xref: /aosp_15_r20/external/clang/test/CodeGenCXX/stmtexpr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -Wno-unused-value -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // rdar: //8540501
3*67e74705SXin Li extern "C" int printf(...);
4*67e74705SXin Li extern "C" void abort();
5*67e74705SXin Li 
6*67e74705SXin Li struct A
7*67e74705SXin Li {
8*67e74705SXin Li   int i;
AA9*67e74705SXin Li   A (int j) : i(j) {printf("this = %p A(%d)\n", this, j);}
AA10*67e74705SXin Li   A (const A &j) : i(j.i) {printf("this = %p const A&(%d)\n", this, i);}
operator =A11*67e74705SXin Li   A& operator= (const A &j) { i = j.i; abort(); return *this; }
~AA12*67e74705SXin Li   ~A() { printf("this = %p ~A(%d)\n", this, i); }
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li struct B
16*67e74705SXin Li {
17*67e74705SXin Li   int i;
BB18*67e74705SXin Li   B (const A& a) { i = a.i; }
BB19*67e74705SXin Li   B() {printf("this = %p B()\n", this);}
BB20*67e74705SXin Li   B (const B &j) : i(j.i) {printf("this = %p const B&(%d)\n", this, i);}
~BB21*67e74705SXin Li   ~B() { printf("this = %p ~B(%d)\n", this, i); }
22*67e74705SXin Li };
23*67e74705SXin Li 
foo(int j)24*67e74705SXin Li A foo(int j)
25*67e74705SXin Li {
26*67e74705SXin Li   return ({ j ? A(1) : A(0); });
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li 
foo2()30*67e74705SXin Li void foo2()
31*67e74705SXin Li {
32*67e74705SXin Li   A b = ({ A a(1); A a1(2); A a2(3); a1; a2; a; });
33*67e74705SXin Li   if (b.i != 1)
34*67e74705SXin Li     abort();
35*67e74705SXin Li   A c = ({ A a(1); A a1(2); A a2(3); a1; a2; a; A a3(4); a2; a3; });
36*67e74705SXin Li   if (c.i != 4)
37*67e74705SXin Li     abort();
38*67e74705SXin Li }
39*67e74705SXin Li 
foo3()40*67e74705SXin Li void foo3()
41*67e74705SXin Li {
42*67e74705SXin Li   const A &b = ({ A a(1); a; });
43*67e74705SXin Li   if (b.i != 1)
44*67e74705SXin Li     abort();
45*67e74705SXin Li }
46*67e74705SXin Li 
foo4()47*67e74705SXin Li void foo4()
48*67e74705SXin Li {
49*67e74705SXin Li // CHECK: call {{.*}} @_ZN1AC1Ei
50*67e74705SXin Li // CHECK: call {{.*}} @_ZN1AC1ERKS_
51*67e74705SXin Li // CHECK: call {{.*}} @_ZN1AD1Ev
52*67e74705SXin Li // CHECK: call {{.*}} @_ZN1BC1ERK1A
53*67e74705SXin Li // CHECK: call {{.*}} @_ZN1AD1Ev
54*67e74705SXin Li   const B &b = ({ A a(1); a; });
55*67e74705SXin Li   if (b.i != 1)
56*67e74705SXin Li     abort();
57*67e74705SXin Li }
58*67e74705SXin Li 
main()59*67e74705SXin Li int main()
60*67e74705SXin Li {
61*67e74705SXin Li   foo2();
62*67e74705SXin Li   foo3();
63*67e74705SXin Li   foo4();
64*67e74705SXin Li   return foo(1).i-1;
65*67e74705SXin Li }
66*67e74705SXin Li 
67*67e74705SXin Li // rdar: // 8600553
68*67e74705SXin Li int a[128];
foo5()69*67e74705SXin Li int* foo5() {
70*67e74705SXin Li // CHECK-NOT: memcpy
71*67e74705SXin Li   // Check that array-to-pointer conversion occurs in a
72*67e74705SXin Li   // statement-expression.
73*67e74705SXin Li   return (({ a; }));
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li // <rdar://problem/14074868>
77*67e74705SXin Li // Make sure this doesn't crash.
foo5(bool b)78*67e74705SXin Li int foo5(bool b) {
79*67e74705SXin Li   int y = 0;
80*67e74705SXin Li   y = ({ A a(1); if (b) goto G; a.i; });
81*67e74705SXin Li   G: return y;
82*67e74705SXin Li }
83