Index: clang/include/clang/AST/Decl.h =================================================================== --- clang/include/clang/AST/Decl.h +++ clang/include/clang/AST/Decl.h @@ -614,7 +614,12 @@ if (!isInline()) return false; auto X = lookup(Name); - auto Y = getParent()->lookup(Name); + // We should not perform a lookup within a transparent context, so walk + // up the context chain until we find a non-transparent context. + const DeclContext *Parent = getParent(); + while (Parent->isTransparentContext()) + Parent = Parent->getParent(); + auto Y = Parent->lookup(Name); return std::distance(X.begin(), X.end()) == std::distance(Y.begin(), Y.end()); } Index: clang/test/Misc/diag-inline-namespace.cpp =================================================================== --- clang/test/Misc/diag-inline-namespace.cpp +++ clang/test/Misc/diag-inline-namespace.cpp @@ -48,3 +48,14 @@ 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