Author: Haojian Wu Date: 2020-02-12T16:56:31+01:00 New Revision: a45ca670f5c43253d71018814d1e00443726f23a
URL: https://github.com/llvm/llvm-project/commit/a45ca670f5c43253d71018814d1e00443726f23a DIFF: https://github.com/llvm/llvm-project/commit/a45ca670f5c43253d71018814d1e00443726f23a.diff LOG: [clang-tidy] No misc-definitions-in-headers warning on C++14 variable templates. Reviewers: gribozavr2 Subscribers: xazax.hun, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D74468 Added: Modified: clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp clang-tools-extra/docs/clang-tidy/checks/misc-definitions-in-headers.rst clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers-1z.hpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp index 1d41edd2083e..7ff6c0d20f63 100644 --- a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -134,6 +134,9 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) { DiagnosticIDs::Note) << FixItHint::CreateInsertion(FD->getInnerLocStart(), "inline "); } else if (const auto *VD = dyn_cast<VarDecl>(ND)) { + // C++14 variable templates are allowed. + if (VD->getDescribedVarTemplate()) + return; // Static data members of a class template are allowed. if (VD->getDeclContext()->isDependentContext() && VD->isStaticDataMember()) return; 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 index 1b6c2cd34438..235e5cd2306d 100644 --- 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 @@ -83,6 +83,10 @@ from multiple translation units. constexpr int f10() { return 0; } // OK: constexpr function implies inline. + // OK: C++14 variable templates are inline. + template <class T> + constexpr T pi = T(3.1415926L); + Options ------- diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers-1z.hpp b/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers-1z.hpp index 79fb7bc0bd8a..fd02998a53d5 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers-1z.hpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-definitions-in-headers-1z.hpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s misc-definitions-in-headers %t -- -- -std=c++1z +// RUN: %check_clang_tidy -std=c++17-or-later %s misc-definitions-in-headers %t class CE { constexpr static int i = 5; // OK: inline variable definition. @@ -8,3 +8,7 @@ inline int i = 5; // OK: inline variable definition. int b = 1; // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'b' defined in a header file; variable definitions in header files can lead to ODR violations [misc-definitions-in-headers] + +// OK: C++14 variable template. +template <class T> +constexpr T pi = T(3.1415926L); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits