1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2 3 // PR1895 4 // sizeof function 5 int zxcv(void); 6 int x=sizeof(zxcv); 7 int y=__alignof__(zxcv); 8 9 10 void *test(int *i) { 11 short a = 1; 12 i += a; 13 i + a; 14 a + i; 15 } 16 17 _Bool test2b; 18 int test2() { if (test2b); return 0; } 19 20 // PR1921 21 int test3() { 22 const unsigned char *bp; 23 bp -= (short)1; 24 } 25 26 // PR2080 - sizeof void 27 int t1 = sizeof(void); 28 int t2 = __alignof__(void); 29 void test4() { 30 t1 = sizeof(void); 31 t2 = __alignof__(void); 32 33 t1 = sizeof(test4()); 34 t2 = __alignof__(test4()); 35 } 36 37 // 'const float' promotes to double in varargs. 38 int test5(const float x, float float_number) { 39 return __builtin_isless(x, float_number); 40 } 41 42 // this one shouldn't fold 43 int ola() { 44 int a=2; 45 if ((0, (int)a) & 2) { return 1; } 46 return 2; 47 } 48 49 // this one shouldn't fold as well 50 void eMaisUma() { 51 double t[1]; 52 if (*t) 53 return; 54 } 55 56 // rdar://6520707 57 void f0(void (*fp)(void), void (*fp2)(void)) { 58 int x = fp - fp2; 59 } 60 61 // noop casts as lvalues. 62 struct X { 63 int Y; 64 }; 65 struct X foo(); 66 int bar() { 67 return ((struct X)foo()).Y + 1; 68 } 69 70 // PR3809: INC/DEC of function pointers. 71 void f2(void); 72 unsigned f1(void) { 73 void (*fp)(void) = f2; 74 75 ++fp; 76 fp++; 77 --fp; 78 fp--; 79 return (unsigned) fp; 80 } 81 82 union f3_x {int x; float y;}; 83 int f3() {return ((union f3_x)2).x;} 84 85 union f4_y {int x; _Complex float y;}; 86 _Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;} 87 88 struct f5_a { int a; } f5_a; 89 union f5_z {int x; struct f5_a y;}; 90 struct f5_a f5() {return ((union f5_z)f5_a).y;} 91 92 // ?: in "lvalue" 93 struct s6 { int f0; }; 94 int f6(int a0, struct s6 a1, struct s6 a2) { 95 return (a0 ? a1 : a2).f0; 96 } 97 98 // PR4026 99 void f7() { 100 __func__; 101 } 102 103 // PR4067 104 int f8() { 105 return ({ foo(); }).Y; 106 } 107 108 // rdar://6880558 109 struct S; 110 struct C { 111 int i; 112 struct S *tab[]; 113 }; 114 struct S { struct C c; }; 115 void f9(struct S *x) { 116 foo(((void)1, x->c).tab[0]); 117 } 118 119 void f10() { 120 __builtin_sin(0); 121 } 122 123 // rdar://7530813 124 // CHECK: define i32 @f11 125 int f11(long X) { 126 int A[100]; 127 return A[X]; 128 129 // CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8 130 // CHECK: load {{.*}}* [[Xaddr]] 131 // CHECK-NEXT: getelementptr inbounds [100 x i32]* %A, i32 0, 132 // CHECK-NEXT: load i32* 133 } 134 135 int f12() { 136 // PR3150 137 // CHECK: define i32 @f12 138 // CHECK: ret i32 1 139 return 1||1; 140 } 141 142 // Make sure negate of fp uses -0.0 for proper -0 handling. 143 double f13(double X) { 144 // CHECK: define double @f13 145 // CHECK: fsub double -0.0 146 return -X; 147 } 148 149 // Check operations on incomplete types. 150 void f14(struct s14 *a) { 151 (void) &*a; 152 } 153 154 // CHECK: define void @f15 155 void f15() { 156 extern void f15_start(void); 157 f15_start(); 158 // CHECK: call void @f15_start() 159 160 extern void *f15_v(void); 161 extern const void *f15_cv(void); 162 extern volatile void *f15_vv(void); 163 *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v(); 164 *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv(); 165 *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv(); 166 // CHECK-NOT: load 167 // CHECK: ret void 168 } 169 170 // PR8967: this was crashing 171 // CHECK: define void @f16() 172 void f16() { 173 __extension__({ goto lbl; }); 174 lbl: 175 ; 176 } 177 178 // PR13704: negative increment in i128 is not preserved. 179 // CHECK: define void @f17() 180 void f17() { 181 extern void extfunc(__int128); 182 __int128 x = 2; 183 x--; 184 extfunc(x); 185 // CHECK: add nsw i128 %{{.}}, -1 186 } 187