]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/4203 (empty base class optimization zeroes first byte of other base class...
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 4 Sep 2001 12:21:33 +0000 (12:21 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 4 Sep 2001 12:21:33 +0000 (12:21 +0000)
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

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

index 8dc0b86f5e2da9577ff73cf8dd9642aee4f54523..28ef9f7ee6b88193a240d4b4a55e895b87c1e081 100644 (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
index 74caa383618ac2dce0cd581408ea5f5a6246745a..9caae4bf00831370307a025695c4539938695d55 100644 (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
index b76142b975259d841fd47f9a4c5003d2ed67a58c..927522a2ce968c51075a7cac38d160b8bed8cfd8 100644 (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.
diff --git a/gcc/testsuite/g++.dg/init/empty1.C b/gcc/testsuite/g++.dg/init/empty1.C
new file mode 100644 (file)
index 0000000..bba179f
--- /dev/null
@@ -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;
+}
index 1210327ee178185fbce396a897f1bdf7fa206145..a876ce84a9f14389ed3eb588b4625d30e751f426 100644 (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 *, ...);