summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2017-02-15 14:10:50 +0000
committerHaojian Wu <hokein@google.com>2017-02-15 14:10:50 +0000
commitead59eeadefbc8e60a960c00b01116f7f86a6848 (patch)
tree6017c6ca5878e55585c66e50219e7ccbdf7af70a
parenta0e56d2d68759b425987fe439e58c9debc3636c1 (diff)
downloadbcm5719-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.cpp7
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-definitions-in-headers.hpp12
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;
OpenPOWER on IntegriCloud