]> gcc.gnu.org Git - gcc.git/commitdiff
gcc toplevel:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Thu, 14 Oct 1999 02:18:10 +0000 (02:18 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 14 Oct 1999 02:18:10 +0000 (03:18 +0100)
* expr.c (store_constructor): Clear union if constructor is empty.
cp:
* typeck2.c (process_init_constructor): Handle empty constructors.
testsuite:
* g++.old-deja/g++.other/union2.C: New test.

From-SVN: r29956

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/union2.C [new file with mode: 0644]

index 243cff9fc14496f500d1a1a9cbb97a6a60c4aa03..1bdfbce58fe3cebb20064e6dc563be10df7c0a35 100644 (file)
@@ -1,3 +1,7 @@
+Wed Oct 13 22:01:35 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * expr.c (store_constructor): Clear union if constructor is empty.
+
 Wed Oct 13 15:19:04 1999  Jim Wilson  <wilson@cygnus.com>
 
        * config/rs6000/sysv4.h (CC1_SPEC): Fix errors from Jan 19 change.
index 9c421a8d92ddcf71b8ff79efb0a64cafc541ba26..3593ce4bc0b48c5cd9d0b4ea5036e0301552929b 100644 (file)
@@ -1,3 +1,7 @@
+Wed Oct 13 22:01:35 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * typeck2.c (process_init_constructor): Handle empty constructors.
+
 1999-10-13  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl.c (lang_mark_tree): Mark NAMESPACE_LEVEL.
index 4b37e48976e699c7d981784b4995cf4900c2d040..cb089d41ec16c5870fd3079d0efa008a56149e03 100644 (file)
@@ -921,7 +921,9 @@ process_init_constructor (type, init, elts)
          members = expr_tree_cons (field, next1, members);
        }
     }
-  else if (TREE_CODE (type) == UNION_TYPE)
+  else if (TREE_CODE (type) == UNION_TYPE
+          /* If the initializer was empty, use default zero initialization.  */
+          && tail)
     {
       register tree field = TYPE_FIELDS (type);
 
index 79e651fc7f6b72c0406e4dac30856213894e7808..e246020304529c59972f0802b78743260b5705d8 100644 (file)
@@ -4073,7 +4073,14 @@ store_constructor (exp, target, align, cleared)
       /* Inform later passes that the whole union value is dead.  */
       if (TREE_CODE (type) == UNION_TYPE
          || TREE_CODE (type) == QUAL_UNION_TYPE)
-       emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+       {
+         emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+
+         /* If the constructor is empty, clear the union.  */
+         if (! CONSTRUCTOR_ELTS (exp)  && ! cleared)
+           clear_storage (target, expr_size (exp),
+                          TYPE_ALIGN (type) / BITS_PER_UNIT);
+       }
 
       /* If we are building a static constructor into a register,
         set the initial value as zero so we can fold the value into
index 47563490a0b6578119dc88a120e36203c7d82381..e6db32ab03fc36b6d0eedd6cc02ca506b94b635b 100644 (file)
@@ -1,3 +1,7 @@
+Wed Oct 13 22:01:35 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * g++.old-deja/g++.other/union2.C: New test.
+
 1999-10-13  Nathan Sidwell  <nathan@acm.org>
 
        * g++.old-deja/g++.other/vaarg2.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/union2.C b/gcc/testsuite/g++.old-deja/g++.other/union2.C
new file mode 100644 (file)
index 0000000..32dd26c
--- /dev/null
@@ -0,0 +1,36 @@
+// Bug: g++ crashed on empty intializers for unions.
+// Bug: gcc and g++ didn't zero unions with empty initializers.
+// Submitted by J"orn Rennecke <amylaar@cygnus.co.uk>
+
+typedef union u
+{
+  union u *up;
+  void *vp;
+} u;
+
+static u v = {};
+
+void bar (u);
+void baz (u);
+
+void foo()
+{
+       u w = {};
+       u x = { &v };
+       baz (x);
+       bar (w);
+}
+
+void baz (u w) { }
+
+void bar (u w)
+{
+  if (w.up)
+    exit (1);
+}
+
+int main ()
+{
+  foo ();
+  return 0;
+}
This page took 0.108406 seconds and 5 git commands to generate.