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>
* parser.c (cp_parser_objc_class_declaration): Updated for change
......
......@@ -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,
......
......@@ -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.) */
......
......@@ -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;
......
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.
......
// 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