From 31055c6aceeaf0f2641ce44ca8b4ca3aa1cc7153 Mon Sep 17 00:00:00 2001 From: Malcolm Parsons Date: Wed, 16 Nov 2016 09:51:40 +0000 Subject: [PATCH] [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 --- .../clang-tidy/modernize/UseDefaultCheck.cpp | 1 + .../test/clang-tidy/modernize-use-default.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseDefaultCheck.cpp index ce497c8..6092ae6 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 4119a70..6f6f01f 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 TempODef { +public: + TempODef(); + ~TempODef(); +}; + +template +TempODef::TempODef() {} +// CHECK-MESSAGES: :[[@LINE-2]]:1: warning: use '= default' +// CHECK-FIXES: TempODef::TempODef() = default; +template +TempODef::~TempODef() {} +// CHECK-MESSAGES: :[[@LINE-2]]:1: warning: use '= default' +// CHECK-FIXES: TempODef::~TempODef() = default; + +template class TempODef; +template class TempODef; + // Non user-provided constructor/destructor. struct Imp { int Int; -- 2.7.4