Merge pull request #85955 from slavapestov/fix-issue-85860

SILGen: Fix keypath descriptor emission for class nested inside generic context
This commit is contained in:
Slava Pestov
2025-12-11 00:36:18 -05:00
committed by GitHub
2 changed files with 12 additions and 1 deletions

View File

@@ -2080,7 +2080,7 @@ SILGenModule::canStorageUseStoredKeyPathComponent(AbstractStorageDecl *decl,
// See the call to getClassFieldOffsetOffset() inside
// emitKeyPathComponent().
if (auto *parentClass = dyn_cast<ClassDecl>(decl->getDeclContext())) {
if (parentClass->hasGenericParamList()) {
if (parentClass->isGenericContext()) {
auto ancestry = parentClass->checkAncestry();
if (ancestry.contains(AncestryFlags::ResilientOther))
return false;

View File

@@ -8,6 +8,10 @@ import resilient_class
open class MySubclass<T> : ResilientOutsideParent {
public final var storedProperty: T? = nil
open class MyNestedClass : ResilientOutsideParent {
public final var storedProperty: T? = nil
}
}
open class ConcreteSubclass : MySubclass<Int> {
@@ -25,6 +29,13 @@ open class ConcreteSubclass : MySubclass<Int> {
// CHECK-SAME: setter @$s26keypaths_resilient_generic10MySubclassC14storedPropertyxSgvplACyxGTk : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed Optional<τ_0_0>, @in_guaranteed MySubclass<τ_0_0>) -> ()
// CHECK-SAME: )
// CHECK: sil_property #MySubclass.MyNestedClass.storedProperty<τ_0_0> (
// CHECK-SAME: settable_property $Optional<τ_0_0>,
// CHECK-SAME: id ##MySubclass.MyNestedClass.storedProperty,
// CHECK-SAME: getter @$s26keypaths_resilient_generic10MySubclassC0D11NestedClassC14storedPropertyxSgvplAEyx_GTK : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed MySubclass<τ_0_0>.MyNestedClass) -> @out Optional<τ_0_0>,
// CHECK-SAME: setter @$s26keypaths_resilient_generic10MySubclassC0D11NestedClassC14storedPropertyxSgvplAEyx_GTk : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed Optional<τ_0_0>, @in_guaranteed MySubclass<τ_0_0>.MyNestedClass) -> ()
// CHECK-SAME: )
// CHECK: sil_property #ConcreteSubclass.anotherStoredProperty (
// CHECK-SAME: stored_property #ConcreteSubclass.anotherStoredProperty : $Optional<Int>
// CHECK-SAME: )