From: Anders Carlsson Date: Sat, 28 Mar 2009 06:23:46 +0000 (+0000) Subject: Check that the namespace alias doesn't conflict with a previous declaration in this... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d7ba402ba062994e242c97719685d6d66a056dd;p=clang 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 --- 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(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'}}