[PATCH] D29928: [clang-tidy] Improve diagnostic message for misc-definitions-in-header.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 14 00:53:04 PST 2017
hokein created this revision.
Herald added a subscriber: JDevlieghere.
Users might get confused easily when they see the check's message on
full template function speciliations.
Add a note to the output message, which mentions these kind of function
specializations are treated as regular functions.
https://reviews.llvm.org/D29928
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
@@ -29,6 +29,7 @@
template <>
int CA::f3() {
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: function 'f3<int>' defined in a header file;
+// CHECK-MESSAGES: :[[@LINE-2]]:9: note: this is a full function template specilization
// CHECK-FIXES: inline int CA::f3() {
int a = 1;
return a;
@@ -93,6 +94,7 @@
template <>
int f3() {
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f3<int>' defined in a header file;
+// CHECK-MESSAGES: :[[@LINE-2]]:5: note: this is a full function template specilization
// CHECK-FIXES: inline int f3() {
int a = 1;
return a;
Index: clang-tidy/misc/DefinitionsInHeadersCheck.cpp
===================================================================
--- clang-tidy/misc/DefinitionsInHeadersCheck.cpp
+++ clang-tidy/misc/DefinitionsInHeadersCheck.cpp
@@ -127,6 +127,12 @@
"function definitions in header files can lead to ODR violations")
<< FD << FixItHint::CreateInsertion(
FD->getReturnTypeSourceRange().getBegin(), "inline ");
+ // Output notes for full function template specializations.
+ if (FD->getTemplateSpecializationKind() != TSK_Undeclared)
+ diag(FD->getLocation(), "this is a full function template specilization "
+ "which behaves as a regular function, so the ODR "
+ "still applies",
+ DiagnosticIDs::Note);
} else if (const auto *VD = dyn_cast<VarDecl>(ND)) {
// Static data members of a class template are allowed.
if (VD->getDeclContext()->isDependentContext() && VD->isStaticDataMember())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29928.88327.patch
Type: text/x-patch
Size: 1817 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170214/17b9cd5c/attachment.bin>
More information about the cfe-commits
mailing list