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 
test(int * i)10 void *test(int *i) {
11  short a = 1;
12  i += a;
13  i + a;
14  a + i;
15 }
16 
17 _Bool test2b;
test2()18 int test2() { if (test2b); return 0; }
19 
20 // PR1921
test3()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);
test4()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.
test5(const float x,float float_number)38 int test5(const float x, float float_number) {
39   return __builtin_isless(x, float_number);
40 }
41 
42 // this one shouldn't fold
ola()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
eMaisUma()50 void eMaisUma() {
51   double t[1];
52   if (*t)
53     return;
54 }
55 
56 // rdar://6520707
f0(void (* fp)(void),void (* fp2)(void))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();
bar()66 int bar() {
67   return ((struct X)foo()).Y + 1;
68 }
69 
70 // PR3809: INC/DEC of function pointers.
71 void f2(void);
f1(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;};
f3()83 int f3() {return ((union f3_x)2).x;}
84 
85 union f4_y {int x; _Complex float y;};
f4()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;};
f5()90 struct f5_a f5() {return ((union f5_z)f5_a).y;}
91 
92 // ?: in "lvalue"
93 struct s6 { int f0; };
f6(int a0,struct s6 a1,struct s6 a2)94 int f6(int a0, struct s6 a1, struct s6 a2) {
95   return (a0 ? a1 : a2).f0;
96 }
97 
98 // PR4026
f7()99 void f7() {
100   __func__;
101 }
102 
103 // PR4067
f8()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; };
f9(struct S * x)115 void f9(struct S *x) {
116   foo(((void)1, x->c).tab[0]);
117 }
118 
f10()119 void f10() {
120   __builtin_sin(0);
121 }
122 
123 // rdar://7530813
124 // CHECK-LABEL: define{{.*}} i32 @f11
f11(long X)125 int f11(long X) {
126   int A[100];
127   return A[X];
128 
129 // CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
130 // CHECK: [[A:%.*]] = alloca [100 x i32], align
131 // CHECK: [[X:%.*]] = load {{.*}}, {{.*}}* [[Xaddr]]
132 // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [100 x i32], [100 x i32]* [[A]], i64 0, i64 [[X]]
133 // CHECK-NEXT: load i32, i32* [[T0]], align 4
134 }
135 
f12()136 int f12() {
137   // PR3150
138   // CHECK-LABEL: define{{.*}} i32 @f12
139   // CHECK: ret i32 1
140   return 1||1;
141 }
142 
143 // Make sure negate of fp uses -0.0 for proper -0 handling.
f13(double X)144 double f13(double X) {
145   // CHECK-LABEL: define{{.*}} double @f13
146   // CHECK: fneg double
147   return -X;
148 }
149 
150 // Check operations on incomplete types.
f14(struct s14 * a)151 void f14(struct s14 *a) {
152   (void) &*a;
153 }
154 
155 // CHECK-LABEL: define{{.*}} void @f15
f15()156 void f15() {
157   extern void f15_start(void);
158   f15_start();
159   // CHECK: call void @f15_start()
160 
161   extern void *f15_v(void);
162   extern const void *f15_cv(void);
163   extern volatile void *f15_vv(void);
164   *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
165   *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
166   *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
167   // CHECK-NOT: load
168   // CHECK: ret void
169 }
170 
171 // PR8967: this was crashing
172 // CHECK-LABEL: define{{.*}} void @f16()
f16()173 void f16() {
174   __extension__({ goto lbl; });
175  lbl:
176   ;
177 }
178 
179 // PR13704: negative increment in i128 is not preserved.
180 // CHECK-LABEL: define{{.*}} void @f17()
f17()181 void f17() {
182   extern void extfunc(__int128);
183   __int128 x = 2;
184   x--;
185   extfunc(x);
186 // CHECK: add nsw i128 %{{.}}, -1
187 }
188 
189 // PR23597: We should evaluate union cast operands even if the cast is unused.
190 typedef union u {
191     int i;
192 } strct;
193 int returns_int(void);
f18()194 void f18() {
195   (strct)returns_int();
196 }
197 // CHECK-LABEL: define{{.*}} void @f18()
198 // CHECK: call i32 @returns_int()
199 
200 // Ensure the right stmt is returned
f19()201 int f19() {
202   return ({ 3;;4;; });
203 }
204 // CHECK-LABEL: define{{.*}} i32 @f19()
205 // CHECK: [[T:%.*]] = alloca i32
206 // CHECK: store i32 4, i32* [[T]]
207 // CHECK: [[L:%.*]] = load i32, i32* [[T]]
208 // CHECK: ret i32 [[L]]
209