| //-*- C -*- |
| |
| /* This is a |
| multiline comment */ |
| |
| // Intended to exercise all syntactic parts of the C language. |
| |
| int g0; |
| int g1, g2; |
| |
| struct s0; |
| |
| struct s0 { |
| int x; |
| }; |
| |
| int g3 = 10; |
| |
| __asm(""); |
| |
| typedef int td0; |
| |
| td0 g4; |
| |
| enum e0 { |
| ec0 |
| }; |
| |
| static void f0(int x) { |
| } |
| |
| inline void f0_0(int x) { |
| ; |
| } |
| |
| extern void f0_1(int x) { |
| } |
| |
| void f1(int, ...); |
| |
| // Statements. |
| void f2() { |
| for (;;) { |
| break; |
| continue; |
| } |
| |
| while (0) { |
| } |
| |
| do { |
| } while (0); |
| |
| void *label = &&theif; |
| goto *label; |
| |
| goto theif; |
| theif: |
| if (0) { |
| ; |
| } else if (0) { |
| } else { |
| } |
| |
| switch(0) { |
| case 0: |
| case 1 ... 2: |
| break; |
| default: |
| break; |
| } |
| |
| asm ("nop"); |
| |
| return; |
| } |
| |
| // Expressions. |
| |
| #include <stdarg.h> |
| |
| typedef struct ipair { |
| int first, second; |
| } ipair; |
| |
| void f4(int a0, int a1, int a2, va_list ap) { |
| int t0 = a0 ? a1 : a2; |
| float t1 = (float) a0; |
| ipair t2 = {1, 2}; |
| ipair t2a = { .second = 2 }; |
| int t3 = sizeof(ipair); |
| ipair t4; |
| t4 = (ipair) {1, 2}; |
| extern int g(int); |
| int t5 = g(a0); |
| int t6 = t4.first; |
| int t7[10]; |
| int t8 = t7[a0]; |
| t8++; |
| const char *t9 = __FUNCTION__; |
| char t10 = 'x'; |
| int t11 = __builtin_offsetof(ipair, first); |
| int t12 = __builtin_types_compatible_p(ipair, int); |
| int t12_0 = __builtin_classify_type(t0); |
| int t12_1 = __builtin_classify_type(t1); |
| int t12_2 = __builtin_classify_type(t2); |
| // FIXME: Add _Complex and aggregate cases. |
| int t13 = va_arg(ap, int); |
| va_list t13_0; |
| va_copy(t13_0, ap); |
| int t14 = __extension__(t13); |
| int t15 = +t13; |
| unsigned t16 = t14 ^ t15; |
| int t17 = t14 % t15; |
| int t17_0 = t16 % t16; |
| float t18; |
| int t19 = t18 ? 0 : 1; |
| char *t20; ++t20; --t20; |
| float t21; ++t21; --t21; |
| double t22; ++t22; --t22; |
| long double t23; ++t23; --t23; |
| int t24 = !t19; |
| int t25 = __real t24; |
| int t26 = __imag t24; |
| const char *t27 = t9; |
| t27 += (unsigned char) 0xFF; |
| t27 += (signed char) 0xFF; |
| |
| struct { char f0[10]; } *t28; |
| int t29 = t28 - t28; |
| char *t30 = &t28->f0[1]; |
| |
| struct s1 { int f0; }; |
| struct s1 t31_a, t31_b; |
| int t31_cond; |
| int t31 = (t31_cond ? t31_a : t31_b).f0; |
| |
| _Complex float t32_a, t32_b; |
| int t32_cond; |
| int t32 = __real (t32_cond ? t32_a : t32_b); |
| |
| struct { int x, y; } t33, *t34, t35[12], t36(int, float); |
| float t37, *t38, t39[9], t40(double); |
| } |
| |
| // Extended vectors |
| |
| typedef __attribute__((ext_vector_type(2))) float float2; |
| typedef __attribute__((ext_vector_type(4))) float float4; |
| |
| void f5() { |
| float4 t0 = (float4) { 0, 1, 2, 3 }; |
| float4 t1 = t0; |
| t0.lo.even = t1.hi.x; |
| |
| // irgen doesn't support this yet. |
| #if 0 |
| int t2_cond; |
| float2 t2 = (t2_cond ? t0 : t1).lo; |
| #endif |
| } |
| |
| void f6() { |
| const char *s0 = __func__; |
| const char *s1 = __FUNCTION__; |
| const char *s2 = __PRETTY_FUNCTION__; |
| } |
| |
| // Arg mismatch with passed type. |
| void f7(x) |
| float x; |
| { |
| } |
| |
| void f8(x) |
| short x; |
| { |
| } |
| |
| // Function which inputs an array |
| void f9(int x[]) { } |
| |
| // Object literals. |
| void f10() { |
| struct f10_s0 { |
| char iv0[10]; |
| } x; |
| |
| x = (struct f10_s0) { .iv0 = "name" }; |
| } |
| |
| // Nested structures. |
| struct s11 { |
| struct s11_2 { |
| int f0; |
| } f0; |
| int f1; |
| }; |
| |
| // Unnamed structures. |
| struct s12 { |
| struct { |
| unsigned char aa; |
| unsigned char bb; |
| }; |
| }; |
| |
| void f11() { |
| struct s12 var = { .aa = 33 }; |
| } |