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:
Douglas Gregor 2010-10-22 15:24:46 +00:00
parent 1530487cb1
commit 412c362d9e
2 changed files with 35 additions and 9 deletions

View File

@ -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.

View File

@ -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();
}