modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20111208-1.c (about) 1 /* PR tree-optimization/51315 */ 2 /* Reported by Jurij Smakov <jurij@wooyd.org> */ 3 4 typedef __SIZE_TYPE__ size_t; 5 6 extern void *memcpy (void *__restrict __dest, 7 __const void *__restrict __src, size_t __n) 8 __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); 9 10 extern size_t strlen (__const char *__s) 11 __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); 12 13 typedef __INT16_TYPE__ int16_t; 14 typedef __INT32_TYPE__ int32_t; 15 16 extern void abort (void); 17 18 int a; 19 20 static void __attribute__ ((noinline,noclone)) 21 do_something (int item) 22 { 23 a = item; 24 } 25 26 int 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 87 int 88 main (void) 89 { 90 int n = pack_unpack ("\200\001\377\376\035\300", "sl"); 91 if (n != 0) 92 abort (); 93 return 0; 94 }