forked from OSchip/llvm-project
When performing name lookup for a namespace definition, only look into
the current context's redeclaration context, ignoring using directives. Fixes PR8430. llvm-svn: 117097
This commit is contained in:
parent
1530487cb1
commit
412c362d9e
|
@ -3216,15 +3216,17 @@ Decl *Sema::ActOnStartNamespaceDef(Scope *NamespcScope,
|
|||
|
||||
if (II) {
|
||||
// C++ [namespace.def]p2:
|
||||
// The identifier in an original-namespace-definition shall not have been
|
||||
// previously defined in the declarative region in which the
|
||||
// original-namespace-definition appears. The identifier in an
|
||||
// original-namespace-definition is the name of the namespace. Subsequently
|
||||
// in that declarative region, it is treated as an original-namespace-name.
|
||||
|
||||
NamedDecl *PrevDecl
|
||||
= LookupSingleName(DeclRegionScope, II, IdentLoc, LookupOrdinaryName,
|
||||
ForRedeclaration);
|
||||
// The identifier in an original-namespace-definition shall not
|
||||
// have been previously defined in the declarative region in
|
||||
// which the original-namespace-definition appears. The
|
||||
// identifier in an original-namespace-definition is the name of
|
||||
// the namespace. Subsequently in that declarative region, it is
|
||||
// treated as an original-namespace-name.
|
||||
//
|
||||
// Since namespace names are unique in their scope, and we don't
|
||||
// look through using directives, just
|
||||
DeclContext::lookup_result R = CurContext->getRedeclContext()->lookup(II);
|
||||
NamedDecl *PrevDecl = R.first == R.second? 0 : *R.first;
|
||||
|
||||
if (NamespaceDecl *OrigNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl)) {
|
||||
// This is an extended namespace definition.
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// PR8430
|
||||
namespace N {
|
||||
class A { };
|
||||
}
|
||||
|
||||
namespace M { }
|
||||
|
||||
using namespace M;
|
||||
|
||||
namespace N {
|
||||
namespace M {
|
||||
}
|
||||
}
|
||||
|
||||
namespace M {
|
||||
namespace N {
|
||||
}
|
||||
}
|
||||
|
||||
namespace N {
|
||||
A *getA();
|
||||
}
|
Loading…
Reference in New Issue