@@ -213,10 +213,8 @@ static void desugarSameTypeRequirement(Type lhs, Type rhs, SourceLoc loc,
213213 return true ;
214214 }
215215
216- errors.push_back (
217- RequirementError::forConcreteTypeMismatch (sugaredFirstType,
218- secondType,
219- loc));
216+ errors.push_back (RequirementError::forConflictingRequirement (
217+ {RequirementKind::SameType, sugaredFirstType, secondType}, loc));
220218 recordedErrors = true ;
221219 return true ;
222220 }
@@ -249,7 +247,7 @@ static void desugarSuperclassRequirement(Type subjectType,
249247 RequirementError::forRedundantRequirement (requirement, loc));
250248 } else {
251249 errors.push_back (
252- RequirementError::forConflictingRequirement (requirement, loc));
250+ RequirementError::forInvalidRequirementSubject (requirement, loc));
253251 }
254252
255253 return ;
@@ -271,7 +269,7 @@ static void desugarLayoutRequirement(Type subjectType,
271269 RequirementError::forRedundantRequirement (requirement, loc));
272270 } else {
273271 errors.push_back (
274- RequirementError::forConflictingRequirement (requirement, loc));
272+ RequirementError::forInvalidRequirementSubject (requirement, loc));
275273 }
276274
277275 return ;
@@ -295,7 +293,7 @@ static void desugarConformanceRequirement(Type subjectType, Type constraintType,
295293 auto *module = protoDecl->getParentModule ();
296294 auto conformance = module ->lookupConformance (subjectType, protoDecl);
297295 if (conformance.isInvalid ()) {
298- errors.push_back (RequirementError::forConflictingRequirement (
296+ errors.push_back (RequirementError::forInvalidRequirementSubject (
299297 {RequirementKind::Conformance, subjectType, constraintType}, loc));
300298 return ;
301299 }
@@ -712,38 +710,7 @@ bool swift::rewriting::diagnoseRequirementErrors(
712710 break ;
713711 }
714712
715- case RequirementError::Kind::ConcreteTypeMismatch: {
716- auto type1 = error.requirement .getFirstType ();
717- auto type2 = error.requirement .getSecondType ();
718-
719- if (!type1->hasError () && !type2->hasError ()) {
720- ctx.Diags .diagnose (loc, diag::requires_same_concrete_type,
721- type1, type2);
722- diagnosedError = true ;
723- }
724-
725- break ;
726- }
727-
728- case RequirementError::Kind::ConflictingRequirement: {
729- // FIXME: Unify this case with SameTypeMissingRequirement.
730- if (auto subjectType = error.typeParameter ) {
731- auto firstType = error.requirement .getFirstType ();
732- auto secondType = error.requirement .getSecondType ();
733-
734- if (error.requirement .getKind () == RequirementKind::SameType) {
735- ctx.Diags .diagnose (loc, diag::same_type_conflict,
736- false , subjectType, firstType, secondType);
737- } else {
738- assert (error.requirement .getKind () == RequirementKind::Superclass);
739- ctx.Diags .diagnose (loc, diag::conflicting_superclass_constraints,
740- subjectType, firstType, secondType);
741-
742- }
743- diagnosedError = true ;
744- break ;
745- }
746-
713+ case RequirementError::Kind::InvalidRequirementSubject: {
747714 auto subjectType = error.requirement .getFirstType ();
748715 if (subjectType->hasError ())
749716 break ;
@@ -754,32 +721,49 @@ bool swift::rewriting::diagnoseRequirementErrors(
754721 break ;
755722 }
756723
757- case RequirementError::Kind::SameTypeMissingRequirement : {
724+ case RequirementError::Kind::ConflictingRequirement : {
758725 auto requirement = error.requirement ;
726+ auto subjectType = error.typeParameter ;
759727 switch (requirement.getKind ()) {
760728 case RequirementKind::SameType:
761- // FIXME: This case should be diagnosed through `ConcreteTypeMismatch`.
729+ if (requirement.getFirstType ()->hasError () ||
730+ requirement.getSecondType ()->hasError ()) {
731+ // Don't emit a cascading error.
732+ } else if (subjectType) {
733+ ctx.Diags .diagnose (loc, diag::same_type_conflict,
734+ false , subjectType,
735+ requirement.getFirstType (),
736+ requirement.getSecondType ());
737+ } else {
738+ ctx.Diags .diagnose (loc, diag::requires_same_concrete_type,
739+ requirement.getFirstType (),
740+ requirement.getSecondType ());
741+ }
762742 break ;
763743 case RequirementKind::Conformance:
764744 ctx.Diags .diagnose (loc, diag::requires_generic_param_same_type_does_not_conform,
765745 requirement.getFirstType (),
766746 requirement.getProtocolDecl ()->getName ());
767- diagnosedError = true ;
768747 break ;
769748 case RequirementKind::Superclass:
770- ctx.Diags .diagnose (loc, diag::same_type_does_not_inherit,
771- requirement.getFirstType (),
772- requirement.getSecondType ());
773- diagnosedError = true ;
749+ if (subjectType) {
750+ ctx.Diags .diagnose (loc, diag::conflicting_superclass_constraints,
751+ subjectType, requirement.getFirstType (),
752+ requirement.getSecondType ());
753+ } else {
754+ ctx.Diags .diagnose (loc, diag::same_type_does_not_inherit,
755+ requirement.getFirstType (),
756+ requirement.getSecondType ());
757+ }
774758 break ;
775759 case RequirementKind::Layout:
776760 ctx.Diags .diagnose (loc, diag::requires_generic_param_same_type_does_not_conform,
777761 requirement.getFirstType (),
778762 ctx.getIdentifier (requirement.getLayoutConstraint ()->getName ()));
779- diagnosedError = true ;
780763 break ;
781764 }
782765
766+ diagnosedError = true ;
783767 break ;
784768 }
785769
0 commit comments