]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/33887 (Reference to bitfield gets wrong value when optimizing)
authorRichard Guenther <rguenther@suse.de>
Fri, 25 Jan 2008 12:06:31 +0000 (12:06 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 25 Jan 2008 12:06:31 +0000 (12:06 +0000)
2008-01-25  Richard Guenther  <rguenther@suse.de>

PR c++/33887
* cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Define
to true.

* g++.dg/torture/pr33887-1.C: New testcase.
* g++.dg/torture/pr33887-2.C: Likewise.
* g++.dg/torture/pr33887-3.C: Likewise.
* gcc.c-torture/execute/20071211-1.c: Likewise.

From-SVN: r131823

gcc/cp/ChangeLog
gcc/cp/cp-lang.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr33887-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr33887-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr33887-3.C [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/20071211-1.c [new file with mode: 0644]

index d842f7703e342ce520761f044c0dc2b6b35195fe..4dca2f11c6906b911bee1c7472dfb060c953ad09 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-25  Richard Guenther  <rguenther@suse.de>
+
+       PR c++/33887
+       * cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Define
+       to true.
+
 2008-01-24  Paolo Carlini  <pcarlini@suse.de>
 
         PR c++/34603
index 70709298e9a88e2397bbf8bebc4ba10aab75d669..b35f7f3811cdad53c93235a4e44a5f0260cc2ff4 100644 (file)
@@ -57,6 +57,8 @@ static enum classify_record cp_classify_record (tree type);
 #define LANG_HOOKS_FOLD_OBJ_TYPE_REF cp_fold_obj_type_ref
 #undef LANG_HOOKS_INIT_TS
 #define LANG_HOOKS_INIT_TS cp_init_ts
+#undef LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS
+#define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS true
 
 /* Each front end provides its own lang hook initializer.  */
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
index 007bb71c1ca966a05b202d5be4698f6776bfece9..858acf920838b267de65d53a6e8b916e2ff4294c 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-25  Richard Guenther  <rguenther@suse.de>
+
+       PR c++/33887
+       * g++.dg/torture/pr33887-1.C: New testcase.
+       * g++.dg/torture/pr33887-2.C: Likewise.
+       * g++.dg/torture/pr33887-3.C: Likewise.
+       * gcc.c-torture/execute/20071211-1.c: Likewise.
+
 2008-01-25  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/34856
diff --git a/gcc/testsuite/g++.dg/torture/pr33887-1.C b/gcc/testsuite/g++.dg/torture/pr33887-1.C
new file mode 100644 (file)
index 0000000..2f17d95
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+struct S { unsigned int i : 24; } x;
+void __attribute__((noinline)) test1()
+{
+  if (--x.i != 0x00ffffff)
+    abort ();
+  if (x.i != 0x00ffffff)
+    abort ();
+}
+void __attribute__((noinline)) test2()
+{
+  if (x.i-- != 0)
+    abort ();
+  if (x.i != 0x00ffffff)
+    abort ();
+}
+void __attribute__((noinline)) test3()
+{
+  if (++x.i != 0)
+    abort ();
+  if (x.i != 0)
+    abort ();
+}
+void __attribute__((noinline)) test4()
+{
+  if (x.i++ != 0x00ffffff)
+    abort ();
+  if (x.i != 0)
+    abort ();
+}
+int main()
+{
+  x.i = 0;
+  test1();
+  x.i = 0;
+  test2();
+  x.i = 0x00ffffff;
+  test3();
+  x.i = 0x00ffffff;
+  test4();
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr33887-2.C b/gcc/testsuite/g++.dg/torture/pr33887-2.C
new file mode 100644 (file)
index 0000000..f64cfad
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+
+extern "C" void abort() __attribute__ ((noreturn));
+
+struct s
+{
+  unsigned long long f1 : 40;
+  unsigned int f2 : 24;
+} sv;
+
+int main()
+{
+  int f2;
+  sv.f2 = (1 << 24) - 1;
+  __asm__ volatile ("" : : : "memory");
+  ++sv.f2;
+  f2 = sv.f2;
+  if (f2 != 0)
+    abort();
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr33887-3.C b/gcc/testsuite/g++.dg/torture/pr33887-3.C
new file mode 100644 (file)
index 0000000..b4b883f
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+
+struct s
+{
+  unsigned long long f1 : 40;
+  unsigned int f2 : 24;
+};
+
+s sv;
+
+void __attribute__((noinline)) foo(unsigned int i)
+{
+  unsigned int tmp;
+  sv.f2 = i;
+  tmp = sv.f2;
+  if (tmp != 0)
+    abort ();
+}
+
+int main()
+{
+  foo (0xff000000u);
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20071211-1.c b/gcc/testsuite/gcc.c-torture/execute/20071211-1.c
new file mode 100644 (file)
index 0000000..f3786a2
--- /dev/null
@@ -0,0 +1,19 @@
+extern void abort() __attribute__ ((noreturn));
+
+struct s
+{
+  unsigned long long f1 : 40;
+  unsigned int f2 : 24;
+} sv;
+
+int main()
+{
+  int f2;
+  sv.f2 = (1 << 24) - 1;
+  __asm__ volatile ("" : : : "memory");
+  ++sv.f2;
+  f2 = sv.f2;
+  if (f2 != 0)
+    abort();
+  return 0;
+}