On Fri, Mar 25, 2011 at 9:40 AM, Peter Collingbourne <[email protected]> wrote:
> I believe the correct thing to do is to iterate through
> declaration context parents until you reach something that is not a
> LinkageSpecDecl, and warn if it is a TranslationUnitDecl.
Is something like the attached closer to what you want? This new
version recursively walks up the DeclContext chain, and I've
integrated all the examples I've seen in this thread into the tests.
-- Elliot
Index: test/SemaCXX/warn-using-namespace-in-header.h
===================================================================
--- test/SemaCXX/warn-using-namespace-in-header.h (revision 128154)
+++ test/SemaCXX/warn-using-namespace-in-header.h (working copy)
@@ -13,3 +13,30 @@
namespace dont_warn_here {
using namespace warn_in_header_in_global_context;
}
+
+// We should warn in toplevel extern contexts.
+namespace warn_inside_linkage {}
+extern "C++" {
+using namespace warn_inside_linkage;
+}
+
+// This is really silly, but we should warn on it:
+extern "C++" {
+extern "C" {
+extern "C++" {
+using namespace warn_inside_linkage;
+}
+}
+}
+
+// But we shouldn't warn in extern contexts inside namespaces.
+namespace dont_warn_here {
+extern "C++" {
+using namespace warn_in_header_in_global_context;
+}
+}
+
+// We also shouldn't warn in case of functions.
+inline void foo() {
+ using namespace warn_in_header_in_global_context;
+}
Index: test/SemaCXX/warn-using-namespace-in-header.cpp
===================================================================
--- test/SemaCXX/warn-using-namespace-in-header.cpp (revision 128154)
+++ test/SemaCXX/warn-using-namespace-in-header.cpp (working copy)
@@ -7,3 +7,21 @@
// Warning is actually in the header but only the cpp file gets scanned.
// expected-warning {{using namespace directive in global context in header}}
+
+
+
+
+
+
+
+
+
+// Warn inside linkage specs too.
+// expected-warning {{using namespace directive in global context in header}}
+
+
+
+
+
+
+// expected-warning {{using namespace directive in global context in header}}
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp (revision 128154)
+++ lib/Sema/SemaDeclCXX.cpp (working copy)
@@ -3838,6 +3838,19 @@
return getStdNamespace();
}
+/// \brief Determine whether a using statement is in a context where it will be
+/// apply in all contexts.
+static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext) {
+ switch (CurContext->getDeclKind()) {
+ case Decl::TranslationUnit:
+ return true;
+ case Decl::LinkageSpec:
+ return IsUsingDirectiveInToplevelContext(CurContext->getParent());
+ default:
+ return false;
+ }
+}
+
Decl *Sema::ActOnUsingDirective(Scope *S,
SourceLocation UsingLoc,
SourceLocation NamespcLoc,
@@ -3923,7 +3936,7 @@
SS.getWithLocInContext(Context),
IdentLoc, Named, CommonAncestor);
- if (CurContext->getDeclKind() == Decl::TranslationUnit &&
+ if (IsUsingDirectiveInToplevelContext(CurContext) &&
!SourceMgr.isFromMainFile(IdentLoc)) {
Diag(IdentLoc, diag::warn_using_directive_in_header);
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits