@@ -214,6 +214,56 @@ enum class RequirementCheckResult {
214
214
Success, Failure, SubstitutionFailure
215
215
};
216
216
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
+
217
267
// / Describes the kind of checked cast operation being performed.
218
268
enum class CheckedCastContextKind {
219
269
// / None: we're just establishing how to perform the checked cast. This
@@ -480,7 +530,18 @@ RequirementCheckResult checkGenericArguments(
480
530
ArrayRef<Requirement> requirements, TypeSubstitutionFn substitutions,
481
531
SubstOptions options = None);
482
532
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.
484
545
RequirementCheckResult checkGenericArguments (
485
546
ModuleDecl *module ,
486
547
ArrayRef<Requirement> requirements,
0 commit comments