1 // RUN: %clang_cc1 -fsyntax-only -Wheader-hygiene -verify %s 2 3 #ifdef BE_THE_HEADER 4 namespace warn_in_header_in_global_context {} 5 using namespace warn_in_header_in_global_context; // expected-warning {{using namespace directive in global context in header}} 6 7 // While we want to error on the previous using directive, we don't when we are 8 // inside a namespace 9 namespace dont_warn_here { 10 using namespace warn_in_header_in_global_context; 11 } 12 13 // We should warn in toplevel extern contexts. 14 namespace warn_inside_linkage {} 15 extern "C++" { 16 using namespace warn_inside_linkage; // expected-warning {{using namespace directive in global context in header}} 17 } 18 19 // This is really silly, but we should warn on it: 20 extern "C++" { 21 extern "C" { 22 extern "C++" { 23 using namespace warn_inside_linkage; // expected-warning {{using namespace directive in global context in header}} 24 } 25 } 26 } 27 28 // But we shouldn't warn in extern contexts inside namespaces. 29 namespace dont_warn_here { 30 extern "C++" { 31 using namespace warn_in_header_in_global_context; 32 } 33 } 34 35 // We also shouldn't warn in case of functions. 36 inline void foo() { 37 using namespace warn_in_header_in_global_context; 38 } 39 40 41 namespace macronamespace {} 42 #define USING_MACRO using namespace macronamespace; 43 44 // |using namespace| through a macro should warn if the instantiation is in a 45 // header. 46 USING_MACRO // expected-warning {{using namespace directive in global context in header}} 47 48 #else 49 50 #define BE_THE_HEADER 51 #include __FILE__ 52 53 namespace dont_warn {} 54 using namespace dont_warn; 55 56 // |using namespace| through a macro shouldn't warn if the instantiation is in a 57 // cc file. 58 USING_MACRO 59 60 // Check behavior of line markers. 61 namespace warn_header_with_line_marker {} 62 # 1 "XXX.h" 1 63 using namespace warn_header_with_line_marker; // expected-warning {{using namespace directive in global context in header}} 64 # 70 "warn-using-namespace-in-header.cpp" 2 65 66 namespace nowarn_after_line_marker {} 67 using namespace nowarn_after_line_marker; 68 69 #endif 70