@@ -926,27 +926,6 @@ namespace {
926
926
/// fold (not just why it's not strictly a constant expression)?
927
927
bool HasFoldFailureDiagnostic;
928
928
929
- enum EvaluationMode {
930
- /// Evaluate as a constant expression. Stop if we find that the expression
931
- /// is not a constant expression.
932
- EM_ConstantExpression,
933
-
934
- /// Evaluate as a constant expression. Stop if we find that the expression
935
- /// is not a constant expression. Some expressions can be retried in the
936
- /// optimizer if we don't constant fold them here, but in an unevaluated
937
- /// context we try to fold them immediately since the optimizer never
938
- /// gets a chance to look at it.
939
- EM_ConstantExpressionUnevaluated,
940
-
941
- /// Fold the expression to a constant. Stop if we hit a side-effect that
942
- /// we can't model.
943
- EM_ConstantFold,
944
-
945
- /// Evaluate in any way we know how. Don't worry about side-effects that
946
- /// can't be modeled.
947
- EM_IgnoreSideEffects,
948
- } EvalMode;
949
-
950
929
EvalInfo(const ASTContext &C, Expr::EvalStatus &S, EvaluationMode Mode)
951
930
: Ctx(const_cast<ASTContext &>(C)), EvalStatus(S), CurrentCall(nullptr),
952
931
CallStackDepth(0), NextCallIndex(1),
@@ -957,7 +936,9 @@ namespace {
957
936
/*CallExpr=*/nullptr, CallRef()),
958
937
EvaluatingDecl((const ValueDecl *)nullptr),
959
938
EvaluatingDeclValue(nullptr), HasActiveDiagnostic(false),
960
- HasFoldFailureDiagnostic(false), EvalMode(Mode) {}
939
+ HasFoldFailureDiagnostic(false) {
940
+ EvalMode = Mode;
941
+ }
961
942
962
943
~EvalInfo() {
963
944
discardCleanups();
@@ -1132,18 +1113,18 @@ namespace {
1132
1113
// unless we require this evaluation to produce a constant expression.
1133
1114
//
1134
1115
// FIXME: We might want to show both diagnostics to the user in
1135
- // EM_ConstantFold mode.
1116
+ // EvaluationMode::ConstantFold mode.
1136
1117
bool hasPriorDiagnostic() override {
1137
1118
if (!EvalStatus.Diag->empty()) {
1138
1119
switch (EvalMode) {
1139
- case EM_ConstantFold :
1140
- case EM_IgnoreSideEffects :
1120
+ case EvaluationMode::ConstantFold :
1121
+ case EvaluationMode::IgnoreSideEffects :
1141
1122
if (!HasFoldFailureDiagnostic)
1142
1123
break;
1143
1124
// We've already failed to fold something. Keep that diagnostic.
1144
1125
[[fallthrough]];
1145
- case EM_ConstantExpression :
1146
- case EM_ConstantExpressionUnevaluated :
1126
+ case EvaluationMode::ConstantExpression :
1127
+ case EvaluationMode::ConstantExpressionUnevaluated :
1147
1128
setActiveDiagnostic(false);
1148
1129
return true;
1149
1130
}
@@ -1158,12 +1139,12 @@ namespace {
1158
1139
/// couldn't model?
1159
1140
bool keepEvaluatingAfterSideEffect() const override {
1160
1141
switch (EvalMode) {
1161
- case EM_IgnoreSideEffects :
1142
+ case EvaluationMode::IgnoreSideEffects :
1162
1143
return true;
1163
1144
1164
- case EM_ConstantExpression :
1165
- case EM_ConstantExpressionUnevaluated :
1166
- case EM_ConstantFold :
1145
+ case EvaluationMode::ConstantExpression :
1146
+ case EvaluationMode::ConstantExpressionUnevaluated :
1147
+ case EvaluationMode::ConstantFold :
1167
1148
// By default, assume any side effect might be valid in some other
1168
1149
// evaluation of this expression from a different context.
1169
1150
return checkingPotentialConstantExpression() ||
@@ -1182,12 +1163,12 @@ namespace {
1182
1163
/// Should we continue evaluation after encountering undefined behavior?
1183
1164
bool keepEvaluatingAfterUndefinedBehavior() {
1184
1165
switch (EvalMode) {
1185
- case EM_IgnoreSideEffects :
1186
- case EM_ConstantFold :
1166
+ case EvaluationMode::IgnoreSideEffects :
1167
+ case EvaluationMode::ConstantFold :
1187
1168
return true;
1188
1169
1189
- case EM_ConstantExpression :
1190
- case EM_ConstantExpressionUnevaluated :
1170
+ case EvaluationMode::ConstantExpression :
1171
+ case EvaluationMode::ConstantExpressionUnevaluated :
1191
1172
return checkingForUndefinedBehavior();
1192
1173
}
1193
1174
llvm_unreachable("Missed EvalMode case");
@@ -1208,10 +1189,10 @@ namespace {
1208
1189
return false;
1209
1190
1210
1191
switch (EvalMode) {
1211
- case EM_ConstantExpression :
1212
- case EM_ConstantExpressionUnevaluated :
1213
- case EM_ConstantFold :
1214
- case EM_IgnoreSideEffects :
1192
+ case EvaluationMode::ConstantExpression :
1193
+ case EvaluationMode::ConstantExpressionUnevaluated :
1194
+ case EvaluationMode::ConstantFold :
1195
+ case EvaluationMode::IgnoreSideEffects :
1215
1196
return checkingPotentialConstantExpression() ||
1216
1197
checkingForUndefinedBehavior();
1217
1198
}
@@ -1261,7 +1242,7 @@ namespace {
1261
1242
EvalInfo &Info;
1262
1243
bool Enabled;
1263
1244
bool HadNoPriorDiags;
1264
- EvalInfo:: EvaluationMode OldMode;
1245
+ EvaluationMode OldMode;
1265
1246
1266
1247
explicit FoldConstant(EvalInfo &Info, bool Enabled)
1267
1248
: Info(Info),
@@ -1271,7 +1252,7 @@ namespace {
1271
1252
!Info.EvalStatus.HasSideEffects),
1272
1253
OldMode(Info.EvalMode) {
1273
1254
if (Enabled)
1274
- Info.EvalMode = EvalInfo::EM_ConstantFold ;
1255
+ Info.EvalMode = EvaluationMode::ConstantFold ;
1275
1256
}
1276
1257
void keepDiagnostics() { Enabled = false; }
1277
1258
~FoldConstant() {
@@ -1286,10 +1267,10 @@ namespace {
1286
1267
/// side-effects.
1287
1268
struct IgnoreSideEffectsRAII {
1288
1269
EvalInfo &Info;
1289
- EvalInfo:: EvaluationMode OldMode;
1270
+ EvaluationMode OldMode;
1290
1271
explicit IgnoreSideEffectsRAII(EvalInfo &Info)
1291
1272
: Info(Info), OldMode(Info.EvalMode) {
1292
- Info.EvalMode = EvalInfo::EM_IgnoreSideEffects ;
1273
+ Info.EvalMode = EvaluationMode::IgnoreSideEffects ;
1293
1274
}
1294
1275
1295
1276
~IgnoreSideEffectsRAII() { Info.EvalMode = OldMode; }
@@ -9188,7 +9169,7 @@ bool LValueExprEvaluator::VisitMaterializeTemporaryExpr(
9188
9169
// value for use outside this evaluation.
9189
9170
APValue *Value;
9190
9171
if (E->getStorageDuration() == SD_Static) {
9191
- if (Info.EvalMode == EvalInfo::EM_ConstantFold )
9172
+ if (Info.EvalMode == EvaluationMode::ConstantFold )
9192
9173
return false;
9193
9174
// FIXME: What about SD_Thread?
9194
9175
Value = E->getOrCreateValue(true);
@@ -13552,12 +13533,12 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
13552
13533
// Expression had no side effects, but we couldn't statically determine the
13553
13534
// size of the referenced object.
13554
13535
switch (Info.EvalMode) {
13555
- case EvalInfo::EM_ConstantExpression :
13556
- case EvalInfo::EM_ConstantFold :
13557
- case EvalInfo::EM_IgnoreSideEffects :
13536
+ case EvaluationMode::ConstantExpression :
13537
+ case EvaluationMode::ConstantFold :
13538
+ case EvaluationMode::IgnoreSideEffects :
13558
13539
// Leave it to IR generation.
13559
13540
return Error(E);
13560
- case EvalInfo::EM_ConstantExpressionUnevaluated :
13541
+ case EvaluationMode::ConstantExpressionUnevaluated :
13561
13542
// Reduce it to a constant now.
13562
13543
return Success((Type & 2) ? 0 : -1, E);
13563
13544
}
@@ -17563,7 +17544,7 @@ bool Expr::EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx,
17563
17544
assert(!isValueDependent() &&
17564
17545
"Expression evaluator can't be called on a dependent expression.");
17565
17546
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsRValue");
17566
- EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects );
17547
+ EvalInfo Info(Ctx, Result, EvaluationMode::IgnoreSideEffects );
17567
17548
Info.InConstantContext = InConstantContext;
17568
17549
return ::EvaluateAsRValue(this, Result, Ctx, Info);
17569
17550
}
@@ -17584,7 +17565,7 @@ bool Expr::EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx,
17584
17565
assert(!isValueDependent() &&
17585
17566
"Expression evaluator can't be called on a dependent expression.");
17586
17567
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsInt");
17587
- EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects );
17568
+ EvalInfo Info(Ctx, Result, EvaluationMode::IgnoreSideEffects );
17588
17569
Info.InConstantContext = InConstantContext;
17589
17570
return ::EvaluateAsInt(this, Result, Ctx, AllowSideEffects, Info);
17590
17571
}
@@ -17595,7 +17576,7 @@ bool Expr::EvaluateAsFixedPoint(EvalResult &Result, const ASTContext &Ctx,
17595
17576
assert(!isValueDependent() &&
17596
17577
"Expression evaluator can't be called on a dependent expression.");
17597
17578
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsFixedPoint");
17598
- EvalInfo Info(Ctx, Result, EvalInfo::EM_IgnoreSideEffects );
17579
+ EvalInfo Info(Ctx, Result, EvaluationMode::IgnoreSideEffects );
17599
17580
Info.InConstantContext = InConstantContext;
17600
17581
return ::EvaluateAsFixedPoint(this, Result, Ctx, AllowSideEffects, Info);
17601
17582
}
@@ -17626,7 +17607,7 @@ bool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx,
17626
17607
"Expression evaluator can't be called on a dependent expression.");
17627
17608
17628
17609
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsLValue");
17629
- EvalInfo Info(Ctx, Result, EvalInfo::EM_ConstantFold );
17610
+ EvalInfo Info(Ctx, Result, EvaluationMode::ConstantFold );
17630
17611
Info.InConstantContext = InConstantContext;
17631
17612
LValue LV;
17632
17613
CheckedTemporaries CheckedTemps;
@@ -17646,8 +17627,8 @@ static bool EvaluateDestruction(const ASTContext &Ctx, APValue::LValueBase Base,
17646
17627
SourceLocation Loc, Expr::EvalStatus &EStatus,
17647
17628
bool IsConstantDestruction) {
17648
17629
EvalInfo Info(Ctx, EStatus,
17649
- IsConstantDestruction ? EvalInfo::EM_ConstantExpression
17650
- : EvalInfo::EM_ConstantFold );
17630
+ IsConstantDestruction ? EvaluationMode::ConstantExpression
17631
+ : EvaluationMode::ConstantFold );
17651
17632
Info.setEvaluatingDecl(Base, DestroyedValue,
17652
17633
EvalInfo::EvaluatingDeclKind::Dtor);
17653
17634
Info.InConstantContext = IsConstantDestruction;
@@ -17675,7 +17656,7 @@ bool Expr::EvaluateAsConstantExpr(EvalResult &Result, const ASTContext &Ctx,
17675
17656
return true;
17676
17657
17677
17658
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateAsConstantExpr");
17678
- EvalInfo:: EvaluationMode EM = EvalInfo::EM_ConstantExpression ;
17659
+ EvaluationMode EM = EvaluationMode::ConstantExpression ;
17679
17660
EvalInfo Info(Ctx, Result, EM);
17680
17661
Info.InConstantContext = true;
17681
17662
@@ -17752,8 +17733,8 @@ bool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx,
17752
17733
EvalInfo Info(Ctx, EStatus,
17753
17734
(IsConstantInitialization &&
17754
17735
(Ctx.getLangOpts().CPlusPlus || Ctx.getLangOpts().C23))
17755
- ? EvalInfo::EM_ConstantExpression
17756
- : EvalInfo::EM_ConstantFold );
17736
+ ? EvaluationMode::ConstantExpression
17737
+ : EvaluationMode::ConstantFold );
17757
17738
Info.setEvaluatingDecl(VD, Value);
17758
17739
Info.InConstantContext = IsConstantInitialization;
17759
17740
@@ -17848,7 +17829,7 @@ APSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx,
17848
17829
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateKnownConstInt");
17849
17830
EvalResult EVResult;
17850
17831
EVResult.Diag = Diag;
17851
- EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects );
17832
+ EvalInfo Info(Ctx, EVResult, EvaluationMode::IgnoreSideEffects );
17852
17833
Info.InConstantContext = true;
17853
17834
17854
17835
bool Result = ::EvaluateAsRValue(this, EVResult, Ctx, Info);
@@ -17867,7 +17848,7 @@ APSInt Expr::EvaluateKnownConstIntCheckOverflow(
17867
17848
ExprTimeTraceScope TimeScope(this, Ctx, "EvaluateKnownConstIntCheckOverflow");
17868
17849
EvalResult EVResult;
17869
17850
EVResult.Diag = Diag;
17870
- EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects );
17851
+ EvalInfo Info(Ctx, EVResult, EvaluationMode::IgnoreSideEffects );
17871
17852
Info.InConstantContext = true;
17872
17853
Info.CheckingForUndefinedBehavior = true;
17873
17854
@@ -17887,7 +17868,7 @@ void Expr::EvaluateForOverflow(const ASTContext &Ctx) const {
17887
17868
bool IsConst;
17888
17869
EvalResult EVResult;
17889
17870
if (!FastEvaluateAsRValue(this, EVResult.Val, Ctx, IsConst)) {
17890
- EvalInfo Info(Ctx, EVResult, EvalInfo::EM_IgnoreSideEffects );
17871
+ EvalInfo Info(Ctx, EVResult, EvaluationMode::IgnoreSideEffects );
17891
17872
Info.CheckingForUndefinedBehavior = true;
17892
17873
(void)::EvaluateAsRValue(Info, this, EVResult.Val);
17893
17874
}
@@ -17941,7 +17922,7 @@ static ICEDiag Worst(ICEDiag A, ICEDiag B) { return A.Kind >= B.Kind ? A : B; }
17941
17922
static ICEDiag CheckEvalInICE(const Expr* E, const ASTContext &Ctx) {
17942
17923
Expr::EvalResult EVResult;
17943
17924
Expr::EvalStatus Status;
17944
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression );
17925
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantExpression );
17945
17926
17946
17927
Info.InConstantContext = true;
17947
17928
if (!::EvaluateAsRValue(E, EVResult, Ctx, Info) || EVResult.HasSideEffects ||
@@ -18425,7 +18406,7 @@ Expr::getIntegerConstantExpr(const ASTContext &Ctx) const {
18425
18406
// value.
18426
18407
EvalResult ExprResult;
18427
18408
Expr::EvalStatus Status;
18428
- EvalInfo Info(Ctx, Status, EvalInfo::EM_IgnoreSideEffects );
18409
+ EvalInfo Info(Ctx, Status, EvaluationMode::IgnoreSideEffects );
18429
18410
Info.InConstantContext = true;
18430
18411
18431
18412
if (!::EvaluateAsInt(this, ExprResult, Ctx, SE_AllowSideEffects, Info))
@@ -18461,7 +18442,7 @@ bool Expr::isCXX11ConstantExpr(const ASTContext &Ctx, APValue *Result) const {
18461
18442
Expr::EvalStatus Status;
18462
18443
SmallVector<PartialDiagnosticAt, 8> Diags;
18463
18444
Status.Diag = &Diags;
18464
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression );
18445
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantExpression );
18465
18446
18466
18447
bool IsConstExpr =
18467
18448
::EvaluateAsRValue(Info, this, Result ? *Result : Scratch) &&
@@ -18488,7 +18469,7 @@ bool Expr::EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx,
18488
18469
});
18489
18470
18490
18471
Expr::EvalStatus Status;
18491
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpressionUnevaluated );
18472
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantExpressionUnevaluated );
18492
18473
Info.InConstantContext = true;
18493
18474
18494
18475
LValue ThisVal;
@@ -18564,7 +18545,8 @@ bool Expr::isPotentialConstantExpr(const FunctionDecl *FD,
18564
18545
Expr::EvalStatus Status;
18565
18546
Status.Diag = &Diags;
18566
18547
18567
- EvalInfo Info(FD->getASTContext(), Status, EvalInfo::EM_ConstantExpression);
18548
+ EvalInfo Info(FD->getASTContext(), Status,
18549
+ EvaluationMode::ConstantExpression);
18568
18550
Info.InConstantContext = true;
18569
18551
Info.CheckingPotentialConstantExpression = true;
18570
18552
@@ -18614,7 +18596,7 @@ bool Expr::isPotentialConstantExprUnevaluated(Expr *E,
18614
18596
Status.Diag = &Diags;
18615
18597
18616
18598
EvalInfo Info(FD->getASTContext(), Status,
18617
- EvalInfo::EM_ConstantExpressionUnevaluated );
18599
+ EvaluationMode::ConstantExpressionUnevaluated );
18618
18600
Info.InConstantContext = true;
18619
18601
Info.CheckingPotentialConstantExpression = true;
18620
18602
@@ -18638,7 +18620,7 @@ bool Expr::tryEvaluateObjectSize(uint64_t &Result, ASTContext &Ctx,
18638
18620
return false;
18639
18621
18640
18622
Expr::EvalStatus Status;
18641
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold );
18623
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantFold );
18642
18624
return tryEvaluateBuiltinObjectSize(this, Type, Info, Result);
18643
18625
}
18644
18626
@@ -18696,7 +18678,7 @@ static bool EvaluateBuiltinStrLen(const Expr *E, uint64_t &Result,
18696
18678
18697
18679
std::optional<std::string> Expr::tryEvaluateString(ASTContext &Ctx) const {
18698
18680
Expr::EvalStatus Status;
18699
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold );
18681
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantFold );
18700
18682
uint64_t Result;
18701
18683
std::string StringResult;
18702
18684
@@ -18711,7 +18693,7 @@ static bool EvaluateCharRangeAsStringImpl(const Expr *, T &Result,
18711
18693
const Expr *PtrExpression,
18712
18694
ASTContext &Ctx,
18713
18695
Expr::EvalResult &Status) {
18714
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpression );
18696
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantExpression );
18715
18697
Info.InConstantContext = true;
18716
18698
18717
18699
if (Info.EnableNewConstInterp)
@@ -18779,7 +18761,7 @@ bool Expr::EvaluateCharRangeAsString(APValue &Result,
18779
18761
18780
18762
bool Expr::tryEvaluateStrLen(uint64_t &Result, ASTContext &Ctx) const {
18781
18763
Expr::EvalStatus Status;
18782
- EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantFold );
18764
+ EvalInfo Info(Ctx, Status, EvaluationMode::ConstantFold );
18783
18765
18784
18766
if (Info.EnableNewConstInterp)
18785
18767
return Info.Ctx.getInterpContext().evaluateStrlen(Info, this, Result);
0 commit comments