Skip to content

Commit 76d9154

Browse files
committed
Sema: Add a simpler form of checkGenericArguments()
1 parent c1cd15f commit 76d9154

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,35 @@ CheckGenericArgumentsResult::Kind TypeChecker::checkGenericArguments(
10621062
return CheckGenericArgumentsResult::Success;
10631063
}
10641064

1065+
CheckGenericArgumentsResult::Kind TypeChecker::checkGenericArguments(
1066+
ArrayRef<Requirement> requirements) {
1067+
SmallVector<Requirement, 4> worklist(requirements.begin(), requirements.end());
1068+
1069+
bool hadSubstFailure = false;
1070+
1071+
while (!worklist.empty()) {
1072+
auto req = worklist.pop_back_val();
1073+
switch (req.checkRequirement(worklist, /*allowMissing=*/true)) {
1074+
case CheckRequirementResult::Success:
1075+
case CheckRequirementResult::ConditionalConformance:
1076+
case CheckRequirementResult::PackRequirement:
1077+
break;
1078+
1079+
case CheckRequirementResult::RequirementFailure:
1080+
return CheckGenericArgumentsResult::RequirementFailure;
1081+
1082+
case CheckRequirementResult::SubstitutionFailure:
1083+
hadSubstFailure = true;
1084+
break;
1085+
}
1086+
}
1087+
1088+
if (hadSubstFailure)
1089+
return CheckGenericArgumentsResult::SubstitutionFailure;
1090+
1091+
return CheckGenericArgumentsResult::Success;
1092+
}
1093+
10651094
Requirement
10661095
RequirementRequest::evaluate(Evaluator &evaluator,
10671096
WhereClauseOwner owner,

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5733,9 +5733,7 @@ TypeChecker::conformsToProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
57335733

57345734
// If we have a conditional requirements that we need to check, do so now.
57355735
if (!condReqs->empty()) {
5736-
auto conditionalCheckResult = checkGenericArguments(
5737-
M, *condReqs,
5738-
[](SubstitutableType *dependentType) { return Type(dependentType); });
5736+
auto conditionalCheckResult = checkGenericArguments(*condReqs);
57395737
switch (conditionalCheckResult) {
57405738
case CheckGenericArgumentsResult::Success:
57415739
break;

lib/Sema/TypeChecker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,10 @@ checkGenericArguments(ModuleDecl *module, ArrayRef<Requirement> requirements,
535535
TypeSubstitutionFn substitutions,
536536
SubstOptions options = None);
537537

538+
/// Check the given requirements without applying substitutions.
539+
CheckGenericArgumentsResult::Kind
540+
checkGenericArguments(ArrayRef<Requirement> requirements);
541+
538542
/// Checks whether the generic requirements imposed on the nested type
539543
/// declaration \p decl (if present) are in agreement with the substitutions
540544
/// that are needed to spell it as a member of the given parent type

0 commit comments

Comments
 (0)