[clang-tools-extra] [clang-tidy][NFC] Fix `bugprone-unchecked-optional-access` warnings in codebase (PR #170004)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 24 05:32:14 PST 2026
https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/170004
>From 026c03ac0ceb4a94c00f97535cc7f2f64d51ab84 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 22:53:37 +0800
Subject: [PATCH 01/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
ClangTidyProfiling
---
.../clang-tidy/ClangTidyProfiling.cpp | 22 +++++++++----------
.../clang-tidy/ClangTidyProfiling.h | 5 +++--
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
index 6fee154be448c..7f8b2e9b66209 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
@@ -43,10 +43,11 @@ void ClangTidyProfiling::printUserFriendlyTable(llvm::raw_ostream &OS,
}
void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
- llvm::TimerGroup &TG) {
+ llvm::TimerGroup &TG,
+ const StorageParams &Storage) {
OS << "{\n";
- OS << R"("file": ")" << Storage->SourceFilename << "\",\n";
- OS << R"("timestamp": ")" << Storage->Timestamp << "\",\n";
+ OS << R"("file": ")" << Storage.SourceFilename << "\",\n";
+ OS << R"("timestamp": ")" << Storage.Timestamp << "\",\n";
OS << "\"profile\": {\n";
TG.printJSONValues(OS, "");
OS << "\n}\n";
@@ -54,10 +55,9 @@ void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
OS.flush();
}
-void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG) {
- assert(Storage && "We should have a filename.");
-
- llvm::SmallString<256> OutputDirectory(Storage->StoreFilename);
+void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG,
+ const StorageParams &Storage) {
+ llvm::SmallString<256> OutputDirectory(Storage.StoreFilename);
llvm::sys::path::remove_filename(OutputDirectory);
if (const std::error_code EC =
llvm::sys::fs::create_directories(OutputDirectory)) {
@@ -67,14 +67,14 @@ void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG) {
}
std::error_code EC;
- llvm::raw_fd_ostream OS(Storage->StoreFilename, EC, llvm::sys::fs::OF_None);
+ llvm::raw_fd_ostream OS(Storage.StoreFilename, EC, llvm::sys::fs::OF_None);
if (EC) {
- llvm::errs() << "Error opening output file '" << Storage->StoreFilename
+ llvm::errs() << "Error opening output file '" << Storage.StoreFilename
<< "': " << EC.message() << "\n";
return;
}
- printAsJSON(OS, TG);
+ printAsJSON(OS, TG, Storage);
}
ClangTidyProfiling::ClangTidyProfiling(std::optional<StorageParams> Storage)
@@ -85,7 +85,7 @@ ClangTidyProfiling::~ClangTidyProfiling() {
if (!Storage)
printUserFriendlyTable(llvm::errs(), TG);
else
- storeProfileData(TG);
+ storeProfileData(TG, *Storage);
}
} // namespace clang::tidy
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.h b/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
index 59c213b181ef7..40efcc10e2c47 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
@@ -37,8 +37,9 @@ class ClangTidyProfiling {
std::optional<StorageParams> Storage;
void printUserFriendlyTable(llvm::raw_ostream &OS, llvm::TimerGroup &TG);
- void printAsJSON(llvm::raw_ostream &OS, llvm::TimerGroup &TG);
- void storeProfileData(llvm::TimerGroup &TG);
+ void printAsJSON(llvm::raw_ostream &OS, llvm::TimerGroup &TG,
+ const StorageParams &Storage);
+ void storeProfileData(llvm::TimerGroup &TG, const StorageParams &Storage);
public:
llvm::StringMap<llvm::TimeRecord> Records;
>From 8f291da8d6fc14c6bbed07d64210d0bc427bf926 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 22:54:30 +0800
Subject: [PATCH 02/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
EasilySwappableParametersCheck
---
.../clang-tidy/bugprone/EasilySwappableParametersCheck.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
index a07a68c8a3e65..bdc451be77c08 100644
--- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -1690,8 +1690,9 @@ class PassedToSameFunction {
TargetIdx.emplace(Idx);
assert(TargetIdx && "Matched, but didn't find index?");
- TargetParams[PassedParamOfThisFn].insert(
- {CalledFn->getCanonicalDecl(), *TargetIdx});
+ if (TargetIdx)
+ TargetParams[PassedParamOfThisFn].insert(
+ {CalledFn->getCanonicalDecl(), *TargetIdx});
}
}
>From 83e4eff69af6d7705836a2f4c8a99a0165b7a97c Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 22:58:04 +0800
Subject: [PATCH 03/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
IdentifierNamingCheck
---
.../readability/IdentifierNamingCheck.cpp | 26 ++++++++++++-------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index d1583a62a8e5e..a4dda7e5e3285 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -440,7 +440,7 @@ bool IdentifierNamingCheck::HungarianNotation::isOptionEnabled(
if (Iter == StrMap.end())
return false;
- return *llvm::yaml::parseBool(Iter->getValue());
+ return llvm::yaml::parseBool(Iter->getValue()).value_or(false);
}
void IdentifierNamingCheck::HungarianNotation::loadFileConfig(
@@ -834,26 +834,28 @@ void IdentifierNamingCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
const ArrayRef<std::optional<NamingStyle>> Styles =
MainFileStyle->getStyles();
for (size_t I = 0; I < SK_Count; ++I) {
- if (!Styles[I])
+ const auto &StyleOpt = Styles[I];
+ if (!StyleOpt)
continue;
+ const NamingStyle &Style = *StyleOpt;
const size_t StyleSize = StyleNames[I].size();
StyleString.assign({StyleNames[I], "HungarianPrefix"});
- Options.store(Opts, StyleString, Styles[I]->HPType);
+ Options.store(Opts, StyleString, Style.HPType);
memcpy(&StyleString[StyleSize], "IgnoredRegexp", 13);
StyleString.truncate(StyleSize + 13);
- Options.store(Opts, StyleString, Styles[I]->IgnoredRegexpStr);
+ Options.store(Opts, StyleString, Style.IgnoredRegexpStr);
memcpy(&StyleString[StyleSize], "Prefix", 6);
StyleString.truncate(StyleSize + 6);
- Options.store(Opts, StyleString, Styles[I]->Prefix);
+ Options.store(Opts, StyleString, Style.Prefix);
// Fast replacement of [Pre]fix -> [Suf]fix.
memcpy(&StyleString[StyleSize], "Suf", 3);
- Options.store(Opts, StyleString, Styles[I]->Suffix);
- if (Styles[I]->Case) {
+ Options.store(Opts, StyleString, Style.Suffix);
+ if (Style.Case) {
memcpy(&StyleString[StyleSize], "Case", 4);
StyleString.pop_back_n(2);
- Options.store(Opts, StyleString, *Styles[I]->Case);
+ Options.store(Opts, StyleString, *Style.Case);
}
}
Options.store(Opts, "GetConfigPerFile", GetConfigPerFile);
@@ -1344,10 +1346,14 @@ IdentifierNamingCheck::getFailureInfo(
ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles,
const IdentifierNamingCheck::HungarianNotationOption &HNOption,
StyleKind SK, const SourceManager &SM, bool IgnoreFailedSplit) const {
- if (SK == SK_Invalid || !NamingStyles[SK])
+ if (SK == SK_Invalid)
return std::nullopt;
- const IdentifierNamingCheck::NamingStyle &Style = *NamingStyles[SK];
+ const auto &StyleOpt = NamingStyles[SK];
+ if (!StyleOpt)
+ return std::nullopt;
+
+ const IdentifierNamingCheck::NamingStyle &Style = *StyleOpt;
if (Style.IgnoredRegexp.isValid() && Style.IgnoredRegexp.match(Name))
return std::nullopt;
>From 395da7551951fb80ad18a4a1a67c5dec8f83e42d Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 22:59:08 +0800
Subject: [PATCH 04/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
FunctionSizeCheck
---
.../clang-tidy/readability/FunctionSizeCheck.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp b/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
index 2f0949c231844..b80eed3f12971 100644
--- a/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
@@ -225,10 +225,12 @@ void FunctionSizeCheck::check(const MatchFinder::MatchResult &Result) {
<< ActualNumberParameters << ParameterThreshold.value();
}
- for (const auto &CSPos : FI.NestingThresholders) {
- diag(CSPos, "nesting level %0 starts here (threshold %1)",
- DiagnosticIDs::Note)
- << NestingThreshold.value() + 1 << NestingThreshold.value();
+ if (NestingThreshold) {
+ for (const auto &CSPos : FI.NestingThresholders) {
+ diag(CSPos, "nesting level %0 starts here (threshold %1)",
+ DiagnosticIDs::Note)
+ << NestingThreshold.value() + 1 << NestingThreshold.value();
+ }
}
if (VariableThreshold && FI.Variables > VariableThreshold) {
>From f6677ba346b91fcf18f4f9950ca305b4c34a4ab3 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:00:11 +0800
Subject: [PATCH 05/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
ExceptionAnalyzer
---
clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
index f766a1bca655c..428e3822c78c6 100644
--- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -304,6 +304,9 @@ static bool isQualificationConvertiblePointer(QualType From, QualType To,
"From pointer or array has no pointee or element!");
assert(ToPointeeOrElem && "To pointer or array has no pointee or element!");
+ if (!FromPointeeOrElem || !ToPointeeOrElem)
+ return false;
+
From = *FromPointeeOrElem;
To = *ToPointeeOrElem;
}
>From 4f0c34264df35ac61967c8acfae94a27af3ce047 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:00:59 +0800
Subject: [PATCH 06/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
TimeSubtractionCheck
---
clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
index 4ae49d285930d..b23b6ad25a23c 100644
--- a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
@@ -96,6 +96,8 @@ void TimeSubtractionCheck::registerMatchers(MatchFinder *Finder) {
const std::string TimeInverse = (llvm::Twine("ToUnix") + ScaleName).str();
std::optional<DurationScale> Scale = getScaleForTimeInverse(TimeInverse);
assert(Scale && "Unknown scale encountered");
+ if (!Scale)
+ continue;
auto TimeInverseMatcher = callExpr(callee(
functionDecl(hasName((llvm::Twine("::absl::") + TimeInverse).str()))
>From 7f6239f19a809f8ed9623d651942d819d1498bc7 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:08:27 +0800
Subject: [PATCH 07/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
ClangTidyDiagnosticConsumer
---
.../ClangTidyDiagnosticConsumer.cpp | 21 +++++++++++--------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 6716d90a1acaf..7198dd5bb8546 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -239,13 +239,16 @@ static bool parseFileExtensions(llvm::ArrayRef<std::string> AllFileExtensions,
void ClangTidyContext::setCurrentFile(StringRef File) {
CurrentFile = std::string(File);
CurrentOptions = getOptionsForFile(CurrentFile);
- CheckFilter = std::make_unique<CachedGlobList>(*getOptions().Checks);
- WarningAsErrorFilter =
- std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
- if (!parseFileExtensions(*getOptions().HeaderFileExtensions,
+ CheckFilter =
+ std::make_unique<CachedGlobList>(getOptions().Checks.value_or(""));
+ WarningAsErrorFilter = std::make_unique<CachedGlobList>(
+ getOptions().WarningsAsErrors.value_or(""));
+ if (!parseFileExtensions(getOptions().HeaderFileExtensions.value_or(
+ std::vector<std::string>()),
HeaderFileExtensions))
this->configurationDiag("Invalid header file extensions");
- if (!parseFileExtensions(*getOptions().ImplementationFileExtensions,
+ if (!parseFileExtensions(getOptions().ImplementationFileExtensions.value_or(
+ std::vector<std::string>()),
ImplementationFileExtensions))
this->configurationDiag("Invalid implementation file extensions");
}
@@ -569,7 +572,7 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
return;
}
- if (!*Context.getOptions().SystemHeaders &&
+ if (!Context.getOptions().SystemHeaders.value_or(false) &&
(Sources.isInSystemHeader(Location) || Sources.isInSystemMacro(Location)))
return;
@@ -600,15 +603,15 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
llvm::Regex *ClangTidyDiagnosticConsumer::getHeaderFilter() {
if (!HeaderFilter)
- HeaderFilter =
- std::make_unique<llvm::Regex>(*Context.getOptions().HeaderFilterRegex);
+ HeaderFilter = std::make_unique<llvm::Regex>(
+ Context.getOptions().HeaderFilterRegex.value_or(""));
return HeaderFilter.get();
}
llvm::Regex *ClangTidyDiagnosticConsumer::getExcludeHeaderFilter() {
if (!ExcludeHeaderFilter)
ExcludeHeaderFilter = std::make_unique<llvm::Regex>(
- *Context.getOptions().ExcludeHeaderFilterRegex);
+ Context.getOptions().ExcludeHeaderFilterRegex.value_or(""));
return ExcludeHeaderFilter.get();
}
>From b1eeb0517e1107131811f20faf9001a3a5585b6d Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:09:15 +0800
Subject: [PATCH 08/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
UseRangesCheck
---
clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp b/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
index 09adbf1155e62..5cd88a72e83e1 100644
--- a/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
@@ -247,6 +247,8 @@ void UseRangesCheck::check(const MatchFinder::MatchResult &Result) {
Result.Context->getLangOpts()));
} else {
assert(ReverseDescriptor && "Couldn't find forward argument");
+ if (!ReverseDescriptor)
+ return;
ArgNode.push_back('R');
ArgExpr = Result.Nodes.getNodeAs<Expr>(ArgNode);
assert(ArgExpr && "Couldn't find forward or reverse argument");
>From d5e3c033486e1ca4f7ab883cb6f8a34f8598fa80 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:10:38 +0800
Subject: [PATCH 09/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
RedundantBranchConditionCheck
---
.../RedundantBranchConditionCheck.cpp | 36 ++++++++++---------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
index 528c254dbe17e..8eced3ee61c33 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
@@ -132,17 +132,18 @@ void RedundantBranchConditionCheck::check(
// If the other side has side effects then keep it.
if (OtherSide && OtherSide->HasSideEffects(*Result.Context)) {
- const SourceLocation BeforeOtherSide =
- OtherSide->getBeginLoc().getLocWithOffset(-1);
- const SourceLocation AfterOtherSide =
- Lexer::findNextToken(OtherSide->getEndLoc(), *Result.SourceManager,
- getLangOpts())
- ->getLocation();
- Diag << FixItHint::CreateRemoval(
- CharSourceRange::getTokenRange(IfBegin, BeforeOtherSide))
- << FixItHint::CreateInsertion(AfterOtherSide, ";")
- << FixItHint::CreateRemoval(
- CharSourceRange::getTokenRange(AfterOtherSide, IfEnd));
+ auto NextToken = Lexer::findNextToken(
+ OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts());
+ if (NextToken) {
+ const SourceLocation BeforeOtherSide =
+ OtherSide->getBeginLoc().getLocWithOffset(-1);
+ const SourceLocation AfterOtherSide = NextToken->getLocation();
+ Diag << FixItHint::CreateRemoval(
+ CharSourceRange::getTokenRange(IfBegin, BeforeOtherSide))
+ << FixItHint::CreateInsertion(AfterOtherSide, ";")
+ << FixItHint::CreateRemoval(
+ CharSourceRange::getTokenRange(AfterOtherSide, IfEnd));
+ }
} else {
Diag << FixItHint::CreateRemoval(
CharSourceRange::getTokenRange(IfBegin, IfEnd));
@@ -166,12 +167,13 @@ void RedundantBranchConditionCheck::check(
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
CondOp->getLHS()->getBeginLoc(), BeforeRHS));
} else {
- const SourceLocation AfterLHS =
- Lexer::findNextToken(CondOp->getLHS()->getEndLoc(),
- *Result.SourceManager, getLangOpts())
- ->getLocation();
- Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
- AfterLHS, CondOp->getRHS()->getEndLoc()));
+ auto NextToken = Lexer::findNextToken(
+ CondOp->getLHS()->getEndLoc(), *Result.SourceManager, getLangOpts());
+ if (NextToken) {
+ const SourceLocation AfterLHS = NextToken->getLocation();
+ Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
+ AfterLHS, CondOp->getRHS()->getEndLoc()));
+ }
}
}
}
>From eabda175aad16af8cb13812741dcb815aa3b1db6 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:11:28 +0800
Subject: [PATCH 10/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
ClangTidy.cpp
---
clang-tools-extra/clang-tidy/ClangTidy.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp
index 4af328cd5110a..e2f581562e97d 100644
--- a/clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -213,7 +213,8 @@ class ErrorReporter {
}
const StringRef Code = Buffer.get()->getBuffer();
auto Style = format::getStyle(
- *Context.getOptionsForFile(File).FormatStyle, File, "none");
+ Context.getOptionsForFile(File).FormatStyle.value_or("none"), File,
+ "none");
if (!Style) {
llvm::errs() << llvm::toString(Style.takeError()) << "\n";
continue;
>From 4fd99891b3a6ef254a664a4382c128eaca9fca82 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:13:18 +0800
Subject: [PATCH 11/24] [clang-tidy] Fix bugprone-unchecked-optional-access in
FormatStringConverter
---
.../clang-tidy/utils/FormatStringConverter.cpp | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp b/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
index d210b000dfd33..ab830d8d455d9 100644
--- a/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
+++ b/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
@@ -800,9 +800,11 @@ void FormatStringConverter::applyFixes(DiagnosticBuilder &Diag,
}
for (const auto &[ArgIndex, Replacement] : ArgFixes) {
- const SourceLocation AfterOtherSide =
- Lexer::findNextToken(Args[ArgIndex]->getEndLoc(), SM, LangOpts)
- ->getLocation();
+ const auto NextToken =
+ Lexer::findNextToken(Args[ArgIndex]->getEndLoc(), SM, LangOpts);
+ if (!NextToken)
+ continue;
+ const SourceLocation AfterOtherSide = NextToken->getLocation();
Diag << FixItHint::CreateInsertion(Args[ArgIndex]->getBeginLoc(),
Replacement, true)
>From a9d0e38f431f6981acfd44cbcbf59ffbde51516e Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 29 Nov 2025 23:26:15 +0800
Subject: [PATCH 12/24] [clang-tidy] Enable bugprone-unchecked-optional-access
---
clang-tools-extra/clang-tidy/.clang-tidy | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/.clang-tidy b/clang-tools-extra/clang-tidy/.clang-tidy
index 82d0df8697178..26dfeb4a1f743 100644
--- a/clang-tools-extra/clang-tidy/.clang-tidy
+++ b/clang-tools-extra/clang-tidy/.clang-tidy
@@ -7,7 +7,7 @@ Checks: >
-bugprone-branch-clone,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
- -bugprone-unchecked-optional-access,
+ bugprone-unchecked-optional-access,
-bugprone-unused-return-value,
misc-const-correctness,
modernize-*,
>From 26d1aa75fabd4dd103e28ec495c1f5dc5ab305bf Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sun, 30 Nov 2025 00:01:54 +0800
Subject: [PATCH 13/24] Revert "[clang-tidy] Fix
bugprone-unchecked-optional-access in ClangTidyDiagnosticConsumer"
This reverts commit 7f6239f19a809f8ed9623d651942d819d1498bc7.
---
.../ClangTidyDiagnosticConsumer.cpp | 21 ++++++++-----------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 7198dd5bb8546..6716d90a1acaf 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -239,16 +239,13 @@ static bool parseFileExtensions(llvm::ArrayRef<std::string> AllFileExtensions,
void ClangTidyContext::setCurrentFile(StringRef File) {
CurrentFile = std::string(File);
CurrentOptions = getOptionsForFile(CurrentFile);
- CheckFilter =
- std::make_unique<CachedGlobList>(getOptions().Checks.value_or(""));
- WarningAsErrorFilter = std::make_unique<CachedGlobList>(
- getOptions().WarningsAsErrors.value_or(""));
- if (!parseFileExtensions(getOptions().HeaderFileExtensions.value_or(
- std::vector<std::string>()),
+ CheckFilter = std::make_unique<CachedGlobList>(*getOptions().Checks);
+ WarningAsErrorFilter =
+ std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
+ if (!parseFileExtensions(*getOptions().HeaderFileExtensions,
HeaderFileExtensions))
this->configurationDiag("Invalid header file extensions");
- if (!parseFileExtensions(getOptions().ImplementationFileExtensions.value_or(
- std::vector<std::string>()),
+ if (!parseFileExtensions(*getOptions().ImplementationFileExtensions,
ImplementationFileExtensions))
this->configurationDiag("Invalid implementation file extensions");
}
@@ -572,7 +569,7 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
return;
}
- if (!Context.getOptions().SystemHeaders.value_or(false) &&
+ if (!*Context.getOptions().SystemHeaders &&
(Sources.isInSystemHeader(Location) || Sources.isInSystemMacro(Location)))
return;
@@ -603,15 +600,15 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
llvm::Regex *ClangTidyDiagnosticConsumer::getHeaderFilter() {
if (!HeaderFilter)
- HeaderFilter = std::make_unique<llvm::Regex>(
- Context.getOptions().HeaderFilterRegex.value_or(""));
+ HeaderFilter =
+ std::make_unique<llvm::Regex>(*Context.getOptions().HeaderFilterRegex);
return HeaderFilter.get();
}
llvm::Regex *ClangTidyDiagnosticConsumer::getExcludeHeaderFilter() {
if (!ExcludeHeaderFilter)
ExcludeHeaderFilter = std::make_unique<llvm::Regex>(
- Context.getOptions().ExcludeHeaderFilterRegex.value_or(""));
+ *Context.getOptions().ExcludeHeaderFilterRegex);
return ExcludeHeaderFilter.get();
}
>From 8d712f4bf5207f399d8518bf6ed9f29c937f1b3b Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 3 Dec 2025 23:38:57 +0800
Subject: [PATCH 14/24] [clang-tidy] Fix `ClangTidyDiagnosticConsumer`
---
.../ClangTidyDiagnosticConsumer.cpp | 29 +++++++++++++------
.../clang-tidy/ClangTidyProfiling.cpp | 1 +
.../RedundantBranchConditionCheck.cpp | 4 +--
3 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 6716d90a1acaf..ab38266de4ae4 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -239,13 +239,20 @@ static bool parseFileExtensions(llvm::ArrayRef<std::string> AllFileExtensions,
void ClangTidyContext::setCurrentFile(StringRef File) {
CurrentFile = std::string(File);
CurrentOptions = getOptionsForFile(CurrentFile);
- CheckFilter = std::make_unique<CachedGlobList>(*getOptions().Checks);
- WarningAsErrorFilter =
- std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
- if (!parseFileExtensions(*getOptions().HeaderFileExtensions,
+ CheckFilter = std::make_unique<CachedGlobList>(
+ getOptions().Checks ? StringRef(*getOptions().Checks) : StringRef(""));
+ WarningAsErrorFilter = std::make_unique<CachedGlobList>(
+ getOptions().WarningsAsErrors ? StringRef(*getOptions().WarningsAsErrors)
+ : StringRef(""));
+ static const std::vector<std::string> EmptyFileExtensions;
+ if (!parseFileExtensions(getOptions().HeaderFileExtensions
+ ? *getOptions().HeaderFileExtensions
+ : EmptyFileExtensions,
HeaderFileExtensions))
this->configurationDiag("Invalid header file extensions");
- if (!parseFileExtensions(*getOptions().ImplementationFileExtensions,
+ if (!parseFileExtensions(getOptions().ImplementationFileExtensions
+ ? *getOptions().ImplementationFileExtensions
+ : EmptyFileExtensions,
ImplementationFileExtensions))
this->configurationDiag("Invalid implementation file extensions");
}
@@ -569,7 +576,7 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
return;
}
- if (!*Context.getOptions().SystemHeaders &&
+ if (!Context.getOptions().SystemHeaders.value_or(false) &&
(Sources.isInSystemHeader(Location) || Sources.isInSystemMacro(Location)))
return;
@@ -600,15 +607,19 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
llvm::Regex *ClangTidyDiagnosticConsumer::getHeaderFilter() {
if (!HeaderFilter)
- HeaderFilter =
- std::make_unique<llvm::Regex>(*Context.getOptions().HeaderFilterRegex);
+ HeaderFilter = std::make_unique<llvm::Regex>(
+ Context.getOptions().HeaderFilterRegex
+ ? StringRef(*Context.getOptions().HeaderFilterRegex)
+ : StringRef(""));
return HeaderFilter.get();
}
llvm::Regex *ClangTidyDiagnosticConsumer::getExcludeHeaderFilter() {
if (!ExcludeHeaderFilter)
ExcludeHeaderFilter = std::make_unique<llvm::Regex>(
- *Context.getOptions().ExcludeHeaderFilterRegex);
+ Context.getOptions().ExcludeHeaderFilterRegex
+ ? StringRef(*Context.getOptions().ExcludeHeaderFilterRegex)
+ : StringRef(""));
return ExcludeHeaderFilter.get();
}
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
index 7f8b2e9b66209..bb2d5049e6c4c 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
@@ -57,6 +57,7 @@ void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG,
const StorageParams &Storage) {
+ assert(this->Storage && "We should have a filename.");
llvm::SmallString<256> OutputDirectory(Storage.StoreFilename);
llvm::sys::path::remove_filename(OutputDirectory);
if (const std::error_code EC =
diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
index 8eced3ee61c33..ceb7be5169273 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
@@ -132,7 +132,7 @@ void RedundantBranchConditionCheck::check(
// If the other side has side effects then keep it.
if (OtherSide && OtherSide->HasSideEffects(*Result.Context)) {
- auto NextToken = Lexer::findNextToken(
+ const auto NextToken = Lexer::findNextToken(
OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts());
if (NextToken) {
const SourceLocation BeforeOtherSide =
@@ -167,7 +167,7 @@ void RedundantBranchConditionCheck::check(
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
CondOp->getLHS()->getBeginLoc(), BeforeRHS));
} else {
- auto NextToken = Lexer::findNextToken(
+ const auto NextToken = Lexer::findNextToken(
CondOp->getLHS()->getEndLoc(), *Result.SourceManager, getLangOpts());
if (NextToken) {
const SourceLocation AfterLHS = NextToken->getLocation();
>From 11e86d64146ee0522e0a72cf3799a36c2df62022 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Thu, 4 Dec 2025 00:26:38 +0800
Subject: [PATCH 15/24] ~
---
.../clang-tidy/bugprone/EasilySwappableParametersCheck.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
index 2c7757b9b4c99..4acbdf16c0e9c 100644
--- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -1175,6 +1175,8 @@ class UserDefinedConversionSelector {
}
if (HowManyGoodConversions == 1) {
+ assert(BestConversion &&
+ "BestConversion must be set if HowManyGoodConversions is 1");
LLVM_DEBUG(llvm::dbgs()
<< "--- selectUserDefinedConv. Unique result. Flags: "
<< formatMixFlags(BestConversion->Flags) << '\n');
>From 67bf385b02b1f780a292de068e1c6bcc62b0127b Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 17 Dec 2025 18:16:36 +0800
Subject: [PATCH 16/24] Revert "[clang-tidy] Fix
bugprone-unchecked-optional-access in TimeSubtractionCheck"
This reverts commit 4f0c34264df35ac61967c8acfae94a27af3ce047.
---
clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
index b23b6ad25a23c..4ae49d285930d 100644
--- a/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/abseil/TimeSubtractionCheck.cpp
@@ -96,8 +96,6 @@ void TimeSubtractionCheck::registerMatchers(MatchFinder *Finder) {
const std::string TimeInverse = (llvm::Twine("ToUnix") + ScaleName).str();
std::optional<DurationScale> Scale = getScaleForTimeInverse(TimeInverse);
assert(Scale && "Unknown scale encountered");
- if (!Scale)
- continue;
auto TimeInverseMatcher = callExpr(callee(
functionDecl(hasName((llvm::Twine("::absl::") + TimeInverse).str()))
>From 8f46670d3875606bdc4f759c00206aa241a681a4 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 17 Dec 2025 18:26:08 +0800
Subject: [PATCH 17/24] Address review feedback
---
.../clang-tidy/ClangTidyDiagnosticConsumer.cpp | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 161c9aa9eb9b3..4af4042f4110a 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -240,10 +240,9 @@ void ClangTidyContext::setCurrentFile(StringRef File) {
CurrentFile = std::string(File);
CurrentOptions = getOptionsForFile(CurrentFile);
CheckFilter = std::make_unique<CachedGlobList>(
- getOptions().Checks ? StringRef(*getOptions().Checks) : StringRef(""));
+ StringRef(getOptions().Checks.value_or("")));
WarningAsErrorFilter = std::make_unique<CachedGlobList>(
- getOptions().WarningsAsErrors ? StringRef(*getOptions().WarningsAsErrors)
- : StringRef(""));
+ StringRef(getOptions().WarningsAsErrors.value_or("")));
static const std::vector<std::string> EmptyFileExtensions;
if (!parseFileExtensions(getOptions().HeaderFileExtensions
? *getOptions().HeaderFileExtensions
@@ -608,18 +607,14 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
llvm::Regex *ClangTidyDiagnosticConsumer::getHeaderFilter() {
if (!HeaderFilter)
HeaderFilter = std::make_unique<llvm::Regex>(
- Context.getOptions().HeaderFilterRegex
- ? StringRef(*Context.getOptions().HeaderFilterRegex)
- : StringRef(""));
+ StringRef(Context.getOptions().HeaderFilterRegex.value_or("")));
return HeaderFilter.get();
}
llvm::Regex *ClangTidyDiagnosticConsumer::getExcludeHeaderFilter() {
if (!ExcludeHeaderFilter)
ExcludeHeaderFilter = std::make_unique<llvm::Regex>(
- Context.getOptions().ExcludeHeaderFilterRegex
- ? StringRef(*Context.getOptions().ExcludeHeaderFilterRegex)
- : StringRef(""));
+ StringRef(Context.getOptions().ExcludeHeaderFilterRegex.value_or("")));
return ExcludeHeaderFilter.get();
}
>From 95333514649dfabb7d8a370fac62eafc386b5bb0 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 17 Dec 2025 18:31:55 +0800
Subject: [PATCH 18/24] Cleanup
---
clang-tools-extra/clang-tidy/.clang-tidy | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/.clang-tidy b/clang-tools-extra/clang-tidy/.clang-tidy
index d49b6804893a5..41082695da090 100644
--- a/clang-tools-extra/clang-tidy/.clang-tidy
+++ b/clang-tools-extra/clang-tidy/.clang-tidy
@@ -7,7 +7,6 @@ Checks: >
-bugprone-branch-clone,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
- bugprone-unchecked-optional-access,
-bugprone-unused-return-value,
cppcoreguidelines-init-variables,
cppcoreguidelines-missing-std-forward,
>From 80e42a7811c4fedc8a01a6e78b239f364d2032f2 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 17 Dec 2025 18:49:14 +0800
Subject: [PATCH 19/24] ~
---
clang-tools-extra/clang-tidy/.clang-tidy | 1 +
clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp | 3 ---
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/.clang-tidy b/clang-tools-extra/clang-tidy/.clang-tidy
index 41082695da090..94df1d8f5c38f 100644
--- a/clang-tools-extra/clang-tidy/.clang-tidy
+++ b/clang-tools-extra/clang-tidy/.clang-tidy
@@ -7,6 +7,7 @@ Checks: >
-bugprone-branch-clone,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
+ -bugprone-unchecked-optional-access,
-bugprone-unused-return-value,
cppcoreguidelines-init-variables,
cppcoreguidelines-missing-std-forward,
diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
index 428e3822c78c6..f766a1bca655c 100644
--- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -304,9 +304,6 @@ static bool isQualificationConvertiblePointer(QualType From, QualType To,
"From pointer or array has no pointee or element!");
assert(ToPointeeOrElem && "To pointer or array has no pointee or element!");
- if (!FromPointeeOrElem || !ToPointeeOrElem)
- return false;
-
From = *FromPointeeOrElem;
To = *ToPointeeOrElem;
}
>From fc7afb71c83c572a5b108ad2ca9917c3ec3637ba Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 21 Jan 2026 15:51:58 +0800
Subject: [PATCH 20/24] Revert "~"
This reverts commit 80e42a7811c4fedc8a01a6e78b239f364d2032f2.
---
clang-tools-extra/clang-tidy/.clang-tidy | 1 -
clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp | 3 +++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/.clang-tidy b/clang-tools-extra/clang-tidy/.clang-tidy
index 94df1d8f5c38f..41082695da090 100644
--- a/clang-tools-extra/clang-tidy/.clang-tidy
+++ b/clang-tools-extra/clang-tidy/.clang-tidy
@@ -7,7 +7,6 @@ Checks: >
-bugprone-branch-clone,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
- -bugprone-unchecked-optional-access,
-bugprone-unused-return-value,
cppcoreguidelines-init-variables,
cppcoreguidelines-missing-std-forward,
diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
index f766a1bca655c..428e3822c78c6 100644
--- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -304,6 +304,9 @@ static bool isQualificationConvertiblePointer(QualType From, QualType To,
"From pointer or array has no pointee or element!");
assert(ToPointeeOrElem && "To pointer or array has no pointee or element!");
+ if (!FromPointeeOrElem || !ToPointeeOrElem)
+ return false;
+
From = *FromPointeeOrElem;
To = *ToPointeeOrElem;
}
>From 88ca987bfffe89ae69dfa2285d4fcf05050ae19c Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 21 Jan 2026 18:30:51 +0800
Subject: [PATCH 21/24] Fix bugprone-redundant-branch-condition check
---
.../RedundantBranchConditionCheck.cpp | 33 ++++++++++---------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
index 705b8e41f9ab7..82c557e39007c 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
@@ -135,15 +135,16 @@ void RedundantBranchConditionCheck::check(
if (OtherSide && OtherSide->HasSideEffects(*Result.Context)) {
const SourceLocation BeforeOtherSide =
OtherSide->getBeginLoc().getLocWithOffset(-1);
- const SourceLocation AfterOtherSide =
- utils::lexer::findNextTokenSkippingComments(
- OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts())
- ->getLocation();
- Diag << FixItHint::CreateRemoval(
- CharSourceRange::getTokenRange(IfBegin, BeforeOtherSide))
- << FixItHint::CreateInsertion(AfterOtherSide, ";")
- << FixItHint::CreateRemoval(
- CharSourceRange::getTokenRange(AfterOtherSide, IfEnd));
+ const auto NextToken = utils::lexer::findNextTokenSkippingComments(
+ OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts());
+ if (NextToken) {
+ const SourceLocation AfterOtherSide = NextToken->getLocation();
+ Diag << FixItHint::CreateRemoval(
+ CharSourceRange::getTokenRange(IfBegin, BeforeOtherSide))
+ << FixItHint::CreateInsertion(AfterOtherSide, ";")
+ << FixItHint::CreateRemoval(
+ CharSourceRange::getTokenRange(AfterOtherSide, IfEnd));
+ }
} else {
Diag << FixItHint::CreateRemoval(
CharSourceRange::getTokenRange(IfBegin, IfEnd));
@@ -167,13 +168,13 @@ void RedundantBranchConditionCheck::check(
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
CondOp->getLHS()->getBeginLoc(), BeforeRHS));
} else {
- const SourceLocation AfterLHS =
- utils::lexer::findNextTokenSkippingComments(
- CondOp->getLHS()->getEndLoc(), *Result.SourceManager,
- getLangOpts())
- ->getLocation();
- Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
- AfterLHS, CondOp->getRHS()->getEndLoc()));
+ const auto NextToken = utils::lexer::findNextTokenSkippingComments(
+ CondOp->getLHS()->getEndLoc(), *Result.SourceManager, getLangOpts());
+ if (NextToken) {
+ const SourceLocation AfterLHS = NextToken->getLocation();
+ Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
+ AfterLHS, CondOp->getRHS()->getEndLoc()));
+ }
}
}
}
>From 632fa467cffcbddc189114c4058940e854b56213 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Thu, 22 Jan 2026 16:48:10 +0800
Subject: [PATCH 22/24] Address review feedback
---
clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp b/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
index b80eed3f12971..c331a74b9b794 100644
--- a/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
@@ -229,7 +229,7 @@ void FunctionSizeCheck::check(const MatchFinder::MatchResult &Result) {
for (const auto &CSPos : FI.NestingThresholders) {
diag(CSPos, "nesting level %0 starts here (threshold %1)",
DiagnosticIDs::Note)
- << NestingThreshold.value() + 1 << NestingThreshold.value();
+ << *NestingThreshold + 1 << *NestingThreshold;
}
}
>From 8cb3e8008e2ae1b96a0d45f80990415aeb29fe52 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 24 Jan 2026 17:45:33 +0800
Subject: [PATCH 23/24] Address reviewer feedback
---
.../bugprone/EasilySwappableParametersCheck.cpp | 5 ++---
.../bugprone/RedundantBranchConditionCheck.cpp | 11 +++++------
clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp | 2 --
3 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
index cc04c40a88031..7774c34927ce1 100644
--- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -1701,9 +1701,8 @@ class PassedToSameFunction {
TargetIdx.emplace(Idx);
assert(TargetIdx && "Matched, but didn't find index?");
- if (TargetIdx)
- TargetParams[PassedParamOfThisFn].insert(
- {CalledFn->getCanonicalDecl(), *TargetIdx});
+ TargetParams[PassedParamOfThisFn].insert(
+ {CalledFn->getCanonicalDecl(), *TargetIdx});
}
}
diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
index 82c557e39007c..e0d4aa382d961 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
@@ -135,9 +135,8 @@ void RedundantBranchConditionCheck::check(
if (OtherSide && OtherSide->HasSideEffects(*Result.Context)) {
const SourceLocation BeforeOtherSide =
OtherSide->getBeginLoc().getLocWithOffset(-1);
- const auto NextToken = utils::lexer::findNextTokenSkippingComments(
- OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts());
- if (NextToken) {
+ if (const auto NextToken = utils::lexer::findNextTokenSkippingComments(
+ OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts())) {
const SourceLocation AfterOtherSide = NextToken->getLocation();
Diag << FixItHint::CreateRemoval(
CharSourceRange::getTokenRange(IfBegin, BeforeOtherSide))
@@ -168,9 +167,9 @@ void RedundantBranchConditionCheck::check(
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
CondOp->getLHS()->getBeginLoc(), BeforeRHS));
} else {
- const auto NextToken = utils::lexer::findNextTokenSkippingComments(
- CondOp->getLHS()->getEndLoc(), *Result.SourceManager, getLangOpts());
- if (NextToken) {
+ if (const auto NextToken = utils::lexer::findNextTokenSkippingComments(
+ CondOp->getLHS()->getEndLoc(), *Result.SourceManager,
+ getLangOpts())) {
const SourceLocation AfterLHS = NextToken->getLocation();
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
AfterLHS, CondOp->getRHS()->getEndLoc()));
diff --git a/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp b/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
index f014ef3d3b804..004e61526b778 100644
--- a/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/UseRangesCheck.cpp
@@ -246,8 +246,6 @@ void UseRangesCheck::check(const MatchFinder::MatchResult &Result) {
Result.Context->getLangOpts()));
} else {
assert(ReverseDescriptor && "Couldn't find forward argument");
- if (!ReverseDescriptor)
- return;
ArgNode.push_back('R');
ArgExpr = Result.Nodes.getNodeAs<Expr>(ArgNode);
assert(ArgExpr && "Couldn't find forward or reverse argument");
>From d8caa3a9f335835013e2f6fdadc3928bfbcfe2aa Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 24 Jan 2026 21:31:40 +0800
Subject: [PATCH 24/24] ~
---
.../ClangTidyDiagnosticConsumer.cpp | 4 ++--
.../clang-tidy/ClangTidyProfiling.cpp | 23 +++++++++----------
.../clang-tidy/ClangTidyProfiling.h | 5 ++--
.../clang-tidy/utils/ExceptionAnalyzer.cpp | 3 ---
4 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 5fc4891f7af8f..337d660b1f93b 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -607,14 +607,14 @@ void ClangTidyDiagnosticConsumer::checkFilters(SourceLocation Location,
llvm::Regex *ClangTidyDiagnosticConsumer::getHeaderFilter() {
if (!HeaderFilter)
HeaderFilter = std::make_unique<llvm::Regex>(
- StringRef(Context.getOptions().HeaderFilterRegex.value_or("")));
+ Context.getOptions().HeaderFilterRegex.value_or(""));
return HeaderFilter.get();
}
llvm::Regex *ClangTidyDiagnosticConsumer::getExcludeHeaderFilter() {
if (!ExcludeHeaderFilter)
ExcludeHeaderFilter = std::make_unique<llvm::Regex>(
- StringRef(Context.getOptions().ExcludeHeaderFilterRegex.value_or("")));
+ Context.getOptions().ExcludeHeaderFilterRegex.value_or(""));
return ExcludeHeaderFilter.get();
}
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
index bb2d5049e6c4c..68b8ae0797acc 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
@@ -43,11 +43,11 @@ void ClangTidyProfiling::printUserFriendlyTable(llvm::raw_ostream &OS,
}
void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
- llvm::TimerGroup &TG,
- const StorageParams &Storage) {
+ llvm::TimerGroup &TG) {
+ assert(Storage && "We should have a filename.");
OS << "{\n";
- OS << R"("file": ")" << Storage.SourceFilename << "\",\n";
- OS << R"("timestamp": ")" << Storage.Timestamp << "\",\n";
+ OS << R"("file": ")" << Storage->SourceFilename << "\",\n";
+ OS << R"("timestamp": ")" << Storage->Timestamp << "\",\n";
OS << "\"profile\": {\n";
TG.printJSONValues(OS, "");
OS << "\n}\n";
@@ -55,10 +55,9 @@ void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
OS.flush();
}
-void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG,
- const StorageParams &Storage) {
- assert(this->Storage && "We should have a filename.");
- llvm::SmallString<256> OutputDirectory(Storage.StoreFilename);
+void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG) {
+ assert(Storage && "We should have a filename.");
+ llvm::SmallString<256> OutputDirectory(Storage->StoreFilename);
llvm::sys::path::remove_filename(OutputDirectory);
if (const std::error_code EC =
llvm::sys::fs::create_directories(OutputDirectory)) {
@@ -68,14 +67,14 @@ void ClangTidyProfiling::storeProfileData(llvm::TimerGroup &TG,
}
std::error_code EC;
- llvm::raw_fd_ostream OS(Storage.StoreFilename, EC, llvm::sys::fs::OF_None);
+ llvm::raw_fd_ostream OS(Storage->StoreFilename, EC, llvm::sys::fs::OF_None);
if (EC) {
- llvm::errs() << "Error opening output file '" << Storage.StoreFilename
+ llvm::errs() << "Error opening output file '" << Storage->StoreFilename
<< "': " << EC.message() << "\n";
return;
}
- printAsJSON(OS, TG, Storage);
+ printAsJSON(OS, TG);
}
ClangTidyProfiling::ClangTidyProfiling(std::optional<StorageParams> Storage)
@@ -86,7 +85,7 @@ ClangTidyProfiling::~ClangTidyProfiling() {
if (!Storage)
printUserFriendlyTable(llvm::errs(), TG);
else
- storeProfileData(TG, *Storage);
+ storeProfileData(TG);
}
} // namespace clang::tidy
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.h b/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
index 40efcc10e2c47..59c213b181ef7 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.h
@@ -37,9 +37,8 @@ class ClangTidyProfiling {
std::optional<StorageParams> Storage;
void printUserFriendlyTable(llvm::raw_ostream &OS, llvm::TimerGroup &TG);
- void printAsJSON(llvm::raw_ostream &OS, llvm::TimerGroup &TG,
- const StorageParams &Storage);
- void storeProfileData(llvm::TimerGroup &TG, const StorageParams &Storage);
+ void printAsJSON(llvm::raw_ostream &OS, llvm::TimerGroup &TG);
+ void storeProfileData(llvm::TimerGroup &TG);
public:
llvm::StringMap<llvm::TimeRecord> Records;
diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
index 428e3822c78c6..f766a1bca655c 100644
--- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
@@ -304,9 +304,6 @@ static bool isQualificationConvertiblePointer(QualType From, QualType To,
"From pointer or array has no pointee or element!");
assert(ToPointeeOrElem && "To pointer or array has no pointee or element!");
- if (!FromPointeeOrElem || !ToPointeeOrElem)
- return false;
-
From = *FromPointeeOrElem;
To = *ToPointeeOrElem;
}
More information about the cfe-commits
mailing list