@@ -333,10 +333,6 @@ struct SynthesizedExtensionAnalyzer::Implementation {
333
333
ProtocolDecl *BaseProto = OwningExt->getInnermostDeclContext ()
334
334
->getSelfProtocolDecl ();
335
335
for (auto Req : Reqs) {
336
- // FIXME: Don't skip layout requirements.
337
- if (Req.getKind () == RequirementKind::Layout)
338
- continue ;
339
-
340
336
// Skip protocol's Self : <Protocol> requirement.
341
337
if (BaseProto &&
342
338
Req.getKind () == RequirementKind::Conformance &&
@@ -357,40 +353,33 @@ struct SynthesizedExtensionAnalyzer::Implementation {
357
353
}
358
354
359
355
assert (!Req.getFirstType ()->hasArchetype ());
360
- assert (!Req.getSecondType ()->hasArchetype ());
361
-
362
- auto SubstReq = Req.subst (
363
- [&](Type type) -> Type {
364
- if (type->isTypeParameter ())
365
- return Target->mapTypeIntoContext (type);
366
-
367
- return type;
368
- },
369
- LookUpConformanceInModule ());
356
+ if (Req.getKind () != RequirementKind::Layout)
357
+ assert (!Req.getSecondType ()->hasArchetype ());
370
358
371
359
SmallVector<Requirement, 2 > subReqs;
372
- switch (SubstReq.checkRequirement (subReqs)) {
373
- case CheckRequirementResult::Success:
374
- break ;
375
-
376
- case CheckRequirementResult::ConditionalConformance:
377
- // FIXME: Need to handle conditional requirements here!
378
- break ;
379
-
380
- case CheckRequirementResult::PackRequirement:
381
- // FIXME
382
- assert (false && " Refactor this" );
383
- return true ;
384
-
385
- case CheckRequirementResult::SubstitutionFailure:
386
- return true ;
387
-
388
- case CheckRequirementResult::RequirementFailure:
389
- if (!SubstReq.canBeSatisfied ())
360
+ subReqs.push_back (
361
+ Req.subst (
362
+ QueryInterfaceTypeSubstitutions (Target->getGenericEnvironment ()),
363
+ LookUpConformanceInModule ()));
364
+
365
+ while (!subReqs.empty ()) {
366
+ auto req = subReqs.pop_back_val ();
367
+ switch (req.checkRequirement (subReqs)) {
368
+ case CheckRequirementResult::Success:
369
+ case CheckRequirementResult::PackRequirement:
370
+ case CheckRequirementResult::ConditionalConformance:
371
+ break ;
372
+
373
+ case CheckRequirementResult::SubstitutionFailure:
390
374
return true ;
391
375
392
- MergeInfo.addRequirement (Req);
393
- break ;
376
+ case CheckRequirementResult::RequirementFailure:
377
+ if (!req.canBeSatisfied ())
378
+ return true ;
379
+
380
+ MergeInfo.addRequirement (Req);
381
+ break ;
382
+ }
394
383
}
395
384
}
396
385
return false ;
0 commit comments