diff options
author | Anders Carlsson <andersca@mac.com> | 2009-03-28 06:23:46 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-03-28 06:23:46 +0000 |
commit | 8d7ba402ba062994e242c97719685d6d66a056dd (patch) | |
tree | fa75733695ceac5214031fe8c9fdd0de6d10475d | |
parent | 239a53edc946f3756635b2d230f62ed43dbbbef7 (diff) |
Check that the namespace alias doesn't conflict with a previous declaration in this scope.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67921 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 14 | ||||
-rw-r--r-- | test/SemaCXX/namespace-alias.cpp | 11 |
2 files changed, 24 insertions, 1 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 349aafdbda..4c8437deee 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1675,12 +1675,24 @@ void Sema::PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir) { S->PushUsingDirective(UDir); } -Sema::DeclTy *Sema::ActOnNamespaceAliasDef(Scope *CurScope, +Sema::DeclTy *Sema::ActOnNamespaceAliasDef(Scope *S, SourceLocation AliasLoc, IdentifierInfo *Alias, const CXXScopeSpec &SS, SourceLocation NamespaceLoc, IdentifierInfo *NamespaceName) { + + // Check if we have a previous declaration with the same name. + if (NamedDecl *PrevDecl = LookupName(S, Alias, LookupOrdinaryName)) { + // FIXME: If this is a namespace alias decl, and it points to the same + // namespace, we shouldn't warn. + unsigned DiagID = isa<NamespaceDecl>(PrevDecl) ? diag::err_redefinition : + diag::err_redefinition_different_kind; + Diag(AliasLoc, DiagID) << Alias; + Diag(PrevDecl->getLocation(), diag::note_previous_definition); + return 0; + } + return 0; } diff --git a/test/SemaCXX/namespace-alias.cpp b/test/SemaCXX/namespace-alias.cpp new file mode 100644 index 0000000000..745893082b --- /dev/null +++ b/test/SemaCXX/namespace-alias.cpp @@ -0,0 +1,11 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +namespace N { }; + +namespace A = N; + +int B; // expected-note {{previous definition is here}} +namespace B = N; // expected-error {{redefinition of 'B' as different kind of symbol}} + +namespace C { } // expected-note {{previous definition is here}} +namespace C = N; // expected-error {{redefinition of 'C'}} |