@@ -2383,6 +2383,7 @@ static CanType removeNoEscape(CanType resultType) {
23832383
23842384// / Get the type of a default argument generator, () -> T.
23852385static 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.
24482442static 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" );
0 commit comments