Commit 57e2aff2 by Richard Guenther Committed by Richard Biener

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
parent f84fe9b6
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
......
......@@ -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;
......
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
/* { 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;
}
/* { 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;
}
/* { 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;
}
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment