@@ -68,9 +68,9 @@ SubstitutionMap SILGenModule::mapSubstitutionsForWitnessOverride(
68
68
// / Return the abstraction pattern to use when calling a function value.
69
69
static AbstractionPattern
70
70
getIndirectApplyAbstractionPattern (SILGenFunction &SGF,
71
+ AbstractionPattern pattern,
71
72
CanFunctionType fnType) {
72
73
assert (fnType);
73
- AbstractionPattern pattern (fnType);
74
74
switch (fnType->getRepresentation ()) {
75
75
case FunctionTypeRepresentation::Swift:
76
76
case FunctionTypeRepresentation::Thin:
@@ -875,9 +875,9 @@ class SILGenApply : public Lowering::ExprVisitor<SILGenApply> {
875
875
876
876
ManagedValue fn = SGF.emitRValueAsSingleValue (e);
877
877
auto substType = cast<FunctionType>(e->getType ()->getCanonicalType ());
878
-
878
+ auto origType = AbstractionPattern (substType);
879
879
// When calling an C or block function, there's implicit bridging.
880
- auto origType = getIndirectApplyAbstractionPattern (SGF, substType);
880
+ origType = getIndirectApplyAbstractionPattern (SGF, origType , substType);
881
881
882
882
setCallee (Callee::forIndirect (fn, origType, substType, e));
883
883
}
@@ -1171,10 +1171,6 @@ class SILGenApply : public Lowering::ExprVisitor<SILGenApply> {
1171
1171
}
1172
1172
1173
1173
void visitMemberRefExpr (MemberRefExpr *e) {
1174
- // If we're loading a closure-type property out of a generic aggregate,
1175
- // we might reabstract it under normal circumstances, but since we're
1176
- // going to apply it immediately here, there's no reason to. We can
1177
- // invoke the function value at whatever abstraction level we get.
1178
1174
assert (isa<VarDecl>(e->getMember ().getDecl ()));
1179
1175
1180
1176
// Any writebacks for this access are tightly scoped.
@@ -1186,9 +1182,12 @@ class SILGenApply : public Lowering::ExprVisitor<SILGenApply> {
1186
1182
1187
1183
ManagedValue fn = SGF.emitLoadOfLValue (e, std::move (lv), SGFContext ())
1188
1184
.getAsSingleValue (SGF, e);
1189
-
1190
- setCallee (Callee::forIndirect (fn, lv.getOrigFormalType (),
1191
- cast<FunctionType>(lv.getSubstFormalType ()), e));
1185
+ auto substType = cast<FunctionType>(lv.getSubstFormalType ());
1186
+ auto origType = lv.getOrigFormalType ();
1187
+ // When calling an C or block function, there's implicit bridging.
1188
+ origType = getIndirectApplyAbstractionPattern (SGF, origType, substType);
1189
+
1190
+ setCallee (Callee::forIndirect (fn, origType, substType, e));
1192
1191
}
1193
1192
1194
1193
void visitAbstractClosureExpr (AbstractClosureExpr *e) {
0 commit comments