Skip to content

Commit a4a4366

Browse files
authored
[clang] In Sema use new parentEvaluationContext function (#93338)
Fixes #93284
1 parent 331eb8a commit a4a4366

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5153,12 +5153,16 @@ class Sema final : public SemaBase {
51535153
return ExprEvalContexts.back();
51545154
};
51555155

5156-
const ExpressionEvaluationContextRecord &parentEvaluationContext() const {
5156+
ExpressionEvaluationContextRecord &parentEvaluationContext() {
51575157
assert(ExprEvalContexts.size() >= 2 &&
51585158
"Must be in an expression evaluation context");
51595159
return ExprEvalContexts[ExprEvalContexts.size() - 2];
51605160
};
51615161

5162+
const ExpressionEvaluationContextRecord &parentEvaluationContext() const {
5163+
return const_cast<Sema *>(this)->parentEvaluationContext();
5164+
};
5165+
51625166
bool isBoundsAttrContext() const {
51635167
return ExprEvalContexts.back().ExprContext ==
51645168
ExpressionEvaluationContextRecord::ExpressionKind::
@@ -6289,10 +6293,9 @@ class Sema final : public SemaBase {
62896293
/// flag from previous context.
62906294
void keepInLifetimeExtendingContext() {
62916295
if (ExprEvalContexts.size() > 2 &&
6292-
ExprEvalContexts[ExprEvalContexts.size() - 2]
6293-
.InLifetimeExtendingContext) {
6296+
parentEvaluationContext().InLifetimeExtendingContext) {
62946297
auto &LastRecord = ExprEvalContexts.back();
6295-
auto &PrevRecord = ExprEvalContexts[ExprEvalContexts.size() - 2];
6298+
auto &PrevRecord = parentEvaluationContext();
62966299
LastRecord.InLifetimeExtendingContext =
62976300
PrevRecord.InLifetimeExtendingContext;
62986301
}

clang/lib/Sema/SemaExpr.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17232,8 +17232,7 @@ ExprResult Sema::TransformToPotentiallyEvaluated(Expr *E) {
1723217232
TypeSourceInfo *Sema::TransformToPotentiallyEvaluated(TypeSourceInfo *TInfo) {
1723317233
assert(isUnevaluatedContext() &&
1723417234
"Should only transform unevaluated expressions");
17235-
ExprEvalContexts.back().Context =
17236-
ExprEvalContexts[ExprEvalContexts.size() - 2].Context;
17235+
ExprEvalContexts.back().Context = parentEvaluationContext().Context;
1723717236
if (isUnevaluatedContext())
1723817237
return TInfo;
1723917238
return TransformToPE(*this).TransformType(TInfo);
@@ -17250,14 +17249,13 @@ Sema::PushExpressionEvaluationContext(
1725017249
// discarded statements or immediate context are themselves
1725117250
// a discarded statement or an immediate context, respectively.
1725217251
ExprEvalContexts.back().InDiscardedStatement =
17253-
ExprEvalContexts[ExprEvalContexts.size() - 2]
17254-
.isDiscardedStatementContext();
17252+
parentEvaluationContext().isDiscardedStatementContext();
1725517253

1725617254
// C++23 [expr.const]/p15
1725717255
// An expression or conversion is in an immediate function context if [...]
1725817256
// it is a subexpression of a manifestly constant-evaluated expression or
1725917257
// conversion.
17260-
const auto &Prev = ExprEvalContexts[ExprEvalContexts.size() - 2];
17258+
const auto &Prev = parentEvaluationContext();
1726117259
ExprEvalContexts.back().InImmediateFunctionContext =
1726217260
Prev.isImmediateFunctionContext() || Prev.isConstantEvaluated();
1726317261

@@ -17702,7 +17700,7 @@ void Sema::PopExpressionEvaluationContext() {
1770217700

1770317701
// Append the collected materialized temporaries into previous context before
1770417702
// exit if the previous also is a lifetime extending context.
17705-
auto &PrevRecord = ExprEvalContexts[ExprEvalContexts.size() - 2];
17703+
auto &PrevRecord = parentEvaluationContext();
1770617704
if (getLangOpts().CPlusPlus23 && Rec.InLifetimeExtendingContext &&
1770717705
PrevRecord.InLifetimeExtendingContext &&
1770817706
!Rec.ForRangeLifetimeExtendTemps.empty()) {

0 commit comments

Comments
 (0)