pt.c (tsubst_aggr_type): Bail if creating the argvec fails.
authorJason Merrill <jason@redhat.com>
Wed, 9 Aug 2000 05:52:17 +0000 (01:52 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 9 Aug 2000 05:52:17 +0000 (01:52 -0400)
        * 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

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/pt.c

index 5d124c9..b7b7df8 100644 (file)
@@ -1,3 +1,11 @@
+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.
index 514b9c6..cf1feb6 100644 (file)
@@ -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.  */
index 12ba705..3d0a1b3 100644 (file)
@@ -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);