@@ -2317,13 +2317,11 @@ std::optional<Pointer> OffsetHelper(InterpState &S, CodePtr OpPC,
23172317template <PrimType Name, class T = typename PrimConv<Name>::T>
23182318bool AddOffset (InterpState &S, CodePtr OpPC) {
23192319 const T &Offset = S.Stk .pop <T>();
2320- Pointer Ptr = S.Stk .pop <Pointer>();
2321- if (Ptr.isBlockPointer ())
2322- Ptr = Ptr.expand ();
2320+ Pointer Ptr = S.Stk .pop <Pointer>().expand ();
23232321
23242322 if (std::optional<Pointer> Result = OffsetHelper<T, ArithOp::Add>(
23252323 S, OpPC, Offset, Ptr, /* IsPointerArith=*/ true )) {
2326- S.Stk .push <Pointer>(* Result);
2324+ S.Stk .push <Pointer>(Result-> narrow () );
23272325 return true ;
23282326 }
23292327 return false ;
@@ -2332,11 +2330,11 @@ bool AddOffset(InterpState &S, CodePtr OpPC) {
23322330template <PrimType Name, class T = typename PrimConv<Name>::T>
23332331bool SubOffset (InterpState &S, CodePtr OpPC) {
23342332 const T &Offset = S.Stk .pop <T>();
2335- const Pointer & Ptr = S.Stk .pop <Pointer>();
2333+ Pointer Ptr = S.Stk .pop <Pointer>(). expand ();
23362334
23372335 if (std::optional<Pointer> Result = OffsetHelper<T, ArithOp::Sub>(
23382336 S, OpPC, Offset, Ptr, /* IsPointerArith=*/ true )) {
2339- S.Stk .push <Pointer>(* Result);
2337+ S.Stk .push <Pointer>(Result-> narrow () );
23402338 return true ;
23412339 }
23422340 return false ;
@@ -3191,7 +3189,7 @@ inline bool ArrayDecay(InterpState &S, CodePtr OpPC) {
31913189 }
31923190
31933191 if (Ptr.isRoot () || !Ptr.isUnknownSizeArray ()) {
3194- S.Stk .push <Pointer>(Ptr.atIndex (0 ));
3192+ S.Stk .push <Pointer>(Ptr.atIndex (0 ). narrow () );
31953193 return true ;
31963194 }
31973195
0 commit comments