[clang-tools-extra] 6324f57 - [clang-tidy][NFC] Fix `bugprone-unchecked-optional-access` warnings in codebase (#170004)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 24 06:04:38 PST 2026
Author: mitchell
Date: 2026-01-24T22:04:33+08:00
New Revision: 6324f576861eaa9a0689c676d739b13325baa20a
URL: https://github.com/llvm/llvm-project/commit/6324f576861eaa9a0689c676d739b13325baa20a
DIFF: https://github.com/llvm/llvm-project/commit/6324f576861eaa9a0689c676d739b13325baa20a.diff
LOG: [clang-tidy][NFC] Fix `bugprone-unchecked-optional-access` warnings in codebase (#170004)
Closes [#156151](https://github.com/llvm/llvm-project/issues/156151)
Assisted-by: Gemini 3 via Gemini CLI
Added:
Modified:
clang-tools-extra/clang-tidy/.clang-tidy
clang-tools-extra/clang-tidy/ClangTidy.cpp
clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
Removed:
################################################################################
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/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp
index c6498521be2d9..9f5d21001ec89 100644
--- a/clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -211,7 +211,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;
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 7d6827f0af653..337d660b1f93b 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -239,13 +239,19 @@ 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>(
+ StringRef(getOptions().Checks.value_or("")));
+ WarningAsErrorFilter = std::make_unique<CachedGlobList>(
+ StringRef(getOptions().WarningsAsErrors.value_or("")));
+ 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 +575,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 +606,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();
}
diff --git a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
index 6fee154be448c..68b8ae0797acc 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyProfiling.cpp
@@ -44,6 +44,7 @@ void ClangTidyProfiling::printUserFriendlyTable(llvm::raw_ostream &OS,
void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
llvm::TimerGroup &TG) {
+ assert(Storage && "We should have a filename.");
OS << "{\n";
OS << R"("file": ")" << Storage->SourceFilename << "\",\n";
OS << R"("timestamp": ")" << Storage->Timestamp << "\",\n";
@@ -56,7 +57,6 @@ void ClangTidyProfiling::printAsJSON(llvm::raw_ostream &OS,
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 =
diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
index c5cf62a78441f..7774c34927ce1 100644
--- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -1184,6 +1184,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');
diff --git a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
index 705b8e41f9ab7..e0d4aa382d961 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RedundantBranchConditionCheck.cpp
@@ -135,15 +135,15 @@ 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));
+ if (const auto NextToken = utils::lexer::findNextTokenSkippingComments(
+ OtherSide->getEndLoc(), *Result.SourceManager, getLangOpts())) {
+ 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 +167,13 @@ void RedundantBranchConditionCheck::check(
Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
CondOp->getLHS()->getBeginLoc(), BeforeRHS));
} else {
- const SourceLocation AfterLHS =
- utils::lexer::findNextTokenSkippingComments(
+ if (const auto NextToken = utils::lexer::findNextTokenSkippingComments(
CondOp->getLHS()->getEndLoc(), *Result.SourceManager,
- getLangOpts())
- ->getLocation();
- Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
- AfterLHS, CondOp->getRHS()->getEndLoc()));
+ getLangOpts())) {
+ const SourceLocation AfterLHS = NextToken->getLocation();
+ Diag << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(
+ AfterLHS, CondOp->getRHS()->getEndLoc()));
+ }
}
}
}
diff --git a/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp b/clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp
index 2f0949c231844..c331a74b9b794 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 + 1 << *NestingThreshold;
+ }
}
if (VariableThreshold && FI.Variables > VariableThreshold) {
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index 9cee6ddb93d4d..e8c1e3a610fae 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -436,7 +436,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(
@@ -829,26 +829,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);
@@ -1336,10 +1338,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;
More information about the cfe-commits
mailing list