[clang-tidy] Avoid adding unnecessary semicolon in modernize-use-equals-default

Adjust the automatic fixit to avoid adding superfluous semicolon.

Test plan: ninja check-all

Differential revision: https://reviews.llvm.org/D136399
This commit is contained in:
Alexander Shaposhnikov 2022-10-22 00:42:50 +00:00
parent d3f8e0bf8d
commit 6c07bda7a7
3 changed files with 30 additions and 6 deletions

View File

@ -337,10 +337,13 @@ void UseEqualsDefaultCheck::check(const MatchFinder::MatchResult &Result) {
Diag << MemberType;
if (ApplyFix) {
SourceLocation UnifiedEnd = utils::lexer::getUnifiedEndLoc(
*Body, Result.Context->getSourceManager(),
Result.Context->getLangOpts());
// Skipping comments, check for a semicolon after Body->getSourceRange()
Optional<Token> Token = utils::lexer::findNextTokenSkippingComments(
Body->getSourceRange().getEnd().getLocWithOffset(1),
Result.Context->getSourceManager(), Result.Context->getLangOpts());
UnifiedEnd, Result.Context->getSourceManager(),
Result.Context->getLangOpts());
StringRef Replacement =
Token && Token->is(tok::semi) ? "= default" : "= default;";
Diag << FixItHint::CreateReplacement(Body->getSourceRange(), Replacement)

View File

@ -159,6 +159,7 @@ Changes in existing checks
with empty body is not equivalent to the explicitly defaulted one, variadic constructors
since they cannot be explicitly defaulted. The check also skips copy assignment operators
with nonstandard return types, private/protected default constructors for C++17 or earlier.
The automatic fixit has been adjusted to avoid adding superfluous semicolon.
The check is restricted to C++11 or later.
- Change the default behavior of :doc:`readability-avoid-const-params-in-decls

View File

@ -91,7 +91,7 @@ public:
// Private constructor/destructor.
class Priv {
Priv();
~Priv() {};
~Priv() {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: ~Priv() = default;
};
@ -100,14 +100,28 @@ Priv::Priv() {}
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use '= default'
// CHECK-FIXES: Priv::Priv() = default;
struct SemiColon {
SemiColon() {};
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: SemiColon() = default;{{$}}
};
struct SemiColonOutOfLine {
SemiColonOutOfLine();
};
SemiColonOutOfLine::SemiColonOutOfLine() {};
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: use '= default'
// CHECK-FIXES: SemiColonOutOfLine::SemiColonOutOfLine() = default;{{$}}
// struct.
struct ST {
ST() {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: ST() = default;
// CHECK-FIXES: ST() = default;{{$}}
~ST() {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: ST() = default;
// CHECK-FIXES: ST() = default;{{$}}
};
// Deleted constructor/destructor.
@ -200,7 +214,13 @@ struct DC : KW {
DC() : KW() {}
~DC() override {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: ~DC() override = default;
// CHECK-FIXES: ~DC() override = default;{{$}}
};
struct OverrideWithSemiColon : KW {
~OverrideWithSemiColon() override {};
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= default'
// CHECK-FIXES: ~OverrideWithSemiColon() override = default;{{$}}
};
struct Comments {