322 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -fblocks -Wno-return-stack-address -triple x86_64-unknown-unknown-gnu -emit-llvm -O1 -o - %s | FileCheck %s2 3struct alignas(4) X {4 X();5 X(const X &);6 X(X &&);7};8 9#define L(A, B, C) void l##A() { \10 auto t = []<class T = X>() -> C { \11 T t; \12 return B; \13 }(); \14}15 16// CHECK-LABEL: define{{.*}} void @_Z2l1v17// CHECK: call {{.*}} @_ZN1XC1Ev18// CHECK-NEXT: call void @llvm.lifetime.end19// CHECK-NEXT: ret void20L(1, t, X);21 22// CHECK-LABEL: define{{.*}} void @_Z2l2v23// CHECK: call {{.*}} @_ZN1XC1Ev24// CHECK-NEXT: call void @llvm.lifetime.end25// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_26// CHECK-NEXT: call void @llvm.lifetime.end27// CHECK-NEXT: ret void28L(2, t, X&);29 30// CHECK-LABEL: define{{.*}} void @_Z2l3v31// CHECK: call {{.*}} @_ZN1XC1Ev32// CHECK-NEXT: call void @llvm.lifetime.end33// CHECK-NEXT: ret void34L(3, t, T);35 36// CHECK-LABEL: define{{.*}} void @_Z2l4v37// CHECK: call {{.*}} @_ZN1XC1Ev38// CHECK-NEXT: call void @llvm.lifetime.end39// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_40// CHECK-NEXT: call void @llvm.lifetime.end41// CHECK-NEXT: ret void42L(4, t, T&);43 44// CHECK-LABEL: define{{.*}} void @_Z2l5v45// CHECK: call {{.*}} @_ZN1XC1Ev46// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_47// CHECK-NEXT: call void @llvm.lifetime.end48// CHECK-NEXT: call void @llvm.lifetime.end49// CHECK-NEXT: ret void50L(5, t, auto);51 52// CHECK-LABEL: define{{.*}} void @_Z2l6v53// CHECK: call {{.*}} @_ZN1XC1Ev54// CHECK-NEXT: call void @llvm.lifetime.end55// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_56// CHECK-NEXT: call void @llvm.lifetime.end57// CHECK-NEXT: ret void58L(6, t, auto&);59 60// CHECK-LABEL: define{{.*}} void @_Z2l7v61// CHECK: call {{.*}} @_ZN1XC1Ev62// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_63// CHECK-NEXT: call void @llvm.lifetime.end64// CHECK-NEXT: call void @llvm.lifetime.end65// CHECK-NEXT: ret void66L(7, t, decltype(auto));67 68// CHECK-LABEL: define{{.*}} void @_Z2l8v69// CHECK: call {{.*}} @_ZN1XC1Ev70// CHECK-NEXT: call void @llvm.lifetime.end71// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_72// CHECK-NEXT: call void @llvm.lifetime.end73// CHECK-NEXT: ret void74L(8, (t), decltype(auto));75 76#undef L77 78#define F(A, B, C) template<class T = X> static inline auto tf##A() -> C { \79 T t; \80 return B; \81} \82void f##A() { auto t = tf##A(); } \83 84// CHECK-LABEL: define{{.*}} void @_Z2f1v85// CHECK: call {{.*}} @_ZN1XC1Ev86// CHECK-NEXT: call void @llvm.lifetime.end87// CHECK-NEXT: ret void88F(1, t, X);89 90// CHECK-LABEL: define{{.*}} void @_Z2f2v91// CHECK: call {{.*}} @_ZN1XC1Ev92// CHECK-NEXT: call void @llvm.lifetime.end93// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_94// CHECK-NEXT: call void @llvm.lifetime.end95// CHECK-NEXT: ret void96F(2, t, X&);97 98// CHECK-LABEL: define{{.*}} void @_Z2f3v99// CHECK: call {{.*}} @_ZN1XC1Ev100// CHECK-NEXT: call void @llvm.lifetime.end101// CHECK-NEXT: ret void102F(3, t, T);103 104// CHECK-LABEL: define{{.*}} void @_Z2f4v105// CHECK: call {{.*}} @_ZN1XC1Ev106// CHECK-NEXT: call void @llvm.lifetime.end107// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_108// CHECK-NEXT: call void @llvm.lifetime.end109// CHECK-NEXT: ret void110F(4, t, T&);111 112// CHECK-LABEL: define{{.*}} void @_Z2f5v113// CHECK: call {{.*}} @_ZN1XC1Ev114// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_115// CHECK-NEXT: call void @llvm.lifetime.end116// CHECK-NEXT: call void @llvm.lifetime.end117// CHECK-NEXT: ret void118F(5, t, auto);119 120// CHECK-LABEL: define{{.*}} void @_Z2f6v121// CHECK: call {{.*}} @_ZN1XC1Ev122// CHECK-NEXT: call void @llvm.lifetime.end123// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_124// CHECK-NEXT: call void @llvm.lifetime.end125// CHECK-NEXT: ret void126F(6, t, auto&);127 128// CHECK-LABEL: define{{.*}} void @_Z2f7v129// CHECK: call {{.*}} @_ZN1XC1Ev130// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_131// CHECK-NEXT: call void @llvm.lifetime.end132// CHECK-NEXT: call void @llvm.lifetime.end133// CHECK-NEXT: ret void134F(7, t, decltype(auto));135 136// CHECK-LABEL: define{{.*}} void @_Z2f8v137// CHECK: call {{.*}} @_ZN1XC1Ev138// CHECK-NEXT: call void @llvm.lifetime.end139// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_140// CHECK-NEXT: call void @llvm.lifetime.end141// CHECK-NEXT: ret void142F(8, (t), decltype(auto));143 144#undef F145 146#define B(A, B) void b##A() { \147 auto t = []<class T = X>() { return ^ B () { \148 T t; \149 return t; \150 }; }()(); \151}152 153// CHECK-LABEL: define{{.*}} void @_Z2b1v154// CHECK: call {{.*}} @_ZN1XC1Ev155// CHECK-NEXT: call void @llvm.lifetime.end156// CHECK-NEXT: ret void157B(1, X);158 159// CHECK-LABEL: define{{.*}} void @_Z2b2v160// CHECK: call {{.*}} @_ZN1XC1Ev161// CHECK-NEXT: call void @llvm.lifetime.end162// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_163// CHECK-NEXT: call void @llvm.lifetime.end164// CHECK-NEXT: ret void165B(2, X&);166 167// CHECK-LABEL: define{{.*}} void @_Z2b3v168// CHECK: call {{.*}} @_ZN1XC1Ev169// CHECK-NEXT: call void @llvm.lifetime.end170// CHECK-NEXT: ret void171B(3, T);172 173// CHECK-LABEL: define{{.*}} void @_Z2b4v174// CHECK: call {{.*}} @_ZN1XC1Ev175// CHECK-NEXT: call void @llvm.lifetime.end176// CHECK-NEXT: call {{.*}} @_ZN1XC1ERKS_177// CHECK-NEXT: call void @llvm.lifetime.end178// CHECK-NEXT: ret void179B(4, T&);180 181// CHECK-LABEL: define{{.*}} void @_Z2b5v182// CHECK: call {{.*}} @_ZN1XC1Ev183// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_184// CHECK-NEXT: call void @llvm.lifetime.end185// CHECK-NEXT: call void @llvm.lifetime.end186// CHECK-NEXT: ret void187B(5, );188 189#undef B190 191// CHECK-LABEL: define{{.*}} void @_Z6f_attrv192// CHECK: call {{.*}} @_ZN1XC1Ev193// CHECK-NEXT: call void @llvm.lifetime.end194// CHECK-NEXT: ret void195template<class T = X> [[gnu::cdecl]] static inline auto tf_attr() -> X {196 T t;197 return t;198}199void f_attr() { auto t = tf_attr(); }200 201// CHECK-LABEL: define{{.*}} void @_Z6b_attrv202// CHECK: call {{.*}} @_ZN1XC1Ev203// CHECK-NEXT: call void @llvm.lifetime.end204// CHECK-NEXT: ret void205void b_attr() {206 auto t = []<class T = X>() {207 return ^X() [[clang::vectorcall]] {208 T t;209 return t;210 };211 }()();212}213 214namespace test_alignas {215 216template <int A> X t1() {217 X a [[gnu::aligned(A)]];218 return a;219}220 221// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi1EEE1Xv222// CHECK: call {{.*}} @_ZN1XC1Ev223// CHECK-NEXT: ret void224template X t1<1>();225 226// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi4EEE1Xv227// CHECK: call {{.*}} @_ZN1XC1Ev228// CHECK-NEXT: ret void229template X t1<4>();230 231// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi8EEE1Xv232// CHECK: call {{.*}} @_ZN1XC1Ev233// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_234// CHECK-NEXT: call void @llvm.lifetime.end235template X t1<8>();236 237template <int A> X t2() {238 X a [[gnu::aligned(1)]] [[gnu::aligned(A)]] [[gnu::aligned(2)]];239 return a;240}241 242// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi1EEE1Xv243// CHECK: call {{.*}} @_ZN1XC1Ev244// CHECK-NEXT: ret void245template X t2<1>();246 247// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi4EEE1Xv248// CHECK: call {{.*}} @_ZN1XC1Ev249// CHECK-NEXT: ret void250template X t2<4>();251 252// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi8EEE1Xv253// CHECK: call {{.*}} @_ZN1XC1Ev254// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_255// CHECK-NEXT: call void @llvm.lifetime.end256template X t2<8>();257 258// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t3Ev259// CHECK: call {{.*}} @_ZN1XC1Ev260// CHECK-NEXT: ret void261X t3() {262 X a [[gnu::aligned(1)]];263 return a;264}265 266// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t4Ev267// CHECK: call {{.*}} @_ZN1XC1Ev268// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_269// CHECK-NEXT: call void @llvm.lifetime.end270X t4() {271 X a [[gnu::aligned(8)]];272 return a;273}274 275// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t5Ev276// CHECK: call {{.*}} @_ZN1XC1Ev277// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_278// CHECK-NEXT: call void @llvm.lifetime.end279X t5() {280 X a [[gnu::aligned(1)]] [[gnu::aligned(8)]];281 return a;282}283 284} // namespace test_alignas285 286namespace PR51862 {287 288template <class T> T test() {289 T a;290 T b;291 if (0)292 return a;293 return b;294}295 296struct A {297 A();298 A(A &);299 A(int);300 operator int();301};302 303// CHECK-LABEL: define{{.*}} void @_ZN7PR518624testINS_1AEEET_v304// CHECK: call noundef i32 @_ZN7PR518621AcviEv305// CHECK-NEXT: call void @_ZN7PR518621AC1Ei306// CHECK-NEXT: call void @llvm.lifetime.end307template A test<A>();308 309struct BSub {};310struct B : BSub {311 B();312 B(B &);313 B(const BSub &);314};315 316// CHECK-LABEL: define{{.*}} void @_ZN7PR518624testINS_1BEEET_v317// CHECK: call void @_ZN7PR518621BC1ERKNS_4BSubE318// CHECK-NEXT: call void @llvm.lifetime.end319template B test<B>();320 321} // namespace PR51862322