[PATCH] D29957: [clang-tidy] Ignore instantiated functions and static data members of classes in misc-definitions-in-headers.

2017-02-15 Thread Haojian Wu via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL295178: [clang-tidy] Ignore instantiated functions and 
static data members of classes… (authored by hokein).

Changed prior to commit:
  https://reviews.llvm.org/D29957?vs=88413=88520#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D29957

Files:
  clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
  clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp


Index: clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===
--- clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -104,8 +104,8 @@
 // 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 @@
 // 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())
Index: clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
===
--- clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
+++ clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
@@ -71,6 +71,12 @@
 template 
 int CB::a = 2; // OK: static data member definition of a class template.
 
+template class CB; // OK: explicitly instantiated static data member of a 
class template.
+inline int callCB() {
+  CB cb; // OK: implicitly instantiated static data member of a class 
template.
+  return cb.a;
+}
+
 template 
 T tf() { // OK: template function definition.
   T a;
@@ -107,6 +113,12 @@
 
 int f8() = delete; // OK: the function being marked delete is not callable.
 
+template 
+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;


Index: clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===
--- clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tools-extra/trunk/clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -104,8 +104,8 @@
 // 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 @@
 // 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())
Index: clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
===
--- clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
+++ clang-tools-extra/trunk/test/clang-tidy/misc-definitions-in-headers.hpp
@@ -71,6 +71,12 @@
 template 
 int CB::a = 2; // OK: static data member definition of a class template.
 
+template class CB; // OK: explicitly instantiated static data member of a class template.
+inline int callCB() {
+  CB cb; // OK: implicitly instantiated static data member of a class template.
+  return cb.a;
+}
+
 template 
 T tf() { // OK: template function definition.
   T a;
@@ 

[PATCH] D29957: [clang-tidy] Ignore instantiated functions and static data members of classes in misc-definitions-in-headers.

2017-02-15 Thread Alexander Kornienko via Phabricator via cfe-commits
alexfh accepted this revision.
alexfh added a comment.
This revision is now accepted and ready to land.

LG


https://reviews.llvm.org/D29957



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D29957: [clang-tidy] Ignore instantiated functions and static data members of classes in misc-definitions-in-headers.

2017-02-14 Thread Haojian Wu via Phabricator via cfe-commits
hokein created this revision.
Herald added a subscriber: JDevlieghere.

https://reviews.llvm.org/D29957

Files:
  clang-tidy/misc/DefinitionsInHeadersCheck.cpp
  test/clang-tidy/misc-definitions-in-headers.hpp


Index: test/clang-tidy/misc-definitions-in-headers.hpp
===
--- test/clang-tidy/misc-definitions-in-headers.hpp
+++ test/clang-tidy/misc-definitions-in-headers.hpp
@@ -71,6 +71,12 @@
 template 
 int CB::a = 2; // OK: static data member definition of a class template.
 
+template class CB; // OK: explicitly instantiated static data member of a 
class template.
+inline int callCB() {
+  CB cb; // OK: implicitly instantiated static data member of a class 
template.
+  return cb.a;
+}
+
 template 
 T tf() { // OK: template function definition.
   T a;
@@ -107,6 +113,12 @@
 
 int f8() = delete; // OK: the function being marked delete is not callable.
 
+template 
+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;
Index: clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===
--- clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -104,8 +104,8 @@
 // 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.
@@ -131,7 +131,8 @@
 // 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())


Index: test/clang-tidy/misc-definitions-in-headers.hpp
===
--- test/clang-tidy/misc-definitions-in-headers.hpp
+++ test/clang-tidy/misc-definitions-in-headers.hpp
@@ -71,6 +71,12 @@
 template 
 int CB::a = 2; // OK: static data member definition of a class template.
 
+template class CB; // OK: explicitly instantiated static data member of a class template.
+inline int callCB() {
+  CB cb; // OK: implicitly instantiated static data member of a class template.
+  return cb.a;
+}
+
 template 
 T tf() { // OK: template function definition.
   T a;
@@ -107,6 +113,12 @@
 
 int f8() = delete; // OK: the function being marked delete is not callable.
 
+template 
+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;
Index: clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===
--- clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -104,8 +104,8 @@
 // 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.
@@ -131,7 +131,8 @@
 // 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())
___
cfe-commits mailing list