// RUN: %clang_cc1 -std=c++17 -verify %s template struct A { template struct B { B(...); B(const B &) = default; }; template B(U) -> B; }; A::B b = 123; A::B copy = b; using T = decltype(b); using T = A::B; using Copy = decltype(copy); using Copy = A::B; namespace GH94614 { template struct S {}; struct trouble_1 { } constexpr t1; struct trouble_2 { } constexpr t2; struct trouble_3 { } constexpr t3; struct trouble_4 { } constexpr t4; struct trouble_5 { } constexpr t5; struct trouble_6 { } constexpr t6; struct trouble_7 { } constexpr t7; struct trouble_8 { } constexpr t8; struct trouble_9 { } constexpr t9; template struct Unrelated { using Trouble = S; template using Trouble2 = S; }; template struct Outer { using Trouble = S; template using Trouble2 = S; template using Trouble3 = S; template struct Inner { template struct Paranoid { using Trouble4 = S; template using Trouble5 = S; }; Inner(trouble_1, V v, Trouble trouble) {} Inner(trouble_2, V v, Trouble2 trouble) {} Inner(trouble_3, V v, Trouble3 trouble) {} Inner(trouble_4, V v, typename Unrelated::template Trouble2 trouble) {} Inner(trouble_5, V v, typename Unrelated::Trouble trouble) {} Inner(trouble_6, V v, typename Unrelated::Trouble trouble) {} Inner(trouble_7, V v, typename Paranoid::Trouble4 trouble) {} Inner(trouble_8, V v, typename Paranoid::template Trouble5 trouble) {} template Inner(trouble_9, V v, W w, typename Paranoid::template Trouble5 trouble) {} }; }; S s; Outer::Inner _1(t1, 42, s); Outer::Inner _2(t2, 42, s); Outer::Inner _3(t3, 42, s); Outer::Inner _4(t4, 42, s); Outer::Inner _5(t5, 42, s); Outer::Inner _6(t6, 42, s); Outer::Inner _7(t7, 42, s); Outer::Inner _8(t8, 42, s); Outer::Inner _9(t9, 42, 24, s); // Make sure we don't accidentally inject the TypedefNameDecl into the TU. Trouble should_not_be_in_the_tu_decl; // expected-error {{unknown type name 'Trouble'}} } // namespace GH94614