From 042b4c4e4d64f3eada18d9347b3c77bd6c01d002 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 10 Jan 2001 14:13:41 +0000 Subject: [PATCH] call.c (build_new_method_call): Use binfo_for_vbase. cp: * call.c (build_new_method_call): Use binfo_for_vbase. testsuite: * g++.old_deja/g++.other/vbase4.C: New test. From-SVN: r38866 --- gcc/cp/ChangeLog | 4 +++ gcc/cp/call.c | 9 ++++--- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.old-deja/g++.other/vbase4.C | 27 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/vbase4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 173e22218ba6..e84c48a50a2d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2001-01-10 Nathan Sidwell + + * call.c (build_new_method_call): Use binfo_for_vbase. + 2001-01-10 Joseph S. Myers * cp-tree.h (flag_cond_mismatch): Don't declare. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 0c08d18af4ca..a855963c8297 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 48d61914fe39..0dcc078c27e3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-01-10 Nathan Sidwell + + * g++.old_deja/g++.other/vbase4.C: New test. + 2001-01-08 Jonathan Larmour * 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 index 000000000000..59974c31a4d8 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/vbase4.C @@ -0,0 +1,27 @@ +// Build don't link: + +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 10 Jan 2001 +// 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 () {} -- 2.43.5