64 lines · cpp
1// RUN: %check_clang_tidy %s llvmlibc-implementation-in-namespace %t2 3#define MACRO_A "defining macros outside namespace is valid"4 5class ClassB;6// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace7struct StructC {};8// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace9const char *VarD = MACRO_A;10// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace11typedef int typeE;12// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace13void funcF() {}14// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace15 16namespace outer_most {17// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: the outermost namespace should be the 'LIBC_NAMESPACE_DECL' macro18 class A {};19}20 21// Wrapped in anonymous namespace.22namespace {23// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: declaration must be enclosed within the 'LIBC_NAMESPACE_DECL' namespace24 class A {};25}26 27namespace namespaceG {28// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: the outermost namespace should be the 'LIBC_NAMESPACE_DECL' macro29namespace __llvm_libc {30namespace namespaceH {31class ClassB;32} // namespace namespaceH33struct StructC {};34} // namespace __llvm_libc35const char *VarD = MACRO_A;36typedef int typeE;37void funcF() {}38} // namespace namespaceG39 40// Wrapped in macro namespace but with an incorrect name41#define LIBC_NAMESPACE_DECL [[gnu::visibility("hidden")]] custom_namespace42namespace LIBC_NAMESPACE_DECL {43// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: the 'LIBC_NAMESPACE_DECL' macro expansion should start with '__llvm_libc'44 45namespace namespaceH {46class ClassB;47} // namespace namespaceH48} // namespace LIBC_NAMESPACE_DECL49 50 51// Wrapped in macro namespace with a valid name, LIBC_NAMESPACE_DECL starts with '__llvm_libc'52#undef LIBC_NAMESPACE_DECL53#define LIBC_NAMESPACE_DECL [[gnu::visibility("hidden")]] __llvm_libc_xyz54namespace LIBC_NAMESPACE_DECL {55namespace namespaceI {56class ClassB;57} // namespace namespaceI58struct StructC {};59const char *VarD = MACRO_A;60typedef int typeE;61void funcF() {}62extern "C" void extern_funcJ() {}63} // namespace LIBC_NAMESPACE_DECL64