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