================ @@ -1875,6 +1875,54 @@ static ExprResult BuiltinIsWithinLifetime(Sema &S, CallExpr *TheCall) { << 0; return ExprError(); } + return TheCall; +} + +static ExprResult BuiltinTriviallyRelocate(Sema &S, CallExpr *TheCall) { + if (S.checkArgCount(TheCall, 3)) + return ExprError(); + + QualType Dest = TheCall->getArg(0)->getType(); + if (!Dest->isPointerType() || Dest.getCVRQualifiers() != 0) { + S.Diag(TheCall->getArg(0)->getExprLoc(), + diag::err_builtin_trivially_relocate_invalid_arg_type) + << /*a pointer*/ 0; + return ExprError(); + } + + QualType T = Dest->getPointeeType(); + if (S.RequireCompleteType(TheCall->getBeginLoc(), T, + diag::err_incomplete_type)) + return ExprError(); + + if (T.isConstQualified() || + !T.isCppTriviallyRelocatableType(S.getASTContext())) { + S.Diag(TheCall->getArg(0)->getExprLoc(), + diag::err_builtin_trivially_relocate_invalid_arg_type) + << (T.isConstQualified() ? /*non-const*/ 1 : /*relocatable*/ 2); + return ExprError(); + } + + TheCall->setType(Dest); + + QualType Src = TheCall->getArg(1)->getType(); + if (Src.getCanonicalType() != Dest.getCanonicalType()) { + S.Diag(TheCall->getArg(0)->getExprLoc(), + diag::err_builtin_trivially_relocate_invalid_arg_type) + << /*the same*/ 3; + return ExprError(); + } + + Expr *SizeExpr = TheCall->getArg(2); + ExprResult Size = S.DefaultLvalueConversion(SizeExpr); ---------------- cor3ntin wrote:
I don't think so? (In part because we check that the type of the argument is a pointer already) https://github.com/llvm/llvm-project/pull/127636 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits