From: Marco Antognini Date: Mon, 3 Dec 2018 10:58:56 +0000 (+0000) Subject: [OpenCL][Sema] Improve BuildResolvedCallExpr handling of builtins X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=afd5bcc1f716db4dd5b5811aedd1e4a6cfdde2db;p=clang [OpenCL][Sema] Improve BuildResolvedCallExpr handling of builtins Summary: This is a follow-up on https://reviews.llvm.org/D52879, addressing a few issues. This: - adds a FIXME for later improvement for specific builtins: I previously have only checked OpenCL ones and ensured tests cover those. - fixed the CallExpr type. Reviewers: riccibruno Reviewed By: riccibruno Subscribers: yaxunl, Anastasia, kristina, svenvh, cfe-commits Differential Revision: https://reviews.llvm.org/D55136 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@348120 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f4edd7b89b..03115514e3 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -5562,17 +5562,20 @@ Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, // We special-case function promotion here because we only allow promoting // builtin functions to function pointers in the callee of a call. ExprResult Result; - QualType ReturnTy; + QualType ResultTy; if (BuiltinID && Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) { // Extract the return type from the (builtin) function pointer type. - auto FnPtrTy = Context.getPointerType(FDecl->getType()); + // FIXME Several builtins still have setType in + // Sema::CheckBuiltinFunctionCall. One should review their + // definitions in Builtins.def to ensure they are correct before + // removing setType calls. + QualType FnPtrTy = Context.getPointerType(FDecl->getType()); Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get(); - auto FnTy = FnPtrTy->getPointeeType()->castAs(); - ReturnTy = FnTy->getReturnType(); + ResultTy = FDecl->getCallResultType(); } else { Result = CallExprUnaryConversions(Fn); - ReturnTy = Context.BoolTy; + ResultTy = Context.BoolTy; } if (Result.isInvalid()) return ExprError(); @@ -5584,10 +5587,10 @@ Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, if (Config) TheCall = new (Context) CUDAKernelCallExpr(Context, Fn, cast(Config), - Args, ReturnTy, VK_RValue, RParenLoc); + Args, ResultTy, VK_RValue, RParenLoc); else TheCall = new (Context) - CallExpr(Context, Fn, Args, ReturnTy, VK_RValue, RParenLoc); + CallExpr(Context, Fn, Args, ResultTy, VK_RValue, RParenLoc); if (!getLangOpts().CPlusPlus) { // C cannot always handle TypoExpr nodes in builtin calls and direct