1 /* Test volatile access to unaligned field.  */
2 /* { dg-do run } */
3 /* { dg-require-effective-target size32plus } */
4 /* { dg-options "-fstrict-volatile-bitfields" } */
5 
6 extern void abort (void);
7 
8 #define test_type unsigned int
9 #define MAGIC 0x1020304u
10 
11 typedef struct s{
12  unsigned char Prefix;
13  test_type Type;
14 }__attribute((__packed__)) ss;
15 
16 volatile ss v;
17 ss g;
18 
19 void __attribute__((noinline))
foo(test_type u)20 foo (test_type u)
21 {
22   v.Type = u;
23 }
24 
25 test_type __attribute__((noinline))
bar(void)26 bar (void)
27 {
28   return v.Type;
29 }
30 
main()31 int main()
32 {
33   test_type temp;
34   foo(MAGIC);
35   __builtin_memcpy(&g, (void *)&v, sizeof(g));
36   if (g.Type != MAGIC)
37     abort ();
38 
39   g.Type = MAGIC;
40   __builtin_memcpy((void *)&v, &g, sizeof(v));
41   temp = bar();
42   if (temp != MAGIC)
43     abort ();
44   return 0;
45 }
46