1//-*- C -*- 2 3/* This is a 4 multiline comment */ 5 6// Intended to exercise all syntactic parts of the C language. 7 8int g0; 9int g1, g2; 10 11struct s0; 12 13struct s0 { 14 int x; 15}; 16 17int g3 = 10; 18 19__asm(""); 20 21typedef int td0; 22 23td0 g4; 24 25enum e0 { 26 ec0 27}; 28 29static void f0(int x) { 30} 31 32inline void f0_0(int x) { 33 ; 34} 35 36extern void f0_1(int x) { 37} 38 39void f1(int, ...); 40 41// Statements. 42void f2() { 43 for (;;) { 44 break; 45 continue; 46 } 47 48 while (0) { 49 } 50 51 do { 52 } while (0); 53 54 void *label = &&theif; 55 goto *label; 56 57 goto theif; 58theif: 59 if (0) { 60 ; 61 } else if (0) { 62 } else { 63 } 64 65 switch(0) { 66 case 0: 67 case 1 ... 2: 68 break; 69 default: 70 break; 71 } 72 73 asm ("nop"); 74 int cond; 75 asm goto("" ::::label_true); 76label_true: 77 return; 78} 79 80// Expressions. 81 82#include <stdarg.h> 83 84typedef struct ipair { 85 int first, second; 86} ipair; 87 88void f4(int a0, int a1, int a2, va_list ap) { 89 int t0 = a0 ? a1 : a2; 90 float t1 = (float) a0; 91 ipair t2 = {1, 2}; 92 ipair t2a = { .second = 2 }; 93 int t3 = sizeof(ipair); 94 ipair t4; 95 t4 = (ipair) {1, 2}; 96 extern int g(int); 97 int t5 = g(a0); 98 int t6 = t4.first; 99 int t7[10]; 100 int t8 = t7[a0]; 101 t8++; 102 const char *t9 = __FUNCTION__; 103 char t10 = 'x'; 104 int t11 = __builtin_offsetof(ipair, first); 105 int t12 = __builtin_types_compatible_p(ipair, int); 106 int t12_0 = __builtin_classify_type(t0); 107 int t12_1 = __builtin_classify_type(t1); 108 int t12_2 = __builtin_classify_type(t2); 109 // FIXME: Add _Complex and aggregate cases. 110 int t13 = va_arg(ap, int); 111 va_list t13_0; 112 va_copy(t13_0, ap); 113 int t14 = __extension__(t13); 114 int t15 = +t13; 115 unsigned t16 = t14 ^ t15; 116 int t17 = t14 % t15; 117 int t17_0 = t16 % t16; 118 float t18; 119 int t19 = t18 ? 0 : 1; 120 char *t20; ++t20; --t20; 121 float t21; ++t21; --t21; 122 double t22; ++t22; --t22; 123 long double t23; ++t23; --t23; 124 int t24 = !t19; 125 int t25 = __real t24; 126 int t26 = __imag t24; 127 const char *t27 = t9; 128 t27 += (unsigned char) 0xFF; 129 t27 += (signed char) 0xFF; 130 131 struct { char f0[10]; } *t28; 132 int t29 = t28 - t28; 133 char *t30 = &t28->f0[1]; 134 135 struct s1 { int f0; }; 136 struct s1 t31_a, t31_b; 137 int t31_cond; 138 int t31 = (t31_cond ? t31_a : t31_b).f0; 139 140 _Complex float t32_a, t32_b; 141 int t32_cond; 142 int t32 = __real (t32_cond ? t32_a : t32_b); 143 144 struct { int x, y; } t33, *t34, t35[12], t36(int, float); 145 float t37, *t38, t39[9], t40(double); 146} 147 148// Extended vectors 149 150typedef __attribute__((ext_vector_type(2))) float float2; 151typedef __attribute__((ext_vector_type(4))) float float4; 152 153void f5() { 154 float4 t0 = (float4) { 0, 1, 2, 3 }; 155 float4 t1 = t0; 156 t0.lo.even = t1.hi.x; 157 158 // irgen doesn't support this yet. 159#if 0 160 int t2_cond; 161 float2 t2 = (t2_cond ? t0 : t1).lo; 162#endif 163} 164 165void f6() { 166 const char *s0 = __func__; 167 const char *s1 = __FUNCTION__; 168 const char *s2 = __PRETTY_FUNCTION__; 169} 170 171// Arg mismatch with passed type. 172void f7(x) 173 float x; 174{ 175} 176 177void f8(x) 178 short x; 179{ 180} 181 182// Function which inputs an array 183void f9(int x[]) { } 184 185// Object literals. 186void f10() { 187 struct f10_s0 { 188 char iv0[10]; 189 } x; 190 191 x = (struct f10_s0) { .iv0 = "name" }; 192} 193 194// Nested structures. 195struct s11 { 196 struct s11_2 { 197 int f0; 198 } f0; 199 int f1; 200}; 201 202// Unnamed structures. 203struct s12 { 204 struct { 205 unsigned char aa; 206 unsigned char bb; 207 }; 208}; 209 210void f11() { 211 struct s12 var = { .aa = 33 }; 212} 213