Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -5549,17 +5549,19 @@ // 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(); @@ -5571,10 +5573,10 @@ 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