Skip to content

Commit 37698d9

Browse files
committed
[clang][Interp][NFC] Use CheckLoad() in Inc/Dec ops
CheckLoad checks more things than we did before.
1 parent 8d4aa1f commit 37698d9

File tree

2 files changed

+18
-35
lines changed

2 files changed

+18
-35
lines changed

clang/lib/AST/Interp/Interp.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -476,23 +476,24 @@ bool CheckGlobalInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
476476
return false;
477477
}
478478

479-
bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
480-
if (!CheckLive(S, OpPC, Ptr, AK_Read))
479+
bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
480+
AccessKinds AK) {
481+
if (!CheckLive(S, OpPC, Ptr, AK))
481482
return false;
482483
if (!CheckConstant(S, OpPC, Ptr))
483484
return false;
484485

485-
if (!CheckDummy(S, OpPC, Ptr, AK_Read))
486+
if (!CheckDummy(S, OpPC, Ptr, AK))
486487
return false;
487488
if (!CheckExtern(S, OpPC, Ptr))
488489
return false;
489-
if (!CheckRange(S, OpPC, Ptr, AK_Read))
490+
if (!CheckRange(S, OpPC, Ptr, AK))
490491
return false;
491-
if (!CheckActive(S, OpPC, Ptr, AK_Read))
492+
if (!CheckActive(S, OpPC, Ptr, AK))
492493
return false;
493-
if (!CheckInitialized(S, OpPC, Ptr, AK_Read))
494+
if (!CheckInitialized(S, OpPC, Ptr, AK))
494495
return false;
495-
if (!CheckTemporary(S, OpPC, Ptr, AK_Read))
496+
if (!CheckTemporary(S, OpPC, Ptr, AK))
496497
return false;
497498
if (!CheckMutable(S, OpPC, Ptr))
498499
return false;

clang/lib/AST/Interp/Interp.h

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ bool CheckConstant(InterpState &S, CodePtr OpPC, const Descriptor *Desc);
9292
bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
9393

9494
/// Checks if a value can be loaded from a block.
95-
bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
95+
bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
96+
AccessKinds AK = AK_Read);
9697

9798
bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
9899
AccessKinds AK);
@@ -724,9 +725,7 @@ bool IncDecHelper(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
724725
template <PrimType Name, class T = typename PrimConv<Name>::T>
725726
bool Inc(InterpState &S, CodePtr OpPC) {
726727
const Pointer &Ptr = S.Stk.pop<Pointer>();
727-
if (!CheckDummy(S, OpPC, Ptr, AK_Increment))
728-
return false;
729-
if (!CheckInitialized(S, OpPC, Ptr, AK_Increment))
728+
if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
730729
return false;
731730

732731
return IncDecHelper<T, IncDecOp::Inc, PushVal::Yes>(S, OpPC, Ptr);
@@ -738,9 +737,7 @@ bool Inc(InterpState &S, CodePtr OpPC) {
738737
template <PrimType Name, class T = typename PrimConv<Name>::T>
739738
bool IncPop(InterpState &S, CodePtr OpPC) {
740739
const Pointer &Ptr = S.Stk.pop<Pointer>();
741-
if (!CheckDummy(S, OpPC, Ptr, AK_Increment))
742-
return false;
743-
if (!CheckInitialized(S, OpPC, Ptr, AK_Increment))
740+
if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
744741
return false;
745742

746743
return IncDecHelper<T, IncDecOp::Inc, PushVal::No>(S, OpPC, Ptr);
@@ -753,9 +750,7 @@ bool IncPop(InterpState &S, CodePtr OpPC) {
753750
template <PrimType Name, class T = typename PrimConv<Name>::T>
754751
bool Dec(InterpState &S, CodePtr OpPC) {
755752
const Pointer &Ptr = S.Stk.pop<Pointer>();
756-
if (!CheckDummy(S, OpPC, Ptr, AK_Decrement))
757-
return false;
758-
if (!CheckInitialized(S, OpPC, Ptr, AK_Decrement))
753+
if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
759754
return false;
760755

761756
return IncDecHelper<T, IncDecOp::Dec, PushVal::Yes>(S, OpPC, Ptr);
@@ -767,9 +762,7 @@ bool Dec(InterpState &S, CodePtr OpPC) {
767762
template <PrimType Name, class T = typename PrimConv<Name>::T>
768763
bool DecPop(InterpState &S, CodePtr OpPC) {
769764
const Pointer &Ptr = S.Stk.pop<Pointer>();
770-
if (!CheckDummy(S, OpPC, Ptr, AK_Decrement))
771-
return false;
772-
if (!CheckInitialized(S, OpPC, Ptr, AK_Decrement))
765+
if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
773766
return false;
774767

775768
return IncDecHelper<T, IncDecOp::Dec, PushVal::No>(S, OpPC, Ptr);
@@ -797,42 +790,31 @@ bool IncDecFloatHelper(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
797790

798791
inline bool Incf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
799792
const Pointer &Ptr = S.Stk.pop<Pointer>();
800-
if (Ptr.isDummy())
801-
return false;
802-
if (!CheckInitialized(S, OpPC, Ptr, AK_Increment))
793+
if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
803794
return false;
804795

805796
return IncDecFloatHelper<IncDecOp::Inc, PushVal::Yes>(S, OpPC, Ptr, RM);
806797
}
807798

808799
inline bool IncfPop(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
809800
const Pointer &Ptr = S.Stk.pop<Pointer>();
810-
if (Ptr.isDummy())
811-
return false;
812-
if (!CheckInitialized(S, OpPC, Ptr, AK_Increment))
801+
if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
813802
return false;
814803

815804
return IncDecFloatHelper<IncDecOp::Inc, PushVal::No>(S, OpPC, Ptr, RM);
816805
}
817806

818807
inline bool Decf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
819808
const Pointer &Ptr = S.Stk.pop<Pointer>();
820-
821-
if (Ptr.isDummy())
822-
return false;
823-
824-
if (!CheckInitialized(S, OpPC, Ptr, AK_Decrement))
809+
if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
825810
return false;
826811

827812
return IncDecFloatHelper<IncDecOp::Dec, PushVal::Yes>(S, OpPC, Ptr, RM);
828813
}
829814

830815
inline bool DecfPop(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
831816
const Pointer &Ptr = S.Stk.pop<Pointer>();
832-
833-
if (Ptr.isDummy())
834-
return false;
835-
if (!CheckInitialized(S, OpPC, Ptr, AK_Decrement))
817+
if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
836818
return false;
837819

838820
return IncDecFloatHelper<IncDecOp::Dec, PushVal::No>(S, OpPC, Ptr, RM);

0 commit comments

Comments
 (0)