@@ -2383,6 +2383,7 @@ static CanType removeNoEscape(CanType resultType) {
2383
2383
2384
2384
// / Get the type of a default argument generator, () -> T.
2385
2385
static CanAnyFunctionType getDefaultArgGeneratorInterfaceType (
2386
+ TypeConverter &TC,
2386
2387
SILDeclRef c) {
2387
2388
auto *vd = c.getDecl ();
2388
2389
auto resultTy = getParameterAt (vd,
@@ -2400,14 +2401,7 @@ static CanAnyFunctionType getDefaultArgGeneratorInterfaceType(
2400
2401
canResultTy = removeNoEscape (canResultTy);
2401
2402
2402
2403
// 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);
2411
2405
2412
2406
// FIXME: Verify ExtInfo state is correct, not working by accident.
2413
2407
CanAnyFunctionType::ExtInfo info;
@@ -2447,24 +2441,20 @@ static CanAnyFunctionType getStoredPropertyInitializerInterfaceType(
2447
2441
// / (property-type) -> backing-type.
2448
2442
static CanAnyFunctionType getPropertyWrapperBackingInitializerInterfaceType (
2449
2443
TypeConverter &TC,
2450
- VarDecl *VD,
2451
- bool fromWrappedValue) {
2444
+ SILDeclRef c) {
2445
+ auto *VD = cast<VarDecl>(c. getDecl ());
2452
2446
CanType resultType =
2453
2447
VD->getPropertyWrapperBackingPropertyType ()->getCanonicalType ();
2454
2448
2455
- auto *DC = VD->getInnermostDeclContext ();
2456
2449
CanType inputType;
2457
- if (fromWrappedValue ) {
2450
+ if (c. kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer ) {
2458
2451
inputType = VD->getPropertyWrapperInitValueInterfaceType ()->getCanonicalType ();
2459
2452
} else {
2460
2453
Type interfaceType = VD->getPropertyWrapperProjectionVar ()->getInterfaceType ();
2461
2454
inputType = interfaceType->getCanonicalType ();
2462
2455
}
2463
2456
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);
2468
2458
2469
2459
AnyFunctionType::Param param (
2470
2460
inputType, Identifier (),
@@ -2625,13 +2615,12 @@ CanAnyFunctionType TypeConverter::makeConstantInterfaceType(SILDeclRef c) {
2625
2615
return getGlobalAccessorType (var->getInterfaceType ()->getCanonicalType ());
2626
2616
}
2627
2617
case SILDeclRef::Kind::DefaultArgGenerator:
2628
- return getDefaultArgGeneratorInterfaceType (c);
2618
+ return getDefaultArgGeneratorInterfaceType (* this , c);
2629
2619
case SILDeclRef::Kind::StoredPropertyInitializer:
2630
2620
return getStoredPropertyInitializerInterfaceType (cast<VarDecl>(vd));
2631
2621
case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2632
2622
case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
2633
- return getPropertyWrapperBackingInitializerInterfaceType (
2634
- *this , cast<VarDecl>(vd), c.kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer);
2623
+ return getPropertyWrapperBackingInitializerInterfaceType (*this , c);
2635
2624
case SILDeclRef::Kind::IVarInitializer:
2636
2625
return getIVarInitDestroyerInterfaceType (cast<ClassDecl>(vd),
2637
2626
c.isForeign , false );
@@ -2667,11 +2656,27 @@ TypeConverter::getConstantGenericSignature(SILDeclRef c) {
2667
2656
return getEffectiveGenericSignature (
2668
2657
vd->getInnermostDeclContext (), captureInfo);
2669
2658
}
2659
+ case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2660
+ case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue: {
2661
+ // FIXME: It might be better to compute lowered local captures of
2662
+ // the property wrapper generator directly and collapse this into the
2663
+ // above case. For now, take the generic signature of the enclosing
2664
+ // context.
2665
+ auto *dc = vd->getDeclContext ();
2666
+ if (dc->isLocalContext ()) {
2667
+ SILDeclRef enclosingDecl;
2668
+ if (auto *closure = dyn_cast<AbstractClosureExpr>(dc)) {
2669
+ enclosingDecl = SILDeclRef (closure);
2670
+ } else {
2671
+ enclosingDecl = SILDeclRef (cast<AbstractFunctionDecl>(dc));
2672
+ }
2673
+ return getConstantGenericSignature (enclosingDecl);
2674
+ }
2675
+ return dc->getGenericSignatureOfContext ();
2676
+ }
2670
2677
case SILDeclRef::Kind::EnumElement:
2671
2678
case SILDeclRef::Kind::GlobalAccessor:
2672
2679
case SILDeclRef::Kind::StoredPropertyInitializer:
2673
- case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2674
- case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
2675
2680
return vd->getDeclContext ()->getGenericSignatureOfContext ();
2676
2681
}
2677
2682
0 commit comments