xref: /llvm-project/clang/test/CodeGen/exprs.c (revision 12f78e740c5419f7d1fbcf8f2106e7a40cd1d6f7)
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -Wno-strict-prototypes -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(void) { if (test2b); return 0; }
19 
20 // PR1921
21 void test3(void) {
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(void) {
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(void) {
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(void) {
51   double t[1];
52   if (*t)
53     return;
54 }
55 
56 void f0(void (*fp)(void), void (*fp2)(void)) {
57   int x = fp - fp2;
58 }
59 
60 // noop casts as lvalues.
61 struct X {
62   int Y;
63 };
64 struct X foo();
65 int bar(void) {
66   return ((struct X)foo()).Y + 1;
67 }
68 
69 // PR3809: INC/DEC of function pointers.
70 void f2(void);
71 unsigned f1(void) {
72   void (*fp)(void) = f2;
73 
74   ++fp;
75   fp++;
76   --fp;
77   fp--;
78   return (unsigned) fp;
79 }
80 
81 union f3_x {int x; float y;};
82 int f3(void) {return ((union f3_x)2).x;}
83 
84 union f4_y {int x; _Complex float y;};
85 _Complex float f4(void) {return ((union f4_y)(_Complex float)2.0).y;}
86 
87 struct f5_a { int a; } f5_a;
88 union f5_z {int x; struct f5_a y;};
89 struct f5_a f5(void) {return ((union f5_z)f5_a).y;}
90 
91 // ?: in "lvalue"
92 struct s6 { int f0; };
93 int f6(int a0, struct s6 a1, struct s6 a2) {
94   return (a0 ? a1 : a2).f0;
95 }
96 
97 // PR4026
98 void f7(void) {
99   __func__;
100 }
101 
102 // PR4067
103 int f8(void) {
104   return ({ foo(); }).Y;
105 }
106 
107 struct S;
108 struct C {
109   int i;
110   struct S *tab[];
111 };
112 struct S { struct C c; };
113 void f9(struct S *x) {
114   foo(((void)1, x->c).tab[0]);
115 }
116 
117 void f10(void) {
118   __builtin_sin(0);
119 }
120 
121 // CHECK-LABEL: define{{.*}} i32 @f11
122 int f11(long X) {
123   int A[100];
124   return A[X];
125 
126 // CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
127 // CHECK: [[A:%.*]] = alloca [100 x i32], align
128 // CHECK: [[X:%.*]] = load {{.*}}, ptr [[Xaddr]]
129 // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [100 x i32], ptr [[A]], i64 0, i64 [[X]]
130 // CHECK-NEXT: load i32, ptr [[T0]], align 4
131 }
132 
133 int f12(void) {
134   // PR3150
135   // CHECK-LABEL: define{{.*}} i32 @f12
136   // CHECK: ret i32 1
137   return 1||1;
138 }
139 
140 // Make sure negate of fp uses -0.0 for proper -0 handling.
141 double f13(double X) {
142   // CHECK-LABEL: define{{.*}} double @f13
143   // CHECK: fneg double
144   return -X;
145 }
146 
147 // Check operations on incomplete types.
148 void f14(struct s14 *a) {
149   (void) &*a;
150 }
151 
152 // CHECK-LABEL: define{{.*}} void @f15
153 void f15(void) {
154   extern void f15_start(void);
155   f15_start();
156   // CHECK: call void @f15_start()
157 
158   extern void *f15_v(void);
159   extern const void *f15_cv(void);
160   extern volatile void *f15_vv(void);
161   *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
162   *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
163   *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
164   // CHECK-NOT: load
165   // CHECK: ret void
166 }
167 
168 // PR8967: this was crashing
169 // CHECK-LABEL: define{{.*}} void @f16()
170 void f16(void) {
171   __extension__({ goto lbl; });
172  lbl:
173   ;
174 }
175 
176 // PR13704: negative increment in i128 is not preserved.
177 // CHECK-LABEL: define{{.*}} void @f17()
178 void f17(void) {
179   extern void extfunc(__int128);
180   __int128 x = 2;
181   x--;
182   extfunc(x);
183 // CHECK: add nsw i128 %{{.}}, -1
184 }
185 
186 // PR23597: We should evaluate union cast operands even if the cast is unused.
187 typedef union u {
188     int i;
189 } strct;
190 int returns_int(void);
191 void f18(void) {
192   (strct)returns_int();
193 }
194 // CHECK-LABEL: define{{.*}} void @f18()
195 // CHECK: call i32 @returns_int()
196 
197 // Ensure the right stmt is returned
198 int f19(void) {
199   return ({ 3;;4;; });
200 }
201 // CHECK-LABEL: define{{.*}} i32 @f19()
202 // CHECK: [[T:%.*]] = alloca i32
203 // CHECK: store i32 4, ptr [[T]]
204 // CHECK: [[L:%.*]] = load i32, ptr [[T]]
205 // CHECK: ret i32 [[L]]
206