================
@@ -2058,6 +2058,74 @@ static bool isOneByteCharacterType(QualType T) {
return T->isCharType() || T->isChar8Type();
}
+// stdc_memreverse8(size_t N, unsigned char *P)
+static bool interp__builtin_stdc_memreverse8(InterpState &S, CodePtr OpPC,
+ const InterpFrame *Frame,
+ const CallExpr *Call) {
+ Pointer Ptr = S.Stk.pop<Pointer>();
+
+ uint64_t NElems;
+ if (!popToUInt64(S, Call->getArg(0), NElems))
+ return false;
+
+ if (Ptr.isZero()) {
+ S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_access_null)
+ << AK_Assign;
+ return false;
+ }
+
+ if (!isReadable(Ptr) && !Ptr.isOnePastEnd())
+ return false;
+
+ const Descriptor *Desc = Ptr.getFieldDesc();
+ bool IsArray = Desc->isArray();
+ QualType ElemTy = IsArray ? Desc->getElemQualType() : Desc->getType();
+
+ if (IsArray)
+ Ptr = Ptr.expand();
+
+ size_t BaseIdx = Ptr.getIndex();
+ size_t ArraySize = Ptr.getNumElems();
+ size_t RemainingElems = ArraySize - BaseIdx;
+ if (NElems > RemainingElems) {
+ if (IsArray)
+ S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_array_index)
+ << (uint64_t)(BaseIdx + NElems - 1) << /*array*/ 0
+ << (uint64_t)ArraySize;
+ else
+ S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_array_index)
+ << (uint64_t)(BaseIdx + NElems - 1) << /*non-array*/ 1;
+ return false;
+ }
+
+ if (NElems <= 1)
+ return true;
+
+ Pointer FirstPtr = Ptr.atIndex(BaseIdx);
+ if (FirstPtr.isConst()) {
+ S.FFDiag(S.Current->getSource(OpPC),
diag::note_constexpr_modify_const_type)
+ << FirstPtr.getType();
+ return false;
+ }
+
+ PrimType ElemT = *S.getContext().classify(ElemTy);
+
+ for (uint64_t I = 0, Half = NElems / 2; I < Half; ++I) {
+ Pointer LoPtr = Ptr.atIndex(BaseIdx + I);
+ Pointer HiPtr = Ptr.atIndex(BaseIdx + NElems - 1 - I);
+
+ if (!CheckLoad(S, OpPC, LoPtr, AK_Read) ||
+ !CheckLoad(S, OpPC, HiPtr, AK_Read))
----------------
chaitanyav wrote:
Added CheckStore check alongside the CheckLoad
https://github.com/llvm/llvm-project/pull/202402
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits