diff options
author | Haojian Wu <hokein@google.com> | 2017-02-15 14:10:50 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2017-02-15 14:10:50 +0000 |
commit | ead59eeadefbc8e60a960c00b01116f7f86a6848 (patch) | |
tree | 6017c6ca5878e55585c66e50219e7ccbdf7af70a | |
parent | a0e56d2d68759b425987fe439e58c9debc3636c1 (diff) | |
download | bcm5719-llvm-ead59eeadefbc8e60a960c00b01116f7f86a6848.tar.gz bcm5719-llvm-ead59eeadefbc8e60a960c00b01116f7f86a6848.zip |
[clang-tidy] Ignore instantiated functions and static data members of classes in misc-definitions-in-headers.
Reviewers: alexfh
Reviewed By: alexfh
Subscribers: JDevlieghere, cfe-commits
Differential Revision: https://reviews.llvm.org/D29957
llvm-svn: 295178
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp | 7 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp | 12 |
2 files changed, 16 insertions, 3 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp index 8b87cec3a03..39ae7b9a692 100644 --- a/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.cpp @@ -104,8 +104,8 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) { // Function templates are allowed. if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate) return; - // Function template full specialization is prohibited in header file. - if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation) + // Ignore instantiated functions. + if (FD->isTemplateInstantiation()) return; // Member function of a class template and member function of a nested class // in a class template are allowed. @@ -133,7 +133,8 @@ void DefinitionsInHeadersCheck::check(const MatchFinder::MatchResult &Result) { // Static data members of a class template are allowed. if (VD->getDeclContext()->isDependentContext() && VD->isStaticDataMember()) return; - if (VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation) + // Ignore instantiated static data members of classes. + if (isTemplateInstantiation(VD->getTemplateSpecializationKind())) return; // Ignore variable definition within function scope. if (VD->hasLocalStorage() || VD->isStaticLocal()) diff --git a/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp b/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp index 2527b6e0a18..d0dda9598d5 100644 --- a/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp +++ b/clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp @@ -71,6 +71,12 @@ void CB<T>::CCB::f3() { template <typename T> int CB<T>::a = 2; // OK: static data member definition of a class template. +template class CB<int>; // OK: explicitly instantiated static data member of a class template. +inline int callCB() { + CB<double> cb; // OK: implicitly instantiated static data member of a class template. + return cb.a; +} + template <typename T> T tf() { // OK: template function definition. T a; @@ -107,6 +113,12 @@ namespace { int f8() = delete; // OK: the function being marked delete is not callable. +template <typename T> +int f9(T t) { return 1; } + +inline void callF9() { f9(1); } // OK: implicitly instantiated function. +template int f9(double); // OK: explicitly instantiated function. + int a = 1; // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'a' defined in a header file; variable definitions in header files can lead to ODR violations [misc-definitions-in-headers] CA a1; |