diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-14 10:59:58 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-14 10:59:58 -0400 |
commit | fe5b5c364b49300ba7e1e283f03f593d3e37524a (patch) | |
tree | 3b9fbfa2e2c5327fbcc704558440a2ca72fec6f2 /gcc/cp | |
parent | 4a5ba3ed87794d7ea5ab54d0c89cf6cedd0e6c9f (diff) | |
download | gcc-fe5b5c364b49300ba7e1e283f03f593d3e37524a.zip gcc-fe5b5c364b49300ba7e1e283f03f593d3e37524a.tar.gz gcc-fe5b5c364b49300ba7e1e283f03f593d3e37524a.tar.bz2 |
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
Diffstat (limited to 'gcc/cp')
-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 |
4 files changed, 20 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; |