@@ -4003,6 +4003,13 @@ bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) {
4003
4003
} else if (!this ->visit (MC->getImplicitObjectArgument ())) {
4004
4004
return false ;
4005
4005
}
4006
+ } else if (!FuncDecl) {
4007
+ const Expr *Callee = E->getCallee ();
4008
+ CalleeOffset = this ->allocateLocalPrimitive (Callee, PT_FnPtr, true , false );
4009
+ if (!this ->visit (Callee))
4010
+ return false ;
4011
+ if (!this ->emitSetLocal (PT_FnPtr, *CalleeOffset, E))
4012
+ return false ;
4006
4013
}
4007
4014
4008
4015
llvm::BitVector NonNullArgs = collectNonNullArgs (FuncDecl, Args);
@@ -4071,22 +4078,19 @@ bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) {
4071
4078
for (unsigned I = 0 , N = E->getNumArgs (); I != N; ++I)
4072
4079
ArgSize += align (primSize (classify (E->getArg (I)).value_or (PT_Ptr)));
4073
4080
4074
- // Get the callee, either from a member pointer saved in CalleeOffset,
4075
- // or by just visiting the Callee expr .
4076
- if (CalleeOffset) {
4081
+ // Get the callee, either from a member pointer or function pointer saved in
4082
+ // CalleeOffset .
4083
+ if (isa<CXXMemberCallExpr>(E) && CalleeOffset) {
4077
4084
if (!this ->emitGetLocal (PT_MemberPtr, *CalleeOffset, E))
4078
4085
return false ;
4079
4086
if (!this ->emitGetMemberPtrDecl (E))
4080
4087
return false ;
4081
- if (!this ->emitCallPtr (ArgSize, E, E))
4082
- return false ;
4083
4088
} else {
4084
- if (!this ->visit (E->getCallee ()))
4085
- return false ;
4086
-
4087
- if (!this ->emitCallPtr (ArgSize, E, E))
4089
+ if (!this ->emitGetLocal (PT_FnPtr, *CalleeOffset, E))
4088
4090
return false ;
4089
4091
}
4092
+ if (!this ->emitCallPtr (ArgSize, E, E))
4093
+ return false ;
4090
4094
}
4091
4095
4092
4096
// Cleanup for discarded return values.
0 commit comments