brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 30ede69 Raw
91 lines · cpp
1// RUN: %clang_cc1 -std=c++17 -verify %s2 3template<typename T> struct A {4  template<typename U> struct B {5    B(...);6    B(const B &) = default;7  };8  template<typename U> B(U) -> B<U>;9};10A<void>::B b = 123;11A<void>::B copy = b;12 13using T = decltype(b);14using T = A<void>::B<int>;15 16using Copy = decltype(copy);17using Copy = A<void>::B<int>;18 19namespace GH94614 {20 21template <class, class> struct S {};22 23struct trouble_1 {24} constexpr t1;25struct trouble_2 {26} constexpr t2;27struct trouble_3 {28} constexpr t3;29struct trouble_4 {30} constexpr t4;31struct trouble_5 {32} constexpr t5;33struct trouble_6 {34} constexpr t6;35struct trouble_7 {36} constexpr t7;37struct trouble_8 {38} constexpr t8;39struct trouble_9 {40} constexpr t9;41 42template <class U, class... T> struct Unrelated {43  using Trouble = S<U, T...>;44 45  template <class... V> using Trouble2 = S<V..., T...>;46};47 48template <class T, class U> struct Outer {49  using Trouble = S<U, T>;50 51  template <class V> using Trouble2 = S<V, T>;52 53  template <class V> using Trouble3 = S<U, T>;54 55  template <class V> struct Inner {56    template <class W> struct Paranoid {57      using Trouble4 = S<W, T>;58 59      template <class... X> using Trouble5 = S<X..., T>;60    };61 62    Inner(trouble_1, V v, Trouble trouble) {}63    Inner(trouble_2, V v, Trouble2<V> trouble) {}64    Inner(trouble_3, V v, Trouble3<V> trouble) {}65    Inner(trouble_4, V v, typename Unrelated<U, T>::template Trouble2<V> trouble) {}66    Inner(trouble_5, V v, typename Unrelated<U, T>::Trouble trouble) {}67    Inner(trouble_6, V v, typename Unrelated<V, T>::Trouble trouble) {}68    Inner(trouble_7, V v, typename Paranoid<V>::Trouble4 trouble) {}69    Inner(trouble_8, V v, typename Paranoid<V>::template Trouble5<V> trouble) {}70    template <class W>71    Inner(trouble_9, V v, W w, typename Paranoid<V>::template Trouble5<W> trouble) {}72  };73};74 75S<int, char> s;76 77Outer<char, int>::Inner _1(t1, 42, s);78Outer<char, int>::Inner _2(t2, 42, s);79Outer<char, int>::Inner _3(t3, 42, s);80Outer<char, int>::Inner _4(t4, 42, s);81Outer<char, int>::Inner _5(t5, 42, s);82Outer<char, int>::Inner _6(t6, 42, s);83Outer<char, int>::Inner _7(t7, 42, s);84Outer<char, int>::Inner _8(t8, 42, s);85Outer<char, int>::Inner _9(t9, 42, 24, s);86 87// Make sure we don't accidentally inject the TypedefNameDecl into the TU.88Trouble should_not_be_in_the_tu_decl; // expected-error {{unknown type name 'Trouble'}}89 90} // namespace GH9461491