@@ -5662,28 +5662,40 @@ ASTContext::getOpenedElementSignature(CanGenericSignature baseGenericSig) {
5662
5662
};
5663
5663
5664
5664
for (auto requirement : baseGenericSig.getRequirements ()) {
5665
- requirements.push_back (requirement);
5666
-
5667
5665
// If this requirement contains parameter packs, create a new requirement
5668
5666
// for the corresponding pack element.
5669
5667
switch (requirement.getKind ()) {
5670
5668
case RequirementKind::SameShape:
5671
- // Drop same-shape requirements from the element signature.
5669
+ requirements.push_back (requirement);
5670
+ // Same-shape requirements don't apply to elements.
5672
5671
break ;
5673
5672
case RequirementKind::Conformance:
5674
5673
case RequirementKind::Superclass:
5675
5674
case RequirementKind::SameType: {
5676
5675
auto firstType = eraseParameterPackRec (requirement.getFirstType ());
5677
5676
auto secondType = eraseParameterPackRec (requirement.getSecondType ());
5678
5677
if (firstType->isEqual (requirement.getFirstType ()) &&
5679
- secondType->isEqual (requirement.getSecondType ()))
5678
+ secondType->isEqual (requirement.getSecondType ())) {
5679
+ requirements.push_back (requirement);
5680
5680
break ;
5681
+ }
5682
+
5683
+ // FIXME: For now, Drop same-element requirements from opened
5684
+ // element signatures. Otherwise, we can end up with a signature:
5685
+ //
5686
+ // <T..., U, T_Element> where T == U, T_Element == U
5687
+ //
5688
+ // implying that T == T_Element
5689
+ if (requirement.getKind () != RequirementKind::SameType) {
5690
+ requirements.push_back (requirement);
5691
+ }
5681
5692
5682
5693
requirements.emplace_back (requirement.getKind (),
5683
5694
firstType, secondType);
5684
5695
break ;
5685
5696
}
5686
5697
case RequirementKind::Layout: {
5698
+ requirements.push_back (requirement);
5687
5699
auto firstType = eraseParameterPackRec (requirement.getFirstType ());
5688
5700
if (firstType->isEqual (requirement.getFirstType ()))
5689
5701
break ;
0 commit comments