@@ -1344,24 +1344,37 @@ static llvm::Optional<TypeLookupError>
13441344checkGenericRequirement (const GenericRequirementDescriptor &req,
13451345 llvm::SmallVectorImpl<const void *> &extraArguments,
13461346 SubstGenericParameterFn substGenericParam,
1347- SubstDependentWitnessTableFn substWitnessTable) {
1347+ SubstDependentWitnessTableFn substWitnessTable,
1348+ bool allowsUnresolvedSubject) {
13481349 assert (!req.getFlags ().isPackRequirement ());
13491350
13501351 // Make sure we understand the requirement we're dealing with.
13511352 if (!req.hasKnownKind ())
13521353 return TypeLookupError (" unknown kind" );
13531354
1355+ const Metadata *subjectType = nullptr ;
1356+
13541357 // Resolve the subject generic parameter.
13551358 auto result = swift_getTypeByMangledName (
13561359 MetadataState::Abstract, req.getParam (), extraArguments.data (),
13571360 substGenericParam, substWitnessTable);
1358- if (result.getError ())
1361+
1362+ if (!allowsUnresolvedSubject && result.isError ()) {
13591363 return *result.getError ();
1360- const Metadata *subjectType = result.getType ().getMetadata ();
1364+ }
1365+
1366+ if (!result.isError ()) {
1367+ subjectType = result.getType ().getMetadata ();
1368+ }
13611369
13621370 // Check the requirement.
13631371 switch (req.getKind ()) {
13641372 case GenericRequirementKind::Protocol: {
1373+ // Protocol requirements _require_ a subject type.
1374+ if (result.isError ()) {
1375+ return *result.getError ();
1376+ }
1377+
13651378 const WitnessTable *witnessTable = nullptr ;
13661379 if (!_conformsToProtocol (nullptr , subjectType, req.getProtocol (),
13671380 &witnessTable)) {
@@ -1382,16 +1395,37 @@ checkGenericRequirement(const GenericRequirementDescriptor &req,
13821395 }
13831396
13841397 case GenericRequirementKind::SameType: {
1398+ // Same type requirements don't require a valid subject.
1399+
1400+ const Metadata *sameType = nullptr ;
1401+
13851402 // Demangle the second type under the given substitutions.
13861403 auto result = swift_getTypeByMangledName (
13871404 MetadataState::Abstract, req.getMangledTypeName (),
13881405 extraArguments.data (), substGenericParam, substWitnessTable);
1389- if (result.getError ())
1406+
1407+ if (!allowsUnresolvedSubject && result.isError ()) {
13901408 return *result.getError ();
1391- auto otherType = result.getType ().getMetadata ();
1409+ }
1410+
1411+ if (!result.isError ()) {
1412+ sameType = result.getType ().getMetadata ();
1413+ }
1414+
1415+ // If we don't have one of either the subject type or the same type and we
1416+ // have the other, then return this as a success. This assumes the given
1417+ // extra arguments have provided only the required key arguments in which
1418+ // case some same type constraints may concretize some generic arguments
1419+ // making them non-key.
1420+ //
1421+ // Note: We don't need to check for allowsUnresolvedSubject here because
1422+ // these can only be null in the case where we do allow it.
1423+ if ((!subjectType && sameType) || (subjectType && !sameType)) {
1424+ return llvm::None;
1425+ }
13921426
13931427 // Check that the types are equivalent.
1394- if (subjectType != otherType ) {
1428+ if (subjectType != sameType ) {
13951429 return TYPE_LOOKUP_ERROR_FMT (
13961430 " subject type %.*s does not match %.*s" , (int )req.getParam ().size (),
13971431 req.getParam ().data (), (int )req.getMangledTypeName ().size (),
@@ -1402,10 +1436,20 @@ checkGenericRequirement(const GenericRequirementDescriptor &req,
14021436 }
14031437
14041438 case GenericRequirementKind::Layout: {
1439+ // Layout requirements _require_ a subject type.
1440+ if (result.isError ()) {
1441+ return *result.getError ();
1442+ }
1443+
14051444 return satisfiesLayoutConstraint (req, subjectType);
14061445 }
14071446
14081447 case GenericRequirementKind::BaseClass: {
1448+ // Base class requirements _require_ a subject type.
1449+ if (result.isError ()) {
1450+ return *result.getError ();
1451+ }
1452+
14091453 // Demangle the base type under the given substitutions.
14101454 auto result = swift_getTypeByMangledName (
14111455 MetadataState::Abstract, req.getMangledTypeName (),
@@ -1594,7 +1638,8 @@ llvm::Optional<TypeLookupError> swift::_checkGenericRequirements(
15941638 llvm::ArrayRef<GenericRequirementDescriptor> requirements,
15951639 llvm::SmallVectorImpl<const void *> &extraArguments,
15961640 SubstGenericParameterFn substGenericParam,
1597- SubstDependentWitnessTableFn substWitnessTable) {
1641+ SubstDependentWitnessTableFn substWitnessTable,
1642+ bool allowsUnresolvedSubject) {
15981643 for (const auto &req : requirements) {
15991644 if (req.getFlags ().isPackRequirement ()) {
16001645 auto error = checkGenericPackRequirement (req, extraArguments,
@@ -1605,7 +1650,8 @@ llvm::Optional<TypeLookupError> swift::_checkGenericRequirements(
16051650 } else {
16061651 auto error = checkGenericRequirement (req, extraArguments,
16071652 substGenericParam,
1608- substWitnessTable);
1653+ substWitnessTable,
1654+ allowsUnresolvedSubject);
16091655 if (error)
16101656 return error;
16111657 }
0 commit comments