Skip to content

Commit e6fe68f

Browse files
committed
[SILGen] Account for transitive captures of generic parameters when computing
the generic signature for local property wrapper and default argument generators.
1 parent b5e5254 commit e6fe68f

File tree

3 files changed

+60
-21
lines changed

3 files changed

+60
-21
lines changed

lib/SIL/IR/TypeLowering.cpp

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2383,6 +2383,7 @@ static CanType removeNoEscape(CanType resultType) {
23832383

23842384
/// Get the type of a default argument generator, () -> T.
23852385
static CanAnyFunctionType getDefaultArgGeneratorInterfaceType(
2386+
TypeConverter &TC,
23862387
SILDeclRef c) {
23872388
auto *vd = c.getDecl();
23882389
auto resultTy = getParameterAt(vd,
@@ -2400,14 +2401,7 @@ static CanAnyFunctionType getDefaultArgGeneratorInterfaceType(
24002401
canResultTy = removeNoEscape(canResultTy);
24012402

24022403
// Get the generic signature from the surrounding context.
2403-
auto sig = vd->getInnermostDeclContext()->getGenericSignatureOfContext();
2404-
if (auto *afd = dyn_cast<AbstractFunctionDecl>(vd)) {
2405-
auto *param = getParameterAt(afd, c.defaultArgIndex);
2406-
if (param->hasDefaultExpr()) {
2407-
auto captureInfo = param->getDefaultArgumentCaptureInfo();
2408-
sig = getEffectiveGenericSignature(afd, captureInfo);
2409-
}
2410-
}
2404+
auto sig = TC.getConstantGenericSignature(c);
24112405

24122406
// FIXME: Verify ExtInfo state is correct, not working by accident.
24132407
CanAnyFunctionType::ExtInfo info;
@@ -2447,24 +2441,20 @@ static CanAnyFunctionType getStoredPropertyInitializerInterfaceType(
24472441
/// (property-type) -> backing-type.
24482442
static CanAnyFunctionType getPropertyWrapperBackingInitializerInterfaceType(
24492443
TypeConverter &TC,
2450-
VarDecl *VD,
2451-
bool fromWrappedValue) {
2444+
SILDeclRef c) {
2445+
auto *VD = cast<VarDecl>(c.getDecl());
24522446
CanType resultType =
24532447
VD->getPropertyWrapperBackingPropertyType()->getCanonicalType();
24542448

2455-
auto *DC = VD->getInnermostDeclContext();
24562449
CanType inputType;
2457-
if (fromWrappedValue) {
2450+
if (c.kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer) {
24582451
inputType = VD->getPropertyWrapperInitValueInterfaceType()->getCanonicalType();
24592452
} else {
24602453
Type interfaceType = VD->getPropertyWrapperProjectionVar()->getInterfaceType();
24612454
inputType = interfaceType->getCanonicalType();
24622455
}
24632456

2464-
GenericSignature sig;
2465-
auto *closure = dyn_cast<AbstractClosureExpr>(DC);
2466-
if (!closure || closure->getCaptureInfo().hasGenericParamCaptures())
2467-
sig = DC->getGenericSignatureOfContext();
2457+
GenericSignature sig = TC.getConstantGenericSignature(c);
24682458

24692459
AnyFunctionType::Param param(
24702460
inputType, Identifier(),
@@ -2664,13 +2654,12 @@ CanAnyFunctionType TypeConverter::makeConstantInterfaceType(SILDeclRef c) {
26642654
return getGlobalAccessorType(var->getInterfaceType()->getCanonicalType());
26652655
}
26662656
case SILDeclRef::Kind::DefaultArgGenerator:
2667-
return getDefaultArgGeneratorInterfaceType(c);
2657+
return getDefaultArgGeneratorInterfaceType(*this, c);
26682658
case SILDeclRef::Kind::StoredPropertyInitializer:
26692659
return getStoredPropertyInitializerInterfaceType(cast<VarDecl>(vd));
26702660
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
26712661
case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
2672-
return getPropertyWrapperBackingInitializerInterfaceType(
2673-
*this, cast<VarDecl>(vd), c.kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer);
2662+
return getPropertyWrapperBackingInitializerInterfaceType(*this, c);
26742663
case SILDeclRef::Kind::IVarInitializer:
26752664
return getIVarInitDestroyerInterfaceType(cast<ClassDecl>(vd),
26762665
c.isForeign, false);
@@ -2708,11 +2697,27 @@ TypeConverter::getConstantGenericSignature(SILDeclRef c) {
27082697
return getEffectiveGenericSignature(
27092698
vd->getInnermostDeclContext(), captureInfo);
27102699
}
2700+
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2701+
case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue: {
2702+
// FIXME: It might be better to compute lowered local captures of
2703+
// the property wrapper generator directly and collapse this into the
2704+
// above case. For now, take the generic signature of the enclosing
2705+
// context.
2706+
auto *dc = vd->getDeclContext();
2707+
if (dc->isLocalContext()) {
2708+
SILDeclRef enclosingDecl;
2709+
if (auto *closure = dyn_cast<AbstractClosureExpr>(dc)) {
2710+
enclosingDecl = SILDeclRef(closure);
2711+
} else {
2712+
enclosingDecl = SILDeclRef(cast<AbstractFunctionDecl>(dc));
2713+
}
2714+
return getConstantGenericSignature(enclosingDecl);
2715+
}
2716+
return dc->getGenericSignatureOfContext();
2717+
}
27112718
case SILDeclRef::Kind::EnumElement:
27122719
case SILDeclRef::Kind::GlobalAccessor:
27132720
case SILDeclRef::Kind::StoredPropertyInitializer:
2714-
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2715-
case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
27162721
return vd->getDeclContext()->getGenericSignatureOfContext();
27172722
case SILDeclRef::Kind::EntryPoint:
27182723
llvm_unreachable("Doesn't have generic signature");

test/SILGen/default_arguments_local.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,16 @@ class ArtClass<T> {
7070

7171
inner()
7272
}
73+
74+
// CHECK-LABEL: sil hidden [ossa] @$s23default_arguments_local5outeryyxlF : $@convention(thin) <T> (@in_guaranteed T) -> ()
75+
func outer<T>(_: T) {
76+
// CHECK-LABEL: sil private [ossa] @$s23default_arguments_local5outeryyxlF5innerL_yylF : $@convention(thin) <T> () -> ()
77+
func inner() { print(T.self) }
78+
79+
// default argument 0 of hasDefault #1 <A>(x:) in outer<A>(_:)
80+
// CHECK-LABEL: sil private [ossa] @$s23default_arguments_local5outeryyxlF10hasDefaultL_1xySi_tlFfA_ : $@convention(thin) <T> () -> Int
81+
82+
// CHECK-LABEL: sil private [ossa] @$s23default_arguments_local5outeryyxlF10hasDefaultL_1xySi_tlF : $@convention(thin) <T> (Int) -> ()
83+
func hasDefault(x: Int = { inner(); return 3 }()) {}
84+
hasDefault()
85+
}

test/SILGen/property_wrapper_parameter.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,27 @@ func genericContext<T>(_: T) where T: P {
235235

236236
// property wrapper init from projected value of $value #1 in closure #2 in implicit closure #2 in genericContext<A>(_:)
237237
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlFxAA17ProjectionWrapperVySiGcfu0_xAFcfU0_6$valueL_AFvpfW : $@convention(thin) <T where T : P> (ProjectionWrapper<Int>) -> ProjectionWrapper<Int>
238+
239+
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlF5innerL_1ayAA7WrapperVySiG_tAaCRzlF : $@convention(thin) (Wrapper<Int>) -> ()
240+
func inner(@Wrapper a: Int) {}
241+
242+
// property wrapper backing initializer of a #1 in inner #1 <A>(a:) in genericContext<A>(_:)
243+
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlF5innerL_1ayAA7WrapperVySiG_tAaCRzlFAEL_SivpfP : $@convention(thin) (Int) -> Wrapper<Int>
244+
245+
inner(a: 1)
246+
247+
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlF5innerL0_yyAaCRzlF : $@convention(thin) <T where T : P> () -> ()
248+
func inner() { _ = T.self }
249+
250+
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlF5innerL1_1byAA7WrapperVySiG_tAaCRzlF : $@convention(thin) <T where T : P> (Wrapper<Int>) -> ()
251+
func inner(@Wrapper b: Int) {
252+
inner()
253+
}
254+
255+
// property wrapper backing initializer of b #1 in inner #3 <A>(b:) in genericContext<A>(_:)
256+
// CHECK-LABEL: sil private [ossa] @$s26property_wrapper_parameter14genericContextyyxAA1PRzlF5innerL1_1byAA7WrapperVySiG_tAaCRzlFAEL_SivpfP : $@convention(thin) <T where T : P> (Int) -> Wrapper<Int>
257+
258+
inner(b: 1)
238259
}
239260

240261
@propertyWrapper

0 commit comments

Comments
 (0)