aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-04-14 10:59:58 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-04-14 10:59:58 -0400
commitfe5b5c364b49300ba7e1e283f03f593d3e37524a (patch)
tree3b9fbfa2e2c5327fbcc704558440a2ca72fec6f2 /gcc/cp
parent4a5ba3ed87794d7ea5ab54d0c89cf6cedd0e6c9f (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl.c12
-rw-r--r--gcc/cp/init.c3
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;