@@ -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);
@@ -1572,10 +1584,10 @@ static bool interp__builtin_operator_new(InterpState &S, CodePtr OpPC,
15721584 return true ;
15731585 }
15741586
1575- const Descriptor *Desc =
1576- S. P . createDescriptor ( NewCall, *ElemT, Descriptor::InlineDescMD,
1577- /* IsConst=*/ false , /* IsTemporary=*/ false ,
1578- /* IsMutable=*/ false );
1587+ const Descriptor *Desc = S. P . createDescriptor (
1588+ NewCall, *ElemT, ElemType. getTypePtr () , Descriptor::InlineDescMD,
1589+ /* IsConst=*/ false , /* IsTemporary=*/ false ,
1590+ /* IsMutable=*/ false );
15791591 Block *B = Allocator.allocate (Desc, S.getContext ().getEvalID (),
15801592 DynamicAllocator::Form::Operator);
15811593 assert (B);
@@ -1779,15 +1791,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
17791791 if (DestPtr.isDummy () || SrcPtr.isDummy ())
17801792 return false ;
17811793
1782- QualType DestElemType;
1794+ QualType DestElemType = getElemType (DestPtr) ;
17831795 size_t RemainingDestElems;
17841796 if (DestPtr.getFieldDesc ()->isArray ()) {
1785- DestElemType = DestPtr.getFieldDesc ()->getElemQualType ();
17861797 RemainingDestElems = DestPtr.isUnknownSizeArray ()
17871798 ? 0
17881799 : (DestPtr.getNumElems () - DestPtr.getIndex ());
17891800 } else {
1790- DestElemType = DestPtr.getType ();
17911801 RemainingDestElems = 1 ;
17921802 }
17931803 unsigned DestElemSize = ASTCtx.getTypeSizeInChars (DestElemType).getQuantity ();
@@ -1800,15 +1810,13 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
18001810 return false ;
18011811 }
18021812
1803- QualType SrcElemType;
1813+ QualType SrcElemType = getElemType (SrcPtr) ;
18041814 size_t RemainingSrcElems;
18051815 if (SrcPtr.getFieldDesc ()->isArray ()) {
1806- SrcElemType = SrcPtr.getFieldDesc ()->getElemQualType ();
18071816 RemainingSrcElems = SrcPtr.isUnknownSizeArray ()
18081817 ? 0
18091818 : (SrcPtr.getNumElems () - SrcPtr.getIndex ());
18101819 } else {
1811- SrcElemType = SrcPtr.getType ();
18121820 RemainingSrcElems = 1 ;
18131821 }
18141822 unsigned SrcElemSize = ASTCtx.getTypeSizeInChars (SrcElemType).getQuantity ();
@@ -1881,16 +1889,6 @@ static bool interp__builtin_memcmp(InterpState &S, CodePtr OpPC,
18811889 bool IsWide =
18821890 (ID == Builtin::BIwmemcmp || ID == Builtin::BI__builtin_wmemcmp);
18831891
1884- auto getElemType = [](const Pointer &P) -> QualType {
1885- const Descriptor *Desc = P.getFieldDesc ();
1886- QualType T = Desc->getType ();
1887- if (T->isPointerType ())
1888- return T->getAs <PointerType>()->getPointeeType ();
1889- if (Desc->isArray ())
1890- return Desc->getElemQualType ();
1891- return T;
1892- };
1893-
18941892 const ASTContext &ASTCtx = S.getASTContext ();
18951893 QualType ElemTypeA = getElemType (PtrA);
18961894 QualType ElemTypeB = getElemType (PtrB);
0 commit comments