+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
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,
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.) */
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 *);
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.
--- /dev/null
+// 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));
+ }
+}