diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0358-PR-c-49165.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0358-PR-c-49165.patch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0358-PR-c-49165.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0358-PR-c-49165.patch new file mode 100644 index 000000000..cbe05a533 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0358-PR-c-49165.patch @@ -0,0 +1,89 @@ +From 0a0395125e1f619c73c0d0c754c630cd92cc4aa7 Mon Sep 17 00:00:00 2001 +From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Fri, 27 May 2011 19:23:46 +0000 +Subject: [PATCH] PR c++/49165 + * c-common.c (c_common_truthvalue_conversion) <case COND_EXPR>: For + C++ don't call c_common_truthvalue_conversion on void type arms. + + * g++.dg/eh/cond6.C: New test. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174351 138bc75d-0d04-0410-961f-82ee72b054a4 + +index 0be3996..ea5a196 100644 +--- a/gcc/c-family/c-common.c ++++ b/gcc/c-family/c-common.c +@@ -3915,14 +3915,15 @@ c_common_truthvalue_conversion (location_t location, tree expr) + /* Distribute the conversion into the arms of a COND_EXPR. */ + if (c_dialect_cxx ()) + { ++ tree op1 = TREE_OPERAND (expr, 1); ++ tree op2 = TREE_OPERAND (expr, 2); ++ /* In C++ one of the arms might have void type if it is throw. */ ++ if (!VOID_TYPE_P (TREE_TYPE (op1))) ++ op1 = c_common_truthvalue_conversion (location, op1); ++ if (!VOID_TYPE_P (TREE_TYPE (op2))) ++ op2 = c_common_truthvalue_conversion (location, op2); + expr = fold_build3_loc (location, COND_EXPR, truthvalue_type_node, +- TREE_OPERAND (expr, 0), +- c_common_truthvalue_conversion (location, +- TREE_OPERAND (expr, +- 1)), +- c_common_truthvalue_conversion (location, +- TREE_OPERAND (expr, +- 2))); ++ TREE_OPERAND (expr, 0), op1, op2); + goto ret; + } + else +new file mode 100644 +index 0000000..1eed63e +--- /dev/null ++++ b/gcc/testsuite/g++.dg/eh/cond6.C +@@ -0,0 +1,43 @@ ++// PR c++/49165 ++// { dg-do run } ++ ++extern "C" void abort (); ++ ++int ++foo (bool x, int y) ++{ ++ if (y < 10 && (x ? 1 : throw 1)) ++ y++; ++ if (y > 20 || (x ? 1 : throw 2)) ++ y++; ++ return y; ++} ++ ++int ++main () ++{ ++ if (foo (true, 0) != 2 ++ || foo (true, 10) != 11 ++ || foo (false, 30) != 31) ++ abort (); ++ try ++ { ++ foo (false, 0); ++ abort (); ++ } ++ catch (int i) ++ { ++ if (i != 1) ++ abort (); ++ } ++ try ++ { ++ foo (false, 10); ++ abort (); ++ } ++ catch (int i) ++ { ++ if (i != 2) ++ abort (); ++ } ++} +-- +1.7.0.4 + |