aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-01-25 12:06:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-01-25 12:06:31 +0000
commit57e2aff267801c94a26098f7cb7b1e9bc054b854 (patch)
tree5710bf6fd996dbfb4ebf091c78d3a355aab1b6ee /gcc
parentf84fe9b6f7ef38e8c68edd1a64f260521c251dbf (diff)
downloadgcc-57e2aff267801c94a26098f7cb7b1e9bc054b854.zip
gcc-57e2aff267801c94a26098f7cb7b1e9bc054b854.tar.gz
gcc-57e2aff267801c94a26098f7cb7b1e9bc054b854.tar.bz2
re PR c++/33887 (Reference to bitfield gets wrong value when optimizing)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-lang.c2
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33887-1.C44
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33887-2.C21
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33887-3.C26
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20071211-1.c19
7 files changed, 126 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d842f77..4dca2f1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 7070929..b35f7f3 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 007bb71..858acf9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..2f17d95
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr33887-1.C
@@ -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
index 0000000..f64cfad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr33887-2.C
@@ -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
index 0000000..b4b883f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr33887-3.C
@@ -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
index 0000000..f3786a2
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20071211-1.c
@@ -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;
+}