+2002-01-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5132
+ * typeck2.c (digest_init): Make sure non-array core type is
+ instantiated.
+ * decl2.c (reparse_absdcl_as_casts): Just store the type in the
+ constructor, rather than build a new one.
+ (build_expr_from_tree, CONSTRUCTOR case): Be careful with the
+ PURPOSE of constructor elts.
+
2002-01-23 Zack Weinberg <zack@codesourcery.com>
* Make-lang.in (parse.c): Adjust expected number of
decl = TREE_OPERAND (decl, 0);
if (processing_template_decl)
- expr = build_min (CONSTRUCTOR, type, decl, CONSTRUCTOR_ELTS (expr));
+ TREE_TYPE (expr) = type;
else
{
expr = digest_init (type, expr, (tree *) 0);
case CONSTRUCTOR:
{
tree r;
+ tree elts;
+ tree type = TREE_TYPE (t);
+ bool purpose_p;
/* digest_init will do the wrong thing if we let it. */
- if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
+ if (type && TYPE_PTRMEMFUNC_P (type))
return t;
- r = build_nt (CONSTRUCTOR, NULL_TREE,
- build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
+ r = NULL_TREE;
+ /* We do not want to process the purpose of aggregate
+ initializers as they are identifier nodes which will be
+ looked up by digest_init. */
+ purpose_p = !(type && IS_AGGR_TYPE (type));
+ for (elts = CONSTRUCTOR_ELTS (t); elts; elts = TREE_CHAIN (elts))
+ {
+ tree purpose = TREE_PURPOSE (elts);
+ tree value = TREE_VALUE (elts);
+
+ if (purpose && purpose_p)
+ purpose = build_expr_from_tree (purpose);
+ value = build_expr_from_tree (value);
+ r = tree_cons (purpose, value, r);
+ }
+
+ r = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (r));
TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
- if (TREE_TYPE (t))
- return digest_init (TREE_TYPE (t), r, 0);
+ if (type)
+ return digest_init (type, r, 0);
return r;
}
/* __PRETTY_FUNCTION__'s initializer is a bogus expression inside
a template function. This gets substituted during instantiation. */
return init;
+
+ /* We must strip the outermost array type when completing the type,
+ because the its bounds might be incomplete at the moment. */
+ if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE
+ ? TREE_TYPE (type) : type, NULL_TREE))
+ return error_mark_node;
/* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
if (TREE_CODE (init) == NON_LVALUE_EXPR)