Skip to content

Commit f39464b

Browse files
committed
TypeChecker: Replace calls to the old 'checkGenericArguments' with 'checkGenericArgumentsForDiagnostics'
1 parent 6450dc2 commit f39464b

File tree

4 files changed

+71
-49
lines changed

4 files changed

+71
-49
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4942,20 +4942,13 @@ void ConformanceChecker::ensureRequirementsAreSatisfied() {
49424942
auto proto = Conformance->getProtocol();
49434943
auto &diags = proto->getASTContext().Diags;
49444944

4945-
auto DC = Conformance->getDeclContext();
4945+
auto *const module = DC->getParentModule();
49464946
auto substitutingType = DC->mapTypeIntoContext(Conformance->getType());
49474947
auto substitutions = SubstitutionMap::getProtocolSubstitutions(
49484948
proto, substitutingType, ProtocolConformanceRef(Conformance));
49494949

49504950
auto reqSig = proto->getRequirementSignature().getRequirements();
49514951

4952-
auto result = TypeChecker::checkGenericArguments(
4953-
DC->getParentModule(), Loc, Loc,
4954-
// FIXME: maybe this should be the conformance's type
4955-
proto->getDeclaredInterfaceType(),
4956-
{ proto->getSelfInterfaceType() },
4957-
reqSig, QuerySubstitutionMap{substitutions});
4958-
49594952
// Non-final classes should not be able to conform to protocols with a
49604953
// same-type requirement on 'Self', since such a conformance would no
49614954
// longer be covariant. For now, this is a warning. Once this becomes
@@ -4970,16 +4963,21 @@ void ConformanceChecker::ensureRequirementsAreSatisfied() {
49704963
}
49714964
}
49724965

