@@ -823,9 +823,9 @@ inline bool CmpHelperEQ<Pointer>(InterpState &S, CodePtr OpPC, CompareFn Fn) {
823823 // element in the same array are NOT equal. They have the same Base value,
824824 // but a different Offset. This is a pretty rare case, so we fix this here
825825 // by comparing pointers to the first elements.
826- if (!LHS.isZero () && !LHS. isDummy () && LHS.isArrayRoot ())
826+ if (!LHS.isZero () && LHS.isArrayRoot ())
827827 VL = LHS.atIndex (0 ).getByteOffset ();
828- if (!RHS.isZero () && !RHS. isDummy () && RHS.isArrayRoot ())
828+ if (!RHS.isZero () && RHS.isArrayRoot ())
829829 VR = RHS.atIndex (0 ).getByteOffset ();
830830
831831 S.Stk .push <BoolT>(BoolT::from (Fn (Compare (VL, VR))));
@@ -1241,14 +1241,16 @@ inline bool GetPtrField(InterpState &S, CodePtr OpPC, uint32_t Off) {
12411241 !CheckNull (S, OpPC, Ptr, CSK_Field))
12421242 return false ;
12431243
1244- if (CheckDummy (S, OpPC, Ptr)) {
1245- if (!CheckExtern (S, OpPC, Ptr))
1246- return false ;
1247- if (!CheckRange (S, OpPC, Ptr, CSK_Field))
1248- return false ;
1249- if (!CheckSubobject (S, OpPC, Ptr, CSK_Field))
1250- return false ;
1251- }
1244+ if (!CheckExtern (S, OpPC, Ptr))
1245+ return false ;
1246+ if (!CheckRange (S, OpPC, Ptr, CSK_Field))
1247+ return false ;
1248+ if (!CheckSubobject (S, OpPC, Ptr, CSK_Field))
1249+ return false ;
1250+
1251+ if (Ptr.isBlockPointer () && Off > Ptr.block ()->getSize ())
1252+ return false ;
1253+
12521254 S.Stk .push <Pointer>(Ptr.atField (Off));
12531255 return true ;
12541256}
@@ -2034,11 +2036,6 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) {
20342036 if (!Ptr.isZero ()) {
20352037 if (!CheckArray (S, OpPC, Ptr))
20362038 return false ;
2037-
2038- if (Ptr.isDummy ()) {
2039- S.Stk .push <Pointer>(Ptr);
2040- return true ;
2041- }
20422039 }
20432040
20442041 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
@@ -2055,11 +2052,6 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
20552052 if (!Ptr.isZero ()) {
20562053 if (!CheckArray (S, OpPC, Ptr))
20572054 return false ;
2058-
2059- if (Ptr.isDummy ()) {
2060- S.Stk .push <Pointer>(Ptr);
2061- return true ;
2062- }
20632055 }
20642056
20652057 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
@@ -2113,12 +2105,12 @@ inline bool CopyArray(InterpState &S, CodePtr OpPC, uint32_t SrcIndex, uint32_t
21132105inline bool ArrayDecay (InterpState &S, CodePtr OpPC) {
21142106 const Pointer &Ptr = S.Stk .pop <Pointer>();
21152107
2116- if (Ptr.isZero () || Ptr. isDummy () ) {
2108+ if (Ptr.isZero ()) {
21172109 S.Stk .push <Pointer>(Ptr);
21182110 return true ;
21192111 }
21202112
2121- if (!Ptr.isUnknownSizeArray ()) {
2113+ if (!Ptr.isUnknownSizeArray () || Ptr. isDummy () ) {
21222114 S.Stk .push <Pointer>(Ptr.atIndex (0 ));
21232115 return true ;
21242116 }
0 commit comments