From: Richard Guenther Date: Fri, 25 Jan 2008 12:06:31 +0000 (+0000) Subject: re PR c++/33887 (Reference to bitfield gets wrong value when optimizing) X-Git-Tag: releases/gcc-4.3.0~410 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57e2aff267801c94a26098f7cb7b1e9bc054b854;p=thirdparty%2Fgcc.git re PR c++/33887 (Reference to bitfield gets wrong value when optimizing) 2008-01-25 Richard Guenther 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d842f7703e34..4dca2f11c690 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-01-25 Richard Guenther + + PR c++/33887 + * cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Define + to true. + 2008-01-24 Paolo Carlini PR c++/34603 diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index 70709298e9a8..b35f7f3811cd 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 007bb71c1ca9..858acf920838 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-01-25 Richard Guenther + + 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 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 000000000000..2f17d9583268 --- /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 000000000000..f64cfad96079 --- /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 000000000000..b4b883fba0f5 --- /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 000000000000..f3786a2f4076 --- /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; +}