@@ -1802,9 +1802,11 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
1802
1802
peekToAPSInt (S.Stk , *S.getContext ().classify (Call->getArg (2 )));
1803
1803
assert (!Size.isSigned () && " memcpy and friends take an unsigned size" );
1804
1804
1805
- if (ID == Builtin::BImemcpy)
1805
+ if (ID == Builtin::BImemcpy || ID == Builtin::BImemmove )
1806
1806
diagnoseNonConstexprBuiltin (S, OpPC, ID);
1807
1807
1808
+ bool Move = (ID == Builtin::BI__builtin_memmove || ID == Builtin::BImemmove);
1809
+
1808
1810
if (DestPtr.isDummy () || SrcPtr.isDummy ())
1809
1811
return false ;
1810
1812
@@ -1817,7 +1819,7 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
1817
1819
if (SrcPtr.isZero () || DestPtr.isZero ()) {
1818
1820
Pointer DiagPtr = (SrcPtr.isZero () ? SrcPtr : DestPtr);
1819
1821
S.FFDiag (S.Current ->getSource (OpPC), diag::note_constexpr_memcpy_null)
1820
- << /* IsMove=*/ false << /* IsWchar=*/ false << !SrcPtr.isZero ()
1822
+ << /* IsMove=*/ Move << /* IsWchar=*/ false << !SrcPtr.isZero ()
1821
1823
<< DiagPtr.toDiagnosticString (S.getASTContext ());
1822
1824
return false ;
1823
1825
}
@@ -2291,6 +2293,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
2291
2293
2292
2294
case Builtin::BI__builtin_memcpy:
2293
2295
case Builtin::BImemcpy:
2296
+ case Builtin::BI__builtin_memmove:
2297
+ case Builtin::BImemmove:
2294
2298
if (!interp__builtin_memcpy (S, OpPC, Frame, F, Call))
2295
2299
return false ;
2296
2300
break ;
0 commit comments