@@ -3555,10 +3555,6 @@ namespace {
3555
3555
// / potential archetypes in this component equivalent to the concrete type.
3556
3556
const RequirementSource *concreteTypeSource;
3557
3557
3558
- // / The (best) requirement source within the component that introduces
3559
- // / the superclass constraint.
3560
- const RequirementSource *superclassSource;
3561
-
3562
3558
friend bool operator <(const SameTypeComponent &lhs,
3563
3559
const SameTypeComponent &rhs) {
3564
3560
return compareDependentTypes (&lhs.anchor , &rhs.anchor ) < 0 ;
@@ -3615,7 +3611,7 @@ static SmallVector<SameTypeComponent, 2> getSameTypeComponents(
3615
3611
auto anchor = sameTypeDFS (pa, components.size (), paToComponent);
3616
3612
3617
3613
// Record the anchor.
3618
- components.push_back ({anchor, nullptr , nullptr });
3614
+ components.push_back ({anchor, nullptr });
3619
3615
}
3620
3616
3621
3617
// If there is a concrete type, figure out the best concrete type anchor
@@ -3634,29 +3630,26 @@ static SmallVector<SameTypeComponent, 2> getSameTypeComponents(
3634
3630
bestConcreteTypeSource = concrete.source ;
3635
3631
}
3636
3632
3637
- // If there is a superclass and no concrete type, figure out the best
3638
- // superclass source per component.
3639
- if (equivClass->superclass && !equivClass->concreteType ) {
3640
- for (const auto &superclass : equivClass->superclassConstraints ) {
3641
- // Dig out the component associated with constraint.
3642
- assert (paToComponent.count (superclass.archetype ) > 0 );
3643
- auto &component = components[paToComponent[superclass.archetype ]];
3644
-
3645
- // If it has a better source than we'd seen before for this component,
3646
- // keep it.
3647
- auto &bestSuperclassSource = component.superclassSource ;
3648
- if (!bestSuperclassSource ||
3649
- superclass.source ->compare (bestSuperclassSource) < 0 )
3650
- bestSuperclassSource = superclass.source ;
3651
- }
3652
- }
3653
-
3654
3633
// Sort the components.
3655
3634
llvm::array_pod_sort (components.begin (), components.end ());
3656
3635
3657
3636
return components;
3658
3637
}
3659
3638
3639
+ namespace {
3640
+ // / Retrieve the best requirement source from a set of constraints.
3641
+ template <typename T>
3642
+ const RequirementSource *getBestConstraintSource (
3643
+ ArrayRef<Constraint<T>> constraints) {
3644
+ auto bestSource = constraints.front ().source ;
3645
+ for (const auto &constraint : constraints) {
3646
+ if (constraint.source ->compare (bestSource) < 0 )
3647
+ bestSource = constraint.source ;
3648
+ }
3649
+ return bestSource;
3650
+ }
3651
+ }
3652
+
3660
3653
void GenericSignatureBuilder::enumerateRequirements (llvm::function_ref<
3661
3654
void (RequirementKind kind,
3662
3655
PotentialArchetype *archetype,
@@ -3730,14 +3723,6 @@ void GenericSignatureBuilder::enumerateRequirements(llvm::function_ref<
3730
3723
continue ;
3731
3724
}
3732
3725
3733
- // If we have a superclass, produce a superclass requirement
3734
- if (Type superclass = rep->getSuperclass ()) {
3735
- f (RequirementKind::Superclass, archetype, superclass,
3736
- knownAnchor->superclassSource
3737
- ? knownAnchor->superclassSource
3738
- : RequirementSource::forAbstract (archetype));
3739
- }
3740
-
3741
3726
// If we're at the last anchor in the component, do nothing;
3742
3727
auto nextAnchor = knownAnchor;
3743
3728
++nextAnchor;
@@ -3762,6 +3747,12 @@ void GenericSignatureBuilder::enumerateRequirements(llvm::function_ref<
3762
3747
3763
3748
auto equivClass = rep->getEquivalenceClassIfPresent ();
3764
3749
3750
+ // If we have a superclass, produce a superclass requirement
3751
+ if (equivClass && equivClass->superclass ) {
3752
+ f (RequirementKind::Superclass, archetype, equivClass->superclass ,
3753
+ getBestConstraintSource<Type>(equivClass->superclassConstraints ));
3754
+ }
3755
+
3765
3756
// If we have a layout constraint, produce a layout requirement.
3766
3757
if (equivClass && equivClass->layout ) {
3767
3758
// Find the best source among the constraints that describe the layout
@@ -3772,7 +3763,9 @@ void GenericSignatureBuilder::enumerateRequirements(llvm::function_ref<
3772
3763
bestSource = constraint.source ;
3773
3764
}
3774
3765
3775
- f (RequirementKind::Layout, archetype, equivClass->layout , bestSource);
3766
+ f (RequirementKind::Layout, archetype, equivClass->layout ,
3767
+ getBestConstraintSource<LayoutConstraint>(
3768
+ equivClass->layoutConstraints ));
3776
3769
}
3777
3770
3778
3771
// Enumerate conformance requirements.
@@ -3792,7 +3785,9 @@ void GenericSignatureBuilder::enumerateRequirements(llvm::function_ref<
3792
3785
bestSource = constraint.source ;
3793
3786
}
3794
3787
3795
- protocolSources.insert ({conforms.first , bestSource});
3788
+ protocolSources.insert (
3789
+ {conforms.first ,
3790
+ getBestConstraintSource<ProtocolDecl *>(conforms.second )});
3796
3791
}
3797
3792
}
3798
3793
0 commit comments