[clang] a99c978 - [Clang] Avoid dereferencing an invalid iterator
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 18 01:03:27 PDT 2025
Author: Corentin Jabot
Date: 2025-04-18T10:03:06+02:00
New Revision: a99c978d1b35e30d9a0fe9db68b91e9f2815c8e9
URL: https://github.com/llvm/llvm-project/commit/a99c978d1b35e30d9a0fe9db68b91e9f2815c8e9
DIFF: https://github.com/llvm/llvm-project/commit/a99c978d1b35e30d9a0fe9db68b91e9f2815c8e9.diff
LOG: [Clang] Avoid dereferencing an invalid iterator
Fix msan builds after 8c5a307bd8
https://lab.llvm.org/buildbot/#/builders/94/builds/6321
Added:
Modified:
clang/include/clang/Sema/Overload.h
clang/lib/Sema/SemaOverload.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/Overload.h b/clang/include/clang/Sema/Overload.h
index 55d714c1222a1..8182ce9c39685 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -1350,6 +1350,9 @@ class Sema;
iterator end() { return Candidates.end(); }
size_t size() const { return Candidates.size() + DeferredCandidatesCount; }
+
+ size_t nonDeferredCandidatesCount() const { return Candidates.size(); }
+
bool empty() const {
return Candidates.empty() && DeferredCandidatesCount == 0;
}
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index b7a981e08ead9..e4ff8c5489df3 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -1108,7 +1108,7 @@ bool OverloadCandidateSet::OperatorRewriteInfo::shouldAddReversed(
}
void OverloadCandidateSet::destroyCandidates() {
- for (iterator i = begin(), e = end(); i != e; ++i) {
+ for (iterator i = Candidates.begin(), e = Candidates.end(); i != e; ++i) {
for (auto &C : i->Conversions)
C.~ImplicitConversionSequence();
if (!i->Viable && i->FailureKind == ovl_fail_bad_deduction)
@@ -11237,7 +11237,7 @@ void OverloadCandidateSet::PerfectViableFunction(
Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best) {
Best = end();
- for (auto It = begin(); It != end(); ++It) {
+ for (auto It = Candidates.begin(); It != Candidates.end(); ++It) {
if (!It->isPerfectMatch(S.getASTContext()))
continue;
@@ -11277,7 +11277,8 @@ OverloadingResult OverloadCandidateSet::BestViableFunctionImpl(
llvm::SmallVector<OverloadCandidate *, 16> Candidates;
Candidates.reserve(this->Candidates.size());
- std::transform(begin(), end(), std::back_inserter(Candidates),
+ std::transform(this->Candidates.begin(), this->Candidates.end(),
+ std::back_inserter(Candidates),
[](OverloadCandidate &Cand) { return &Cand; });
if (S.getLangOpts().CUDA)
@@ -13050,7 +13051,8 @@ SmallVector<OverloadCandidate *, 32> OverloadCandidateSet::CompleteCandidates(
// be prohibitive, so we make a set of pointers and sort those.
SmallVector<OverloadCandidate*, 32> Cands;
if (OCD == OCD_AllCandidates) Cands.reserve(size());
- for (iterator Cand = begin(), LastCand = end(); Cand != LastCand; ++Cand) {
+ for (iterator Cand = Candidates.begin(), LastCand = Candidates.end();
+ Cand != LastCand; ++Cand) {
if (!Filter(*Cand))
continue;
switch (OCD) {
@@ -13127,7 +13129,8 @@ void OverloadCandidateSet::NoteCandidates(
NoteCandidates(S, Args, Cands, Opc, OpLoc);
if (OCD == OCD_AmbiguousCandidates)
- MaybeDiagnoseAmbiguousConstraints(S, {begin(), end()});
+ MaybeDiagnoseAmbiguousConstraints(S,
+ {Candidates.begin(), Candidates.end()});
}
void OverloadCandidateSet::NoteCandidates(Sema &S, ArrayRef<Expr *> Args,
@@ -16255,7 +16258,8 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
// we filter them out to produce better error diagnostics, ie to avoid
// showing 2 failed overloads instead of one.
bool IgnoreSurrogateFunctions = false;
- if (CandidateSet.size() == 1 && Record->getAsCXXRecordDecl()->isLambda()) {
+ if (CandidateSet.nonDeferredCandidatesCount() == 1 &&
+ Record->getAsCXXRecordDecl()->isLambda()) {
const OverloadCandidate &Candidate = *CandidateSet.begin();
if (!Candidate.Viable &&
Candidate.FailureKind == ovl_fail_constraints_not_satisfied)
More information about the cfe-commits
mailing list