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)21do_something (int item) 22 { 23 a = item; 24 } 25 26 int pack_unpack(char * s,char * p)27pack_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)89testTortureExecute (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