aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-05-25 20:18:26 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-05-25 20:18:26 +0000
commite92fb50114706dd60fc43ccec488a7ac99b5fa9b (patch)
tree622ad082d8859f1f7dcb1eac879fee90193bb6e0 /gcc/gimplify.c
parent05a58ad48d4bad7dff39cc2c2b5263bbb89cab38 (diff)
downloadgcc-e92fb50114706dd60fc43ccec488a7ac99b5fa9b.zip
gcc-e92fb50114706dd60fc43ccec488a7ac99b5fa9b.tar.gz
gcc-e92fb50114706dd60fc43ccec488a7ac99b5fa9b.tar.bz2
re PR c++/20103 (ICE in create_tmp_var with C99 style struct initializer)
PR c++/20103 * gimplify.c (gimplify_decl_expr): Do not call gimple_add_tmp_var for anonymous variables explicitly declared by front ends. PR c++/20103 * decl.c (cp_make_fname_decl): Don't set DECL_INITIAL to error_mark_node to indicate an initialization is OK. (start_decl): Likewise. Adjust call to start_decl_1. (start_decl_1): Add initialized parameter. Simplify. * except.c (initialize_handler_parm): Adjust call to setart_decl_1. (expand_start_catch_block): Let cp_finish_decl initialize catch parameters. * cp-tree.h (start_decl_1): Adjust prototype. * pt.c (tsubst_expr): Don't set DECL_INITIAL to error_mark_node. (instantiate_decl): Let cp_finish_decl handle initialization. * semantics.c (finish_compound_literal): Create a temporary variable for the literal. * typeck.c (build_unary_op): Remove COMPOUND_LITERAL_P special cases. * decl2.c (finish_static_data_member_decl): Don't set DECL_INITIAL. (grokfield): Do not try to initialize functions. PR c++/20103 * g++.dg/ext/complit6.C: New test. * g++.dg/ext/complit3.C: Adjust error markers. * g++.dg/init/const3.C: New test. From-SVN: r114119
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 103b36e..fe18bc1 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1216,10 +1216,12 @@ gimplify_decl_expr (tree *stmt_p)
walk_tree (&init, force_labels_r, NULL, NULL);
}
- /* This decl isn't mentioned in the enclosing block, so add it to the
- list of temps. FIXME it seems a bit of a kludge to say that
- anonymous artificial vars aren't pushed, but everything else is. */
- if (DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
+ /* Some front ends do not explicitly declare all anonymous
+ artificial variables. We compensate here by declaring the
+ variables, though it would be better if the front ends would
+ explicitly declare them. */
+ if (!DECL_SEEN_IN_BIND_EXPR_P (decl)
+ && DECL_ARTIFICIAL (decl) && DECL_NAME (decl) == NULL_TREE)
gimple_add_tmp_var (decl);
}