diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c5b30b7dd94..12d865e8bb8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2002-03-18 Jason Merrill + PR c++/4222, c++/5995 + * call.c (build_over_call): Fix empty class logic. + PR c++/3870 * cp-tree.h (struct saved_scope): Add last_parms field. * decl.c (maybe_push_to_top_level): Save last_function_parms. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 0cb7dfce5c8..9d26861cdec 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4256,7 +4256,8 @@ build_over_call (cand, args, flags) 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))) + && !(is_empty_class (DECL_CONTEXT (fn)) + && TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)))) { tree address; tree to = stabilize_reference diff --git a/gcc/testsuite/g++.old-deja/g++.other/empty1.C b/gcc/testsuite/g++.old-deja/g++.other/empty1.C index a876ce84a9f..b54490c9579 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/empty1.C +++ b/gcc/testsuite/g++.old-deja/g++.other/empty1.C @@ -2,9 +2,7 @@ // 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 *-*-* +// PR c++/5995 extern "C" void abort(); extern "C" int printf (const char *, ...);