xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-using-namespace-in-header.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li inline 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