xref: /aosp_15_r20/external/clang/test/CodeGenCXX/conditional-gnu-ext.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // rdar: // 8353567
3*67e74705SXin Li // pr7726
4*67e74705SXin Li 
5*67e74705SXin Li extern "C" int printf(...);
6*67e74705SXin Li 
test0()7*67e74705SXin Li void test0() {
8*67e74705SXin Li // CHECK: call i32 (...) @printf({{.*}}, i8* inttoptr (i64 3735928559 to i8*))
9*67e74705SXin Li     printf("%p\n", (void *)0xdeadbeef ? : (void *)0xaaaaaa);
10*67e74705SXin Li }
11*67e74705SXin Li 
12*67e74705SXin Li // rdar://8446940
13*67e74705SXin Li namespace radar8446940 {
14*67e74705SXin Li extern "C" void abort();
15*67e74705SXin Li 
main()16*67e74705SXin Li int main () {
17*67e74705SXin Li   char x[1];
18*67e74705SXin Li   char *y = x ? : 0;
19*67e74705SXin Li 
20*67e74705SXin Li   if (x != y)
21*67e74705SXin Li     abort();
22*67e74705SXin Li }
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li namespace radar8453812 {
26*67e74705SXin Li extern "C" void abort();
getComplex(_Complex int val)27*67e74705SXin Li _Complex int getComplex(_Complex int val) {
28*67e74705SXin Li   static int count;
29*67e74705SXin Li   if (count++)
30*67e74705SXin Li     abort();
31*67e74705SXin Li   return val;
32*67e74705SXin Li }
33*67e74705SXin Li 
cmplx()34*67e74705SXin Li _Complex int cmplx() {
35*67e74705SXin Li     _Complex int cond;
36*67e74705SXin Li     _Complex int rhs;
37*67e74705SXin Li 
38*67e74705SXin Li     return getComplex(1+2i) ? : rhs;
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li // lvalue test
foo(int & lv)42*67e74705SXin Li void foo (int& lv) {
43*67e74705SXin Li   ++lv;
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li int global = 1;
47*67e74705SXin Li 
cond()48*67e74705SXin Li int &cond() {
49*67e74705SXin Li   static int count;
50*67e74705SXin Li   if (count++)
51*67e74705SXin Li     abort();
52*67e74705SXin Li   return global;
53*67e74705SXin Li }
54*67e74705SXin Li 
55*67e74705SXin Li 
main()56*67e74705SXin Li int main() {
57*67e74705SXin Li   cmplx();
58*67e74705SXin Li   int rhs = 10;
59*67e74705SXin Li   foo (cond()? : rhs);
60*67e74705SXin Li   return  global-2;
61*67e74705SXin Li }
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li namespace test3 {
65*67e74705SXin Li   struct A {
66*67e74705SXin Li     A();
67*67e74705SXin Li     A(const A&);
68*67e74705SXin Li     ~A();
69*67e74705SXin Li   };
70*67e74705SXin Li 
71*67e74705SXin Li   struct B {
72*67e74705SXin Li     B();
73*67e74705SXin Li     B(const B&);
74*67e74705SXin Li     ~B();
75*67e74705SXin Li     operator bool();
76*67e74705SXin Li     operator A();
77*67e74705SXin Li   };
78*67e74705SXin Li 
test0(B & x)79*67e74705SXin Li   B test0(B &x) {
80*67e74705SXin Li     // CHECK-LABEL:    define void @_ZN5test35test0ERNS_1BE(
81*67e74705SXin Li     // CHECK:      [[X:%.*]] = alloca [[B:%.*]]*,
82*67e74705SXin Li     // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
83*67e74705SXin Li     // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
84*67e74705SXin Li     // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
85*67e74705SXin Li     // CHECK-NEXT: br i1 [[BOOL]]
86*67e74705SXin Li     // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[T0]])
87*67e74705SXin Li     // CHECK-NEXT: br label
88*67e74705SXin Li     // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
89*67e74705SXin Li     // CHECK-NEXT: br label
90*67e74705SXin Li     // CHECK:      ret void
91*67e74705SXin Li     return x ?: B();
92*67e74705SXin Li   }
93*67e74705SXin Li 
test1()94*67e74705SXin Li   B test1() {
95*67e74705SXin Li     // CHECK-LABEL:    define void @_ZN5test35test1Ev(
96*67e74705SXin Li     // CHECK:      [[TEMP:%.*]] = alloca [[B]],
97*67e74705SXin Li     // CHECK-NEXT: call  void @_ZN5test312test1_helperEv([[B]]* sret [[TEMP]])
98*67e74705SXin Li     // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
99*67e74705SXin Li     // CHECK-NEXT: br i1 [[BOOL]]
100*67e74705SXin Li     // CHECK:      call void @_ZN5test31BC1ERKS0_([[B]]* [[RESULT:%.*]], [[B]]* dereferenceable({{[0-9]+}}) [[TEMP]])
101*67e74705SXin Li     // CHECK-NEXT: br label
102*67e74705SXin Li     // CHECK:      call void @_ZN5test31BC1Ev([[B]]* [[RESULT]])
103*67e74705SXin Li     // CHECK-NEXT: br label
104*67e74705SXin Li     // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
105*67e74705SXin Li     // CHECK-NEXT: ret void
106*67e74705SXin Li     extern B test1_helper();
107*67e74705SXin Li     return test1_helper() ?: B();
108*67e74705SXin Li   }
109*67e74705SXin Li 
110*67e74705SXin Li 
test2(B & x)111*67e74705SXin Li   A test2(B &x) {
112*67e74705SXin Li     // CHECK-LABEL:    define void @_ZN5test35test2ERNS_1BE(
113*67e74705SXin Li     // CHECK:      [[X:%.*]] = alloca [[B]]*,
114*67e74705SXin Li     // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]]
115*67e74705SXin Li     // CHECK-NEXT: [[T0:%.*]] = load [[B]]*, [[B]]** [[X]]
116*67e74705SXin Li     // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[T0]])
117*67e74705SXin Li     // CHECK-NEXT: br i1 [[BOOL]]
118*67e74705SXin Li     // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A:%.*]]* sret [[RESULT:%.*]], [[B]]* [[T0]])
119*67e74705SXin Li     // CHECK-NEXT: br label
120*67e74705SXin Li     // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
121*67e74705SXin Li     // CHECK-NEXT: br label
122*67e74705SXin Li     // CHECK:      ret void
123*67e74705SXin Li     return x ?: A();
124*67e74705SXin Li   }
125*67e74705SXin Li 
test3()126*67e74705SXin Li   A test3() {
127*67e74705SXin Li     // CHECK-LABEL:    define void @_ZN5test35test3Ev(
128*67e74705SXin Li     // CHECK:      [[TEMP:%.*]] = alloca [[B]],
129*67e74705SXin Li     // CHECK-NEXT: call  void @_ZN5test312test3_helperEv([[B]]* sret [[TEMP]])
130*67e74705SXin Li     // CHECK-NEXT: [[BOOL:%.*]] = call zeroext i1 @_ZN5test31BcvbEv([[B]]* [[TEMP]])
131*67e74705SXin Li     // CHECK-NEXT: br i1 [[BOOL]]
132*67e74705SXin Li     // CHECK:      call void @_ZN5test31BcvNS_1AEEv([[A]]* sret [[RESULT:%.*]], [[B]]* [[TEMP]])
133*67e74705SXin Li     // CHECK-NEXT: br label
134*67e74705SXin Li     // CHECK:      call void @_ZN5test31AC1Ev([[A]]* [[RESULT]])
135*67e74705SXin Li     // CHECK-NEXT: br label
136*67e74705SXin Li     // CHECK:      call void @_ZN5test31BD1Ev([[B]]* [[TEMP]])
137*67e74705SXin Li     // CHECK-NEXT: ret void
138*67e74705SXin Li     extern B test3_helper();
139*67e74705SXin Li     return test3_helper() ?: A();
140*67e74705SXin Li   }
141*67e74705SXin Li 
142*67e74705SXin Li }
143*67e74705SXin Li 
144*67e74705SXin Li namespace test4 {
145*67e74705SXin Li   // Make sure this doesn't crash.
f()146*67e74705SXin Li   void f() {
147*67e74705SXin Li     const int a = 10, b = 20;
148*67e74705SXin Li     const int *c = &(a ?: b);
149*67e74705SXin Li   }
150*67e74705SXin Li }
151