@@ -6988,17 +6988,24 @@ void GenericSignatureBuilder::checkSameTypeConstraints(
6988
6988
void GenericSignatureBuilder::checkConcreteTypeConstraints (
6989
6989
TypeArrayView<GenericTypeParamType> genericParams,
6990
6990
EquivalenceClass *equivClass) {
6991
+ // Resolve any thus-far-unresolved dependent types.
6992
+ Type resolvedConcreteType =
6993
+ resolveDependentMemberTypes (*this , equivClass->concreteType );
6994
+
6991
6995
checkConstraintList<Type>(
6992
6996
genericParams, equivClass->concreteTypeConstraints ,
6993
6997
[&](const ConcreteConstraint &constraint) {
6994
- return constraint.value ->isEqual (equivClass->concreteType );
6998
+ if (constraint.value ->isEqual (resolvedConcreteType))
6999
+ return true ;
7000
+
7001
+ auto resolvedType =
7002
+ resolveDependentMemberTypes (*this , constraint.value );
7003
+ return resolvedType->isEqual (resolvedConcreteType);
6995
7004
},
6996
7005
[&](const Constraint<Type> &constraint) {
6997
7006
Type concreteType = constraint.value ;
6998
7007
6999
7008
// If the concrete type is equivalent, the constraint is redundant.
7000
- // FIXME: Should check this constraint after substituting in the
7001
- // archetype anchors for each dependent type.
7002
7009
if (concreteType->isEqual (equivClass->concreteType ))
7003
7010
return ConstraintRelation::Redundant;
7004
7011
@@ -7013,33 +7020,28 @@ void GenericSignatureBuilder::checkConcreteTypeConstraints(
7013
7020
diag::redundant_same_type_to_concrete,
7014
7021
diag::same_type_redundancy_here);
7015
7022
7016
- // Resolve any thus-far-unresolved dependent types.
7017
- equivClass->concreteType =
7018
- resolveDependentMemberTypes (*this , equivClass->concreteType );
7023
+ equivClass->concreteType = resolvedConcreteType;
7019
7024
}
7020
7025
7021
7026
void GenericSignatureBuilder::checkSuperclassConstraints (
7022
7027
TypeArrayView<GenericTypeParamType> genericParams,
7023
7028
EquivalenceClass *equivClass) {
7024
7029
assert (equivClass->superclass && " No superclass constraint?" );
7025
7030
7026
- // FIXME: We should be substituting in the canonical type in context so
7027
- // we can resolve superclass requirements, e.g., if you had:
7028
- //
7029
- // class Foo<T>
7030
- // class Bar: Foo<Int>
7031
- //
7032
- // func foo<T, U where U: Bar, U: Foo<T>>(...) { ... }
7033
- //
7034
- // then the second `U: Foo<T>` constraint introduces a `T == Int`
7035
- // constraint, and we will need to perform that substitution for this final
7036
- // check.
7031
+ // Resolve any this-far-unresolved dependent types.
7032
+ Type resolvedSuperclass =
7033
+ resolveDependentMemberTypes (*this , equivClass->superclass );
7037
7034
7038
7035
auto representativeConstraint =
7039
7036
checkConstraintList<Type>(
7040
7037
genericParams, equivClass->superclassConstraints ,
7041
7038
[&](const ConcreteConstraint &constraint) {
7042
- return constraint.value ->isEqual (equivClass->superclass );
7039
+ if (constraint.value ->isEqual (resolvedSuperclass))
7040
+ return true ;
7041
+
7042
+ Type resolvedType =
7043
+ resolveDependentMemberTypes (*this , constraint.value );
7044
+ return resolvedType->isEqual (equivClass->superclass );
7043
7045
},
7044
7046
[&](const Constraint<Type> &constraint) {
7045
7047
Type superclass = constraint.value ;
@@ -7056,15 +7058,16 @@ void GenericSignatureBuilder::checkSuperclassConstraints(
7056
7058
diag::superclass_redundancy_here);
7057
7059
7058
7060
// Resolve any this-far-unresolved dependent types.
7059
- equivClass->superclass =
7060
- resolveDependentMemberTypes (*this , equivClass->superclass );
7061
+ equivClass->superclass = resolvedSuperclass;
7061
7062
7062
7063
// If we have a concrete type, check it.
7063
7064
// FIXME: Substitute into the concrete type.
7064
7065
if (equivClass->concreteType ) {
7066
+ Type resolvedConcreteType =
7067
+ resolveDependentMemberTypes (*this , equivClass->concreteType );
7065
7068
auto existing = equivClass->findAnyConcreteConstraintAsWritten ();
7066
7069
// Make sure the concrete type fulfills the superclass requirement.
7067
- if (!equivClass->superclass ->isExactSuperclassOf (equivClass-> concreteType )){
7070
+ if (!equivClass->superclass ->isExactSuperclassOf (resolvedConcreteType )){
7068
7071
Impl->HadAnyError = true ;
7069
7072
if (existing) {
7070
7073
Diags.diagnose (existing->source ->getLoc (), diag::type_does_not_inherit,
@@ -7084,7 +7087,7 @@ void GenericSignatureBuilder::checkSuperclassConstraints(
7084
7087
diag::type_does_not_inherit,
7085
7088
representativeConstraint.getSubjectDependentType (
7086
7089
genericParams),
7087
- equivClass-> concreteType , equivClass->superclass );
7090
+ resolvedConcreteType , equivClass->superclass );
7088
7091
}
7089
7092
} else if (representativeConstraint.source ->shouldDiagnoseRedundancy (true )
7090
7093
&& existing &&
0 commit comments