aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c
new file mode 100644
index 000000000..a2eb86b6d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20011113-1.c
@@ -0,0 +1,55 @@
+typedef __SIZE_TYPE__ size_t;
+extern void *memcpy (void *__restrict, const void *__restrict, size_t);
+extern void abort (void);
+extern void exit (int);
+
+typedef struct t
+{
+ unsigned a : 16;
+ unsigned b : 8;
+ unsigned c : 8;
+ long d[4];
+} *T;
+
+typedef struct {
+ long r[3];
+} U;
+
+T bar (U, unsigned int);
+
+T foo (T x)
+{
+ U d, u;
+
+ memcpy (&u, &x->d[1], sizeof u);
+ d = u;
+ return bar (d, x->b);
+}
+
+T baz (T x)
+{
+ U d, u;
+
+ d.r[0] = 0x123456789;
+ d.r[1] = 0xfedcba987;
+ d.r[2] = 0xabcdef123;
+ memcpy (&u, &x->d[1], sizeof u);
+ d = u;
+ return bar (d, x->b);
+}
+
+T bar (U d, unsigned int m)
+{
+ if (d.r[0] != 21 || d.r[1] != 22 || d.r[2] != 23)
+ abort ();
+ return 0;
+}
+
+struct t t = { 26, 0, 0, { 0, 21, 22, 23 }};
+
+int main (void)
+{
+ baz (&t);
+ foo (&t);
+ exit (0);
+}