123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // RUN: %clang_cc1 -fsyntax-only -Wheader-hygiene -verify %s
- #ifdef BE_THE_HEADER
- 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;
- // |using namespace| through a macro shouldn't warn if the instantiation is in a
- // cc file.
- USING_MACRO
- // Check behavior of line markers.
- namespace warn_header_with_line_marker {}
- # 1 "XXX.h" 1
- using namespace warn_header_with_line_marker; // expected-warning {{using namespace directive in global context in header}}
- # 70 "warn-using-namespace-in-header.cpp" 2
- namespace nowarn_after_line_marker {}
- using namespace nowarn_after_line_marker;
- #endif
|