cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jan 2001 14:13:41 +0000 (14:13 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Jan 2001 14:13:41 +0000 (14:13 +0000)
* call.c (build_new_method_call): Use binfo_for_vbase.
testsuite:
* g++.old_deja/g++.other/vbase4.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38866 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 173e222..e84c48a 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-10  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * call.c (build_new_method_call): Use binfo_for_vbase.
+
 2001-01-10  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * cp-tree.h (flag_cond_mismatch): Don't declare.
index 0c08d18..a855963 100644 (file)
@@ -4382,7 +4382,7 @@ build_new_method_call (instance, name, args, basetype_path, flags)
             old ABI.  */
          name = constructor_p ? ctor_identifier : dtor_identifier;
        }
-      /* If we're call a subobject constructor or destructor for a
+      /* If we're a call to a constructor or destructor for a
         subobject that uses virtual base classes, then we need to
         pass down a pointer to a VTT for the subobject.  */
       else if ((name == base_ctor_identifier
@@ -4391,6 +4391,7 @@ build_new_method_call (instance, name, args, basetype_path, flags)
        {
          tree vtt;
          tree sub_vtt;
+         tree basebinfo = basetype_path;
 
          /* If the current function is a complete object constructor
             or destructor, then we fetch the VTT directly.
@@ -4401,9 +4402,11 @@ build_new_method_call (instance, name, args, basetype_path, flags)
                       DECL_USE_VTT_PARM (current_function_decl),
                       DECL_VTT_PARM (current_function_decl),
                       vtt);
-
+         if (TREE_VIA_VIRTUAL (basebinfo))
+           basebinfo = binfo_for_vbase (basetype, current_class_type);
+         my_friendly_assert (BINFO_SUBVTT_INDEX (basebinfo), 20010110);
          sub_vtt = build (PLUS_EXPR, TREE_TYPE (vtt), vtt,
-                          BINFO_SUBVTT_INDEX (basetype_path));
+                          BINFO_SUBVTT_INDEX (basebinfo));
          sub_vtt = build_indirect_ref (sub_vtt, NULL);
 
          args = tree_cons (NULL_TREE, sub_vtt, args);
index 48d6191..0dcc078 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-10  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old_deja/g++.other/vbase4.C: New test.
+
 2001-01-08  Jonathan Larmour  <jlarmour@redhat.com>
 
        * gcc.dg/20000419-2.c: Move to "special" subdirectory.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/vbase4.C b/gcc/testsuite/g++.old-deja/g++.other/vbase4.C
new file mode 100644 (file)
index 0000000..59974c3
--- /dev/null
@@ -0,0 +1,27 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 10 Jan 2001 <nathan@codesourcery.com>
+// Origin snyder@fnal.gov
+
+// Bug 933. Secondary vtables weren't correctly located for non-primary
+// virtual bases. Causing us to ICE.
+
+class d0_Object
+{
+public:
+virtual ~d0_Object ();
+};
+
+
+class M10 : virtual public d0_Object {};
+class M4 : virtual public M10 {};
+
+class M9
+: public M4, virtual public M10
+{
+public:
+M9 ();
+};
+
+M9::M9 () {}