diff options
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/decl.c | 12 | ||||
-rw-r--r-- | gcc/cp/init.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/vla10.C | 32 |
6 files changed, 56 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37b1071..0833125 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-04-14 Jason Merrill <jason@redhat.com> + + 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 <nicola.pero@meta-innovation.com> * 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 15c1974..3ca44c2 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 7553886..794832b 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 3131690..32afa03 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 ffca004..080d29b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-04-14 Jason Merrill <jason@redhat.com> + + * g++.dg/ext/vla10.C: New. + 2011-04-14 Richard Guenther <rguenther@suse.de> * 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 0000000..17cdb2f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla10.C @@ -0,0 +1,32 @@ +// PR c++/48446 +// { dg-options "" } + +template<typename T> +struct A +{ + ~A (); + T *operator-> () const; +}; + +struct B +{ + typedef A <B> P; + static P foo (int); +}; + +struct C +{ + typedef A<C> P; + static const int c = 80; +}; + +C::P bar (); + +void +baz () +{ + char z[bar ()->c]; + { + B::P m = B::foo (sizeof (z)); + } +} |