[clang] [clang] Fix a crash when referencing the result if the overload fails (PR #77288)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 8 01:30:21 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Haojian Wu (hokein)
<details>
<summary>Changes</summary>
after 20a05677f9394d4bc9467fe7bc93a4ebd3aeda61
If the overload fails, the `Best` might point to the `end()`, referencing it leads to asan crashes.
---
Full diff: https://github.com/llvm/llvm-project/pull/77288.diff
1 Files Affected:
- (modified) clang/lib/Sema/SemaOverload.cpp (+12-11)
``````````diff
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 9fb767101e1eb7..8e3a2d1288079b 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -13994,21 +13994,22 @@ ExprResult Sema::BuildOverloadedCallExpr(Scope *S, Expr *Fn,
OverloadCandidateSet::iterator Best;
OverloadingResult OverloadResult =
CandidateSet.BestViableFunction(*this, Fn->getBeginLoc(), Best);
- FunctionDecl *FDecl = Best->Function;
// Model the case with a call to a templated function whose definition
// encloses the call and whose return type contains a placeholder type as if
// the UnresolvedLookupExpr was type-dependent.
- if (OverloadResult == OR_Success && FDecl &&
- FDecl->isTemplateInstantiation() &&
- FDecl->getReturnType()->isUndeducedType()) {
- if (auto TP = FDecl->getTemplateInstantiationPattern(false)) {
- if (TP->willHaveBody()) {
- CallExpr *CE =
- CallExpr::Create(Context, Fn, Args, Context.DependentTy, VK_PRValue,
- RParenLoc, CurFPFeatureOverrides());
- result = CE;
- return result;
+ if (OverloadResult == OR_Success) {
+ FunctionDecl *FDecl = Best->Function;
+ if (FDecl && FDecl->isTemplateInstantiation() &&
+ FDecl->getReturnType()->isUndeducedType()) {
+ if (auto TP = FDecl->getTemplateInstantiationPattern(false)) {
+ if (TP->willHaveBody()) {
+ CallExpr *CE =
+ CallExpr::Create(Context, Fn, Args, Context.DependentTy,
+ VK_PRValue, RParenLoc, CurFPFeatureOverrides());
+ result = CE;
+ return result;
+ }
}
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/77288
More information about the cfe-commits
mailing list