diff options
-rw-r--r-- | test/SemaCXX/warn-using-namespace-in-header.cpp | 98 | ||||
-rw-r--r-- | test/SemaCXX/warn-using-namespace-in-header.h | 50 |
2 files changed, 53 insertions, 95 deletions
diff --git a/test/SemaCXX/warn-using-namespace-in-header.cpp b/test/SemaCXX/warn-using-namespace-in-header.cpp index 72c25529b4..d20c6ff67b 100644 --- a/test/SemaCXX/warn-using-namespace-in-header.cpp +++ b/test/SemaCXX/warn-using-namespace-in-header.cpp @@ -1,54 +1,62 @@ // RUN: %clang_cc1 -fsyntax-only -Wheader-hygiene -verify %s -#include "warn-using-namespace-in-header.h" +#ifdef BE_THE_HEADER +// Lots of vertical space to make the error line match up with the line of the +// expected line in the source file. +namespace warn_in_header_in_global_context {} +using namespace warn_in_header_in_global_context; // expected-warning {{using namespace directive in global context in header}} + +// While we want to error on the previous using directive, we don't when we are +// inside a namespace +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; // expected-warning {{using namespace directive in global context in header}} +} + +// This is really silly, but we should warn on it: +extern "C++" { +extern "C" { +extern "C++" { +using namespace warn_inside_linkage; // expected-warning {{using namespace directive in global context in header}} +} +} +} + +// 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; +} + + +namespace macronamespace {} +#define USING_MACRO using namespace macronamespace; + +// |using namespace| through a macro should warn if the instantiation is in a +// header. +USING_MACRO // expected-warning {{using namespace directive in global context in header}} + +#else + +#define BE_THE_HEADER +#include __FILE__ namespace dont_warn {} using namespace dont_warn; -// 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}} - - - - - - - - - - - - - - - - - - - - - - -// expected-warning {{using namespace directive in global context in header}} - // |using namespace| through a macro shouldn't warn if the instantiation is in a // cc file. USING_MACRO + +#endif diff --git a/test/SemaCXX/warn-using-namespace-in-header.h b/test/SemaCXX/warn-using-namespace-in-header.h deleted file mode 100644 index b544c548ae..0000000000 --- a/test/SemaCXX/warn-using-namespace-in-header.h +++ /dev/null @@ -1,50 +0,0 @@ - - - - - -// Lots of vertical space to make the error line match up with the line of the -// expected line in the source file. -namespace warn_in_header_in_global_context {} -using namespace warn_in_header_in_global_context; - -// While we want to error on the previous using directive, we don't when we are -// inside a namespace -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; -} - - -namespace macronamespace {} -#define USING_MACRO using namespace macronamespace; - -// |using namespace| through a macro should warn if the instantiation is in a -// header. -USING_MACRO |