@@ -149,6 +149,18 @@ static bool retPrimValue(InterpState &S, CodePtr OpPC,
149149#undef RET_CASE
150150}
151151
152+ static QualType getElemType (const Pointer &P) {
153+ const Descriptor *Desc = P.getFieldDesc ();
154+ QualType T = Desc->getType ();
155+ if (Desc->isPrimitive ())
156+ return T;
157+ if (T->isPointerType ())
158+ return T->getAs <PointerType>()->getPointeeType ();
159+ if (Desc->isArray ())
160+ return Desc->getElemQualType ();
161+ return T;
162+ }
163+
152164static void diagnoseNonConstexprBuiltin (InterpState &S, CodePtr OpPC,
153165 unsigned ID) {
154166 auto Loc = S.Current ->getSource (OpPC);
@@ -1575,10 +1587,10 @@ static bool interp__builtin_operator_new(InterpState &S, CodePtr OpPC,
15751587 return true ;
15761588 }
15771589
1578- const Descriptor *Desc =
1579- S. P . createDescriptor ( NewCall, *ElemT, Descriptor::InlineDescMD,
1580- /* IsConst=*/ false , /* IsTemporary=*/ false ,
1581- /* IsMutable=*/ false );
1590+ const Descriptor *Desc = S. P . createDescriptor (
1591+ NewCall, *ElemT, ElemType. getTypePtr () , Descriptor::InlineDescMD,
1592+ /* IsConst=*/ false , /* IsTemporary=*/ false ,
1593+ /* IsMutable=*/ false );
15821594 Block *B = Allocator.allocate (Desc, S.getContext ().getEvalID (),
15831595 DynamicAllocator::Form::Operator);
15841596 assert (B);
@@ -1782,15 +1794,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
17821794 if (DestPtr.isDummy () || SrcPtr.isDummy ())
17831795 return false ;
17841796
1785- QualType DestElemType;
1797+ QualType DestElemType = getElemType (DestPtr) ;
17861798 size_t RemainingDestElems;
17871799 if (DestPtr.getFieldDesc ()->isArray ()) {
1788- DestElemType = DestPtr.getFieldDesc ()->getElemQualType ();
17891800 RemainingDestElems = DestPtr.isUnknownSizeArray ()
17901801 ? 0
17911802 : (DestPtr.getNumElems () - DestPtr.getIndex ());
17921803 } else {
1793- DestElemType = DestPtr.getType ();
17941804 RemainingDestElems = 1 ;
17951805 }
17961806 unsigned DestElemSize = ASTCtx.getTypeSizeInChars (DestElemType).getQuantity ();
@@ -1803,15 +1813,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
18031813 return false ;
18041814 }
18051815
1806- QualType SrcElemType;
1816+ QualType SrcElemType = getElemType (SrcPtr) ;
18071817 size_t RemainingSrcElems;
18081818 if (SrcPtr.getFieldDesc ()->isArray ()) {
1809- SrcElemType = SrcPtr.getFieldDesc ()->getElemQualType ();
18101819 RemainingSrcElems = SrcPtr.isUnknownSizeArray ()
18111820 ? 0
18121821 : (SrcPtr.getNumElems () - SrcPtr.getIndex ());
18131822 } else {
1814- SrcElemType = SrcPtr.getType ();
18151823 RemainingSrcElems = 1 ;
18161824 }
18171825 unsigned SrcElemSize = ASTCtx.getTypeSizeInChars (SrcElemType).getQuantity ();
@@ -1884,16 +1892,6 @@ static bool interp__builtin_memcmp(InterpState &S, CodePtr OpPC,
18841892 bool IsWide =
18851893 (ID == Builtin::BIwmemcmp || ID == Builtin::BI__builtin_wmemcmp);
18861894
1887- auto getElemType = [](const Pointer &P) -> QualType {
1888- const Descriptor *Desc = P.getFieldDesc ();
1889- QualType T = Desc->getType ();
1890- if (T->isPointerType ())
1891- return T->getAs <PointerType>()->getPointeeType ();
1892- if (Desc->isArray ())
1893- return Desc->getElemQualType ();
1894- return T;
1895- };
1896-
18971895 const ASTContext &ASTCtx = S.getASTContext ();
18981896 QualType ElemTypeA = getElemType (PtrA);
18991897 QualType ElemTypeB = getElemType (PtrB);
0 commit comments