diff --git a/clang/lib/AST/Interp/Descriptor.cpp b/clang/lib/AST/Interp/Descriptor.cpp index 31554dddb30a0..a6bef77bf8c16 100644 --- a/clang/lib/AST/Interp/Descriptor.cpp +++ b/clang/lib/AST/Interp/Descriptor.cpp @@ -28,8 +28,8 @@ static void dtorTy(Block *, char *Ptr, const Descriptor *) { } template -static void moveTy(Block *, char *Src, char *Dst, const Descriptor *) { - auto *SrcPtr = reinterpret_cast(Src); +static void moveTy(Block *, const char *Src, char *Dst, const Descriptor *) { + const auto *SrcPtr = reinterpret_cast(Src); auto *DstPtr = reinterpret_cast(Dst); new (DstPtr) T(std::move(*SrcPtr)); } @@ -55,9 +55,10 @@ static void dtorArrayTy(Block *, char *Ptr, const Descriptor *D) { } template -static void moveArrayTy(Block *, char *Src, char *Dst, const Descriptor *D) { +static void moveArrayTy(Block *, const char *Src, char *Dst, + const Descriptor *D) { for (unsigned I = 0, NE = D->getNumElems(); I < NE; ++I) { - auto *SrcPtr = &reinterpret_cast(Src)[I]; + const auto *SrcPtr = &reinterpret_cast(Src)[I]; auto *DstPtr = &reinterpret_cast(Dst)[I]; new (DstPtr) T(std::move(*SrcPtr)); } @@ -104,18 +105,19 @@ static void dtorArrayDesc(Block *B, char *Ptr, const Descriptor *D) { } } -static void moveArrayDesc(Block *B, char *Src, char *Dst, const Descriptor *D) { +static void moveArrayDesc(Block *B, const char *Src, char *Dst, + const Descriptor *D) { const unsigned NumElems = D->getNumElems(); const unsigned ElemSize = D->ElemDesc->getAllocSize() + sizeof(InlineDescriptor); unsigned ElemOffset = 0; for (unsigned I = 0; I < NumElems; ++I, ElemOffset += ElemSize) { - auto *SrcPtr = Src + ElemOffset; + const auto *SrcPtr = Src + ElemOffset; auto *DstPtr = Dst + ElemOffset; - auto *SrcDesc = reinterpret_cast(SrcPtr); - auto *SrcElemLoc = reinterpret_cast(SrcDesc + 1); + const auto *SrcDesc = reinterpret_cast(SrcPtr); + const auto *SrcElemLoc = reinterpret_cast(SrcDesc + 1); auto *DstDesc = reinterpret_cast(DstPtr); auto *DstElemLoc = reinterpret_cast(DstDesc + 1); @@ -162,7 +164,8 @@ static void dtorRecord(Block *B, char *Ptr, const Descriptor *D) { DtorSub(F.Offset, F.Desc); } -static void moveRecord(Block *B, char *Src, char *Dst, const Descriptor *D) { +static void moveRecord(Block *B, const char *Src, char *Dst, + const Descriptor *D) { for (const auto &F : D->ElemRecord->fields()) { auto FieldOff = F.Offset; auto FieldDesc = F.Desc; diff --git a/clang/lib/AST/Interp/Descriptor.h b/clang/lib/AST/Interp/Descriptor.h index 5b86ffb7957a0..657dbafb23805 100644 --- a/clang/lib/AST/Interp/Descriptor.h +++ b/clang/lib/AST/Interp/Descriptor.h @@ -41,7 +41,7 @@ using BlockDtorFn = void (*)(Block *Storage, char *FieldPtr, /// blocks are persisted: the move function copies all inline descriptors and /// non-trivial fields, as existing pointers might need to reference those /// descriptors. Data is not copied since it cannot be legally read. -using BlockMoveFn = void (*)(Block *Storage, char *SrcFieldPtr, +using BlockMoveFn = void (*)(Block *Storage, const char *SrcFieldPtr, char *DstFieldPtr, const Descriptor *FieldDesc); /// Inline descriptor embedded in structures and arrays.