Skip to content

Commit 6450dc2

Browse files
committed
[NFC] TypeChecker: Extract requirement failure diagnosis from 'checkGenericArguments' into a dedicated routine
1 parent d2751bf commit 6450dc2

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,71 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
817817
/// Checking bound generic type arguments
818818
///
819819

820+
void TypeChecker::diagnoseRequirementFailure(
821+
const CheckGenericArgumentsResult::RequirementFailureInfo &reqFailureInfo,
822+
SourceLoc errorLoc, SourceLoc noteLoc, Type targetTy,
823+
TypeArrayView<GenericTypeParamType> genericParams,
824+
TypeSubstitutionFn substitutions, ModuleDecl *module) {
825+
assert(errorLoc.isValid() && noteLoc.isValid());
826+
827+
const auto &req = reqFailureInfo.Req;
828+
const auto &substReq = reqFailureInfo.SubstReq;
829+
830+
Diag<Type, Type, Type> diagnostic;
831+
Diag<Type, Type, StringRef> diagnosticNote;
832+
833+
const auto reqKind = req.getKind();
834+
switch (reqKind) {
835+
case RequirementKind::Conformance: {
836+
diagnoseConformanceFailure(substReq.getFirstType(),
837+
substReq.getProtocolDecl(), module, errorLoc);
838+
839+
if (reqFailureInfo.ReqPath.empty())
840+
return;
841+
842+
diagnostic = diag::type_does_not_conform_owner;
843+
diagnosticNote = diag::type_does_not_inherit_or_conform_requirement;
844+
break;
845+
}
846+
847+
case RequirementKind::Layout:
848+
diagnostic = diag::type_is_not_a_class;
849+
diagnosticNote = diag::anyobject_requirement;
850+
break;
851+
852+
case RequirementKind::Superclass:
853+
diagnostic = diag::type_does_not_inherit;
854+
diagnosticNote = diag::type_does_not_inherit_or_conform_requirement;
855+
break;
856+
857+
case RequirementKind::SameType:
858+
diagnostic = diag::types_not_equal;
859+
diagnosticNote = diag::types_not_equal_requirement;
860+
break;
861+
}
862+
863+
Type secondTy, substSecondTy;
864+
if (req.getKind() != RequirementKind::Layout) {
865+
secondTy = req.getSecondType();
866+
substSecondTy = substReq.getSecondType();
867+
}
868+
869+
ASTContext &ctx = module->getASTContext();
870+
// FIXME: Poor source-location information.
871+
ctx.Diags.diagnose(errorLoc, diagnostic, targetTy, substReq.getFirstType(),
872+
substSecondTy);
873+
874+
const auto genericParamBindingsText =
875+
TypeChecker::gatherGenericParamBindingsText(
876+
{req.getFirstType(), secondTy}, genericParams, substitutions);
877+
878+
ctx.Diags.diagnose(noteLoc, diagnosticNote, req.getFirstType(), secondTy,
879+
genericParamBindingsText);
880+
881+
ParentConditionalConformance::diagnoseConformanceStack(
882+
ctx.Diags, noteLoc, reqFailureInfo.ReqPath);
883+
}
884+
820885
RequirementCheckResult TypeChecker::checkGenericArguments(
821886
ModuleDecl *module, SourceLoc loc, SourceLoc noteLoc, Type owner,
822887
TypeArrayView<GenericTypeParamType> genericParams,

lib/Sema/TypeChecker.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,20 @@ std::string gatherGenericParamBindingsText(
513513
ArrayRef<Type> types, TypeArrayView<GenericTypeParamType> genericParams,
514514
TypeSubstitutionFn substitutions);
515515

516+
/// Diagnose a requirement failure.
517+
///
518+
/// \param errorLoc The location at which an error shall be emitted.
519+
/// \param noteLoc The location at which any notes shall be emitted.
520+
/// \param targetTy The type whose generic arguments caused the requirement
521+
/// failure.
522+
/// \param genericParams The generic parameters that were substituted.
523+
/// \param substitutions The substitutions that caused the requirement failure.
524+
void diagnoseRequirementFailure(
525+
const CheckGenericArgumentsResult::RequirementFailureInfo &reqFailureInfo,
526+
SourceLoc errorLoc, SourceLoc noteLoc, Type targetTy,
527+
TypeArrayView<GenericTypeParamType> genericParams,
528+
TypeSubstitutionFn substitutions, ModuleDecl *module);
529+
516530
/// Check the given set of generic arguments against the requirements in a
517531
/// generic signature.
518532
///

0 commit comments

Comments
 (0)