diff options
Diffstat (limited to 'libmudflap')
-rw-r--r-- | libmudflap/ChangeLog | 5 | ||||
-rw-r--r-- | libmudflap/testsuite/libmudflap.c/pass64-frag.c | 38 |
2 files changed, 43 insertions, 0 deletions
diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog index e9eec1050f4..6a879243c9c 100644 --- a/libmudflap/ChangeLog +++ b/libmudflap/ChangeLog @@ -1,3 +1,8 @@ +2008-09-15 Jakub Jelinek <jakub@redhat.com> + + PR libmudflap/36397 + * testsuite/libmudflap.c/pass64-frag.c: New test. + 2008-06-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * Makefile.in: Regenerate. diff --git a/libmudflap/testsuite/libmudflap.c/pass64-frag.c b/libmudflap/testsuite/libmudflap.c/pass64-frag.c new file mode 100644 index 00000000000..856eec0fa7e --- /dev/null +++ b/libmudflap/testsuite/libmudflap.c/pass64-frag.c @@ -0,0 +1,38 @@ +/* PR libmudflap/36397 */ +/* { dg-do run } */ +/* { dg-options "-O -fmudflap -fno-strict-aliasing -lmudflap" } */ + +struct A +{ + int a[2]; +}; + +long long int x; + +int __attribute__ ((noinline)) +baz (long long int *x) +{ + return *x; +} + +int __attribute__ ((noinline)) +foo (int i) +{ + if (i > 10) + return baz (&x); + return ((struct A *) &x)->a[i]; +} + +int +main (void) +{ + if (sizeof (long long) == 2 * sizeof (int) + && sizeof (long long) == sizeof (struct A)) + { + struct A a = { .a[0] = 10, .a[1] = 20 }; + __builtin_memcpy (&x, &a, sizeof (x)); + if (foo (0) != 10 || foo (1) != 20) + __builtin_abort (); + } + return 0; +} |