[clang-tools-extra] [clang-tidy] Fix trailing semicolon and lost comment in readability-use-std-min-max (PR #208782)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 1 00:46:18 PDT 2026
https://github.com/xxxxbc updated https://github.com/llvm/llvm-project/pull/208782
>From b0217e26f8a4ddbbefe50e86e4c3fbf7e5517e7b Mon Sep 17 00:00:00 2001
From: hehuan <2128534713 at qq.com>
Date: Sat, 11 Jul 2026 01:11:39 +0800
Subject: [PATCH] [clang-tidy] Fix trailing semicolon and lost comment in
readability-use-std-min-max
For non-compound if bodies (no braces), If->getEndLoc() returns the end
of the expression, not the trailing semicolon. The replacement range
therefore stopped before the semicolon, causing a duplicate semicolon in
the output. Any comments between the expression and the semicolon were
also lost.
Add handling for the non-compound case that mirrors the existing
compound-statement logic: find the trailing semicolon, capture any
intervening comments, and extend the replacement range to cover it.
Fixes #208708.
---
.../clang-tidy/readability/UseStdMinMaxCheck.cpp | 10 +++++++++-
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++
.../checkers/readability/use-std-min-max.cpp | 12 ++++++++++++
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/readability/UseStdMinMaxCheck.cpp b/clang-tools-extra/clang-tidy/readability/UseStdMinMaxCheck.cpp
index ed1af05d232ce..b1a4001e293a6 100644
--- a/clang-tools-extra/clang-tidy/readability/UseStdMinMaxCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/UseStdMinMaxCheck.cpp
@@ -167,7 +167,7 @@ void UseStdMinMaxCheck::check(const MatchFinder::MatchResult &Result) {
const auto *BinaryOp = Result.Nodes.getNodeAs<BinaryOperator>("binaryOp");
const BinaryOperatorKind BinaryOpcode = BinaryOp->getOpcode();
const SourceLocation IfLocation = If->getIfLoc();
- const SourceLocation ThenLocation = If->getEndLoc();
+ SourceLocation ThenLocation = If->getEndLoc();
auto ReplaceAndDiagnose = [&](const StringRef FunctionName) {
const SourceManager &Source = *Result.SourceManager;
@@ -218,6 +218,14 @@ void UseStdMinMaxCheck::check(const MatchFinder::MatchResult &Result) {
if (Semi != StringRef::npos && PostInner.take_front(Semi).trim().empty())
PostInner = PostInner.drop_front(Semi + 1);
AppendNormalized(PostInner);
+ } else {
+ if (const auto SemiTok =
+ Lexer::findNextToken(ThenLocation, Source, LO);
+ SemiTok && SemiTok->is(tok::semi)) {
+ AppendNormalized(
+ GetSourceText(ThenLocation, SemiTok->getLocation()).rtrim());
+ ThenLocation = SemiTok->getLocation();
+ }
}
diag(IfLocation, "use `%0` instead of `%1`")
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 9a5a23f3d8542..66ce08534cae8 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -121,6 +121,10 @@ Changes in existing checks
exclusively for overload resolution. Added the :option:`IgnoredTypes`
option to allow customizing the set of ignored types.
+- Improved :doc:`readability-use-std-min-max
+ <clang-tidy/checks/readability/use-std-min-max>` check by fixing spurious
+ trailing semicolons and lost comments when the ``if`` body has no braces.
+
Removed checks
^^^^^^^^^^^^^^
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/use-std-min-max.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/use-std-min-max.cpp
index 35570189e1122..ebc3783e84650 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/use-std-min-max.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/use-std-min-max.cpp
@@ -253,6 +253,18 @@ void testVectorSizeType() {
value = v.size();
}
+namespace gh208708 {
+void f(int &n) {
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::max` instead of `<`
+ // CHECK-FIXES: n = std::max(n, -1);
+ if (n < -1) n = -1 ;
+
+ // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: use `std::min` instead of `>`
+ // CHECK-FIXES: n = std::min(n, 1); /*use clamp when c++17 or later is enabled*/
+ if (n > 1) n = 1/*use clamp when c++17 or later is enabled*/;
+}
+} // namespace gh208708
+
namespace gh121676 {
void useLeft() {
More information about the cfe-commits
mailing list