@@ -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 }
0 commit comments