@@ -1438,7 +1438,7 @@ checkGenericPackRequirement(const GenericRequirementDescriptor &req,
1438
1438
llvm::SmallVector<const WitnessTable *, 4 > witnessTables;
1439
1439
1440
1440
// Look up the conformance of each pack element to the protocol.
1441
- for (unsigned i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1441
+ for (size_t i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1442
1442
const Metadata *elt = subjectType.getElements ()[i];
1443
1443
1444
1444
const WitnessTable *witnessTable = nullptr ;
@@ -1447,8 +1447,8 @@ checkGenericPackRequirement(const GenericRequirementDescriptor &req,
1447
1447
const char *protoName =
1448
1448
req.getProtocol () ? req.getProtocol ().getName () : " <null>" ;
1449
1449
return TYPE_LOOKUP_ERROR_FMT (
1450
- " subject type %.*s does not conform to protocol %s" ,
1451
- (int )req.getParam ().size (), req.getParam ().data (), protoName);
1450
+ " subject type %.*s does not conform to protocol %s at pack index %lu " ,
1451
+ (int )req.getParam ().size (), req.getParam ().data (), protoName, i );
1452
1452
}
1453
1453
1454
1454
if (req.getProtocol ().needsWitnessTable ())
@@ -1467,11 +1467,40 @@ checkGenericPackRequirement(const GenericRequirementDescriptor &req,
1467
1467
}
1468
1468
1469
1469
case GenericRequirementKind::SameType: {
1470
- llvm_unreachable (" Implement me" );
1470
+ // Resolve the constraint generic parameter.
1471
+ auto result = swift::getTypePackByMangledName (
1472
+ req.getMangledTypeName (), extraArguments.data (),
1473
+ substGenericParam, substWitnessTable);
1474
+ if (result.getError ())
1475
+ return *result.getError ();
1476
+ MetadataPackPointer constraintType = result.getType ();
1477
+ assert (constraintType.getLifetime () == PackLifetime::OnHeap);
1478
+
1479
+ if (subjectType.getNumElements () != constraintType.getNumElements ()) {
1480
+ return TYPE_LOOKUP_ERROR_FMT (
1481
+ " mismatched pack lengths in same-type pack requirement %.*s: %lu vs %lu" ,
1482
+ (int )req.getParam ().size (), req.getParam ().data (),
1483
+ subjectType.getNumElements (), constraintType.getNumElements ());
1484
+ }
1485
+
1486
+ for (size_t i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1487
+ auto *subjectElt = subjectType.getElements ()[i];
1488
+ auto *constraintElt = constraintType.getElements ()[i];
1489
+
1490
+ if (subjectElt != constraintElt) {
1491
+ return TYPE_LOOKUP_ERROR_FMT (
1492
+ " subject type %.*s does not match %.*s at pack index %lu" ,
1493
+ (int )req.getParam ().size (),
1494
+ req.getParam ().data (), (int )req.getMangledTypeName ().size (),
1495
+ req.getMangledTypeName ().data (), i);
1496
+ }
1497
+ }
1498
+
1499
+ return llvm::None;
1471
1500
}
1472
1501
1473
1502
case GenericRequirementKind::Layout: {
1474
- for (unsigned i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1503
+ for (size_t i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1475
1504
const Metadata *elt = subjectType.getElements ()[i];
1476
1505
if (auto result = satisfiesLayoutConstraint (req, elt))
1477
1506
return result;
@@ -1490,14 +1519,15 @@ checkGenericPackRequirement(const GenericRequirementDescriptor &req,
1490
1519
auto baseType = result.getType ().getMetadata ();
1491
1520
1492
1521
// Check that each pack element inherits from the base class.
1493
- for (unsigned i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1522
+ for (size_t i = 0 , e = subjectType.getNumElements (); i < e; ++i) {
1494
1523
const Metadata *elt = subjectType.getElements ()[i];
1495
1524
1496
1525
if (!isSubclassOrExistential (elt, baseType))
1497
1526
return TYPE_LOOKUP_ERROR_FMT (
1498
- " %.*s is not subclass of %.*s" , (int )req.getParam ().size (),
1527
+ " %.*s is not subclass of %.*s at pack index %lu" ,
1528
+ (int )req.getParam ().size (),
1499
1529
req.getParam ().data (), (int )req.getMangledTypeName ().size (),
1500
- req.getMangledTypeName ().data ());
1530
+ req.getMangledTypeName ().data (), i );
1501
1531
}
1502
1532
1503
1533
return llvm::None;
0 commit comments