@@ -213,10 +213,8 @@ static void desugarSameTypeRequirement(Type lhs, Type rhs, SourceLoc loc,
213
213
return true ;
214
214
}
215
215
216
- errors.push_back (
217
- RequirementError::forConcreteTypeMismatch (sugaredFirstType,
218
- secondType,
219
- loc));
216
+ errors.push_back (RequirementError::forConflictingRequirement (
217
+ {RequirementKind::SameType, sugaredFirstType, secondType}, loc));
220
218
recordedErrors = true ;
221
219
return true ;
222
220
}
@@ -249,7 +247,7 @@ static void desugarSuperclassRequirement(Type subjectType,
249
247
RequirementError::forRedundantRequirement (requirement, loc));
250
248
} else {
251
249
errors.push_back (
252
- RequirementError::forConflictingRequirement (requirement, loc));
250
+ RequirementError::forInvalidRequirementSubject (requirement, loc));
253
251
}
254
252
255
253
return ;
@@ -271,7 +269,7 @@ static void desugarLayoutRequirement(Type subjectType,
271
269
RequirementError::forRedundantRequirement (requirement, loc));
272
270
} else {
273
271
errors.push_back (
274
- RequirementError::forConflictingRequirement (requirement, loc));
272
+ RequirementError::forInvalidRequirementSubject (requirement, loc));
275
273
}
276
274
277
275
return ;
@@ -295,7 +293,7 @@ static void desugarConformanceRequirement(Type subjectType, Type constraintType,
295
293
auto *module = protoDecl->getParentModule ();
296
294
auto conformance = module ->lookupConformance (subjectType, protoDecl);
297
295
if (conformance.isInvalid ()) {
298
- errors.push_back (RequirementError::forConflictingRequirement (
296
+ errors.push_back (RequirementError::forInvalidRequirementSubject (
299
297
{RequirementKind::Conformance, subjectType, constraintType}, loc));
300
298
return ;
301
299
}
@@ -712,38 +710,7 @@ bool swift::rewriting::diagnoseRequirementErrors(
712
710
break ;
713
711
}
714
712
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: {
747
714
auto subjectType = error.requirement .getFirstType ();
748
715
if (subjectType->hasError ())
749
716
break ;
@@ -754,32 +721,49 @@ bool swift::rewriting::diagnoseRequirementErrors(
754
721
break ;
755
722
}
756
723
757
- case RequirementError::Kind::SameTypeMissingRequirement : {
724
+ case RequirementError::Kind::ConflictingRequirement : {
758
725
auto requirement = error.requirement ;
726
+ auto subjectType = error.typeParameter ;
759
727
switch (requirement.getKind ()) {
760
728
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
+ }
762
742
break ;
763
743
case RequirementKind::Conformance:
764
744
ctx.Diags .diagnose (loc, diag::requires_generic_param_same_type_does_not_conform,
765
745
requirement.getFirstType (),
766
746
requirement.getProtocolDecl ()->getName ());
767
- diagnosedError = true ;
768
747
break ;
769
748
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
+ }
774
758
break ;
775
759
case RequirementKind::Layout:
776
760
ctx.Diags .diagnose (loc, diag::requires_generic_param_same_type_does_not_conform,
777
761
requirement.getFirstType (),
778
762
ctx.getIdentifier (requirement.getLayoutConstraint ()->getName ()));
779
- diagnosedError = true ;
780
763
break ;
781
764
}
782
765
766
+ diagnosedError = true ;
783
767
break ;
784
768
}
785
769
0 commit comments