Lines Matching refs:S

47 bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
50 bool CheckArray(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
53 bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
56 bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
60 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
64 bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
68 bool CheckConst(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
71 bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
74 bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
77 bool CheckStore(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
80 bool CheckInvoke(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
83 bool CheckInit(InterpState &S, CodePtr OpPC, const Pointer &Ptr);
86 bool CheckCallable(InterpState &S, CodePtr OpPC, Function *F);
89 bool CheckThis(InterpState &S, CodePtr OpPC, const Pointer &This);
92 bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD);
102 bool AddSubMulHelper(InterpState &S, CodePtr OpPC, unsigned Bits, const T &LHS, in AddSubMulHelper() argument
107 S.Stk.push<T>(Result); in AddSubMulHelper()
112 S.Stk.push<T>(Result); in AddSubMulHelper()
118 const Expr *E = S.Current->getExpr(OpPC); in AddSubMulHelper()
120 if (S.checkingForUndefinedBehavior()) { in AddSubMulHelper()
123 S.report(Loc, diag::warn_integer_constant_overflow) << Trunc << Type; in AddSubMulHelper()
126 S.CCEDiag(E, diag::note_constexpr_overflow) << Value << Type; in AddSubMulHelper()
127 return S.noteUndefinedBehavior(); in AddSubMulHelper()
132 bool Add(InterpState &S, CodePtr OpPC) { in Add() argument
133 const T &RHS = S.Stk.pop<T>(); in Add()
134 const T &LHS = S.Stk.pop<T>(); in Add()
136 return AddSubMulHelper<T, T::add, std::plus>(S, OpPC, Bits, LHS, RHS); in Add()
140 bool Sub(InterpState &S, CodePtr OpPC) { in Sub() argument
141 const T &RHS = S.Stk.pop<T>(); in Sub()
142 const T &LHS = S.Stk.pop<T>(); in Sub()
144 return AddSubMulHelper<T, T::sub, std::minus>(S, OpPC, Bits, LHS, RHS); in Sub()
148 bool Mul(InterpState &S, CodePtr OpPC) { in Mul() argument
149 const T &RHS = S.Stk.pop<T>(); in Mul()
150 const T &LHS = S.Stk.pop<T>(); in Mul()
152 return AddSubMulHelper<T, T::mul, std::multiplies>(S, OpPC, Bits, LHS, RHS); in Mul()
162 bool CmpHelper(InterpState &S, CodePtr OpPC, CompareFn Fn) { in CmpHelper() argument
164 const T &RHS = S.Stk.pop<T>(); in CmpHelper()
165 const T &LHS = S.Stk.pop<T>(); in CmpHelper()
166 S.Stk.push<BoolT>(BoolT::from(Fn(LHS.compare(RHS)))); in CmpHelper()
171 bool CmpHelperEQ(InterpState &S, CodePtr OpPC, CompareFn Fn) { in CmpHelperEQ() argument
172 return CmpHelper<T>(S, OpPC, Fn); in CmpHelperEQ()
176 inline bool CmpHelper<Pointer>(InterpState &S, CodePtr OpPC, CompareFn Fn) {
178 const Pointer &RHS = S.Stk.pop<Pointer>();
179 const Pointer &LHS = S.Stk.pop<Pointer>();
182 const SourceInfo &Loc = S.Current->getSource(OpPC);
183 S.FFDiag(Loc, diag::note_invalid_subexpr_in_const_expr);
188 S.Stk.push<BoolT>(BoolT::from(Fn(Compare(VL, VR))));
194 inline bool CmpHelperEQ<Pointer>(InterpState &S, CodePtr OpPC, CompareFn Fn) {
196 const Pointer &RHS = S.Stk.pop<Pointer>();
197 const Pointer &LHS = S.Stk.pop<Pointer>();
200 S.Stk.push<BoolT>(BoolT::from(Fn(ComparisonCategoryResult::Equal)));
205 S.Stk.push<BoolT>(BoolT::from(Fn(ComparisonCategoryResult::Unordered)));
210 S.Stk.push<BoolT>(BoolT::from(Fn(Compare(VL, VR))));
216 bool EQ(InterpState &S, CodePtr OpPC) { in EQ() argument
217 return CmpHelperEQ<T>(S, OpPC, [](ComparisonCategoryResult R) { in EQ()
223 bool NE(InterpState &S, CodePtr OpPC) { in NE() argument
224 return CmpHelperEQ<T>(S, OpPC, [](ComparisonCategoryResult R) { in NE()
230 bool LT(InterpState &S, CodePtr OpPC) { in LT() argument
231 return CmpHelper<T>(S, OpPC, [](ComparisonCategoryResult R) { in LT()
237 bool LE(InterpState &S, CodePtr OpPC) { in LE() argument
238 return CmpHelper<T>(S, OpPC, [](ComparisonCategoryResult R) { in LE()
245 bool GT(InterpState &S, CodePtr OpPC) { in GT() argument
246 return CmpHelper<T>(S, OpPC, [](ComparisonCategoryResult R) { in GT()
252 bool GE(InterpState &S, CodePtr OpPC) { in GE() argument
253 return CmpHelper<T>(S, OpPC, [](ComparisonCategoryResult R) { in GE()
264 bool InRange(InterpState &S, CodePtr OpPC) { in InRange() argument
265 const T RHS = S.Stk.pop<T>(); in InRange()
266 const T LHS = S.Stk.pop<T>(); in InRange()
267 const T Value = S.Stk.pop<T>(); in InRange()
269 S.Stk.push<bool>(LHS <= Value && Value <= RHS); in InRange()
278 bool Dup(InterpState &S, CodePtr OpPC) { in Dup() argument
279 S.Stk.push<T>(S.Stk.peek<T>()); in Dup()
284 bool Pop(InterpState &S, CodePtr OpPC) { in Pop() argument
285 S.Stk.pop<T>(); in Pop()
294 bool Const(InterpState &S, CodePtr OpPC, const T &Arg) { in Const() argument
295 S.Stk.push<T>(Arg); in Const()
304 bool GetLocal(InterpState &S, CodePtr OpPC, uint32_t I) { in GetLocal() argument
305 S.Stk.push<T>(S.Current->getLocal<T>(I)); in GetLocal()
310 bool SetLocal(InterpState &S, CodePtr OpPC, uint32_t I) { in SetLocal() argument
311 S.Current->setLocal<T>(I, S.Stk.pop<T>()); in SetLocal()
316 bool GetParam(InterpState &S, CodePtr OpPC, uint32_t I) { in GetParam() argument
317 if (S.checkingPotentialConstantExpression()) { in GetParam()
320 S.Stk.push<T>(S.Current->getParam<T>(I)); in GetParam()
325 bool SetParam(InterpState &S, CodePtr OpPC, uint32_t I) { in SetParam() argument
326 S.Current->setParam<T>(I, S.Stk.pop<T>()); in SetParam()
331 bool GetField(InterpState &S, CodePtr OpPC, uint32_t I) { in GetField() argument
332 const Pointer &Obj = S.Stk.peek<Pointer>(); in GetField()
333 if (!CheckNull(S, OpPC, Obj, CSK_Field)) in GetField()
335 if (!CheckRange(S, OpPC, Obj, CSK_Field)) in GetField()
338 if (!CheckLoad(S, OpPC, Field)) in GetField()
340 S.Stk.push<T>(Field.deref<T>()); in GetField()
345 bool SetField(InterpState &S, CodePtr OpPC, uint32_t I) { in SetField() argument
346 const T &Value = S.Stk.pop<T>(); in SetField()
347 const Pointer &Obj = S.Stk.peek<Pointer>(); in SetField()
348 if (!CheckNull(S, OpPC, Obj, CSK_Field)) in SetField()
350 if (!CheckRange(S, OpPC, Obj, CSK_Field)) in SetField()
353 if (!CheckStore(S, OpPC, Field)) in SetField()
360 bool GetFieldPop(InterpState &S, CodePtr OpPC, uint32_t I) { in GetFieldPop() argument
361 const Pointer &Obj = S.Stk.pop<Pointer>(); in GetFieldPop()
362 if (!CheckNull(S, OpPC, Obj, CSK_Field)) in GetFieldPop()
364 if (!CheckRange(S, OpPC, Obj, CSK_Field)) in GetFieldPop()
367 if (!CheckLoad(S, OpPC, Field)) in GetFieldPop()
369 S.Stk.push<T>(Field.deref<T>()); in GetFieldPop()
374 bool GetThisField(InterpState &S, CodePtr OpPC, uint32_t I) { in GetThisField() argument
375 if (S.checkingPotentialConstantExpression()) in GetThisField()
377 const Pointer &This = S.Current->getThis(); in GetThisField()
378 if (!CheckThis(S, OpPC, This)) in GetThisField()
381 if (!CheckLoad(S, OpPC, Field)) in GetThisField()
383 S.Stk.push<T>(Field.deref<T>()); in GetThisField()
388 bool SetThisField(InterpState &S, CodePtr OpPC, uint32_t I) { in SetThisField() argument
389 if (S.checkingPotentialConstantExpression()) in SetThisField()
391 const T &Value = S.Stk.pop<T>(); in SetThisField()
392 const Pointer &This = S.Current->getThis(); in SetThisField()
393 if (!CheckThis(S, OpPC, This)) in SetThisField()
396 if (!CheckStore(S, OpPC, Field)) in SetThisField()
403 bool GetGlobal(InterpState &S, CodePtr OpPC, uint32_t I) { in GetGlobal() argument
404 auto *B = S.P.getGlobal(I); in GetGlobal()
407 S.Stk.push<T>(B->deref<T>()); in GetGlobal()
412 bool SetGlobal(InterpState &S, CodePtr OpPC, uint32_t I) { in SetGlobal() argument
418 bool InitGlobal(InterpState &S, CodePtr OpPC, uint32_t I) { in InitGlobal() argument
419 S.P.getGlobal(I)->deref<T>() = S.Stk.pop<T>(); in InitGlobal()
424 bool InitThisField(InterpState &S, CodePtr OpPC, uint32_t I) { in InitThisField() argument
425 if (S.checkingPotentialConstantExpression()) in InitThisField()
427 const Pointer &This = S.Current->getThis(); in InitThisField()
428 if (!CheckThis(S, OpPC, This)) in InitThisField()
431 Field.deref<T>() = S.Stk.pop<T>(); in InitThisField()
437 bool InitThisBitField(InterpState &S, CodePtr OpPC, const Record::Field *F) { in InitThisBitField() argument
438 if (S.checkingPotentialConstantExpression()) in InitThisBitField()
440 const Pointer &This = S.Current->getThis(); in InitThisBitField()
441 if (!CheckThis(S, OpPC, This)) in InitThisBitField()
444 const auto &Value = S.Stk.pop<T>(); in InitThisBitField()
445 Field.deref<T>() = Value.truncate(F->Decl->getBitWidthValue(S.getCtx())); in InitThisBitField()
451 bool InitThisFieldActive(InterpState &S, CodePtr OpPC, uint32_t I) { in InitThisFieldActive() argument
452 if (S.checkingPotentialConstantExpression()) in InitThisFieldActive()
454 const Pointer &This = S.Current->getThis(); in InitThisFieldActive()
455 if (!CheckThis(S, OpPC, This)) in InitThisFieldActive()
458 Field.deref<T>() = S.Stk.pop<T>(); in InitThisFieldActive()
465 bool InitField(InterpState &S, CodePtr OpPC, uint32_t I) { in InitField() argument
466 const T &Value = S.Stk.pop<T>(); in InitField()
467 const Pointer &Field = S.Stk.pop<Pointer>().atField(I); in InitField()
475 bool InitBitField(InterpState &S, CodePtr OpPC, const Record::Field *F) { in InitBitField() argument
476 const T &Value = S.Stk.pop<T>(); in InitBitField()
477 const Pointer &Field = S.Stk.pop<Pointer>().atField(F->Offset); in InitBitField()
478 Field.deref<T>() = Value.truncate(F->Decl->getBitWidthValue(S.getCtx())); in InitBitField()
485 bool InitFieldActive(InterpState &S, CodePtr OpPC, uint32_t I) { in InitFieldActive() argument
486 const T &Value = S.Stk.pop<T>(); in InitFieldActive()
487 const Pointer &Ptr = S.Stk.pop<Pointer>(); in InitFieldActive()
499 inline bool GetPtrLocal(InterpState &S, CodePtr OpPC, uint32_t I) { in GetPtrLocal() argument
500 S.Stk.push<Pointer>(S.Current->getLocalPointer(I)); in GetPtrLocal()
504 inline bool GetPtrParam(InterpState &S, CodePtr OpPC, uint32_t I) { in GetPtrParam() argument
505 if (S.checkingPotentialConstantExpression()) { in GetPtrParam()
508 S.Stk.push<Pointer>(S.Current->getParamPointer(I)); in GetPtrParam()
512 inline bool GetPtrGlobal(InterpState &S, CodePtr OpPC, uint32_t I) { in GetPtrGlobal() argument
513 S.Stk.push<Pointer>(S.P.getPtrGlobal(I)); in GetPtrGlobal()
517 inline bool GetPtrField(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrField() argument
518 const Pointer &Ptr = S.Stk.pop<Pointer>(); in GetPtrField()
519 if (!CheckNull(S, OpPC, Ptr, CSK_Field)) in GetPtrField()
521 if (!CheckExtern(S, OpPC, Ptr)) in GetPtrField()
523 if (!CheckRange(S, OpPC, Ptr, CSK_Field)) in GetPtrField()
525 S.Stk.push<Pointer>(Ptr.atField(Off)); in GetPtrField()
529 inline bool GetPtrThisField(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrThisField() argument
530 if (S.checkingPotentialConstantExpression()) in GetPtrThisField()
532 const Pointer &This = S.Current->getThis(); in GetPtrThisField()
533 if (!CheckThis(S, OpPC, This)) in GetPtrThisField()
535 S.Stk.push<Pointer>(This.atField(Off)); in GetPtrThisField()
539 inline bool GetPtrActiveField(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrActiveField() argument
540 const Pointer &Ptr = S.Stk.pop<Pointer>(); in GetPtrActiveField()
541 if (!CheckNull(S, OpPC, Ptr, CSK_Field)) in GetPtrActiveField()
543 if (!CheckRange(S, OpPC, Ptr, CSK_Field)) in GetPtrActiveField()
548 S.Stk.push<Pointer>(std::move(Field)); in GetPtrActiveField()
552 inline bool GetPtrActiveThisField(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrActiveThisField() argument
553 if (S.checkingPotentialConstantExpression()) in GetPtrActiveThisField()
555 const Pointer &This = S.Current->getThis(); in GetPtrActiveThisField()
556 if (!CheckThis(S, OpPC, This)) in GetPtrActiveThisField()
561 S.Stk.push<Pointer>(std::move(Field)); in GetPtrActiveThisField()
565 inline bool GetPtrBase(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrBase() argument
566 const Pointer &Ptr = S.Stk.pop<Pointer>(); in GetPtrBase()
567 if (!CheckNull(S, OpPC, Ptr, CSK_Base)) in GetPtrBase()
569 S.Stk.push<Pointer>(Ptr.atField(Off)); in GetPtrBase()
573 inline bool GetPtrThisBase(InterpState &S, CodePtr OpPC, uint32_t Off) { in GetPtrThisBase() argument
574 if (S.checkingPotentialConstantExpression()) in GetPtrThisBase()
576 const Pointer &This = S.Current->getThis(); in GetPtrThisBase()
577 if (!CheckThis(S, OpPC, This)) in GetPtrThisBase()
579 S.Stk.push<Pointer>(This.atField(Off)); in GetPtrThisBase()
583 inline bool VirtBaseHelper(InterpState &S, CodePtr OpPC, const RecordDecl *Decl, in VirtBaseHelper() argument
590 S.Stk.push<Pointer>(Base.atField(Field->Offset)); in VirtBaseHelper()
594 inline bool GetPtrVirtBase(InterpState &S, CodePtr OpPC, const RecordDecl *D) { in GetPtrVirtBase() argument
595 const Pointer &Ptr = S.Stk.pop<Pointer>(); in GetPtrVirtBase()
596 if (!CheckNull(S, OpPC, Ptr, CSK_Base)) in GetPtrVirtBase()
598 return VirtBaseHelper(S, OpPC, D, Ptr); in GetPtrVirtBase()
601 inline bool GetPtrThisVirtBase(InterpState &S, CodePtr OpPC, in GetPtrThisVirtBase() argument
603 if (S.checkingPotentialConstantExpression()) in GetPtrThisVirtBase()
605 const Pointer &This = S.Current->getThis(); in GetPtrThisVirtBase()
606 if (!CheckThis(S, OpPC, This)) in GetPtrThisVirtBase()
608 return VirtBaseHelper(S, OpPC, D, S.Current->getThis()); in GetPtrThisVirtBase()
616 bool Load(InterpState &S, CodePtr OpPC) { in Load() argument
617 const Pointer &Ptr = S.Stk.peek<Pointer>(); in Load()
618 if (!CheckLoad(S, OpPC, Ptr)) in Load()
620 S.Stk.push<T>(Ptr.deref<T>()); in Load()
625 bool LoadPop(InterpState &S, CodePtr OpPC) { in LoadPop() argument
626 const Pointer &Ptr = S.Stk.pop<Pointer>(); in LoadPop()
627 if (!CheckLoad(S, OpPC, Ptr)) in LoadPop()
629 S.Stk.push<T>(Ptr.deref<T>()); in LoadPop()
634 bool Store(InterpState &S, CodePtr OpPC) { in Store() argument
635 const T &Value = S.Stk.pop<T>(); in Store()
636 const Pointer &Ptr = S.Stk.peek<Pointer>(); in Store()
637 if (!CheckStore(S, OpPC, Ptr)) in Store()
644 bool StorePop(InterpState &S, CodePtr OpPC) { in StorePop() argument
645 const T &Value = S.Stk.pop<T>(); in StorePop()
646 const Pointer &Ptr = S.Stk.pop<Pointer>(); in StorePop()
647 if (!CheckStore(S, OpPC, Ptr)) in StorePop()
654 bool StoreBitField(InterpState &S, CodePtr OpPC) { in StoreBitField() argument
655 const T &Value = S.Stk.pop<T>(); in StoreBitField()
656 const Pointer &Ptr = S.Stk.peek<Pointer>(); in StoreBitField()
657 if (!CheckStore(S, OpPC, Ptr)) in StoreBitField()
660 Ptr.deref<T>() = Value.truncate(FD->getBitWidthValue(S.getCtx())); in StoreBitField()
668 bool StoreBitFieldPop(InterpState &S, CodePtr OpPC) { in StoreBitFieldPop() argument
669 const T &Value = S.Stk.pop<T>(); in StoreBitFieldPop()
670 const Pointer &Ptr = S.Stk.pop<Pointer>(); in StoreBitFieldPop()
671 if (!CheckStore(S, OpPC, Ptr)) in StoreBitFieldPop()
674 Ptr.deref<T>() = Value.truncate(FD->getBitWidthValue(S.getCtx())); in StoreBitFieldPop()
682 bool InitPop(InterpState &S, CodePtr OpPC) { in InitPop() argument
683 const T &Value = S.Stk.pop<T>(); in InitPop()
684 const Pointer &Ptr = S.Stk.pop<Pointer>(); in InitPop()
685 if (!CheckInit(S, OpPC, Ptr)) in InitPop()
693 bool InitElem(InterpState &S, CodePtr OpPC, uint32_t Idx) { in InitElem() argument
694 const T &Value = S.Stk.pop<T>(); in InitElem()
695 const Pointer &Ptr = S.Stk.peek<Pointer>().atIndex(Idx); in InitElem()
696 if (!CheckInit(S, OpPC, Ptr)) in InitElem()
704 bool InitElemPop(InterpState &S, CodePtr OpPC, uint32_t Idx) { in InitElemPop() argument
705 const T &Value = S.Stk.pop<T>(); in InitElemPop()
706 const Pointer &Ptr = S.Stk.pop<Pointer>().atIndex(Idx); in InitElemPop()
707 if (!CheckInit(S, OpPC, Ptr)) in InitElemPop()
718 template <class T, bool Add> bool OffsetHelper(InterpState &S, CodePtr OpPC) { in OffsetHelper() argument
720 const T &Offset = S.Stk.pop<T>(); in OffsetHelper()
721 const Pointer &Ptr = S.Stk.pop<Pointer>(); in OffsetHelper()
722 if (!CheckNull(S, OpPC, Ptr, CSK_ArrayIndex)) in OffsetHelper()
724 if (!CheckRange(S, OpPC, Ptr, CSK_ArrayToPointer)) in OffsetHelper()
732 S.Stk.push<Pointer>(Index.isZero() ? Ptr.atIndex(0) : Ptr); in OffsetHelper()
736 if (!CheckArray(S, OpPC, Ptr)) in OffsetHelper()
748 S.CCEDiag(S.Current->getSource(OpPC), diag::note_constexpr_array_index) in OffsetHelper()
772 S.Stk.push<Pointer>(Ptr.atIndex(static_cast<unsigned>(Result))); in OffsetHelper()
777 bool AddOffset(InterpState &S, CodePtr OpPC) { in AddOffset() argument
778 return OffsetHelper<T, true>(S, OpPC); in AddOffset()
782 bool SubOffset(InterpState &S, CodePtr OpPC) { in SubOffset() argument
783 return OffsetHelper<T, false>(S, OpPC); in SubOffset()
791 inline bool Destroy(InterpState &S, CodePtr OpPC, uint32_t I) { in Destroy() argument
792 S.Current->destroy(I); in Destroy()
800 template <PrimType TIn, PrimType TOut> bool Cast(InterpState &S, CodePtr OpPC) { in Cast() argument
803 S.Stk.push<U>(U::from(S.Stk.pop<T>())); in Cast()
812 bool Zero(InterpState &S, CodePtr OpPC) { in Zero() argument
813 S.Stk.push<T>(T::zero()); in Zero()
818 inline bool Null(InterpState &S, CodePtr OpPC) { in Null() argument
819 S.Stk.push<T>(); in Null()
827 inline bool This(InterpState &S, CodePtr OpPC) { in This() argument
829 if (S.checkingPotentialConstantExpression()) { in This()
833 const Pointer &This = S.Current->getThis(); in This()
834 if (!CheckThis(S, OpPC, This)) in This()
837 S.Stk.push<Pointer>(This); in This()
846 unsigned Trunc(InterpState &S, CodePtr OpPC, unsigned Bits, const T &V) { in Trunc() argument
850 const Expr *E = S.Current->getExpr(OpPC); in Trunc()
853 S.CCEDiag(E, diag::note_constexpr_large_shift) << Val << Ty << Bits; in Trunc()
861 inline bool ShiftRight(InterpState &S, CodePtr OpPC, const T &V, unsigned RHS) { in ShiftRight() argument
863 S.Stk.push<T>(T::from(0, V.bitWidth())); in ShiftRight()
865 S.Stk.push<T>(T::from(V >> RHS, V.bitWidth())); in ShiftRight()
871 inline bool ShiftLeft(InterpState &S, CodePtr OpPC, const T &V, unsigned RHS) { in ShiftLeft() argument
872 if (V.isSigned() && !S.getLangOpts().CPlusPlus20) { in ShiftLeft()
878 const Expr *E = S.Current->getExpr(OpPC); in ShiftLeft()
879 S.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << V.toAPSInt(); in ShiftLeft()
881 S.CCEDiag(S.Current->getExpr(OpPC), diag::note_constexpr_lshift_discards); in ShiftLeft()
886 S.Stk.push<T>(V); in ShiftLeft()
888 S.Stk.push<T>(T::from(0, V.bitWidth())); in ShiftLeft()
890 S.Stk.push<T>(T::from(V.toUnsigned() << RHS, V.bitWidth())); in ShiftLeft()
896 inline bool Shr(InterpState &S, CodePtr OpPC) { in Shr() argument
897 const auto &RHS = S.Stk.pop<typename PrimConv<TR>::T>(); in Shr()
898 const auto &LHS = S.Stk.pop<typename PrimConv<TL>::T>(); in Shr()
902 const SourceInfo &Loc = S.Current->getSource(OpPC); in Shr()
903 S.CCEDiag(Loc, diag::note_constexpr_negative_shift) << RHS.toAPSInt(); in Shr()
904 return ShiftLeft<TL, TR>(S, OpPC, LHS, Trunc<TR, TL>(S, OpPC, Bits, -RHS)); in Shr()
906 return ShiftRight<TL, TR>(S, OpPC, LHS, Trunc<TR, TL>(S, OpPC, Bits, RHS)); in Shr()
911 inline bool Shl(InterpState &S, CodePtr OpPC) { in Shl() argument
912 const auto &RHS = S.Stk.pop<typename PrimConv<TR>::T>(); in Shl()
913 const auto &LHS = S.Stk.pop<typename PrimConv<TL>::T>(); in Shl()
917 const SourceInfo &Loc = S.Current->getSource(OpPC); in Shl()
918 S.CCEDiag(Loc, diag::note_constexpr_negative_shift) << RHS.toAPSInt(); in Shl()
919 return ShiftRight<TL, TR>(S, OpPC, LHS, Trunc<TR, TL>(S, OpPC, Bits, -RHS)); in Shl()
921 return ShiftLeft<TL, TR>(S, OpPC, LHS, Trunc<TR, TL>(S, OpPC, Bits, RHS)); in Shl()
929 inline bool NoRet(InterpState &S, CodePtr OpPC) { in NoRet() argument
930 SourceLocation EndLoc = S.Current->getCallee()->getEndLoc(); in NoRet()
931 S.FFDiag(EndLoc, diag::note_constexpr_no_return); in NoRet()
939 inline bool NarrowPtr(InterpState &S, CodePtr OpPC) { in NarrowPtr() argument
940 const Pointer &Ptr = S.Stk.pop<Pointer>(); in NarrowPtr()
941 S.Stk.push<Pointer>(Ptr.narrow()); in NarrowPtr()
945 inline bool ExpandPtr(InterpState &S, CodePtr OpPC) { in ExpandPtr() argument
946 const Pointer &Ptr = S.Stk.pop<Pointer>(); in ExpandPtr()
947 S.Stk.push<Pointer>(Ptr.expand()); in ExpandPtr()
952 bool Interpret(InterpState &S, APValue &Result);