Skip to content

Commit 964c11a

Browse files
committed
[RequirementMachine] Consolidate the various RequirementError::Kind cases
that represent conflict diagnostics.
1 parent caee699 commit 964c11a

File tree

3 files changed

+44
-67
lines changed

3 files changed

+44
-67
lines changed

lib/AST/RequirementMachine/Diagnostics.h

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ struct RequirementError {
3030
enum class Kind {
3131
/// A constraint to a non-protocol, non-class type, e.g. T: Int.
3232
InvalidTypeRequirement,
33-
/// A type mismatch, e.g. Int == String.
34-
ConcreteTypeMismatch,
35-
/// A requirement proven to be false, e.g. Bool: Collection
33+
/// A type requirement on a trivially invalid subject type,
34+
/// e.g. Bool: Collection.
35+
InvalidRequirementSubject,
36+
/// A pair of conflicting requirements, T == Int, T == String
3637
ConflictingRequirement,
37-
/// A missing requirement on a concrete type in a same-type requirement.
38-
SameTypeMissingRequirement,
3938
/// A redundant requirement, e.g. T == T.
4039
RedundantRequirement,
4140
} kind;
@@ -69,11 +68,9 @@ struct RequirementError {
6968
return {Kind::InvalidTypeRequirement, requirement, loc};
7069
}
7170

72-
static RequirementError forConcreteTypeMismatch(Type type1,
73-
Type type2,
74-
SourceLoc loc) {
75-
Requirement requirement(RequirementKind::SameType, type1, type2);
76-
return {Kind::ConcreteTypeMismatch, requirement, loc};
71+
static RequirementError forInvalidRequirementSubject(Requirement req,
72+
SourceLoc loc) {
73+
return {Kind::InvalidRequirementSubject, req, loc};
7774
}
7875

7976
static RequirementError forConflictingRequirement(Requirement req,
@@ -87,11 +84,6 @@ struct RequirementError {
8784
return {Kind::ConflictingRequirement, typeParameter, req, loc};
8885
}
8986

90-
static RequirementError forSameTypeMissingRequirement(Requirement req,
91-
SourceLoc loc) {
92-
return {Kind::SameTypeMissingRequirement, req, loc};
93-
}
94-
9587
static RequirementError forRedundantRequirement(Requirement req,
9688
SourceLoc loc) {
9789
return {Kind::RedundantRequirement, req, loc};

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 31 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/AST/RequirementMachine/RewriteSystem.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -812,25 +812,26 @@ void RewriteSystem::computeConflictDiagnostics(
812812
auto subjectType = subject.getConcreteType();
813813
switch (constraint.getKind()) {
814814
case Symbol::Kind::ConcreteType:
815-
errors.push_back(RequirementError::forConcreteTypeMismatch(
816-
subjectType, constraint.getConcreteType(), signatureLoc));
815+
errors.push_back(RequirementError::forConflictingRequirement(
816+
{RequirementKind::SameType, subjectType, constraint.getConcreteType()},
817+
signatureLoc));
817818
return;
818819

819820
case Symbol::Kind::Superclass:
820-
errors.push_back(RequirementError::forSameTypeMissingRequirement(
821+
errors.push_back(RequirementError::forConflictingRequirement(
821822
{RequirementKind::Superclass, subjectType, constraint.getConcreteType()},
822823
signatureLoc));
823824
return;
824825

825826
case Symbol::Kind::Protocol:
826-
errors.push_back(RequirementError::forSameTypeMissingRequirement(
827+
errors.push_back(RequirementError::forConflictingRequirement(
827828
{RequirementKind::Conformance, subjectType,
828829
constraint.getProtocol()->getDeclaredInterfaceType()},
829830
signatureLoc));
830831
return;
831832

832833
case Symbol::Kind::Layout:
833-
errors.push_back(RequirementError::forSameTypeMissingRequirement(
834+
errors.push_back(RequirementError::forConflictingRequirement(
834835
{RequirementKind::Layout, subjectType, constraint.getLayoutConstraint()},
835836
signatureLoc));
836837
return;

0 commit comments

Comments
 (0)