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 75 return; 76} 77 78// Expressions. 79 80#include <stdarg.h> 81 82typedef struct ipair { 83 int first, second; 84} ipair; 85 86void f4(int a0, int a1, int a2, va_list ap) { 87 int t0 = a0 ? a1 : a2; 88 float t1 = (float) a0; 89 ipair t2 = {1, 2}; 90 ipair t2a = { .second = 2 }; 91 int t3 = sizeof(ipair); 92 ipair t4; 93 t4 = (ipair) {1, 2}; 94 extern int g(int); 95 int t5 = g(a0); 96 int t6 = t4.first; 97 int t7[10]; 98 int t8 = t7[a0]; 99 t8++; 100 const char *t9 = __FUNCTION__; 101 char t10 = 'x'; 102 int t11 = __builtin_offsetof(ipair, first); 103 int t12 = __builtin_types_compatible_p(ipair, int); 104 int t12_0 = __builtin_classify_type(t0); 105 int t12_1 = __builtin_classify_type(t1); 106 int t12_2 = __builtin_classify_type(t2); 107 // FIXME: Add _Complex and aggregate cases. 108 int t13 = va_arg(ap, int); 109 va_list t13_0; 110 va_copy(t13_0, ap); 111 int t14 = __extension__(t13); 112 int t15 = +t13; 113 unsigned t16 = t14 ^ t15; 114 int t17 = t14 % t15; 115 int t17_0 = t16 % t16; 116 float t18; 117 int t19 = t18 ? 0 : 1; 118 char *t20; ++t20; --t20; 119 float t21; ++t21; --t21; 120 double t22; ++t22; --t22; 121 long double t23; ++t23; --t23; 122 int t24 = !t19; 123 int t25 = __real t24; 124 int t26 = __imag t24; 125 const char *t27 = t9; 126 t27 += (unsigned char) 0xFF; 127 t27 += (signed char) 0xFF; 128 129 struct { char f0[10]; } *t28; 130 int t29 = t28 - t28; 131 char *t30 = &t28->f0[1]; 132 133 struct s1 { int f0; }; 134 struct s1 t31_a, t31_b; 135 int t31_cond; 136 int t31 = (t31_cond ? t31_a : t31_b).f0; 137 138 _Complex float t32_a, t32_b; 139 int t32_cond; 140 int t32 = __real (t32_cond ? t32_a : t32_b); 141 142 struct { int x, y; } t33, *t34, t35[12], t36(int, float); 143 float t37, *t38, t39[9], t40(double); 144} 145 146// Extended vectors 147 148typedef __attribute__((ext_vector_type(2))) float float2; 149typedef __attribute__((ext_vector_type(4))) float float4; 150 151void f5() { 152 float4 t0 = (float4) { 0, 1, 2, 3 }; 153 float4 t1 = t0; 154 t0.lo.even = t1.hi.x; 155 156 // irgen doesn't support this yet. 157#if 0 158 int t2_cond; 159 float2 t2 = (t2_cond ? t0 : t1).lo; 160#endif 161} 162 163void f6() { 164 const char *s0 = __func__; 165 const char *s1 = __FUNCTION__; 166 const char *s2 = __PRETTY_FUNCTION__; 167} 168 169// Arg mismatch with passed type. 170void f7(x) 171 float x; 172{ 173} 174 175void f8(x) 176 short x; 177{ 178} 179 180// Function which inputs an array 181void f9(int x[]) { } 182 183// Object literals. 184void f10() { 185 struct f10_s0 { 186 char iv0[10]; 187 } x; 188 189 x = (struct f10_s0) { .iv0 = "name" }; 190} 191 192// Nested structures. 193struct s11 { 194 struct s11_2 { 195 int f0; 196 } f0; 197 int f1; 198}; 199 200// Unnamed structures. 201struct s12 { 202 struct { 203 unsigned char aa; 204 unsigned char bb; 205 }; 206}; 207 208void f11() { 209 struct s12 var = { .aa = 33 }; 210} 211