@@ -1289,6 +1289,23 @@ static bool isSubclassOrExistential(const Metadata *subclass,
1289
1289
return isSubclass (subclass, superclass);
1290
1290
}
1291
1291
1292
+ static llvm::Optional<TypeLookupError>
1293
+ satisfiesLayoutConstraint (const GenericRequirementDescriptor &req,
1294
+ const Metadata *subjectType) {
1295
+ switch (req.getLayout ()) {
1296
+ case GenericRequirementLayoutKind::Class:
1297
+ if (!subjectType->satisfiesClassConstraint ()) {
1298
+ return TYPE_LOOKUP_ERROR_FMT (
1299
+ " subject type %.*s does not satisfy class constraint" ,
1300
+ (int )req.getParam ().size (), req.getParam ().data ());
1301
+ }
1302
+ return llvm::None;
1303
+ }
1304
+
1305
+ // Unknown layout.
1306
+ return TYPE_LOOKUP_ERROR_FMT (" unknown layout kind %u" , req.getLayout ());
1307
+ }
1308
+
1292
1309
SWIFT_CC (swift)
1293
1310
SWIFT_RUNTIME_STDLIB_SPI
1294
1311
bool swift::_swift_class_isSubclass (const Metadata *subclass,
@@ -1358,18 +1375,7 @@ checkGenericRequirement(const GenericRequirementDescriptor &req,
1358
1375
}
1359
1376
1360
1377
case GenericRequirementKind::Layout: {
1361
- switch (req.getLayout ()) {
1362
- case GenericRequirementLayoutKind::Class:
1363
- if (!subjectType->satisfiesClassConstraint ()) {
1364
- return TYPE_LOOKUP_ERROR_FMT (
1365
- " subject type %.*s does not satisfy class constraint" ,
1366
- (int )req.getParam ().size (), req.getParam ().data ());
1367
- }
1368
- return llvm::None;
1369
- }
1370
-
1371
- // Unknown layout.
1372
- return TYPE_LOOKUP_ERROR_FMT (" unknown layout kind %u" , req.getLayout ());
1378
+ return satisfiesLayoutConstraint (req, subjectType);
1373
1379
}
1374
1380
1375
1381
case GenericRequirementKind::BaseClass: {
@@ -1465,7 +1471,13 @@ checkGenericPackRequirement(const GenericRequirementDescriptor &req,
1465
1471
}
1466
1472
1467
1473
case GenericRequirementKind::Layout: {
1468
- llvm_unreachable (" Implement me" );
1474
+ for (unsigned i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1475
+ const Metadata *elt = subjectType.getElements ()[i];
1476
+ if (auto result = satisfiesLayoutConstraint (req, elt))
1477
+ return result;
1478
+ }
1479
+
1480
+ return llvm::None;
1469
1481
}
1470
1482
1471
1483
case GenericRequirementKind::BaseClass: {
0 commit comments