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