warn-using-namespace-in-header.cpp 1.9 KB

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