Commit fe5b5c36 by Jason Merrill Committed by Jason Merrill

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
parent 4a5ba3ed
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> 2011-04-14 Nicola Pero <nicola.pero@meta-innovation.com>
* parser.c (cp_parser_objc_class_declaration): Updated for change * parser.c (cp_parser_objc_class_declaration): Updated for change
......
...@@ -4964,6 +4964,7 @@ extern tree build_offset_ref (tree, tree, bool); ...@@ -4964,6 +4964,7 @@ extern tree build_offset_ref (tree, tree, bool);
extern tree build_new (VEC(tree,gc) **, tree, tree, extern tree build_new (VEC(tree,gc) **, tree, tree,
VEC(tree,gc) **, int, VEC(tree,gc) **, int,
tsubst_flags_t); tsubst_flags_t);
extern tree get_temp_regvar (tree, tree);
extern tree build_vec_init (tree, tree, tree, bool, int, extern tree build_vec_init (tree, tree, tree, bool, int,
tsubst_flags_t); tsubst_flags_t);
extern tree build_delete (tree, tree, extern tree build_delete (tree, tree,
......
...@@ -7710,8 +7710,16 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) ...@@ -7710,8 +7710,16 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
processing_template_decl = saved_processing_template_decl; processing_template_decl = saved_processing_template_decl;
if (!TREE_CONSTANT (itype)) 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 /* Make sure that there was no overflow when creating to a signed
index type. (For example, on a 32-bit machine, an array with index type. (For example, on a 32-bit machine, an array with
size 2^32 - 1 is too big.) */ size 2^32 - 1 is too big.) */
......
...@@ -45,7 +45,6 @@ static void expand_virtual_init (tree, tree); ...@@ -45,7 +45,6 @@ static void expand_virtual_init (tree, tree);
static tree sort_mem_initializers (tree, tree); static tree sort_mem_initializers (tree, tree);
static tree initializing_context (tree); static tree initializing_context (tree);
static void expand_cleanup_for_base (tree, 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 dfs_initialize_vtbl_ptrs (tree, void *);
static tree build_dtor_call (tree, special_function_kind, int); static tree build_dtor_call (tree, special_function_kind, int);
static tree build_field_list (tree, tree, int *); static tree build_field_list (tree, tree, int *);
...@@ -2875,7 +2874,7 @@ create_temporary_var (tree type) ...@@ -2875,7 +2874,7 @@ create_temporary_var (tree type)
things when it comes time to do final cleanups (which take place things when it comes time to do final cleanups (which take place
"outside" the binding contour of the function). */ "outside" the binding contour of the function). */
static tree tree
get_temp_regvar (tree type, tree init) get_temp_regvar (tree type, tree init)
{ {
tree decl; tree decl;
......
2011-04-14 Jason Merrill <jason@redhat.com>
* g++.dg/ext/vla10.C: New.
2011-04-14 Richard Guenther <rguenther@suse.de> 2011-04-14 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/ssa-dse-14.c: New testcase. * gcc.dg/tree-ssa/ssa-dse-14.c: New testcase.
......
// 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));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment