1 /*
2    20111208-1.c from the execute part of the gcc torture suite.
3  */
4 
5 #include <testfwk.h>
6 
7 #ifdef __SDCC
8 #pragma std_c99
9 #endif
10 
11 #include <stdint.h>
12 #include <string.h>
13 
14 #if !(defined (__GNUC__) && __GNUC__ < 5)
15 /* PR tree-optimization/51315 */
16 /* Reported by Jurij Smakov <jurij@wooyd.org> */
17 
18 int a;
19 
20 static void
do_something(int item)21 do_something (int item)
22 {
23   a = item;
24 }
25 
26 int
pack_unpack(char * s,char * p)27 pack_unpack (char *s, char *p)
28 {
29   char *send, *pend;
30   char type;
31   int integer_size;
32 
33   send = s + strlen (s);
34   pend = p + strlen (p);
35 
36   while (p < pend)
37     {
38       type = *p++;
39 
40       switch (type)
41  {
42  case 's':
43    integer_size = 2;
44    goto unpack_integer;
45 
46  case 'l':
47    integer_size = 4;
48    goto unpack_integer;
49 
50  unpack_integer:
51    switch (integer_size)
52      {
53      case 2:
54        {
55   union
56   {
57     int16_t i;
58     char a[sizeof (int16_t)];
59   }
60   v;
61   memcpy (v.a, s, sizeof (int16_t));
62   s += sizeof (int16_t);
63   do_something (v.i);
64        }
65        break;
66 
67      case 4:
68        {
69   union
70   {
71     int32_t i;
72     char a[sizeof (int32_t)];
73   }
74   v;
75   memcpy (v.a, s, sizeof (int32_t));
76   s += sizeof (int32_t);
77   do_something (v.i);
78        }
79        break;
80      }
81    break;
82  }
83     }
84   return (int) *s;
85 }
86 #endif
87 
88 void
testTortureExecute(void)89 testTortureExecute (void)
90 {
91 #if !(defined (__GNUC__) && __GNUC__ < 5)
92   int n = pack_unpack ("\200\001\377\376\035\300", "sl");
93   if (n != 0)
94     ASSERT (0);
95   return;
96 #endif
97 }
98 
99