@@ -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.isArrayRoot ())
826+ if (!LHS.isZero () && !LHS. isDummy () && LHS.isArrayRoot ())
827827 VL = LHS.atIndex (0 ).getByteOffset ();
828- if (!RHS.isZero () && RHS.isArrayRoot ())
828+ if (!RHS.isZero () && !RHS. isDummy () && RHS.isArrayRoot ())
829829 VR = RHS.atIndex (0 ).getByteOffset ();
830830
831831 S.Stk .push <BoolT>(BoolT::from (Fn (Compare (VL, VR))));
@@ -1241,16 +1241,14 @@ inline bool GetPtrField(InterpState &S, CodePtr OpPC, uint32_t Off) {
12411241 !CheckNull (S, OpPC, Ptr, CSK_Field))
12421242 return false ;
12431243
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-
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+ }
12541252 S.Stk .push <Pointer>(Ptr.atField (Off));
12551253 return true ;
12561254}
@@ -1994,6 +1992,11 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) {
19941992 if (!Ptr.isZero ()) {
19951993 if (!CheckArray (S, OpPC, Ptr))
19961994 return false ;
1995+
1996+ if (Ptr.isDummy ()) {
1997+ S.Stk .push <Pointer>(Ptr);
1998+ return true ;
1999+ }
19972000 }
19982001
19992002 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
@@ -2010,6 +2013,11 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
20102013 if (!Ptr.isZero ()) {
20112014 if (!CheckArray (S, OpPC, Ptr))
20122015 return false ;
2016+
2017+ if (Ptr.isDummy ()) {
2018+ S.Stk .push <Pointer>(Ptr);
2019+ return true ;
2020+ }
20132021 }
20142022
20152023 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
@@ -2045,12 +2053,12 @@ inline bool ArrayElemPop(InterpState &S, CodePtr OpPC, uint32_t Index) {
20452053inline bool ArrayDecay (InterpState &S, CodePtr OpPC) {
20462054 const Pointer &Ptr = S.Stk .pop <Pointer>();
20472055
2048- if (Ptr.isZero ()) {
2056+ if (Ptr.isZero () || Ptr. isDummy () ) {
20492057 S.Stk .push <Pointer>(Ptr);
20502058 return true ;
20512059 }
20522060
2053- if (!Ptr.isUnknownSizeArray () || Ptr. isDummy () ) {
2061+ if (!Ptr.isUnknownSizeArray ()) {
20542062 S.Stk .push <Pointer>(Ptr.atIndex (0 ));
20552063 return true ;
20562064 }
0 commit comments