@@ -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,38 +2441,20 @@ static CanAnyFunctionType getStoredPropertyInitializerInterfaceType(
24472441// / (property-type) -> backing-type.
24482442static CanAnyFunctionType getPropertyWrapperBackingInitializerInterfaceType (
24492443 TypeConverter &TC,
2450- VarDecl *VD) {
2451- CanType resultType =
2452- VD->getPropertyWrapperBackingPropertyType ()->getCanonicalType ();
2453-
2454- auto *DC = VD->getInnermostDeclContext ();
2455- CanType inputType =
2456- VD->getPropertyWrapperInitValueInterfaceType ()->getCanonicalType ();
2457-
2458- auto sig = DC->getGenericSignatureOfContext ();
2459-
2460- AnyFunctionType::Param param (
2461- inputType, Identifier (),
2462- ParameterTypeFlags ().withValueOwnership (ValueOwnership::Owned));
2463- // FIXME: Verify ExtInfo state is correct, not working by accident.
2464- CanAnyFunctionType::ExtInfo info;
2465- return CanAnyFunctionType::get (getCanonicalSignatureOrNull (sig), {param},
2466- resultType, info);
2467- }
2468-
2469- static CanAnyFunctionType getPropertyWrapperInitFromProjectedValueInterfaceType (TypeConverter &TC,
2470- VarDecl *VD) {
2444+ SILDeclRef c) {
2445+ auto *VD = cast<VarDecl>(c.getDecl ());
24712446 CanType resultType =
24722447 VD->getPropertyWrapperBackingPropertyType ()->getCanonicalType ();
24732448
2474- Type interfaceType = VD->getPropertyWrapperProjectionVar ()->getInterfaceType ();
2475- if (interfaceType->hasArchetype ())
2476- interfaceType = interfaceType->mapTypeOutOfContext ();
2477-
2478- CanType inputType = interfaceType->getCanonicalType ();
2449+ CanType inputType;
2450+ if (c.kind == SILDeclRef::Kind::PropertyWrapperBackingInitializer) {
2451+ inputType = VD->getPropertyWrapperInitValueInterfaceType ()->getCanonicalType ();
2452+ } else {
2453+ Type interfaceType = VD->getPropertyWrapperProjectionVar ()->getInterfaceType ();
2454+ inputType = interfaceType->getCanonicalType ();
2455+ }
24792456
2480- auto *DC = VD->getInnermostDeclContext ();
2481- auto sig = DC->getGenericSignatureOfContext ();
2457+ GenericSignature sig = TC.getConstantGenericSignature (c);
24822458
24832459 AnyFunctionType::Param param (
24842460 inputType, Identifier (),
@@ -2678,15 +2654,12 @@ CanAnyFunctionType TypeConverter::makeConstantInterfaceType(SILDeclRef c) {
26782654 return getGlobalAccessorType (var->getInterfaceType ()->getCanonicalType ());
26792655 }
26802656 case SILDeclRef::Kind::DefaultArgGenerator:
2681- return getDefaultArgGeneratorInterfaceType (c);
2657+ return getDefaultArgGeneratorInterfaceType (* this , c);
26822658 case SILDeclRef::Kind::StoredPropertyInitializer:
26832659 return getStoredPropertyInitializerInterfaceType (cast<VarDecl>(vd));
26842660 case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2685- return getPropertyWrapperBackingInitializerInterfaceType (*this ,
2686- cast<VarDecl>(vd));
26872661 case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
2688- return getPropertyWrapperInitFromProjectedValueInterfaceType (*this ,
2689- cast<VarDecl>(vd));
2662+ return getPropertyWrapperBackingInitializerInterfaceType (*this , c);
26902663 case SILDeclRef::Kind::IVarInitializer:
26912664 return getIVarInitDestroyerInterfaceType (cast<ClassDecl>(vd),
26922665 c.isForeign , false );
@@ -2724,11 +2697,27 @@ TypeConverter::getConstantGenericSignature(SILDeclRef c) {
27242697 return getEffectiveGenericSignature (
27252698 vd->getInnermostDeclContext (), captureInfo);
27262699 }
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+ }
27272718 case SILDeclRef::Kind::EnumElement:
27282719 case SILDeclRef::Kind::GlobalAccessor:
27292720 case SILDeclRef::Kind::StoredPropertyInitializer:
2730- case SILDeclRef::Kind::PropertyWrapperBackingInitializer:
2731- case SILDeclRef::Kind::PropertyWrapperInitFromProjectedValue:
27322721 return vd->getDeclContext ()->getGenericSignatureOfContext ();
27332722 case SILDeclRef::Kind::EntryPoint:
27342723 llvm_unreachable (" Doesn't have generic signature" );
0 commit comments