re PR c++/4203 (empty base class optimization zeroes first byte of other base class when using multiple inheritance)

cp:
	PR c++/4203
	* call.c (build_over_call): Do not optimize any empty base
	construction.
testsuite:
	PR c++/4203
	* g++.old-deja/g++.other/empty1.C: XFAIL. See PR c++/4222
	* g++.dg/init/empty1.C: New test.

From-SVN: r45374
This commit is contained in:
Nathan Sidwell 2001-09-04 12:21:33 +00:00 committed by Nathan Sidwell
parent 223671612f
commit da86f08fd7
5 changed files with 51 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2001-09-04 Nathan Sidwell <nathan@codesourcery.com>
PR c++/4203
* call.c (build_over_call): Do not optimize any empty base
construction.
2001-08-31 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* error.c (dump_template_decl): Output template parameters

View File

@ -4258,14 +4258,14 @@ build_over_call (cand, args, flags)
else if (TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)))
return build_target_expr_with_type (arg, DECL_CONTEXT (fn));
}
else if (! real_lvalue_p (arg)
else if ((!real_lvalue_p (arg)
|| TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)))
/* Empty classes have padding which can be hidden
inside an (empty) base of the class. This must not
be touched as it might overlay things. When the
gcc core learns about empty classes, we can treat it
like other classes. */
|| (!is_empty_class (DECL_CONTEXT (fn))
&& TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))))
&& !is_empty_class (DECL_CONTEXT (fn)))
{
tree address;
tree to = stabilize_reference

View File

@ -1,3 +1,9 @@
2001-09-04 Nathan Sidwell <nathan@codesourcery.com>
PR c++/4203
* g++.old-deja/g++.other/empty1.C: XFAIL. See PR c++/4222
* g++.dg/init/empty1.C: New test.
2001-09-03 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20010903-1.c: New test.

View File

@ -0,0 +1,30 @@
// { dg-do run }
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 3 Sept 2001 <nathan@codesourcery.com>
// Bug 4203. We were bit copying empty bases including the
// padding. Which clobbers whatever they overlay.
class EmptyBase0 {};
class EmptyBase1 : public EmptyBase0 {};
class Base1
{
public:
unsigned int t_;
Base1(unsigned int t) : t_(t) {}
};
class PEPE : public Base1, public EmptyBase1
{
public:
PEPE(unsigned int t)
: Base1(t), EmptyBase1(EmptyBase1()) {}
};
int main()
{
PEPE pepe(0xff);
return pepe.t_ != 255;
}

View File

@ -1,4 +1,10 @@
// Origin: Mark Mitchell <mark@codesourcery.com>
// This test case checks that the return value optimization works for
// empty classes.
// xfailed because empty classes clobbering what they overlay as the
// backend treats them as single byte objects. See bug 4222
// execution test - XFAIL *-*-*
extern "C" void abort();
extern "C" int printf (const char *, ...);