]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
search.c (convert_pointer_to_single_level): Reimplement without using get_binfo.
authorMark Mitchell <mark@codesourcery.com>
Mon, 7 Jun 1999 13:28:06 +0000 (13:28 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 7 Jun 1999 13:28:06 +0000 (13:28 +0000)
* search.c (convert_pointer_to_single_level): Reimplement without
using get_binfo.

From-SVN: r27394

gcc/cp/ChangeLog
gcc/cp/search.c
gcc/testsuite/g++.old-deja/g++.other/virtual5.C [new file with mode: 0644]

index e89dfdff1a237a92031b43a771ef179559294228..72aa8d479624a41a708d717fb1778fe7f96fda1c 100644 (file)
@@ -1,3 +1,13 @@
+1999-06-07  Mark Mitchell  <mark@codesourcery.com>
+
+       * search.c (convert_pointer_to_single_level): Reimplement without
+       using get_binfo.
+
+1999-06-06  Mark Mitchell  <mark@codesourcery.com>
+
+       * method.c (is_back_referenceable_type): Back-reference bools when
+       not squangling.
+
 1999-06-07  Dave Brolley  <brolley@cygnus.com>
 
        * lex.c (real_yylex): Replace unused bytes from bad multibyte char.
index 63b733d3ad82e52ad58a4b5f8fe6e77f2f7c71ef..9bac6e6ad49a75c3132aa7d652c9c9ea1cfc9d1f 100644 (file)
@@ -2057,17 +2057,29 @@ static tree
 convert_pointer_to_single_level (to_type, expr)
      tree to_type, expr;
 {
+  tree derived;
   tree binfo_of_derived;
-  tree last;
+  int i;
 
-  binfo_of_derived = TYPE_BINFO (TREE_TYPE (TREE_TYPE (expr)));
-  last = get_binfo (to_type, TREE_TYPE (TREE_TYPE (expr)), 0);
-  my_friendly_assert (BINFO_INHERITANCE_CHAIN (last) == binfo_of_derived,
-                     980827);
+  derived = TREE_TYPE (TREE_TYPE (expr));
+  binfo_of_derived = TYPE_BINFO (derived);
   my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo_of_derived) == NULL_TREE,
                      980827);
-  return build_vbase_path (PLUS_EXPR, build_pointer_type (to_type), expr,
-                          last, 1);
+  for (i = CLASSTYPE_N_BASECLASSES (derived) - 1; i >= 0; --i)
+    {
+      tree binfo = BINFO_BASETYPE (binfo_of_derived, i);
+      my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo) == binfo_of_derived,
+                         980827);
+      if (same_type_p (BINFO_TYPE (binfo), to_type))
+       return build_vbase_path (PLUS_EXPR, 
+                                build_pointer_type (to_type), 
+                                expr, binfo, 1);
+    }
+
+  my_friendly_abort (19990607);
+
+  /* NOTREACHED */
+  return NULL_TREE;
 }
 
 tree markedp (binfo, data) 
diff --git a/gcc/testsuite/g++.old-deja/g++.other/virtual5.C b/gcc/testsuite/g++.old-deja/g++.other/virtual5.C
new file mode 100644 (file)
index 0000000..bf70056
--- /dev/null
@@ -0,0 +1,20 @@
+// Build don't link:
+// Special g++ Options: -w
+// Origin: Derived from code by Andris Pavenis <andris@stargate.astr.lu.lv>
+
+class vector {};
+
+class V
+{
+};
+
+class A : public vector
+{
+};
+
+class B : public A, virtual V, public vector
+{
+  B() {}
+};
+
+