brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · 2491070 Raw
47 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -emit-pch -o %t.a %s2// RUN: %clang_cc1 -std=c++20 -include-pch %t.a %s -verify3 4#ifndef HEADER5#define HEADER6 7namespace preferred_name {8  template<typename T> struct X;9  using Y = X<int>;10  using Z = X<float>;11  template<typename T> struct [[using clang: preferred_name(Y), preferred_name(Z)]] X {};12  Y y;13}14 15namespace aligned {16  // PR48434: ensure attributes don't introduce deserialization cycles.17  template<typename T> struct X1;18  using Y1 = X1<int>;19  template<typename T> struct alignas(Y1*) X1 {};20  Y1 y1;21 22  template<typename T> struct X2;23  using Y2 = X2<int>;24  template<typename T> struct alignas(Y2*) X2 {};25}26 27#else28 29namespace preferred_name {30  Z z;31 32  template<typename T> T forget(T t) { return t; }33  void f() {34    forget(y).foo(); // expected-error {{no member named 'foo' in 'preferred_name::Y'}}35    forget(z).foo(); // expected-error {{no member named 'foo' in 'preferred_name::Z'}}36  }37}38 39namespace aligned {40  extern Y1 y1;41  extern Y2 y2;42  static_assert(alignof(Y1) == alignof(Y1*), "");43  static_assert(alignof(Y2) == alignof(Y2*), "");44}45 46#endif47