Skip to content

Commit ec45d96

Browse files
committed
[RequirementMachine] Always store an invalid requirement in RequirementError.
1 parent 3837b4d commit ec45d96

File tree

2 files changed

+30
-46
lines changed

2 files changed

+30
-46
lines changed

include/swift/AST/Requirement.h

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -130,66 +130,46 @@ struct StructuralRequirement {
130130
/// generic signature of a declaration, and diagnosed via
131131
/// \c diagnoseRequirementErrors .
132132
struct RequirementError {
133+
/// The kind of requirement error.
133134
enum class Kind {
134135
InvalidConformance,
135136
ConcreteTypeMismatch,
136137
NonTypeParameter,
137138
RedundantRequirement,
138139
} kind;
139140

140-
union {
141-
struct {
142-
Type subjectType;
143-
Type constraint;
144-
} invalidConformance;
145-
146-
struct {
147-
Type type1;
148-
Type type2;
149-
} concreteTypeMismatch;
150-
151-
Type nonTypeParameter;
152-
153-
Requirement redundantRequirement;
154-
};
141+
/// The invalid requirement.
142+
Requirement requirement;
155143

156144
SourceLoc loc;
157145

158146
private:
159-
RequirementError(Kind kind, SourceLoc loc)
160-
: kind(kind), loc(loc) {}
147+
RequirementError(Kind kind, Requirement requirement, SourceLoc loc)
148+
: kind(kind), requirement(requirement), loc(loc) {}
161149

162150
public:
163151
static RequirementError forInvalidConformance(Type subjectType,
164152
Type constraint,
165153
SourceLoc loc) {
166-
RequirementError error(Kind::InvalidConformance, loc);
167-
error.invalidConformance.subjectType = subjectType;
168-
error.invalidConformance.constraint = constraint;
169-
return error;
154+
Requirement requirement(RequirementKind::Conformance, subjectType, constraint);
155+
return {Kind::InvalidConformance, requirement, loc};
170156
}
171157

172158
static RequirementError forConcreteTypeMismatch(Type type1,
173159
Type type2,
174160
SourceLoc loc) {
175-
RequirementError error(Kind::ConcreteTypeMismatch, loc);
176-
error.concreteTypeMismatch.type1 = type1;
177-
error.concreteTypeMismatch.type2 = type2;
178-
return error;
161+
Requirement requirement(RequirementKind::SameType, type1, type2);
162+
return {Kind::ConcreteTypeMismatch, requirement, loc};
179163
}
180164

181-
static RequirementError forNonTypeParameter(Type subject,
165+
static RequirementError forNonTypeParameter(Requirement req,
182166
SourceLoc loc) {
183-
RequirementError error(Kind::NonTypeParameter, loc);
184-
error.nonTypeParameter = subject;
185-
return error;
167+
return {Kind::NonTypeParameter, req, loc};
186168
}
187169

188170
static RequirementError forRedundantRequirement(Requirement req,
189171
SourceLoc loc) {
190-
RequirementError error(Kind::RedundantRequirement, loc);
191-
error.redundantRequirement = req;
192-
return error;
172+
return {Kind::RedundantRequirement, req, loc};
193173
}
194174
};
195175

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,14 @@ static void desugarSuperclassRequirement(Type subjectType,
128128
SmallVectorImpl<Requirement> &result,
129129
SmallVectorImpl<RequirementError> &errors) {
130130
if (!subjectType->isTypeParameter()) {
131+
Requirement requirement(RequirementKind::Superclass,
132+
subjectType, constraintType);
131133
if (constraintType->isExactSuperclassOf(subjectType)) {
132-
errors.push_back(RequirementError::forRedundantRequirement(
133-
{RequirementKind::Superclass, subjectType, constraintType}, loc));
134+
errors.push_back(
135+
RequirementError::forRedundantRequirement(requirement, loc));
134136
} else {
135137
errors.push_back(
136-
RequirementError::forNonTypeParameter(subjectType, loc));
138+
RequirementError::forNonTypeParameter(requirement, loc));
137139
}
138140

139141
return;
@@ -148,12 +150,14 @@ static void desugarLayoutRequirement(Type subjectType,
148150
SmallVectorImpl<Requirement> &result,
149151
SmallVectorImpl<RequirementError> &errors) {
150152
if (!subjectType->isTypeParameter()) {
153+
Requirement requirement(RequirementKind::Layout,
154+
subjectType, layout);
151155
if (subjectType->isAnyClassReferenceType()) {
152-
errors.push_back(RequirementError::forRedundantRequirement(
153-
{RequirementKind::Layout, subjectType, layout}, loc));
156+
errors.push_back(
157+
RequirementError::forRedundantRequirement(requirement, loc));
154158
} else {
155159
errors.push_back(
156-
RequirementError::forNonTypeParameter(subjectType, loc));
160+
RequirementError::forNonTypeParameter(requirement, loc));
157161
}
158162

159163
return;
@@ -189,8 +193,8 @@ static void desugarConformanceRequirement(Type subjectType, Type constraintType,
189193
auto *module = protoDecl->getParentModule();
190194
auto conformance = module->lookupConformance(subjectType, protoDecl);
191195
if (conformance.isInvalid()) {
192-
errors.push_back(
193-
RequirementError::forNonTypeParameter(subjectType, loc));
196+
errors.push_back(RequirementError::forNonTypeParameter(
197+
{RequirementKind::Conformance, subjectType, constraintType}, loc));
194198
return;
195199
}
196200

@@ -541,8 +545,8 @@ bool swift::rewriting::diagnoseRequirementErrors(
541545

542546
switch (error.kind) {
543547
case RequirementError::Kind::InvalidConformance: {
544-
Type subjectType = error.invalidConformance.subjectType;
545-
Type constraint = error.invalidConformance.constraint;
548+
Type subjectType = error.requirement.getFirstType();
549+
Type constraint = error.requirement.getSecondType();
546550

547551
// FIXME: The constraint string is printed directly here because
548552
// the current default is to not print `any` for existential
@@ -578,8 +582,8 @@ bool swift::rewriting::diagnoseRequirementErrors(
578582
}
579583

580584
case RequirementError::Kind::ConcreteTypeMismatch: {
581-
auto type1 = error.concreteTypeMismatch.type1;
582-
auto type2 = error.concreteTypeMismatch.type2;
585+
auto type1 = error.requirement.getFirstType();
586+
auto type2 = error.requirement.getSecondType();
583587

584588
if (!type1->hasError() && !type2->hasError()) {
585589
ctx.Diags.diagnose(loc, diag::requires_same_concrete_type,
@@ -592,13 +596,13 @@ bool swift::rewriting::diagnoseRequirementErrors(
592596

593597
case RequirementError::Kind::NonTypeParameter: {
594598
ctx.Diags.diagnose(loc, diag::requires_not_suitable_archetype,
595-
error.nonTypeParameter);
599+
error.requirement.getFirstType());
596600
diagnosedError = true;
597601
break;
598602
}
599603

600604
case RequirementError::Kind::RedundantRequirement: {
601-
auto requirement = error.redundantRequirement;
605+
auto requirement = error.requirement;
602606
switch (requirement.getKind()) {
603607
case RequirementKind::SameType:
604608
ctx.Diags.diagnose(loc, diag::redundant_same_type_to_concrete,

0 commit comments

Comments
 (0)