diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 73a1656522d..30110cca72c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-10-14 Jakub Jelinek + + PR c++/37819 + * cp-gimplify.c (cp_genericize_r): Only fold_convert COND_EXPR + arguments if they don't already have COND_EXPR's type. + 2008-10-14 Paolo Carlini PR c++/37650 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 1641be5ebdc..144de3f1ecd 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -815,14 +815,18 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) = (TREE_OPERAND (stmt, 2) ? is_bitfield_expr_with_lowered_type (TREE_OPERAND (stmt, 2)) : NULL_TREE); - if (type_left) + if (type_left + && !useless_type_conversion_p (TREE_TYPE (stmt), + TREE_TYPE (TREE_OPERAND (stmt, 1)))) { TREE_OPERAND (stmt, 1) = fold_convert (type_left, TREE_OPERAND (stmt, 1)); gcc_assert (useless_type_conversion_p (TREE_TYPE (stmt), type_left)); } - if (type_right) + if (type_right + && !useless_type_conversion_p (TREE_TYPE (stmt), + TREE_TYPE (TREE_OPERAND (stmt, 2)))) { TREE_OPERAND (stmt, 2) = fold_convert (type_right, TREE_OPERAND (stmt, 2)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f3e7b4ae4f..12090cc227d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-14 Jakub Jelinek + + PR c++/37819 + * g++.dg/expr/bitfield11.C: New test. + 2008-10-14 Paolo Carlini PR c++/37650 diff --git a/gcc/testsuite/g++.dg/expr/bitfield11.C b/gcc/testsuite/g++.dg/expr/bitfield11.C new file mode 100644 index 00000000000..bab303ef36c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield11.C @@ -0,0 +1,13 @@ +// PR c++/37819 +// { dg-do compile } + +struct A +{ + unsigned int a : 1; +}; + +bool +foo (A *x, A *y) +{ + x->a = y ? y->a : true; +}