Skip to content

Commit e512e7a

Browse files
committed
[RequirementMachine] Add a RequirementError for diagnosing a conflicting
same-type requirement.
1 parent 0d100e6 commit e512e7a

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,6 +2491,9 @@ ERROR(recursive_superclass_constraint,none,
24912491
ERROR(requires_generic_param_same_type_does_not_conform,none,
24922492
"same-type constraint type %0 does not conform to required protocol %1",
24932493
(Type, Identifier))
2494+
ERROR(same_type_does_not_inherit,none,
2495+
"same-type constraint type %0 does not inherit from required superclass %1",
2496+
(Type, Type))
24942497
ERROR(requires_same_concrete_type,none,
24952498
"generic signature requires types %0 and %1 to be the same", (Type, Type))
24962499
WARNING(redundant_conformance_constraint,none,

lib/AST/RequirementMachine/Diagnostics.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ struct RequirementError {
3434
ConcreteTypeMismatch,
3535
/// A requirement proven to be false, e.g. Bool: Collection
3636
ConflictingRequirement,
37+
/// A missing requirement on a concrete type in a same-type requirement.
38+
SameTypeMissingRequirement,
3739
/// A redundant requirement, e.g. T == T.
3840
RedundantRequirement,
3941
} kind;
@@ -67,6 +69,11 @@ struct RequirementError {
6769
return {Kind::ConflictingRequirement, req, loc};
6870
}
6971

72+
static RequirementError forSameTypeMissingRequirement(Requirement req,
73+
SourceLoc loc) {
74+
return {Kind::SameTypeMissingRequirement, req, loc};
75+
}
76+
7077
static RequirementError forRedundantRequirement(Requirement req,
7178
SourceLoc loc) {
7279
return {Kind::RedundantRequirement, req, loc};

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,35 @@ bool swift::rewriting::diagnoseRequirementErrors(
736736
break;
737737
}
738738

739+
case RequirementError::Kind::SameTypeMissingRequirement: {
740+
auto requirement = error.requirement;
741+
switch (requirement.getKind()) {
742+
case RequirementKind::SameType:
743+
// FIXME: This case should be diagnosed through `ConcreteTypeMismatch`.
744+
break;
745+
case RequirementKind::Conformance:
746+
ctx.Diags.diagnose(loc, diag::requires_generic_param_same_type_does_not_conform,
747+
requirement.getFirstType(),
748+
requirement.getProtocolDecl()->getName());
749+
diagnosedError = true;
750+
break;
751+
case RequirementKind::Superclass:
752+
ctx.Diags.diagnose(loc, diag::same_type_does_not_inherit,
753+
requirement.getFirstType(),
754+
requirement.getSecondType());
755+
diagnosedError = true;
756+
break;
757+
case RequirementKind::Layout:
758+
ctx.Diags.diagnose(loc, diag::requires_generic_param_same_type_does_not_conform,
759+
requirement.getFirstType(),
760+
ctx.getIdentifier(requirement.getLayoutConstraint()->getName()));
761+
diagnosedError = true;
762+
break;
763+
}
764+
765+
break;
766+
}
767+
739768
case RequirementError::Kind::RedundantRequirement: {
740769
auto requirement = error.requirement;
741770
switch (requirement.getKind()) {

0 commit comments

Comments
 (0)