Author: mantognini Date: Mon Dec 3 02:58:56 2018 New Revision: 348120 URL: http://llvm.org/viewvc/llvm-project?rev=348120&view=rev Log: [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 Modified: cfe/trunk/lib/Sema/SemaExpr.cpp Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=348120&r1=348119&r2=348120&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Dec 3 02:58:56 2018 @@ -5562,17 +5562,20 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na // 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<FunctionType>(); - 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, Na if (Config) TheCall = new (Context) CUDAKernelCallExpr(Context, Fn, cast<CallExpr>(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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits