From: Jason Merrill Date: Wed, 9 Aug 2000 05:52:17 +0000 (-0400) Subject: pt.c (tsubst_aggr_type): Bail if creating the argvec fails. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08e72a192902ca20803e5b423bfb6cfdc983642e;p=platform%2Fupstream%2Fgcc.git pt.c (tsubst_aggr_type): Bail if creating the argvec fails. * 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5d124c9..b7b7df8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2000-08-08 Jason Merrill + + * 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 * cp-tree.h (CLASSTYPE_HAS_PRIMARY_BASE_P): Fix a comment typo. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 514b9c6..cf1feb6 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2190,12 +2190,17 @@ build_anon_union_vars (anon_decl, elems, static_p, external_p) 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. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 12ba705..3d0a1b3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5261,6 +5261,9 @@ tsubst_template_arg_vector (t, args, complain) (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; } @@ -5380,6 +5383,8 @@ tsubst_aggr_type (t, args, complain, in_decl, entering_scope) 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);