4966+
const auto result = TypeChecker::checkGenericArgumentsForDiagnostics(
4967+
module, reqSig, QuerySubstitutionMap{substitutions});
49734968
switch (result) {
4974-
case RequirementCheckResult::Success:
4969+
case CheckGenericArgumentsResult::Success:
49754970
// Go on to check exportability.
49764971
break;
49774972

4978-
case RequirementCheckResult::Failure:
4973+
case CheckGenericArgumentsResult::RequirementFailure:
4974+
TypeChecker::diagnoseRequirementFailure(
4975+
result.getRequirementFailureInfo(), Loc, Loc,
4976+
proto->getDeclaredInterfaceType(), {proto->getSelfInterfaceType()},
4977+
QuerySubstitutionMap{substitutions}, module);
49794978
Conformance->setInvalid();
49804979
return;
4981-
4982-
case RequirementCheckResult::SubstitutionFailure:
4980+
case CheckGenericArgumentsResult::SubstitutionFailure:
49834981
// Diagnose the failure generically.
49844982
// FIXME: Would be nice to give some more context here!
49854983
if (!Conformance->isInvalid()) {

lib/Sema/TypeCheckType.cpp

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -518,28 +518,32 @@ bool TypeChecker::checkContextualRequirements(GenericTypeDecl *decl,
518518
const auto subMap = parentTy->getContextSubstitutions(decl->getDeclContext());
519519
const auto genericSig = decl->getGenericSignature();
520520

521-
const auto result =
522-
TypeChecker::checkGenericArguments(
523-
module, loc, noteLoc,
524-
decl->getDeclaredInterfaceType(),
525-
genericSig.getGenericParams(),
526-
genericSig.getRequirements(),
527-
[&](SubstitutableType *type) -> Type {
528-
auto result = QueryTypeSubstitutionMap{subMap}(type);
529-
if (result->hasTypeParameter()) {
530-
if (contextSig) {
531-
auto *genericEnv = contextSig.getGenericEnvironment();
532-
return genericEnv->mapTypeIntoContext(result);
533-
}
534-
}
535-
return result;
536-
});
521+
const auto substitutions = [&](SubstitutableType *type) -> Type {
522+
auto result = QueryTypeSubstitutionMap{subMap}(type);
523+
if (result->hasTypeParameter()) {
524+
if (contextSig) {
525+
auto *genericEnv = contextSig.getGenericEnvironment();
526+
return genericEnv->mapTypeIntoContext(result);
527+
}
528+
}
529+
return result;
530+
};
537531

532+
const auto result = TypeChecker::checkGenericArgumentsForDiagnostics(
533+
module, genericSig.getRequirements(), substitutions);
538534
switch (result) {
539-
case RequirementCheckResult::Failure:
540-
case RequirementCheckResult::SubstitutionFailure:
535+
case CheckGenericArgumentsResult::RequirementFailure:
536+
if (loc.isValid()) {
537+
TypeChecker::diagnoseRequirementFailure(
538+
result.getRequirementFailureInfo(), loc, noteLoc,
539+
decl->getDeclaredInterfaceType(), genericSig.getGenericParams(),
540+
substitutions, module);
541+
}
542+
543+
return false;
544+
case CheckGenericArgumentsResult::SubstitutionFailure:
541545
return false;
542-
case RequirementCheckResult::Success:
546+
case CheckGenericArgumentsResult::Success:
543547
return true;
544548
}
545549
llvm_unreachable("invalid requirement check type");
@@ -949,26 +953,32 @@ Type TypeResolution::applyUnboundGenericArguments(
949953
noteLoc = loc;
950954

951955
auto genericSig = decl->getGenericSignature();
952-
auto result = TypeChecker::checkGenericArguments(
953-
module, loc, noteLoc,
954-
UnboundGenericType::get(decl, parentTy, getASTContext()),
955-
genericSig.getGenericParams(), genericSig.getRequirements(),
956-
[&](SubstitutableType *type) -> Type {
957-
auto result = QueryTypeSubstitutionMap{subs}(type);
958-
if (result->hasTypeParameter()) {
959-
if (const auto contextSig = getGenericSignature()) {
960-
auto *genericEnv = contextSig.getGenericEnvironment();
961-
return genericEnv->mapTypeIntoContext(result);
962-
}
963-
}
964-
return result;
965-
});
956+
const auto substitutions = [&](SubstitutableType *type) -> Type {
957+
auto result = QueryTypeSubstitutionMap{subs}(type);
958+
if (result->hasTypeParameter()) {
959+
if (const auto contextSig = getGenericSignature()) {
960+
auto *genericEnv = contextSig.getGenericEnvironment();
961+
return genericEnv->mapTypeIntoContext(result);
962+
}
963+
}
964+
return result;
965+
};
966966

967+
const auto result = TypeChecker::checkGenericArgumentsForDiagnostics(
968+
module, genericSig.getRequirements(), substitutions);
967969
switch (result) {
968-
case RequirementCheckResult::Failure:
969-
case RequirementCheckResult::SubstitutionFailure:
970+
case CheckGenericArgumentsResult::RequirementFailure:
971+
if (loc.isValid()) {
972+
TypeChecker::diagnoseRequirementFailure(
973+
result.getRequirementFailureInfo(), loc, noteLoc,
974+
UnboundGenericType::get(decl, parentTy, getASTContext()),
975+
genericSig.getGenericParams(), substitutions, module);
976+
}
977+
978+
LLVM_FALLTHROUGH;
979+
case CheckGenericArgumentsResult::SubstitutionFailure:
970980
return ErrorType::get(getASTContext());
971-
case RequirementCheckResult::Success:
981+
case CheckGenericArgumentsResult::Success:
972982
break;
973983
}
974984
}

lib/Sema/TypeChecker.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ checkGenericArgumentsForDiagnostics(ModuleDecl *module,
553553
TypeSubstitutionFn substitutions);
554554

555555
/// Check the given generic parameter substitutions against the given
556-
/// requirements. Unlike \c checkAndDiagnoseGenericArguments, this version
556+
/// requirements. Unlike \c checkGenericArgumentsForDiagnostics, this version
557557
/// reports just the result of the check and doesn't provide additional
558558
/// information on requirement failures that is warranted for diagnostics.
559559
RequirementCheckResult checkGenericArguments(

test/decl/protocol/conforms/failure.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,17 @@ do {
247247
typealias A = Bool // expected-note {{possibly intended match 'Conformer.A' (aka 'Bool') does not conform to 'Sequence'}}
248248
}
249249
}
250+
251+
class Class13 {}
252+
protocol P13a {
253+
associatedtype A
254+
}
255+
protocol P13b: P13a where A: Class13 {}
256+
do {
257+
// FIXME: No conformance failure.
258+
struct Conformer: P13b {
259+
// expected-error@-1 {{'P13b' requires that 'Conformer.A' (aka 'Array<Bool>') inherit from 'Class13'}}
260+
// expected-note@-2 {{requirement specified as 'Self.A' : 'Class13' [with Self = Conformer]}}
261+
typealias A = Array<Bool>
262+
}
263+
}

0 commit comments

Comments
 (0)