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