// RUN: %clang_cc1 -verify %s -std=c++20 // We avoid printing the name of an inline namespace unless it's necessary to // uniquely identify the target. namespace N { inline namespace A { inline namespace B { inline namespace C { int f, g, h, i, j; struct f; struct g; struct h; struct i; struct j; } struct g; struct j; } struct h; } struct i; struct j; template struct Q; // expected-note 5{{here}} Q<&A::B::C::f> q1; // expected-error {{implicit instantiation of undefined template 'N::Q<&N::f>'}} Q<&A::B::C::g> q2; // expected-error {{implicit instantiation of undefined template 'N::Q<&N::C::g>'}} Q<&A::B::C::h> q3; // expected-error {{implicit instantiation of undefined template 'N::Q<&N::B::h>'}} Q<&A::B::C::i> q4; // expected-error {{implicit instantiation of undefined template 'N::Q<&N::A::i>'}} Q<&A::B::C::j> q5; // expected-error {{implicit instantiation of undefined template 'N::Q<&N::C::j>'}} template struct R; // expected-note 5{{here}} R r1; // expected-error {{implicit instantiation of undefined template 'N::R'}} R r2; // expected-error {{implicit instantiation of undefined template 'N::R'}} R r3; // expected-error {{implicit instantiation of undefined template 'N::R'}} R r4; // expected-error {{implicit instantiation of undefined template 'N::R'}} R r5; // expected-error {{implicit instantiation of undefined template 'N::R'}} // Make the name N::C ambiguous. inline namespace A { int C; } template struct S; // expected-note 5{{here}} S<&A::B::C::f> s1; // expected-error {{implicit instantiation of undefined template 'N::S<&N::f>'}} S<&A::B::C::g> s2; // expected-error {{implicit instantiation of undefined template 'N::S<&N::B::C::g>'}} S<&A::B::C::h> s3; // expected-error {{implicit instantiation of undefined template 'N::S<&N::B::h>'}} S<&A::B::C::i> s4; // expected-error {{implicit instantiation of undefined template 'N::S<&N::A::i>'}} S<&A::B::C::j> s5; // expected-error {{implicit instantiation of undefined template 'N::S<&N::B::C::j>'}} template struct T; // expected-note 5{{here}} T t1; // expected-error {{implicit instantiation of undefined template 'N::T'}} T t2; // expected-error {{implicit instantiation of undefined template 'N::T'}} T t3; // expected-error {{implicit instantiation of undefined template 'N::T'}} T t4; // expected-error {{implicit instantiation of undefined template 'N::T'}} T t5; // expected-error {{implicit instantiation of undefined template 'N::T'}} } namespace dont_crash { // A malformed lookup involving inline namespaces in a linkage specification // would previous cause an assertion due to the way diagnostics are emitted. extern "C++" inline namespace { namespace a { a : b // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}} \ // expected-error {{no type named 'b' in namespace 'dont_crash::a'}} } // expected-error {{expected unqualified-id}} } // inline namespace } // dont_crash