14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -std=c++11 -O1 -DWITH_DTOR -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-DTOR %s 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -std=c++11 -O1 -triple x86_64 -emit-llvm -o - | FileCheck -check-prefix=CHECK-NO-DTOR %s 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct A { 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar A(); 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef WITH_DTOR 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ~A(); 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar char a[1024]; 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar operator bool() const; 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Foo(T &&); 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Bar(T &&); 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarT Baz(); 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test1() { 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test1 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]]) 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_ 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]]) 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]]) 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_ 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR]]) 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR-LABEL: Test1 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]]) 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_ 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR:[^ ]+]]) 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_ 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: } 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const A &a = A{}; 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(a); 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar { 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const A &a = A{}; 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(a); 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test2() { 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test2 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR1:[0-9]+]]) 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]]) 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_ 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR2:[0-9]+]]) 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]]) 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIRK1AEvOT_ 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR2]]) 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR2]]) 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[VAR1]]) 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR1]]) 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR-LABEL: Test2 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR1:[0-9]+]]) 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR1:[^ ]+]]) 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_ 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR2:[0-9]+]]) 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_ZN1AC1Ev(%struct.A* nonnull %[[VAR2:[^ ]+]]) 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @_Z3FooIRK1AEvOT_ 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR2]]) 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR1]]) 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-NO-DTOR: } 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const A &a = A{}; 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(a); 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const A &b = A{}; 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(b); 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test3() { 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test3 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // if.then: 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // cleanup: 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // cleanup: 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const A &a = A{}; 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const A &b = A(a)) { 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(b); 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Bar(a); 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test4() { 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test4 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // for.cond.cleanup: 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // for.body: 1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const A &a = A{}; a;) { 1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(a); 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint Test5() { 1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test5 1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start 1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call i32 @_Z3BazIiET_v() 1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: store 1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIRKiEvOT_ 1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: load 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const int &a = Baz<int>(); 1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(a); 1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return a; 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test6() { 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test6 1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 {{[0-9]+}}, i8* %[[ADDR:[0-9]+]]) 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call i32 @_Z3BazIiET_v() 1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: store 1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIiEvOT_ 1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 {{[0-9]+}}, i8* %[[ADDR]]) 1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 {{[0-9]+}}, i8* %[[ADDR:[0-9]+]]) 1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call i32 @_Z3BazIiET_v() 1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: store 1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooIiEvOT_ 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 {{[0-9]+}}, i8* %[[ADDR]]) 1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(Baz<int>()); 1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(Baz<int>()); 1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Test7() { 1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR-LABEL: Test7 1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]]) 1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]]) 1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]]) 1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.start(i64 1024, i8* %[[ADDR:[0-9]+]]) 1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3BazI1AET_v({{.*}} %[[SLOT:[^ ]+]]) 1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_Z3FooI1AEvOT_({{.*}} %[[SLOT]]) 1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @_ZN1AD1Ev(%struct.A* nonnull %[[SLOT]]) 1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: call void @llvm.lifetime.end(i64 1024, i8* %[[ADDR]]) 1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK-DTOR: } 1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(Baz<A>()); 1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Foo(Baz<A>()); 1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 169