20000917-1.c: New test.
authorGreg McGary <greg@mcgary.org>
Sun, 17 Sep 2000 08:55:16 +0000 (08:55 +0000)
committerGreg McGary <gkm@gcc.gnu.org>
Sun, 17 Sep 2000 08:55:16 +0000 (08:55 +0000)
* gcc.c-torture/execute/20000917-1.c: New test.
* gcc.c-torture/execute/20000917-1.x: XFAIL.

From-SVN: r36466

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20000917-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/20000917-1.x [new file with mode: 0644]

index 510c0333be1deca00c90c8c3ed77f886c3194a57..3e847d85565025545f065fe3c424d267069cb53c 100644 (file)
@@ -1,3 +1,8 @@
+2000-09-17  Greg McGary  <greg@mcgary.org>
+
+       * gcc.c-torture/execute/20000917-1.c: New test.
+       * gcc.c-torture/execute/20000917-1.x: XFAIL.
+
 Sat 16-Sep-2000 08:14:58 BST  Neil Booth  <NeilB@earthling.net>
 
        * gcc.dg/cpp/macro2.c: Testcase for multi-context arguments
@@ -90,8 +95,8 @@ Tue Sep 12 18:32:07 2000  J"orn Rennecke <amylaar@redhat.co.uk>
 
 2000-09-06  Greg McGary  <greg@mcgary.org>
 
-       * gcc.c-torture/20000906.c: New test.
-       * gcc.c-torture/20000906.x: Expect failure for ix86 at `-O2'.
+       * gcc.c-torture/execute/20000906-1.c: New test.
+       * gcc.c-torture/execute/20000906-1.x: Expect failure for ix86 at `-O2'.
 
 2000-09-05  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
diff --git a/gcc/testsuite/gcc.c-torture/execute/20000917-1.c b/gcc/testsuite/gcc.c-torture/execute/20000917-1.c
new file mode 100644 (file)
index 0000000..05b00ff
--- /dev/null
@@ -0,0 +1,42 @@
+/* This bug exists in gcc-2.95, egcs-1.1.2, gcc-2.7.2 and probably
+   every other version as well.  */
+
+typedef struct int3 { int a, b, c; } int3;
+
+int3
+one (void)
+{
+  return (int3) { 1, 1, 1 };
+}
+
+int3
+zero (void)
+{
+  return (int3) { 0, 0, 0 };
+}
+
+int
+main (void)
+{
+  int3 a;
+
+  /* gcc allocates a temporary for the inner expression statement
+     to store the return value of `one'.
+
+     gcc frees the temporaries for the inner expression statement.
+
+     gcc realloates the same temporary slot to store the return
+     value of `zero'.
+
+     gcc expands the call to zero ahead of the expansion of the
+     statement expressions.  The temporary gets the value of `zero'.
+
+     gcc expands statement expressions and the stale temporary is
+     clobbered with the value of `one'.  The bad value is copied from
+     the temporary into *&a.  */
+
+  *({ ({ one (); &a; }); }) = zero ();
+  if (a.a && a.b && a.c)
+    abort ();
+  exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20000917-1.x b/gcc/testsuite/gcc.c-torture/execute/20000917-1.x
new file mode 100644 (file)
index 0000000..287382e
--- /dev/null
@@ -0,0 +1,3 @@
+# Never has worked
+set torture_execute_xfail "*-*-*"
+return 0