@@ -214,6 +214,56 @@ enum class RequirementCheckResult {
214214 Success, Failure, SubstitutionFailure
215215};
216216
217+ class CheckGenericArgumentsResult {
218+ public:
219+ enum Kind { Success, RequirementFailure, SubstitutionFailure };
220+
221+ struct RequirementFailureInfo {
222+ // / The failed requirement.
223+ Requirement Req;
224+
225+ // / The failed requirement with substitutions applied.
226+ Requirement SubstReq;
227+
228+ // / The chain of conditional conformances that leads to the failed
229+ // / requirement \c Req. Accordingly, \c Req is a conditional requirement of
230+ // / the last conformance in the chain (if any).
231+ SmallVector<ParentConditionalConformance, 2 > ReqPath;
232+ };
233+
234+ private:
235+ Kind Knd;
236+ Optional<RequirementFailureInfo> ReqFailureInfo;
237+
238+ CheckGenericArgumentsResult (Kind Knd,
239+ Optional<RequirementFailureInfo> ReqFailureInfo)
240+ : Knd(Knd), ReqFailureInfo(ReqFailureInfo) {}
241+
242+ public:
243+ static CheckGenericArgumentsResult createSuccess () {
244+ return CheckGenericArgumentsResult (Success, None);
245+ }
246+
247+ static CheckGenericArgumentsResult createSubstitutionFailure () {
248+ return CheckGenericArgumentsResult (SubstitutionFailure, None);
249+ }
250+
251+ static CheckGenericArgumentsResult createRequirementFailure (
252+ Requirement Req, Requirement SubstReq,
253+ SmallVector<ParentConditionalConformance, 2 > ReqPath) {
254+ return CheckGenericArgumentsResult (
255+ RequirementFailure, RequirementFailureInfo{Req, SubstReq, ReqPath});
256+ }
257+
258+ const RequirementFailureInfo &getRequirementFailureInfo () const {
259+ assert (Knd == RequirementFailure);
260+
261+ return ReqFailureInfo.getValue ();
262+ }
263+
264+ operator Kind () const { return Knd; }
265+ };
266+
217267// / Describes the kind of checked cast operation being performed.
218268enum class CheckedCastContextKind {
219269 // / None: we're just establishing how to perform the checked cast. This
@@ -480,7 +530,18 @@ RequirementCheckResult checkGenericArguments(
480530 ArrayRef<Requirement> requirements, TypeSubstitutionFn substitutions,
481531 SubstOptions options = None);
482532
483- // / A lower-level version of the above without diagnostic emission.
533+ // / Check the given generic parameter substitutions against the given
534+ // / requirements and report on any requirement failures in detail for
535+ // / diagnostic needs.
536+ CheckGenericArgumentsResult
537+ checkGenericArgumentsForDiagnostics (ModuleDecl *module ,
538+ ArrayRef<Requirement> requirements,
539+ TypeSubstitutionFn substitutions);
540+
541+ // / Check the given generic parameter substitutions against the given
542+ // / requirements. Unlike \c checkAndDiagnoseGenericArguments, this version
543+ // / reports just the result of the check and doesn't provide additional
544+ // / information on requirement failures that is warranted for diagnostics.
484545RequirementCheckResult checkGenericArguments (
485546 ModuleDecl *module ,
486547 ArrayRef<Requirement> requirements,
0 commit comments