@@ -754,15 +754,23 @@ void RewriteSystem::freeze() {
754754}
755755
756756static Optional<Requirement>
757- getRequirementForDiagnostics (Type subject, Symbol property) {
757+ getRequirementForDiagnostics (Type subject, Symbol property,
758+ const PropertyMap &map,
759+ TypeArrayView<GenericTypeParamType> genericParams) {
758760 switch (property.getKind ()) {
759- case Symbol::Kind::ConcreteType:
760- return Requirement (RequirementKind::SameType, subject,
761- property.getConcreteType ());
761+ case Symbol::Kind::ConcreteType: {
762+ auto concreteType = map.getTypeFromSubstitutionSchema (
763+ property.getConcreteType (), property.getSubstitutions (),
764+ genericParams, MutableTerm ());
765+ return Requirement (RequirementKind::SameType, subject, concreteType);
766+ }
762767
763- case Symbol::Kind::Superclass:
764- return Requirement (RequirementKind::Superclass, subject,
765- property.getConcreteType ());
768+ case Symbol::Kind::Superclass: {
769+ auto concreteType = map.getTypeFromSubstitutionSchema (
770+ property.getConcreteType (), property.getSubstitutions (),
771+ genericParams, MutableTerm ());
772+ return Requirement (RequirementKind::Superclass, subject, concreteType);
773+ }
766774
767775 case Symbol::Kind::Protocol:
768776 return Requirement (RequirementKind::Conformance, subject,
@@ -785,14 +793,11 @@ void RewriteSystem::computeConflictDiagnostics(
785793 const auto &firstRule = getRule (pair.first );
786794 const auto &secondRule = getRule (pair.second );
787795
788- auto firstProperty = firstRule.isPropertyRule ();
789- auto secondProperty = secondRule.isPropertyRule ();
790- assert (firstProperty && secondProperty);
796+ assert (firstRule.isPropertyRule () && secondRule.isPropertyRule ());
791797
792- auto firstTerm = firstRule.getRHS ();
793- auto secondTerm = secondRule.getRHS ();
794- auto subjectTerm =
795- firstTerm.size () > secondTerm.size () ? firstTerm : secondTerm;
798+ bool chooseFirstRule = firstRule.getRHS ().size () > secondRule.getRHS ().size ();
799+ auto subjectRule = chooseFirstRule ? firstRule : secondRule;
800+ auto subjectTerm = subjectRule.getRHS ();
796801
797802 // If the root protocol of the subject term isn't in this minimization
798803 // domain, the conflict was already diagnosed.
@@ -801,8 +806,10 @@ void RewriteSystem::computeConflictDiagnostics(
801806
802807 Type subject = propertyMap.getTypeForTerm (subjectTerm, genericParams);
803808 errors.push_back (RequirementError::forConflictingRequirement (
804- *getRequirementForDiagnostics (subject, *firstProperty),
805- *getRequirementForDiagnostics (subject, *secondProperty),
809+ *getRequirementForDiagnostics (subject, *firstRule.isPropertyRule (),
810+ propertyMap, genericParams),
811+ *getRequirementForDiagnostics (subject, *secondRule.isPropertyRule (),
812+ propertyMap, genericParams),
806813 signatureLoc));
807814 }
808815}
0 commit comments