brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.8 KiB · 1189a86 Raw
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