From ac2c96528f0d753ae00955bbe65c9f41fe8ddd2f Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 28 Mar 2009 06:42:02 +0000 Subject: [PATCH] Check that the alias points to a valid namespace. llvm-svn: 67925 --- clang/lib/Sema/SemaDeclCXX.cpp | 15 +++++++++++++++ clang/test/SemaCXX/namespace-alias.cpp | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 4c8437deee1d..7f8a69e5f306 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1627,6 +1627,7 @@ Sema::DeclTy *Sema::ActOnUsingDirective(Scope *S, // Lookup namespace name. LookupResult R = LookupParsedName(S, &SS, NamespcName, LookupNamespaceName, false); + // FIXME: Can the result of a namespace lookup ever be ambiguous? if (R.isAmbiguous()) { DiagnoseAmbiguousLookup(R, NamespcName, IdentLoc); return 0; @@ -1693,6 +1694,20 @@ Sema::DeclTy *Sema::ActOnNamespaceAliasDef(Scope *S, return 0; } + // Lookup the namespace name. + LookupResult R = LookupParsedName(S, &SS, NamespaceName, + LookupNamespaceName, false); + // FIXME: Can the result of a namespace lookup ever be ambiguous? + if (R.isAmbiguous()) { + DiagnoseAmbiguousLookup(R, NamespaceName, NamespaceLoc); + return 0; + } + + if (!R) { + Diag(NamespaceLoc, diag::err_expected_namespace_name) << SS.getRange(); + return 0; + } + return 0; } diff --git a/clang/test/SemaCXX/namespace-alias.cpp b/clang/test/SemaCXX/namespace-alias.cpp index 745893082bba..7d46d08678a3 100644 --- a/clang/test/SemaCXX/namespace-alias.cpp +++ b/clang/test/SemaCXX/namespace-alias.cpp @@ -9,3 +9,8 @@ namespace B = N; // expected-error {{redefinition of 'B' as different kind of sy namespace C { } // expected-note {{previous definition is here}} namespace C = N; // expected-error {{redefinition of 'C'}} + +int i; +namespace D = i; // expected-error {{expected namespace name}} + +namespace E = N::Foo; // expected-error {{expected namespace name}}