Skip to content

Commit 8adfb38

Browse files
committed
[clang-tidy] Simplify diagnostics for UniqueptrResetRelease check
Tweak the diagnostics to create small replacements rather than grabbing source text from the lexer. Also simplified the diagnostic message. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D97632
1 parent 87e05eb commit 8adfb38

File tree

2 files changed

+42
-45
lines changed

2 files changed

+42
-45
lines changed

clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,21 @@ namespace misc {
1919
void UniqueptrResetReleaseCheck::registerMatchers(MatchFinder *Finder) {
2020
Finder->addMatcher(
2121
cxxMemberCallExpr(
22-
on(expr().bind("left")), callee(memberExpr().bind("reset_member")),
23-
callee(
24-
cxxMethodDecl(hasName("reset"),
25-
ofClass(cxxRecordDecl(hasName("::std::unique_ptr"),
26-
decl().bind("left_class"))))),
27-
has(ignoringParenImpCasts(cxxMemberCallExpr(
28-
on(expr().bind("right")),
29-
callee(memberExpr().bind("release_member")),
30-
callee(cxxMethodDecl(
31-
hasName("release"),
32-
ofClass(cxxRecordDecl(hasName("::std::unique_ptr"),
33-
decl().bind("right_class")))))))))
22+
callee(memberExpr(
23+
member(cxxMethodDecl(
24+
hasName("reset"),
25+
ofClass(cxxRecordDecl(hasName("::std::unique_ptr"),
26+
decl().bind("left_class"))))))
27+
.bind("reset_member")),
28+
hasArgument(
29+
0, ignoringParenImpCasts(cxxMemberCallExpr(
30+
on(expr().bind("right")),
31+
callee(memberExpr(member(cxxMethodDecl(
32+
hasName("release"),
33+
ofClass(cxxRecordDecl(
34+
hasName("::std::unique_ptr"),
35+
decl().bind("right_class"))))))
36+
.bind("release_member"))))))
3437
.bind("reset_call"),
3538
this);
3639
}
@@ -95,37 +98,31 @@ void UniqueptrResetReleaseCheck::check(const MatchFinder::MatchResult &Result) {
9598
const auto *ReleaseMember =
9699
Result.Nodes.getNodeAs<MemberExpr>("release_member");
97100
const auto *Right = Result.Nodes.getNodeAs<Expr>("right");
98-
const auto *Left = Result.Nodes.getNodeAs<Expr>("left");
99101
const auto *ResetCall =
100102
Result.Nodes.getNodeAs<CXXMemberCallExpr>("reset_call");
101103

102-
std::string LeftText = std::string(clang::Lexer::getSourceText(
103-
CharSourceRange::getTokenRange(Left->getSourceRange()),
104-
*Result.SourceManager, getLangOpts()));
105-
std::string RightText = std::string(clang::Lexer::getSourceText(
106-
CharSourceRange::getTokenRange(Right->getSourceRange()),
107-
*Result.SourceManager, getLangOpts()));
108-
109-
if (ResetMember->isArrow())
110-
LeftText = "*" + LeftText;
111-
if (ReleaseMember->isArrow())
112-
RightText = "*" + RightText;
113-
bool IsMove = false;
114-
// Even if x was rvalue, *x is not rvalue anymore.
115-
if (!Right->isRValue() || ReleaseMember->isArrow()) {
116-
RightText = "std::move(" + RightText + ")";
117-
IsMove = true;
104+
StringRef AssignmentText = " = ";
105+
StringRef TrailingText = "";
106+
if (ReleaseMember->isArrow()) {
107+
AssignmentText = " = std::move(*";
108+
TrailingText = ")";
109+
} else if (!Right->isRValue()) {
110+
AssignmentText = " = std::move(";
111+
TrailingText = ")";
118112
}
119113

120-
std::string NewText = LeftText + " = " + RightText;
121-
122-
diag(ResetMember->getExprLoc(),
123-
"prefer ptr = %select{std::move(ptr2)|ReturnUnique()}0 over "
124-
"ptr.reset(%select{ptr2|ReturnUnique()}0.release())")
125-
<< !IsMove
126-
<< FixItHint::CreateReplacement(
127-
CharSourceRange::getTokenRange(ResetCall->getSourceRange()),
128-
NewText);
114+
auto D = diag(ResetMember->getExprLoc(),
115+
"prefer 'unique_ptr<>' assignment over 'release' and 'reset'");
116+
if (ResetMember->isArrow())
117+
D << FixItHint::CreateInsertion(ResetMember->getBeginLoc(), "*");
118+
D << FixItHint::CreateReplacement(
119+
CharSourceRange::getCharRange(ResetMember->getOperatorLoc(),
120+
Right->getBeginLoc()),
121+
AssignmentText)
122+
<< FixItHint::CreateReplacement(
123+
CharSourceRange::getTokenRange(ReleaseMember->getOperatorLoc(),
124+
ResetCall->getEndLoc()),
125+
TrailingText);
129126
}
130127

131128
} // namespace misc

clang-tools-extra/test/clang-tidy/checkers/misc-uniqueptr-reset-release.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,27 @@ void f() {
3333
std::unique_ptr<Foo> *y = &b;
3434

3535
a.reset(b.release());
36-
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr = std::move(ptr2) over ptr.reset(ptr2.release()) [misc-uniqueptr-reset-release]
36+
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment over 'release' and 'reset' [misc-uniqueptr-reset-release]
3737
// CHECK-FIXES: a = std::move(b);
3838
a.reset(c.release());
39-
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr = std::move(ptr2)
39+
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment
4040
// CHECK-FIXES: a = std::move(c);
4141
a.reset(Create().release());
42-
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer ptr = ReturnUnique() over ptr.reset(ReturnUnique().release()) [misc-uniqueptr-reset-release]
42+
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: prefer 'unique_ptr<>' assignment
4343
// CHECK-FIXES: a = Create();
4444
x->reset(y->release());
45-
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: prefer ptr = std::move(ptr2)
45+
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: prefer 'unique_ptr<>' assignment
4646
// CHECK-FIXES: *x = std::move(*y);
4747
Look().reset(Look().release());
48-
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr = std::move(ptr2)
48+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
4949
// CHECK-FIXES: Look() = std::move(Look());
5050
Get()->reset(Get()->release());
51-
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr = std::move(ptr2)
51+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
5252
// CHECK-FIXES: *Get() = std::move(*Get());
5353

5454
std::unique_ptr<Bar, FooFunc> func_a, func_b;
5555
func_a.reset(func_b.release());
56-
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer ptr = std::move(ptr2)
56+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: prefer 'unique_ptr<>' assignment
5757
// CHECK-FIXES: func_a = std::move(func_b);
5858
}
5959

0 commit comments

Comments
 (0)