summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalcolm Parsons <malcolm.parsons@gmail.com>2016-11-16 09:51:40 +0000
committerMalcolm Parsons <malcolm.parsons@gmail.com>2016-11-16 09:51:40 +0000
commit31055c6aceeaf0f2641ce44ca8b4ca3aa1cc7153 (patch)
tree849e5ae823f467d83749810e8ce068601cce94bb
parentafaa934304858c2abe0a3c3064b325890abe0ef6 (diff)
downloadbcm5719-llvm-31055c6aceeaf0f2641ce44ca8b4ca3aa1cc7153.tar.gz
bcm5719-llvm-31055c6aceeaf0f2641ce44ca8b4ca3aa1cc7153.zip
[clang-tidy] Handle template instantiations in modenize-use-default check
Summary: Duplicate fixes were being created for explicit template instantiations of out-of-line constructors or destructors. Fixes PR30921. Reviewers: alexfh, aaron.ballman Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D26582 llvm-svn: 287091
-rw-r--r--clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp1
-rw-r--r--clang-tools-extra/test/clang-tidy/modernize-use-default.cpp20
2 files changed, 21 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp
index ce497c81ab8..6092ae65e54 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp
@@ -241,6 +241,7 @@ void UseDefaultCheck::check(const MatchFinder::MatchResult &Result) {
if (SpecialFunctionDecl->isDeleted() ||
SpecialFunctionDecl->isExplicitlyDefaulted() ||
SpecialFunctionDecl->isLateTemplateParsed() ||
+ SpecialFunctionDecl->isTemplateInstantiation() ||
!SpecialFunctionDecl->isUserProvided() || !SpecialFunctionDecl->hasBody())
return;
diff --git a/clang-tools-extra/test/clang-tidy/modernize-use-default.cpp b/clang-tools-extra/test/clang-tidy/modernize-use-default.cpp
index 4119a7072c6..6f6f01fa1c8 100644
--- a/clang-tools-extra/test/clang-tidy/modernize-use-default.cpp
+++ b/clang-tools-extra/test/clang-tidy/modernize-use-default.cpp
@@ -124,6 +124,26 @@ public:
// CHECK-FIXES: ~Temp() = default;
};
+// Class template out of line with explicit instantiation.
+template <class T>
+class TempODef {
+public:
+ TempODef();
+ ~TempODef();
+};
+
+template <class T>
+TempODef<T>::TempODef() {}
+// CHECK-MESSAGES: :[[@LINE-2]]:1: warning: use '= default'
+// CHECK-FIXES: TempODef<T>::TempODef() = default;
+template <class T>
+TempODef<T>::~TempODef() {}
+// CHECK-MESSAGES: :[[@LINE-2]]:1: warning: use '= default'
+// CHECK-FIXES: TempODef<T>::~TempODef() = default;
+
+template class TempODef<int>;
+template class TempODef<double>;
+
// Non user-provided constructor/destructor.
struct Imp {
int Int;
OpenPOWER on IntegriCloud