]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/3986 (ICE in build_rtti_vtbl_entries)
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 6 Sep 2001 09:03:31 +0000 (09:03 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 6 Sep 2001 09:03:31 +0000 (09:03 +0000)
cp:
PR c++/3986
* class.c (force_canonical_binfo_r): Check & move an indirect
primary base first.
(force_canonical_binfo): Check that it's not already
canonical.
(mark_primary_virtual_base): Remove BINFO parameter.
(mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here.
testsuite:
PR c++/3986
* g++.dg/abi/vbase1.C: New test.

From-SVN: r45435

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/vbase1.C [new file with mode: 0644]

index be43b1f50a698bb2e385ef0ddb992fcdca268f81..9562779ee1961683e5b2e9e2f63fdaec0b0f8c71 100644 (file)
@@ -1,3 +1,13 @@
+2001-09-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/3986
+       * class.c (force_canonical_binfo_r): Check & move an indirect
+       primary base first.
+       (force_canonical_binfo): Check that it's not already
+       canonical.
+       (mark_primary_virtual_base): Remove BINFO parameter.
+       (mark_primary_bases): Adjust, set BINFO_LOST_PRIMARY_P here.
+
 2001-09-06  Nathan Sidwell  <nathan@codesourcery.com>
 
        Remove TYPE_NONCOPIED_PARTS.
index 03aa7f71f5bc68fe5608f672bae20cc254b0f7b9..78659c7f1ea66d786a4ed3170ee4e89527f61b22 100644 (file)
@@ -1437,7 +1437,8 @@ force_canonical_binfo_r (to, from, type, mappings)
      tree mappings;
 {
   int i, n_baseclasses = BINFO_N_BASETYPES (from);
-  
+
+  my_friendly_assert (to != from, 20010905);
   BINFO_INDIRECT_PRIMARY_P (to)
           = BINFO_INDIRECT_PRIMARY_P (from);
   BINFO_INDIRECT_PRIMARY_P (from) = 0;
@@ -1461,11 +1462,22 @@ force_canonical_binfo_r (to, from, type, mappings)
   my_friendly_assert (same_type_p (BINFO_TYPE (to), BINFO_TYPE (from)),
                      20010104);
   mappings = tree_cons (from, to, mappings);
+
+  if (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (from))
+      && TREE_VIA_VIRTUAL (CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (from))))
+    {
+      tree from_primary = get_primary_binfo (from);
+      
+      if (BINFO_PRIMARY_BASE_OF (from_primary) == from)
+       force_canonical_binfo (get_primary_binfo (to), from_primary,
+                              type, mappings);
+    }
+  
   for (i = 0; i != n_baseclasses; i++)
     {
       tree from_binfo = BINFO_BASETYPE (from, i);
       tree to_binfo = BINFO_BASETYPE (to, i);
-      
+
       if (TREE_VIA_VIRTUAL (from_binfo))
         {
          if (BINFO_PRIMARY_P (from_binfo) &&
@@ -1498,17 +1510,19 @@ force_canonical_binfo (to, from, type, mappings)
 {
   tree assoc = purpose_member (BINFO_TYPE (to),
                               CLASSTYPE_VBASECLASSES (type));
-  TREE_VALUE (assoc) = to;
-  force_canonical_binfo_r (to, from, type, mappings);
+  if (TREE_VALUE (assoc) != to)
+    {
+      TREE_VALUE (assoc) = to;
+      force_canonical_binfo_r (to, from, type, mappings);
+    }
 }
 
-/* Make BASE_BINFO the primary virtual base of BINFO within the hierarchy
-   dominated by TYPE. Returns BASE_BINFO, if it can be made so, NULL
+/* Make BASE_BINFO the a primary virtual base within the hierarchy
+   dominated by TYPE. Returns BASE_BINFO, if it is not already one, NULL
    otherwise (because something else has already made it primary).  */
 
 static tree
-mark_primary_virtual_base (binfo, base_binfo, type)
-     tree binfo;
+mark_primary_virtual_base (base_binfo, type)
      tree base_binfo;
      tree type;
 {
@@ -1519,8 +1533,6 @@ mark_primary_virtual_base (binfo, base_binfo, type)
       /* It's already allocated in the hierarchy. BINFO won't have a
          primary base in this hierachy, even though the complete object
          BINFO is for, would do.  */
-      BINFO_LOST_PRIMARY_P (binfo) = 1;
-      
       return NULL_TREE;
     }
      
@@ -1608,10 +1620,12 @@ mark_primary_bases (type)
       base_binfo = get_primary_binfo (binfo);
 
       if (TREE_VIA_VIRTUAL (base_binfo))
-        base_binfo = mark_primary_virtual_base (binfo, base_binfo, type);
+        base_binfo = mark_primary_virtual_base (base_binfo, type);
 
       if (base_binfo)
         BINFO_PRIMARY_BASE_OF (base_binfo) = binfo;
+      else
+       BINFO_LOST_PRIMARY_P (binfo) = 1;
       
       BINFO_UNSHARED_MARKED (binfo) = 1;
     }
index 0b5516cb79b8bc22207f1fc8efdb0c38ae3c5b11..8592eebe38017cd4249073fa953aa27950332b1c 100644 (file)
@@ -1,3 +1,8 @@
+2001-09-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/3986
+       * g++.dg/abi/vbase1.C: New test.
+
 2001-09-05  Ziemowit Laski  <zlaski@apple.com>
 
        * objc.dg/method-2.m: New.
diff --git a/gcc/testsuite/g++.dg/abi/vbase1.C b/gcc/testsuite/g++.dg/abi/vbase1.C
new file mode 100644 (file)
index 0000000..39d8b81
--- /dev/null
@@ -0,0 +1,60 @@
+// { dg-do compile }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 5 Sept 2001 <nathan@codesourcery.com>
+
+// Bug 3986. Another indirect primary base problem.
+
+struct Consts
+{
+};
+
+struct MathLib :
+  virtual Consts
+{
+};
+
+struct Parallel :
+  virtual Consts
+{
+};
+
+struct Particles :
+  virtual MathLib,
+  virtual Parallel
+{
+};
+
+struct Ring :
+  virtual Particles
+{
+};
+
+struct Injection :
+  virtual Particles,
+  virtual Ring
+{
+};
+
+struct LSpaceCharge :
+  virtual Ring,
+  virtual Injection
+{
+};
+
+struct Bump :
+  virtual Consts
+{
+};
+
+struct Output :
+  virtual Injection,
+  virtual Bump
+{
+};
+
+struct Plots :
+  virtual LSpaceCharge,
+  virtual Output
+{
+};