diff --git a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp --- a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -90,13 +90,11 @@ // Internal linkage variable definitions are ignored for now: // const int a = 1; // static int b = 1; + // namespace { int c = 1; } // // Although these might also cause ODR violations, we can be less certain and // should try to keep the false-positive rate down. - // - // FIXME: Should declarations in anonymous namespaces get the same treatment - // as static / const declarations? - if (!ND->hasExternalFormalLinkage() && !ND->isInAnonymousNamespace()) + if (!ND->hasExternalFormalLinkage() || ND->isInAnonymousNamespace()) return; if (const auto *FD = dyn_cast(ND)) { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -199,6 +199,10 @@ ` check. Global options of the same name should be used instead. +- Fixed false positive in :doc:`misc-definitions-in-headers + ` to avoid warning on + declarations inside anonymous namespaces. + - Deprecated check-local options `HeaderFileExtensions` in :doc:`misc-unused-using-decls ` check. diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc/definitions-in-headers.rst b/clang-tools-extra/docs/clang-tidy/checks/misc/definitions-in-headers.rst --- a/clang-tools-extra/docs/clang-tidy/checks/misc/definitions-in-headers.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/misc/definitions-in-headers.rst @@ -27,6 +27,7 @@ const int c = 1; const char* const str2 = "foo"; constexpr int k = 1; + namespace { int x = 1; } // Warning: function definition. int g() { diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/definitions-in-headers.hpp b/clang-tools-extra/test/clang-tidy/checkers/misc/definitions-in-headers.hpp --- a/clang-tools-extra/test/clang-tidy/checkers/misc/definitions-in-headers.hpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/definitions-in-headers.hpp @@ -108,8 +108,7 @@ int f5(); // OK: function declaration. inline int f6() { return 1; } // OK: inline function definition. namespace { - int f7() { return 1; } -// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: function 'f7' defined in a header file; + int f7() { return 1; } // OK: each TU defines the function in a unique namespace. } int f8() = delete; // OK: the function being marked delete is not callable. @@ -142,8 +141,7 @@ // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'ca' defined in a header file; namespace { - int e = 2; -// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'e' defined in a header file; + int e = 2; // OK: each TU defines the variable in a unique namespace. } const char* const g = "foo"; // OK: internal linkage variable definition.