* pt.c (tsubst_aggr_type): Bail if creating the argvec fails.
(tsubst_template_arg_vector): Likewise.
* decl2.c (build_anon_union_vars): Choose the largest field; don't
assume that one will be as large as the union.
From-SVN: r35581
+2000-08-08 Jason Merrill <jason@redhat.com>
+
+ * pt.c (tsubst_aggr_type): Bail if creating the argvec fails.
+ (tsubst_template_arg_vector): Likewise.
+
+ * decl2.c (build_anon_union_vars): Choose the largest field; don't
+ assume that one will be as large as the union.
+
2000-08-07 Kazu Hirata <kazu@hxi.com>
* cp-tree.h (CLASSTYPE_HAS_PRIMARY_BASE_P): Fix a comment typo.
DECL_INITIAL (decl) = NULL_TREE;
}
- /* Only write out one anon union element--choose the one that
- can hold them all. */
+ /* Only write out one anon union element--choose the largest
+ one. We used to try to find one the same size as the union,
+ but that fails if the ABI forces us to align the union more
+ strictly. */
if (main_decl == NULL_TREE
- && simple_cst_equal (DECL_SIZE (decl),
- DECL_SIZE (anon_decl)) == 1)
- main_decl = decl;
+ || tree_int_cst_lt (DECL_SIZE (main_decl), DECL_SIZE (decl)))
+ {
+ if (main_decl)
+ TREE_ASM_WRITTEN (main_decl) = 1;
+ main_decl = decl;
+ }
else
/* ??? This causes there to be no debug info written out
about this decl. */
(tsubst_expr (TREE_VEC_ELT (t, i), args, complain,
NULL_TREE));
+ if (elts[i] == error_mark_node)
+ return error_mark_node;
+
if (elts[i] != TREE_VEC_ELT (t, i))
need_new = 1;
}
S we only want {double}. */
argvec = tsubst_template_arg_vector (TYPE_TI_ARGS (t), args,
complain);
+ if (argvec == error_mark_node)
+ return error_mark_node;
r = lookup_template_class (t, argvec, in_decl, context,
entering_scope);