diff --git a/lib/AST/RequirementMachine/RequirementLowering.cpp b/lib/AST/RequirementMachine/RequirementLowering.cpp index 33705845b9b..fe7d52b0448 100644 --- a/lib/AST/RequirementMachine/RequirementLowering.cpp +++ b/lib/AST/RequirementMachine/RequirementLowering.cpp @@ -136,7 +136,23 @@ static void desugarConformanceRequirement(Type subjectType, Type constraintType, // Fast path. if (constraintType->is()) { if (!subjectType->isTypeParameter()) { - // FIXME: Check conformance, diagnose redundancy or conflict upstream + // Check if the subject type actually conforms. + auto *protoDecl = constraintType->castTo()->getDecl(); + auto *module = protoDecl->getParentModule(); + auto conformance = module->lookupConformance(subjectType, protoDecl); + if (conformance.isInvalid()) { + // FIXME: Diagnose a conflict. + return; + } + + // FIXME: Diagnose a redundancy. + assert(conformance.isConcrete()); + auto *concrete = conformance.getConcrete(); + + // Introduce conditional requirements if the subject type is concrete. + for (auto req : concrete->getConditionalRequirements()) { + desugarRequirement(req, result); + } return; } diff --git a/test/Generics/conditional_requirement_inference_2.swift b/test/Generics/conditional_requirement_inference_2.swift index b63d59e94aa..b6fbf35a26e 100644 --- a/test/Generics/conditional_requirement_inference_2.swift +++ b/test/Generics/conditional_requirement_inference_2.swift @@ -15,6 +15,18 @@ protocol Sequence { extension Array : Sequence {} struct EquatableSequenceBox where T.Element : Equatable { - // CHECK: Generic signature: >, U : Equatable> + // CHECK-LABEL: EquatableSequenceBox.withArrayArray@ + // CHECK-NEXT: Generic signature: >, U : Equatable> func withArrayArray(_: U) where T == Array> {} -} \ No newline at end of file +} + +// Make sure requirement desugaring handles conditional conformances. +protocol Hashable : Equatable {} + +struct Set {} + +extension Array : Hashable where Element : Hashable {} + +// CHECK-LABEL: doStuff@ +// CHECK-NEXT: Generic signature: +func doStuff(_: Set>) {}