From: Jason Merrill Date: Thu, 14 Apr 2011 14:59:58 +0000 (-0400) Subject: re PR c++/48446 (internal compiler error: in gimplify_var_or_parm_decl, at gimplify... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fe5b5c364b49300ba7e1e283f03f593d3e37524a;p=gcc.git re PR c++/48446 (internal compiler error: in gimplify_var_or_parm_decl, at gimplify.c:1946) PR c++/48446 * decl.c (compute_array_index_type): Use get_temp_regvar instead of variable_size. * init.c (get_temp_regvar): No longer static. * cp-tree.h: Declare it. From-SVN: r172432 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37b107191d5..0833125b470 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-04-14 Jason Merrill + + PR c++/48446 + * decl.c (compute_array_index_type): Use get_temp_regvar instead + of variable_size. + * init.c (get_temp_regvar): No longer static. + * cp-tree.h: Declare it. + 2011-04-14 Nicola Pero * parser.c (cp_parser_objc_class_declaration): Updated for change diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 15c19745233..3ca44c2681e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4964,6 +4964,7 @@ extern tree build_offset_ref (tree, tree, bool); extern tree build_new (VEC(tree,gc) **, tree, tree, VEC(tree,gc) **, int, tsubst_flags_t); +extern tree get_temp_regvar (tree, tree); extern tree build_vec_init (tree, tree, tree, bool, int, tsubst_flags_t); extern tree build_delete (tree, tree, diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 75538866a71..794832b2e0a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7710,8 +7710,16 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) processing_template_decl = saved_processing_template_decl; if (!TREE_CONSTANT (itype)) - /* A variable sized array. */ - itype = variable_size (itype); + { + /* A variable sized array. */ + if (TREE_SIDE_EFFECTS (itype)) + /* Use get_temp_regvar rather than variable_size here so that + people walking expressions that use a variable of this type + don't walk into this expression. */ + itype = get_temp_regvar (TREE_TYPE (itype), itype); + else + itype = variable_size (itype); + } /* Make sure that there was no overflow when creating to a signed index type. (For example, on a 32-bit machine, an array with size 2^32 - 1 is too big.) */ diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 313169072b4..32afa03f538 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -45,7 +45,6 @@ static void expand_virtual_init (tree, tree); static tree sort_mem_initializers (tree, tree); static tree initializing_context (tree); static void expand_cleanup_for_base (tree, tree); -static tree get_temp_regvar (tree, tree); static tree dfs_initialize_vtbl_ptrs (tree, void *); static tree build_dtor_call (tree, special_function_kind, int); static tree build_field_list (tree, tree, int *); @@ -2875,7 +2874,7 @@ create_temporary_var (tree type) things when it comes time to do final cleanups (which take place "outside" the binding contour of the function). */ -static tree +tree get_temp_regvar (tree type, tree init) { tree decl; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffca004140f..080d29bc40f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-04-14 Jason Merrill + + * g++.dg/ext/vla10.C: New. + 2011-04-14 Richard Guenther * gcc.dg/tree-ssa/ssa-dse-14.c: New testcase. diff --git a/gcc/testsuite/g++.dg/ext/vla10.C b/gcc/testsuite/g++.dg/ext/vla10.C new file mode 100644 index 00000000000..17cdb2f9f76 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla10.C @@ -0,0 +1,32 @@ +// PR c++/48446 +// { dg-options "" } + +template +struct A +{ + ~A (); + T *operator-> () const; +}; + +struct B +{ + typedef A P; + static P foo (int); +}; + +struct C +{ + typedef A P; + static const int c = 80; +}; + +C::P bar (); + +void +baz () +{ + char z[bar ()->c]; + { + B::P m = B::foo (sizeof (z)); + } +}