------- Comment #2 from pinskia at gcc dot gnu dot org 2007-07-06 09:43 ------- This quick hack fixes the problem for both testcases (the fold-const part is the only part required to fix the second testcase); Index: fold-const.c =================================================================== --- fold-const.c (revision 126396) +++ fold-const.c (working copy) @@ -3278,7 +3278,7 @@ { tree t = fold_convert (type, result);
- if (TREE_SIDE_EFFECTS (omitted)) + if (folding_initializer || TREE_SIDE_EFFECTS (omitted)) return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t); return non_lvalue (t); @@ -3291,7 +3291,7 @@ { tree t = fold_convert (type, result); - if (TREE_SIDE_EFFECTS (omitted)) + if (folding_initializer || TREE_SIDE_EFFECTS (omitted)) return build2 (COMPOUND_EXPR, type, fold_ignored_result (omitted), t); return pedantic_non_lvalue (t); @@ -14438,6 +14438,10 @@ tree fold_ignored_result (tree t) { + /* Just for now, if this is an initializer. */ + if (folding_initializer) + return t; + if (!TREE_SIDE_EFFECTS (t)) return integer_zero_node; Index: c-typeck.c =================================================================== --- c-typeck.c (revision 126396) +++ c-typeck.c (working copy) @@ -3783,7 +3783,8 @@ enum tree_code coder; tree rname = NULL_TREE; bool objc_ok = false; - + int old_folding_initializer; + if (errtype == ic_argpass || errtype == ic_argpass_nonproto) { tree selector; @@ -3918,13 +3919,29 @@ && (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == ENUMERAL_TYPE || coder == COMPLEX_TYPE || coder == BOOLEAN_TYPE)) - return convert_and_check (type, rhs); + { + tree new; + old_folding_initializer = folding_initializer; + if (errtype == ic_init) + folding_initializer = 1; + new = convert_and_check (type, rhs); + folding_initializer = old_folding_initializer; + return new; + } /* Aggregates in different TUs might need conversion. */ if ((codel == RECORD_TYPE || codel == UNION_TYPE) && codel == coder && comptypes (type, rhstype)) - return convert_and_check (type, rhs); + { + tree new; + old_folding_initializer = folding_initializer; + if (errtype == ic_init) + folding_initializer = 1; + new = convert_and_check (type, rhs); + folding_initializer = old_folding_initializer; + return new; + } /* Conversion to a transparent union from its member types. This applies only to function arguments. */ -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32643