1// RUN: %clang_cc1 -fsyntax-only -Wheader-hygiene -verify %s
2
3#ifdef BE_THE_HEADER
4namespace warn_in_header_in_global_context {}
5using 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
9namespace dont_warn_here {
10using namespace warn_in_header_in_global_context;
11}
12
13// We should warn in toplevel extern contexts.
14namespace warn_inside_linkage {}
15extern "C++" {
16using 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:
20extern "C++" {
21extern "C" {
22extern "C++" {
23using 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.
29namespace dont_warn_here {
30extern "C++" {
31using namespace warn_in_header_in_global_context;
32}
33}
34
35// We also shouldn't warn in case of functions.
36inline void foo() {
37  using namespace warn_in_header_in_global_context;
38}
39
40
41namespace 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.
46USING_MACRO // expected-warning {{using namespace directive in global context in header}}
47
48#else
49
50#define BE_THE_HEADER
51#include __FILE__
52
53namespace dont_warn {}
54using namespace dont_warn;
55
56// |using namespace| through a macro shouldn't warn if the instantiation is in a
57// cc file.
58USING_MACRO
59
60// Check behavior of line markers.
61namespace warn_header_with_line_marker {}
62# 1 "XXX.h" 1
63using 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
66namespace nowarn_after_line_marker {}
67using namespace nowarn_after_line_marker;
68
69#endif
70