@@ -518,28 +518,32 @@ bool TypeChecker::checkContextualRequirements(GenericTypeDecl *decl,
518
518
const auto subMap = parentTy->getContextSubstitutions (decl->getDeclContext ());
519
519
const auto genericSig = decl->getGenericSignature ();
520
520
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
+ };
537
531
532
+ const auto result = TypeChecker::checkGenericArgumentsForDiagnostics (
533
+ module , genericSig.getRequirements (), substitutions);
538
534
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:
541
545
return false ;
542
- case RequirementCheckResult ::Success:
546
+ case CheckGenericArgumentsResult ::Success:
543
547
return true ;
544
548
}
545
549
llvm_unreachable (" invalid requirement check type" );
@@ -949,26 +953,32 @@ Type TypeResolution::applyUnboundGenericArguments(
949
953
noteLoc = loc;
950
954
951
955
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
+ };
966
966
967
+ const auto result = TypeChecker::checkGenericArgumentsForDiagnostics (
968
+ module , genericSig.getRequirements (), substitutions);
967
969
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:
970
980
return ErrorType::get (getASTContext ());
971
- case RequirementCheckResult ::Success:
981
+ case CheckGenericArgumentsResult ::Success:
972
982
break ;
973
983
}
974
984
}
0 commit comments