[clang][bytecode] Fix __builtin_memmove type diagnostics (#132544)

Set the source type when allocating primitives so we can later retrieve
it.
This commit is contained in:
Timm Baeder
2025-03-22 14:58:32 +01:00
committed by GitHub
parent 51aab96ebf
commit c51d396f4d
7 changed files with 51 additions and 33 deletions

View File

@@ -149,6 +149,18 @@ static bool retPrimValue(InterpState &S, CodePtr OpPC,
#undef RET_CASE
}
static QualType getElemType(const Pointer &P) {
const Descriptor *Desc = P.getFieldDesc();
QualType T = Desc->getType();
if (Desc->isPrimitive())
return T;
if (T->isPointerType())
return T->getAs<PointerType>()->getPointeeType();
if (Desc->isArray())
return Desc->getElemQualType();
return T;
}
static void diagnoseNonConstexprBuiltin(InterpState &S, CodePtr OpPC,
unsigned ID) {
auto Loc = S.Current->getSource(OpPC);
@@ -1575,10 +1587,10 @@ static bool interp__builtin_operator_new(InterpState &S, CodePtr OpPC,
return true;
}
const Descriptor *Desc =
S.P.createDescriptor(NewCall, *ElemT, Descriptor::InlineDescMD,
/*IsConst=*/false, /*IsTemporary=*/false,
/*IsMutable=*/false);
const Descriptor *Desc = S.P.createDescriptor(
NewCall, *ElemT, ElemType.getTypePtr(), Descriptor::InlineDescMD,
/*IsConst=*/false, /*IsTemporary=*/false,
/*IsMutable=*/false);
Block *B = Allocator.allocate(Desc, S.getContext().getEvalID(),
DynamicAllocator::Form::Operator);
assert(B);
@@ -1782,15 +1794,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
if (DestPtr.isDummy() || SrcPtr.isDummy())
return false;
QualType DestElemType;
QualType DestElemType = getElemType(DestPtr);
size_t RemainingDestElems;
if (DestPtr.getFieldDesc()->isArray()) {
DestElemType = DestPtr.getFieldDesc()->getElemQualType();
RemainingDestElems = DestPtr.isUnknownSizeArray()
? 0
: (DestPtr.getNumElems() - DestPtr.getIndex());
} else {
DestElemType = DestPtr.getType();
RemainingDestElems = 1;
}
unsigned DestElemSize = ASTCtx.getTypeSizeInChars(DestElemType).getQuantity();
@@ -1803,15 +1813,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
return false;
}
QualType SrcElemType;
QualType SrcElemType = getElemType(SrcPtr);
size_t RemainingSrcElems;
if (SrcPtr.getFieldDesc()->isArray()) {
SrcElemType = SrcPtr.getFieldDesc()->getElemQualType();
RemainingSrcElems = SrcPtr.isUnknownSizeArray()
? 0
: (SrcPtr.getNumElems() - SrcPtr.getIndex());
} else {
SrcElemType = SrcPtr.getType();
RemainingSrcElems = 1;
}
unsigned SrcElemSize = ASTCtx.getTypeSizeInChars(SrcElemType).getQuantity();
@@ -1884,16 +1892,6 @@ static bool interp__builtin_memcmp(InterpState &S, CodePtr OpPC,
bool IsWide =
(ID == Builtin::BIwmemcmp || ID == Builtin::BI__builtin_wmemcmp);
auto getElemType = [](const Pointer &P) -> QualType {
const Descriptor *Desc = P.getFieldDesc();
QualType T = Desc->getType();
if (T->isPointerType())
return T->getAs<PointerType>()->getPointeeType();
if (Desc->isArray())
return Desc->getElemQualType();
return T;
};
const ASTContext &ASTCtx = S.getASTContext();
QualType ElemTypeA = getElemType(PtrA);
QualType ElemTypeB = getElemType(PtrB);