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.
foo()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