Lines Matching defs:Ptr
49 bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
52 bool CheckArray(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
55 bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
59 bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
63 bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
67 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
71 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
74 /// Checks if Ptr is a one-past-the-end pointer.
75 bool CheckSubobject(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
80 bool CheckDowncast(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
84 bool CheckConst(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
90 bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
93 bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
96 bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
99 bool CheckGlobalInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
102 bool CheckStore(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
105 bool CheckInvoke(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
108 bool CheckInit(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
139 const Pointer &Ptr);
144 const Pointer &Ptr, const APSInt &IntValue);
718 bool IncDecHelper(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
719 assert(!Ptr.isDummy());
726 const T &Value = Ptr.deref<T>();
734 Ptr.deref<T>() = Result;
739 Ptr.deref<T>() = Result;
777 const Pointer &Ptr = S.Stk.pop<Pointer>();
778 if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
781 return IncDecHelper<T, IncDecOp::Inc, PushVal::Yes>(S, OpPC, Ptr);
789 const Pointer &Ptr = S.Stk.pop<Pointer>();
790 if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
793 return IncDecHelper<T, IncDecOp::Inc, PushVal::No>(S, OpPC, Ptr);
802 const Pointer &Ptr = S.Stk.pop<Pointer>();
803 if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
806 return IncDecHelper<T, IncDecOp::Dec, PushVal::Yes>(S, OpPC, Ptr);
814 const Pointer &Ptr = S.Stk.pop<Pointer>();
815 if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
818 return IncDecHelper<T, IncDecOp::Dec, PushVal::No>(S, OpPC, Ptr);
822 bool IncDecFloatHelper(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
824 Floating Value = Ptr.deref<Floating>();
836 Ptr.deref<Floating>() = Result;
842 const Pointer &Ptr = S.Stk.pop<Pointer>();
843 if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
846 return IncDecFloatHelper<IncDecOp::Inc, PushVal::Yes>(S, OpPC, Ptr, RM);
850 const Pointer &Ptr = S.Stk.pop<Pointer>();
851 if (!CheckLoad(S, OpPC, Ptr, AK_Increment))
854 return IncDecFloatHelper<IncDecOp::Inc, PushVal::No>(S, OpPC, Ptr, RM);
858 const Pointer &Ptr = S.Stk.pop<Pointer>();
859 if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
862 return IncDecFloatHelper<IncDecOp::Dec, PushVal::Yes>(S, OpPC, Ptr, RM);
866 const Pointer &Ptr = S.Stk.pop<Pointer>();
867 if (!CheckLoad(S, OpPC, Ptr, AK_Decrement))
870 return IncDecFloatHelper<IncDecOp::Dec, PushVal::No>(S, OpPC, Ptr, RM);
1177 const Pointer &Ptr = S.Current->getLocalPointer(I);
1178 if (!CheckLoad(S, OpPC, Ptr))
1180 S.Stk.push<T>(Ptr.deref<T>());
1287 const Pointer &Ptr = S.P.getPtrGlobal(I);
1288 if (!CheckConstant(S, OpPC, Ptr.getFieldDesc()))
1290 if (Ptr.isExtern())
1295 if (!CheckGlobalInitialized(S, OpPC, Ptr))
1298 S.Stk.push<T>(Ptr.deref<T>());
1305 const Pointer &Ptr = S.P.getPtrGlobal(I);
1306 if (!Ptr.isInitialized())
1308 S.Stk.push<T>(Ptr.deref<T>());
1332 const Pointer &Ptr = S.P.getGlobal(I);
1339 assert(Ptr.getDeclDesc()->asExpr());
1342 std::make_pair(Ptr.getDeclDesc()->asExpr(), Temp));
1344 Ptr.deref<T>() = S.Stk.pop<T>();
1345 Ptr.initialize();
1442 const Pointer &Ptr = S.Stk.pop<Pointer>();
1443 const Pointer &Field = Ptr.atField(I);
1475 const Pointer &Ptr = S.Stk.peek<Pointer>();
1478 !CheckNull(S, OpPC, Ptr, CSK_Field))
1481 if (!CheckExtern(S, OpPC, Ptr))
1483 if (!CheckRange(S, OpPC, Ptr, CSK_Field))
1485 if (!CheckArray(S, OpPC, Ptr))
1487 if (!CheckSubobject(S, OpPC, Ptr, CSK_Field))
1490 if (Ptr.isBlockPointer() && Off > Ptr.block()->getSize())
1492 S.Stk.push<Pointer>(Ptr.atField(Off));
1497 const Pointer &Ptr = S.Stk.pop<Pointer>();
1500 !CheckNull(S, OpPC, Ptr, CSK_Field))
1503 if (!CheckExtern(S, OpPC, Ptr))
1505 if (!CheckRange(S, OpPC, Ptr, CSK_Field))
1507 if (!CheckArray(S, OpPC, Ptr))
1509 if (!CheckSubobject(S, OpPC, Ptr, CSK_Field))
1512 if (Ptr.isBlockPointer() && Off > Ptr.block()->getSize())
1515 S.Stk.push<Pointer>(Ptr.atField(Off));
1530 const Pointer &Ptr = S.Stk.pop<Pointer>();
1531 if (!CheckNull(S, OpPC, Ptr, CSK_Field))
1533 if (!CheckRange(S, OpPC, Ptr, CSK_Field))
1535 Pointer Field = Ptr.atField(Off);
1536 Ptr.deactivate();
1556 const Pointer &Ptr = S.Stk.pop<Pointer>();
1557 if (!CheckNull(S, OpPC, Ptr, CSK_Derived))
1559 if (!CheckSubobject(S, OpPC, Ptr, CSK_Derived))
1561 if (!CheckDowncast(S, OpPC, Ptr, Off))
1564 S.Stk.push<Pointer>(Ptr.atFieldSub(Off));
1569 const Pointer &Ptr = S.Stk.peek<Pointer>();
1570 if (!CheckNull(S, OpPC, Ptr, CSK_Base))
1572 if (!CheckSubobject(S, OpPC, Ptr, CSK_Base))
1574 S.Stk.push<Pointer>(Ptr.atField(Off));
1579 const Pointer &Ptr = S.Stk.pop<Pointer>();
1580 if (!CheckNull(S, OpPC, Ptr, CSK_Base))
1582 if (!CheckSubobject(S, OpPC, Ptr, CSK_Base))
1584 S.Stk.push<Pointer>(Ptr.atField(Off));
1589 const auto &Ptr = S.Stk.pop<MemberPointer>();
1590 S.Stk.push<MemberPointer>(Ptr.atInstanceBase(Off));
1605 const Pointer &Ptr = S.Stk.pop<Pointer>();
1606 if (Ptr.canBeInitialized()) {
1607 Ptr.initialize();
1608 Ptr.activate();
1614 const Pointer &Ptr = S.Stk.peek<Pointer>();
1615 if (Ptr.canBeInitialized()) {
1616 Ptr.initialize();
1617 Ptr.activate();
1628 const Pointer &Ptr) {
1629 Pointer Base = Ptr;
1641 const Pointer &Ptr = S.Stk.pop<Pointer>();
1642 if (!CheckNull(S, OpPC, Ptr, CSK_Base))
1644 return VirtBaseHelper(S, OpPC, D, Ptr);
1664 const Pointer &Ptr = S.Stk.peek<Pointer>();
1665 if (!CheckLoad(S, OpPC, Ptr))
1667 if (!Ptr.isBlockPointer())
1669 S.Stk.push<T>(Ptr.deref<T>());
1675 const Pointer &Ptr = S.Stk.pop<Pointer>();
1676 if (!CheckLoad(S, OpPC, Ptr))
1678 if (!Ptr.isBlockPointer())
1680 S.Stk.push<T>(Ptr.deref<T>());
1687 const Pointer &Ptr = S.Stk.peek<Pointer>();
1688 if (!CheckStore(S, OpPC, Ptr))
1690 if (Ptr.canBeInitialized())
1691 Ptr.initialize();
1692 Ptr.deref<T>() = Value;
1699 const Pointer &Ptr = S.Stk.pop<Pointer>();
1700 if (!CheckStore(S, OpPC, Ptr))
1702 if (Ptr.canBeInitialized())
1703 Ptr.initialize();
1704 Ptr.deref<T>() = Value;
1711 const Pointer &Ptr = S.Stk.peek<Pointer>();
1712 if (!CheckStore(S, OpPC, Ptr))
1714 if (Ptr.canBeInitialized())
1715 Ptr.initialize();
1716 if (const auto *FD = Ptr.getField())
1717 Ptr.deref<T>() = Value.truncate(FD->getBitWidthValue(S.getCtx()));
1719 Ptr.deref<T>() = Value;
1726 const Pointer &Ptr = S.Stk.pop<Pointer>();
1727 if (!CheckStore(S, OpPC, Ptr))
1729 if (Ptr.canBeInitialized())
1730 Ptr.initialize();
1731 if (const auto *FD = Ptr.getField())
1732 Ptr.deref<T>() = Value.truncate(FD->getBitWidthValue(S.getCtx()));
1734 Ptr.deref<T>() = Value;
1741 const Pointer &Ptr = S.Stk.peek<Pointer>();
1742 if (!CheckInit(S, OpPC, Ptr)) {
1746 Ptr.initialize();
1747 new (&Ptr.deref<T>()) T(Value);
1754 const Pointer &Ptr = S.Stk.pop<Pointer>();
1755 if (!CheckInit(S, OpPC, Ptr))
1757 Ptr.initialize();
1758 new (&Ptr.deref<T>()) T(Value);
1768 const Pointer &Ptr = S.Stk.peek<Pointer>().atIndex(Idx);
1769 if (Ptr.isUnknownSizeArray())
1771 if (!CheckInit(S, OpPC, Ptr))
1773 Ptr.initialize();
1774 new (&Ptr.deref<T>()) T(Value);
1782 const Pointer &Ptr = S.Stk.pop<Pointer>().atIndex(Idx);
1783 if (Ptr.isUnknownSizeArray())
1785 if (!CheckInit(S, OpPC, Ptr))
1787 Ptr.initialize();
1788 new (&Ptr.deref<T>()) T(Value);
1813 if (std::optional<Pointer> Ptr = MP.toPointer(S.Ctx)) {
1814 S.Stk.push<Pointer>(*Ptr);
1826 const Pointer &Ptr) {
1829 S.Stk.push<Pointer>(Ptr);
1833 if (!CheckNull(S, OpPC, Ptr, CSK_ArrayIndex)) {
1841 if (!CheckArray(S, OpPC, Ptr))
1844 uint64_t MaxIndex = static_cast<uint64_t>(Ptr.getNumElems());
1846 if (Ptr.isOnePastEnd())
1849 Index = Ptr.getIndex();
1861 << NewIndex << /*array*/ static_cast<int>(!Ptr.inArray()) << MaxIndex;
1865 if (Ptr.isBlockPointer()) {
1903 if (Result == 0 && Ptr.isOnePastEnd()) {
1904 S.Stk.push<Pointer>(Ptr.asBlockPointer().Pointee,
1905 Ptr.asBlockPointer().Base);
1909 S.Stk.push<Pointer>(Ptr.atIndex(static_cast<uint64_t>(Result)));
1916 const Pointer &Ptr = S.Stk.pop<Pointer>();
1917 return OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr);
1923 const Pointer &Ptr = S.Stk.pop<Pointer>();
1924 return OffsetHelper<T, ArithOp::Sub>(S, OpPC, Offset, Ptr);
1929 const Pointer &Ptr) {
1930 if (Ptr.isDummy())
1935 const Pointer &P = Ptr.deref<Pointer>();
1942 // Now the current Ptr again and a constant 1.
1948 Ptr.deref<Pointer>() = S.Stk.pop<Pointer>();
1953 const Pointer &Ptr = S.Stk.pop<Pointer>();
1955 if (!CheckInitialized(S, OpPC, Ptr, AK_Increment))
1958 return IncDecPtrHelper<ArithOp::Add>(S, OpPC, Ptr);
1962 const Pointer &Ptr = S.Stk.pop<Pointer>();
1964 if (!CheckInitialized(S, OpPC, Ptr, AK_Decrement))
1967 return IncDecPtrHelper<ArithOp::Sub>(S, OpPC, Ptr);
2132 const Pointer &Ptr = S.Stk.pop<Pointer>();
2134 if (Ptr.isDummy())
2141 S.Stk.push<T>(T::from(Ptr.getIntegerRepresentation()));
2147 const Pointer &Ptr = S.Stk.pop<Pointer>();
2149 if (Ptr.isDummy())
2157 IntegralAP<false>::from(Ptr.getIntegerRepresentation(), BitWidth));
2163 const Pointer &Ptr = S.Stk.pop<Pointer>();
2165 if (Ptr.isDummy())
2173 IntegralAP<true>::from(Ptr.getIntegerRepresentation(), BitWidth));
2178 const auto &Ptr = S.Stk.peek<Pointer>();
2181 bool HasValidResult = !Ptr.isZero();
2363 const Pointer &Ptr = S.Stk.pop<Pointer>();
2364 S.Stk.push<Pointer>(Ptr.narrow());
2369 const Pointer &Ptr = S.Stk.pop<Pointer>();
2370 S.Stk.push<Pointer>(Ptr.expand());
2385 const Pointer &Ptr = S.Stk.peek<Pointer>();
2387 if (!Ptr.isZero()) {
2388 if (!CheckArray(S, OpPC, Ptr))
2392 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
2401 const Pointer &Ptr = S.Stk.pop<Pointer>();
2403 if (!Ptr.isZero()) {
2404 if (!CheckArray(S, OpPC, Ptr))
2408 if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
2416 const Pointer &Ptr = S.Stk.peek<Pointer>();
2418 if (!CheckLoad(S, OpPC, Ptr))
2421 S.Stk.push<T>(Ptr.atIndex(Index).deref<T>());
2427 const Pointer &Ptr = S.Stk.pop<Pointer>();
2429 if (!CheckLoad(S, OpPC, Ptr))
2432 S.Stk.push<T>(Ptr.atIndex(Index).deref<T>());
2457 const Pointer &Ptr = S.Stk.pop<Pointer>();
2459 if (Ptr.isZero()) {
2460 S.Stk.push<Pointer>(Ptr);
2464 if (!CheckRange(S, OpPC, Ptr, CSK_ArrayToPointer))
2467 if (Ptr.isRoot() || !Ptr.isUnknownSizeArray() || Ptr.isDummy()) {
2468 S.Stk.push<Pointer>(Ptr.atIndex(0));
2920 const Pointer &Ptr = S.Stk.pop<Pointer>();
2923 if (Ptr.isZero())
2926 if (!Ptr.isRoot() || Ptr.isOnePastEnd() || Ptr.isArrayElement()) {
2929 << Ptr.toDiagnosticString(S.getCtx()) << Ptr.isOnePastEnd();
2933 Source = Ptr.getDeclDesc()->asExpr();
2934 BlockToDelete = Ptr.block();
2936 if (!CheckDeleteSource(S, OpPC, Source, Ptr))