// RUN: %clang_cc1 -Wno-unused-value -emit-llvm -o - %s | FileCheck %s // rdar: //8540501 extern "C" int printf(...); extern "C" void abort(); struct A { int i; A (int j) : i(j) {printf("this = %p A(%d)\n", this, j);} A (const A &j) : i(j.i) {printf("this = %p const A&(%d)\n", this, i);} A& operator= (const A &j) { i = j.i; abort(); return *this; } ~A() { printf("this = %p ~A(%d)\n", this, i); } }; struct B { int i; B (const A& a) { i = a.i; } B() {printf("this = %p B()\n", this);} B (const B &j) : i(j.i) {printf("this = %p const B&(%d)\n", this, i);} ~B() { printf("this = %p ~B(%d)\n", this, i); } }; A foo(int j) { return ({ j ? A(1) : A(0); }); } void foo2() { A b = ({ A a(1); A a1(2); A a2(3); a1; a2; a; }); if (b.i != 1) abort(); A c = ({ A a(1); A a1(2); A a2(3); a1; a2; a; A a3(4); a2; a3; }); if (c.i != 4) abort(); } void foo3() { const A &b = ({ A a(1); a; }); if (b.i != 1) abort(); } void foo4() { // CHECK: call {{.*}} @_ZN1AC1Ei // CHECK: call {{.*}} @_ZN1AC1ERKS_ // CHECK: call {{.*}} @_ZN1AD1Ev // CHECK: call {{.*}} @_ZN1BC1ERK1A // CHECK: call {{.*}} @_ZN1AD1Ev const B &b = ({ A a(1); a; }); if (b.i != 1) abort(); } int main() { foo2(); foo3(); foo4(); return foo(1).i-1; } // rdar: // 8600553 int a[128]; int* foo5() { // CHECK-NOT: memcpy // Check that array-to-pointer conversion occurs in a // statement-expression. return (({ a; })); }