@@ -8342,6 +8342,10 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
83428342 requirementSignatureSelfProto);
83438343}
83448344
8345+ bool GenericSignatureBuilder::hadAnyError () const {
8346+ return Impl->HadAnyError ;
8347+ }
8348+
83458349GenericSignature GenericSignatureBuilder::computeGenericSignature (
83468350 bool allowConcreteGenericParams,
83478351 const ProtocolDecl *requirementSignatureSelfProto) && {
@@ -8577,7 +8581,7 @@ static bool isCanonicalRequest(GenericSignature baseSignature,
85778581 return true ;
85788582}
85798583
8580- GenericSignature
8584+ GenericSignatureWithError
85818585AbstractGenericSignatureRequest::evaluate (
85828586 Evaluator &evaluator,
85838587 const GenericSignatureImpl *baseSignatureImpl,
@@ -8587,7 +8591,7 @@ AbstractGenericSignatureRequest::evaluate(
85878591 // If nothing is added to the base signature, just return the base
85888592 // signature.
85898593 if (addedParameters.empty () && addedRequirements.empty ())
8590- return baseSignature;
8594+ return GenericSignatureWithError ( baseSignature, /* hadError= */ false ) ;
85918595
85928596 ASTContext &ctx = addedParameters.empty ()
85938597 ? addedRequirements.front ().getFirstType ()->getASTContext ()
@@ -8600,8 +8604,9 @@ AbstractGenericSignatureRequest::evaluate(
86008604 baseSignature.getGenericParams ().begin (),
86018605 baseSignature.getGenericParams ().end ());
86028606
8603- return GenericSignature::get (addedParameters,
8604- baseSignature.getRequirements ());
8607+ auto result = GenericSignature::get (addedParameters,
8608+ baseSignature.getRequirements ());
8609+ return GenericSignatureWithError (result, /* hadError=*/ false );
86058610 }
86068611
86078612 // If the request is non-canonical, we won't need to build our own
@@ -8624,16 +8629,18 @@ AbstractGenericSignatureRequest::evaluate(
86248629 }
86258630
86268631 // Build the canonical signature.
8627- auto canSignatureResult = evaluator (
8632+ auto canSignatureResult = evaluateOrDefault (
8633+ ctx.evaluator ,
86288634 AbstractGenericSignatureRequest{
86298635 canBaseSignature.getPointer (), std::move (canAddedParameters),
8630- std::move (canAddedRequirements)});
8631- if (!canSignatureResult || !*canSignatureResult)
8632- return GenericSignature ();
8636+ std::move (canAddedRequirements)},
8637+ GenericSignatureWithError ());
8638+ if (!canSignatureResult.getPointer ())
8639+ return GenericSignatureWithError ();
86338640
86348641 // Substitute in the original generic parameters to form the sugared
86358642 // result the original request wanted.
8636- auto canSignature = * canSignatureResult;
8643+ auto canSignature = canSignatureResult. getPointer () ;
86378644 SmallVector<GenericTypeParamType *, 2 > resugaredParameters;
86388645 resugaredParameters.reserve (canSignature.getGenericParams ().size ());
86398646 if (baseSignature) {
@@ -8660,7 +8667,9 @@ AbstractGenericSignatureRequest::evaluate(
86608667 resugaredRequirements.push_back (*resugaredReq);
86618668 }
86628669
8663- return GenericSignature::get (resugaredParameters, resugaredRequirements);
8670+ return GenericSignatureWithError (
8671+ GenericSignature::get (resugaredParameters, resugaredRequirements),
8672+ canSignatureResult.getInt ());
86648673 }
86658674
86668675 // Create a generic signature that will form the signature.
@@ -8677,11 +8686,13 @@ AbstractGenericSignatureRequest::evaluate(
86778686 for (const auto &req : addedRequirements)
86788687 builder.addRequirement (req, source, nullptr );
86798688
8680- return std::move (builder).computeGenericSignature (
8689+ bool hadError = builder.hadAnyError ();
8690+ auto result = std::move (builder).computeGenericSignature (
86818691 /* allowConcreteGenericParams=*/ true );
8692+ return GenericSignatureWithError (result, hadError);
86828693}
86838694
8684- GenericSignature
8695+ GenericSignatureWithError
86858696InferredGenericSignatureRequest::evaluate (
86868697 Evaluator &evaluator,
86878698 ModuleDecl *parentModule,
@@ -8801,7 +8812,9 @@ InferredGenericSignatureRequest::evaluate(
88018812
88028813 for (const auto &req : addedRequirements)
88038814 builder.addRequirement (req, source, parentModule);
8804-
8805- return std::move (builder).computeGenericSignature (
8815+
8816+ bool hadError = builder.hadAnyError ();
8817+ auto result = std::move (builder).computeGenericSignature (
88068818 allowConcreteGenericParams);
8819+ return GenericSignatureWithError (result, hadError);
88078820}
0 commit comments