@@ -4423,9 +4423,8 @@ CanTypeWrapper<OpenedArchetypeType> OpenedArchetypeType::getNew(
44234423 ArrayRef<ProtocolDecl *> conformsTo, Type superclass,
44244424 LayoutConstraint layout) {
44254425 // FIXME: It'd be great if all of our callers could submit interface types.
4426- // But the constraint solver submits archetypes when trying to issue checks
4427- // against members of existential types. For now, we'll work around them by
4428- // forcing an interface type.
4426+ // But the constraint solver submits archetypes when e.g. trying to issue
4427+ // checks against members of existential types.
44294428 // assert((!superclass || !superclass->hasArchetype())
44304429 // && "superclass must be interface type");
44314430 auto arena = AllocationArena::Permanent;
@@ -4444,11 +4443,9 @@ CanTypeWrapper<OpenedArchetypeType> OpenedArchetypeType::getNew(
44444443CanTypeWrapper<OpenedArchetypeType>
44454444OpenedArchetypeType::get (CanType existential, const DeclContext *useDC,
44464445 Optional<UUID> knownID) {
4447- Type interfaceType = GenericTypeParamType::get (
4448- /* isTypeSequence=*/ false ,
4449- /* depth*/ useDC->getGenericContextDepth () + 1 , /* index*/ 0 ,
4450- existential->getASTContext ());
4451- return get (existential, interfaceType, useDC, knownID);
4446+ return get (existential,
4447+ OpenedArchetypeType::getSelfInterfaceTypeFromContext (useDC),
4448+ useDC, knownID);
44524449}
44534450
44544451CanOpenedArchetypeType OpenedArchetypeType::get (CanType existential,
@@ -4511,10 +4508,9 @@ CanType OpenedArchetypeType::getAny(CanType existential, Type interfaceType,
45114508
45124509CanType OpenedArchetypeType::getAny (CanType existential,
45134510 const DeclContext *useDC) {
4514- Type interfaceType = GenericTypeParamType::get (
4515- /* isTypeSequence=*/ false , useDC->getGenericContextDepth () + 1 , 0 ,
4516- existential->getASTContext ());
4517- return getAny (existential, interfaceType, useDC);
4511+ return getAny (existential,
4512+ OpenedArchetypeType::getSelfInterfaceTypeFromContext (useDC),
4513+ useDC);
45184514}
45194515
45204516void SubstitutionMap::Storage::Profile (
@@ -5191,6 +5187,18 @@ CanGenericSignature ASTContext::getSingleGenericParameterSignature() const {
51915187 return canonicalSig;
51925188}
51935189
5190+ Type OpenedArchetypeType::getSelfInterfaceTypeFromContext (const DeclContext *useDC) {
5191+ auto typeContext = useDC->getInnermostTypeContext ();
5192+ if (typeContext && typeContext->getSelfProtocolDecl ()) {
5193+ return typeContext->getProtocolSelfType ();
5194+ } else {
5195+ return GenericTypeParamType::get (
5196+ /* isTypeSequence=*/ false ,
5197+ /* depth*/ useDC->getGenericContextDepth () + 1 , /* index*/ 0 ,
5198+ useDC->getASTContext ());
5199+ }
5200+ }
5201+
51945202CanGenericSignature
51955203ASTContext::getOpenedArchetypeSignature (Type type, const DeclContext *useDC) {
51965204 assert (type->isExistentialType ());
@@ -5218,14 +5226,21 @@ ASTContext::getOpenedArchetypeSignature(Type type, const DeclContext *useDC) {
52185226 if (found != getImpl ().ExistentialSignatures .end ())
52195227 return found->second ;
52205228
5221- auto depth = useDC->getGenericContextDepth () + 1 ;
5222- auto genericParam =
5223- GenericTypeParamType::get (/* type sequence*/ false ,
5224- /* depth*/ depth, /* index*/ 0 , *this );
5229+ GenericSignature outerSignature;
5230+ auto *typeContext = useDC->getInnermostTypeContext ();
5231+ if (typeContext && typeContext->getSelfProtocolDecl ()) {
5232+ outerSignature = GenericSignature ();
5233+ } else {
5234+ outerSignature = useDC->getGenericSignatureOfContext ();
5235+ }
5236+
5237+ auto genericParam = OpenedArchetypeType::getSelfInterfaceTypeFromContext (useDC)
5238+ ->getCanonicalType ()->getAs <GenericTypeParamType>();
5239+
52255240 Requirement requirement (RequirementKind::Conformance, genericParam,
52265241 constraint);
52275242 auto genericSig = buildGenericSignature (
5228- *this , useDC-> getGenericSignatureOfContext () .getCanonicalSignature (),
5243+ *this , outerSignature .getCanonicalSignature (),
52295244 {genericParam}, {requirement});
52305245
52315246 CanGenericSignature canGenericSig (genericSig);
0 commit comments