Skip to content

Commit d24649a

Browse files
authored
Merge pull request swiftlang#33622 from slavapestov/fix-generic-requirements-in-inherited-inits-5.3
AST: Try harder to preserve type sugar in AbstractGenericSignatureRequest [5.3]
2 parents 7ef6d7a + ddab827 commit d24649a

File tree

3 files changed

+9
-11
lines changed

3 files changed

+9
-11
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7434,13 +7434,11 @@ AbstractGenericSignatureRequest::evaluate(
74347434
if (baseSignature)
74357435
canBaseSignature = baseSignature->getCanonicalSignature();
74367436

7437-
llvm::SmallDenseMap<GenericTypeParamType *, Type> mappedTypeParameters;
74387437
SmallVector<GenericTypeParamType *, 2> canAddedParameters;
74397438
canAddedParameters.reserve(addedParameters.size());
74407439
for (auto gp : addedParameters) {
74417440
auto canGP = gp->getCanonicalType()->castTo<GenericTypeParamType>();
74427441
canAddedParameters.push_back(canGP);
7443-
mappedTypeParameters[canGP] = Type(gp);
74447442
}
74457443

74467444
SmallVector<Requirement, 2> canAddedRequirements;
@@ -7457,10 +7455,8 @@ AbstractGenericSignatureRequest::evaluate(
74577455
if (!canSignatureResult || !*canSignatureResult)
74587456
return GenericSignature();
74597457

7460-
// Substitute in the original generic parameters to form a more-sugared
7461-
// result closer to what the original request wanted. Note that this
7462-
// loses sugar on concrete types, but for abstract signatures that
7463-
// shouldn't matter.
7458+
// Substitute in the original generic parameters to form the sugared
7459+
// result the original request wanted.
74647460
auto canSignature = *canSignatureResult;
74657461
SmallVector<GenericTypeParamType *, 2> resugaredParameters;
74667462
resugaredParameters.reserve(canSignature->getGenericParams().size());
@@ -7478,9 +7474,8 @@ AbstractGenericSignatureRequest::evaluate(
74787474
auto resugaredReq = req.subst(
74797475
[&](SubstitutableType *type) {
74807476
if (auto gp = dyn_cast<GenericTypeParamType>(type)) {
7481-
auto knownGP = mappedTypeParameters.find(gp);
7482-
if (knownGP != mappedTypeParameters.end())
7483-
return knownGP->second;
7477+
unsigned ordinal = canSignature->getGenericParamOrdinal(gp);
7478+
return Type(resugaredParameters[ordinal]);
74847479
}
74857480
return Type(type);
74867481
},

test/ModuleInterface/inherited-generic-parameters.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class Base<In, Out> {
1919
// CHECK-NEXT: public init<A>(_: A, _: A)
2020
public init<A>(_: A, _: A) {}
2121

22+
// CHECK-NEXT: public init<C>(_: C) where C : main.Base<In, Out>
23+
public init<C>(_: C) where C : Base<In, Out> {}
2224
// CHECK: }
2325
}
2426

@@ -27,6 +29,7 @@ public class Derived<T> : Base<T, T> {
2729
// CHECK-NEXT: {{(@objc )?}}deinit
2830
// CHECK-NEXT: override public init(x: @escaping (T) -> T)
2931
// CHECK-NEXT: override public init<A>(_ argument: A, _ argument: A)
32+
// CHECK-NEXT: override public init<C>(_ argument: C) where C : main.Base<T, T>
3033
// CHECK-NEXT: }
3134
}
3235

test/attr/attr_override.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ class SR_4206_Base_7<T> {
587587
}
588588

589589
class SR_4206_Derived_7<T>: SR_4206_Base_7<T> {
590-
override func foo1() where T: SR_4206_Protocol_2 {} // expected-error {{overridden method 'foo1' has generic signature <T where T : SR_4206_Protocol_2> which is incompatible with base method's generic signature <T where T : SR_4206_Protocol_1>; expected generic signature to be <T where τ_0_0 : SR_4206_Protocol_1>}}
590+
override func foo1() where T: SR_4206_Protocol_2 {} // expected-error {{overridden method 'foo1' has generic signature <T where T : SR_4206_Protocol_2> which is incompatible with base method's generic signature <T where T : SR_4206_Protocol_1>; expected generic signature to be <T where T : SR_4206_Protocol_1>}}
591591

592592
override func foo2() {} // OK
593593
}
@@ -624,7 +624,7 @@ class SR_4206_Base_10<T> {
624624
func foo() where T: SR_4206_Protocol_1 {} // expected-note {{overridden declaration is here}}
625625
}
626626
class SR_4206_Derived_10<T, U>: SR_4206_Base_10<T> {
627-
override func foo() where U: SR_4206_Protocol_1 {} // expected-error {{overridden method 'foo' has generic signature <T, U where U : SR_4206_Protocol_1> which is incompatible with base method's generic signature <T where T : SR_4206_Protocol_1>; expected generic signature to be <T, U where τ_0_0 : SR_4206_Protocol_1>}}
627+
override func foo() where U: SR_4206_Protocol_1 {} // expected-error {{overridden method 'foo' has generic signature <T, U where U : SR_4206_Protocol_1> which is incompatible with base method's generic signature <T where T : SR_4206_Protocol_1>; expected generic signature to be <T, U where T : SR_4206_Protocol_1>}}
628628
}
629629

630630
// Override with return type specialization

0 commit comments

Comments
 (0)