[clang-tools-extra] r284735 - [clang-tidy] Simplify modernize-use-default
Malcolm Parsons via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 20 08:31:35 PDT 2016
Author: malcolm.parsons
Date: Thu Oct 20 10:31:34 2016
New Revision: 284735
URL: http://llvm.org/viewvc/llvm-project?rev=284735&view=rev
Log:
[clang-tidy] Simplify modernize-use-default
Summary:
clang-tidy now cleans up after replacements, so leave colon and comma
removal to that.
Reviewers: angelgarcia, alexfh, aaron.ballman, djasper, ioeric
Subscribers: djasper, cfe-commits
Differential Revision: https://reviews.llvm.org/D25769
Modified:
clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultCheck.cpp
clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-copy.cpp
Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultCheck.cpp?rev=284735&r1=284734&r2=284735&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/UseDefaultCheck.cpp Thu Oct 20 10:31:34 2016
@@ -20,37 +20,6 @@ namespace modernize {
static const char SpecialFunction[] = "SpecialFunction";
-/// \brief Finds the SourceLocation of the colon ':' before the initialization
-/// list in the definition of a constructor.
-static SourceLocation getColonLoc(const ASTContext *Context,
- const CXXConstructorDecl *Ctor) {
- // FIXME: First init is the first initialization that is going to be
- // performed, no matter what was the real order in the source code. If the
- // order of the inits is wrong in the code, it may result in a false negative.
- SourceLocation FirstInit = (*Ctor->init_begin())->getSourceLocation();
- SourceLocation LastArg =
- Ctor->getParamDecl(Ctor->getNumParams() - 1)->getLocEnd();
- // We need to find the colon between the ')' and the first initializer.
- bool Invalid = false;
- StringRef Text = Lexer::getSourceText(
- CharSourceRange::getCharRange(LastArg, FirstInit),
- Context->getSourceManager(), Context->getLangOpts(), &Invalid);
- if (Invalid)
- return SourceLocation();
-
- size_t ColonPos = Text.rfind(':');
- if (ColonPos == StringRef::npos)
- return SourceLocation();
-
- Text = Text.drop_front(ColonPos + 1);
- if (std::strspn(Text.data(), " \t\r\n") != Text.size()) {
- // If there are comments, preprocessor directives or anything, abort.
- return SourceLocation();
- }
- // FIXME: don't remove comments in the middle of the initializers.
- return LastArg.getLocWithOffset(ColonPos);
-}
-
/// \brief Finds all the named non-static fields of \p Record.
static std::set<const FieldDecl *>
getAllNamedFields(const CXXRecordDecl *Record) {
@@ -262,7 +231,6 @@ void UseDefaultCheck::registerMatchers(M
void UseDefaultCheck::check(const MatchFinder::MatchResult &Result) {
std::string SpecialFunctionName;
- SourceLocation StartLoc, EndLoc;
// Both CXXConstructorDecl and CXXDestructorDecl inherit from CXXMethodDecl.
const auto *SpecialFunctionDecl =
@@ -280,15 +248,13 @@ void UseDefaultCheck::check(const MatchF
if (!Body)
return;
- // Default locations.
- StartLoc = Body->getLBracLoc();
- EndLoc = Body->getRBracLoc();
-
// If there are comments inside the body, don't do the change.
if (!SpecialFunctionDecl->isCopyAssignmentOperator() &&
!bodyEmpty(Result.Context, Body))
return;
+ std::vector<FixItHint> RemoveInitializers;
+
if (const auto *Ctor = dyn_cast<CXXConstructorDecl>(SpecialFunctionDecl)) {
if (Ctor->getNumParams() == 0) {
SpecialFunctionName = "default constructor";
@@ -297,10 +263,9 @@ void UseDefaultCheck::check(const MatchF
return;
SpecialFunctionName = "copy constructor";
// If there are constructor initializers, they must be removed.
- if (Ctor->getNumCtorInitializers() != 0) {
- StartLoc = getColonLoc(Result.Context, Ctor);
- if (!StartLoc.isValid())
- return;
+ for (const CXXCtorInitializer *Init : Ctor->inits()) {
+ RemoveInitializers.emplace_back(
+ FixItHint::CreateRemoval(Init->getSourceRange()));
}
}
} else if (isa<CXXDestructorDecl>(SpecialFunctionDecl)) {
@@ -313,8 +278,8 @@ void UseDefaultCheck::check(const MatchF
diag(SpecialFunctionDecl->getLocStart(),
"use '= default' to define a trivial " + SpecialFunctionName)
- << FixItHint::CreateReplacement(
- CharSourceRange::getTokenRange(StartLoc, EndLoc), "= default;");
+ << FixItHint::CreateReplacement(Body->getSourceRange(), "= default;")
+ << RemoveInitializers;
}
} // namespace modernize
Modified: clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-copy.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-copy.cpp?rev=284735&r1=284734&r2=284735&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-copy.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-default-copy.cpp Thu Oct 20 10:31:34 2016
@@ -8,7 +8,7 @@ struct OL {
};
OL::OL(const OL &Other) : Field(Other.Field) {}
// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use '= default' to define a trivial copy constructor [modernize-use-default]
-// CHECK-FIXES: OL::OL(const OL &Other) = default;
+// CHECK-FIXES: OL::OL(const OL &Other) = default;
OL &OL::operator=(const OL &Other) {
Field = Other.Field;
return *this;
@@ -20,7 +20,7 @@ OL &OL::operator=(const OL &Other) {
struct IL {
IL(const IL &Other) : Field(Other.Field) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: IL(const IL &Other) = default;
+ // CHECK-FIXES: IL(const IL &Other) = default;
IL &operator=(const IL &Other) {
Field = Other.Field;
return *this;
@@ -43,7 +43,8 @@ struct Qual {
Mutable(Other.Mutable), Reference(Other.Reference),
Const(Other.Const) {}
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use '= default'
- // CHECK-FIXES: Qual(const Qual &Other) = default;
+ // CHECK-FIXES: Qual(const Qual &Other)
+ // CHECK-FIXES: = default;
int Field;
volatile char Volatile;
@@ -80,6 +81,8 @@ MF &MF::operator=(const MF &Other) {
struct Comments {
Comments(const Comments &Other)
/* don't delete */ : /* this comment */ Field(Other.Field) {}
+ // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use '= default'
+ // CHECK-FIXES: /* don't delete */ = default;
int Field;
};
@@ -95,7 +98,7 @@ struct MoreComments {
struct ColonInComment {
ColonInComment(const ColonInComment &Other) /* : */ : Field(Other.Field) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: ColonInComment(const ColonInComment &Other) /* : */ = default;
+ // CHECK-FIXES: ColonInComment(const ColonInComment &Other) /* : */ = default;
int Field;
};
@@ -116,7 +119,8 @@ struct BF {
BF(const BF &Other) : Field1(Other.Field1), Field2(Other.Field2), Field3(Other.Field3),
Field4(Other.Field4) {}
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use '= default'
- // CHECK-FIXES: BF(const BF &Other) = default;
+ // CHECK-FIXES: BF(const BF &Other) {{$}}
+ // CHECK-FIXES: = default;
BF &operator=(const BF &);
unsigned Field1 : 3;
@@ -140,7 +144,7 @@ BF &BF::operator=(const BF &Other) {
struct BC : IL, OL, BF {
BC(const BC &Other) : IL(Other), OL(Other), BF(Other) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: BC(const BC &Other) = default;
+ // CHECK-FIXES: BC(const BC &Other) = default;
BC &operator=(const BC &Other);
};
BC &BC::operator=(const BC &Other) {
@@ -156,7 +160,7 @@ BC &BC::operator=(const BC &Other) {
struct BCWM : IL, OL {
BCWM(const BCWM &Other) : IL(Other), OL(Other), Bf(Other.Bf) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: BCWM(const BCWM &Other) = default;
+ // CHECK-FIXES: BCWM(const BCWM &Other) = default;
BCWM &operator=(const BCWM &);
BF Bf;
};
@@ -200,7 +204,7 @@ struct VBC : VA, VB, virtual OL {
// is a virtual OL at the beginning of VA (which is the same).
VBC(const VBC &Other) : OL(Other), VA(Other), VB(Other) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: VBC(const VBC &Other) = default;
+ // CHECK-FIXES: VBC(const VBC &Other) = default;
VBC &operator=(const VBC &Other);
};
VBC &VBC::operator=(const VBC &Other) {
@@ -335,7 +339,7 @@ CIB &CIB::operator=(const CIB &Other) {
struct NCRef {
NCRef(NCRef &Other) : Field1(Other.Field1), Field2(Other.Field2) {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
- // CHECK-FIXES: NCRef(NCRef &Other) = default;
+ // CHECK-FIXES: NCRef(NCRef &Other) = default;
NCRef &operator=(NCRef &);
int Field1, Field2;
};
More information about the cfe-commits
mailing list