mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #40747 from DougGregor/opaque-type-archetype-environment
This commit is contained in:
@@ -837,7 +837,8 @@ Type ConstraintSystem::openType(Type type, OpenedTypeMap &replacements) {
|
||||
|
||||
Type ConstraintSystem::openOpaqueType(OpaqueTypeArchetypeType *opaque,
|
||||
ConstraintLocatorBuilder locator) {
|
||||
auto opaqueLocatorKey = getOpenOpaqueLocator(locator, opaque->getDecl());
|
||||
auto opaqueDecl = opaque->getDecl();
|
||||
auto opaqueLocatorKey = getOpenOpaqueLocator(locator, opaqueDecl);
|
||||
|
||||
// If we have already opened this opaque type, look in the known set of
|
||||
// replacements.
|
||||
@@ -858,9 +859,22 @@ Type ConstraintSystem::openOpaqueType(OpaqueTypeArchetypeType *opaque,
|
||||
// corresponding to the underlying type should be the constraints on the
|
||||
// underlying return type.
|
||||
auto opaqueLocator = locator.withPathElement(
|
||||
LocatorPathElt::OpenedOpaqueArchetype(opaque->getDecl()));
|
||||
LocatorPathElt::OpenedOpaqueArchetype(opaqueDecl));
|
||||
OpenedTypeMap replacements;
|
||||
openGeneric(DC, opaque->getBoundSignature(), opaqueLocator, replacements);
|
||||
openGeneric(DC, opaqueDecl->getOpaqueInterfaceGenericSignature(),
|
||||
opaqueLocator, replacements);
|
||||
|
||||
// If there is an outer generic signature, bind the outer parameters based
|
||||
// on the substitutions in the opaque type.
|
||||
auto subs = opaque->getSubstitutions();
|
||||
if (auto genericSig = subs.getGenericSignature()) {
|
||||
for (auto *genericParamPtr : genericSig.getGenericParams()) {
|
||||
Type genericParam(genericParamPtr);
|
||||
addConstraint(
|
||||
ConstraintKind::Bind, openType(genericParam, replacements),
|
||||
genericParam.subst(subs), opaqueLocator);
|
||||
}
|
||||
}
|
||||
|
||||
recordOpenedTypes(opaqueLocatorKey, replacements);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user