[clang] 4af62db - [clang][Sema] Fix crash introduced in b2cd9db589335d5885c04df83003a623cf2f05ff (#66954)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 21 05:27:42 PDT 2023
Author: Takuya Shimizu
Date: 2023-09-21T21:27:38+09:00
New Revision: 4af62db053413ea0b01e59adbd51677c5665328b
URL: https://github.com/llvm/llvm-project/commit/4af62db053413ea0b01e59adbd51677c5665328b
DIFF: https://github.com/llvm/llvm-project/commit/4af62db053413ea0b01e59adbd51677c5665328b.diff
LOG: [clang][Sema] Fix crash introduced in b2cd9db589335d5885c04df83003a623cf2f05ff (#66954)
Old iterator is invalidated upon SmallVector elements additions. Stores
index instead of iterator to avoid this.
Fixes https://github.com/llvm/llvm-project/issues/66938
PR: https://github.com/llvm/llvm-project/pull/66954
Added:
Modified:
clang/lib/Sema/SemaConcept.cpp
clang/test/SemaTemplate/concepts.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index dacdd07c8069950..036548b68247bfa 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -185,7 +185,7 @@ calculateConstraintSatisfaction(Sema &S, const Expr *ConstraintExpr,
ConstraintExpr = ConstraintExpr->IgnoreParenImpCasts();
if (LogicalBinOp BO = ConstraintExpr) {
- auto EffectiveDetailEnd = Satisfaction.Details.end();
+ size_t EffectiveDetailEndIndex = Satisfaction.Details.size();
ExprResult LHSRes = calculateConstraintSatisfaction(
S, BO.getLHS(), Satisfaction, Evaluator);
@@ -228,9 +228,12 @@ calculateConstraintSatisfaction(Sema &S, const Expr *ConstraintExpr,
// The following code removes the irrelevant diagnostic information.
// FIXME: We should probably delay the addition of diagnostic information
// until we know the entire expression is false.
- if (BO.isOr() && IsRHSSatisfied)
+ if (BO.isOr() && IsRHSSatisfied) {
+ auto EffectiveDetailEnd = Satisfaction.Details.begin();
+ std::advance(EffectiveDetailEnd, EffectiveDetailEndIndex);
Satisfaction.Details.erase(EffectiveDetailEnd,
Satisfaction.Details.end());
+ }
return BO.recreateBinOp(S, LHSRes, RHSRes);
}
diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp
index 68050e0f09e248a..e98ebcc9203a430 100644
--- a/clang/test/SemaTemplate/concepts.cpp
+++ b/clang/test/SemaTemplate/concepts.cpp
@@ -1048,3 +1048,19 @@ namespace GH66612 {
// expected-note at -1{{because 'int' does not satisfy 'Container'}}
// expected-note@#66612GH_END{{because 'end' would be invalid: reference to overloaded function could not be resolved; did you mean to call it?}}
}
+
+namespace GH66938 {
+template <class>
+concept True = true;
+
+template <class>
+concept False = false;
+
+template <class T>
+void cand(T t)
+ requires False<T> || False<T> || False<T> || False<T> || False<T> ||
+ False<T> || False<T> || False<T> || False<T> || True<T>
+{}
+
+void test() { cand(42); }
+}
More information about the cfe-commits
mailing list