Commit 042b4c4e by Nathan Sidwell Committed by Nathan Sidwell

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
parent 78053907
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> 2001-01-10 Joseph S. Myers <jsm28@cam.ac.uk>
* cp-tree.h (flag_cond_mismatch): Don't declare. * cp-tree.h (flag_cond_mismatch): Don't declare.
......
...@@ -4382,7 +4382,7 @@ build_new_method_call (instance, name, args, basetype_path, flags) ...@@ -4382,7 +4382,7 @@ build_new_method_call (instance, name, args, basetype_path, flags)
old ABI. */ old ABI. */
name = constructor_p ? ctor_identifier : dtor_identifier; 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 subobject that uses virtual base classes, then we need to
pass down a pointer to a VTT for the subobject. */ pass down a pointer to a VTT for the subobject. */
else if ((name == base_ctor_identifier else if ((name == base_ctor_identifier
...@@ -4391,6 +4391,7 @@ build_new_method_call (instance, name, args, basetype_path, flags) ...@@ -4391,6 +4391,7 @@ build_new_method_call (instance, name, args, basetype_path, flags)
{ {
tree vtt; tree vtt;
tree sub_vtt; tree sub_vtt;
tree basebinfo = basetype_path;
/* If the current function is a complete object constructor /* If the current function is a complete object constructor
or destructor, then we fetch the VTT directly. or destructor, then we fetch the VTT directly.
...@@ -4401,9 +4402,11 @@ build_new_method_call (instance, name, args, basetype_path, flags) ...@@ -4401,9 +4402,11 @@ build_new_method_call (instance, name, args, basetype_path, flags)
DECL_USE_VTT_PARM (current_function_decl), DECL_USE_VTT_PARM (current_function_decl),
DECL_VTT_PARM (current_function_decl), DECL_VTT_PARM (current_function_decl),
vtt); 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, 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); sub_vtt = build_indirect_ref (sub_vtt, NULL);
args = tree_cons (NULL_TREE, sub_vtt, args); args = tree_cons (NULL_TREE, sub_vtt, args);
......
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> 2001-01-08 Jonathan Larmour <jlarmour@redhat.com>
* gcc.dg/20000419-2.c: Move to "special" subdirectory. * gcc.dg/20000419-2.c: Move to "special" subdirectory.
......
// 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 () {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment