Skip to content

Commit 4240b00

Browse files
committed
[Sema] Support GenericIdentTypeReprs as opaque parameters and return type
1 parent ae2c6a1 commit 4240b00

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

lib/AST/NameLookup.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2808,9 +2808,13 @@ CollectedOpaqueReprs swift::collectOpaqueReturnTypeReprs(TypeRepr *r, ASTContext
28082808

28092809
bool walkToTypeReprPre(TypeRepr *repr) override {
28102810
if (auto existential = dyn_cast<ExistentialTypeRepr>(repr)) {
2811-
return false;
2811+
auto generic = dyn_cast<GenericIdentTypeRepr>(existential->getConstraint());
2812+
if(generic)
2813+
Reprs.push_back(existential);
2814+
auto meta = dyn_cast<MetatypeTypeRepr>(existential->getConstraint());
2815+
return meta || generic? true : false;
28122816
}
2813-
2817+
28142818
if (auto opaqueRepr = dyn_cast<OpaqueReturnTypeRepr>(repr)) {
28152819
Reprs.push_back(opaqueRepr);
28162820
if (Ctx.LangOpts.hasFeature(Feature::ImplicitSome))
@@ -2822,6 +2826,14 @@ CollectedOpaqueReprs swift::collectOpaqueReturnTypeReprs(TypeRepr *r, ASTContext
28222826
if (!compositionRepr->isTypeReprAny())
28232827
Reprs.push_back(compositionRepr);
28242828
return false;
2829+
} else if (auto generic = dyn_cast<GenericIdentTypeRepr>(repr)) {
2830+
if (!Reprs.empty()){
2831+
if(isa<ExistentialTypeRepr>(Reprs.front())){
2832+
Reprs.clear();
2833+
return true;
2834+
}
2835+
}
2836+
Reprs.push_back(generic);
28252837
} else if (auto identRepr = dyn_cast<IdentTypeRepr>(repr)) {
28262838
if (identRepr->isProtocol(dc))
28272839
Reprs.push_back(identRepr);

lib/Sema/TypeCheckType.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2259,13 +2259,29 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
22592259
}
22602260
return ty;
22612261
};
2262+
2263+
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2264+
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal(repr))
2265+
return diagnoseDisallowedExistential(getIdentityOpaqueTypeArchetypeType(opaqueDecl, *ordinal));
2266+
}
22622267

2263-
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2264-
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal(repr))
2265-
return diagnoseDisallowedExistential(getIdentityOpaqueTypeArchetypeType(opaqueDecl, *ordinal));
2266-
} else {
2267-
return resolveIdentifierType(cast<IdentTypeRepr>(repr), options);
2268+
// Check whether any of the generic parameters in the context represents
2269+
// this opaque type. If so, return that generic parameter.
2270+
if (options.isConstraintImplicitExistential()) {
2271+
if (auto declDC = DC->getAsDecl()) {
2272+
if (auto genericContext = declDC->getAsGenericContext()) {
2273+
if (auto genericParams = genericContext->getGenericParams()) {
2274+
for (auto genericParam : *genericParams) {
2275+
if (genericParam->getOpaqueTypeRepr() == repr)
2276+
return diagnoseDisallowedExistential(
2277+
genericParam->getDeclaredInterfaceType());
2278+
}
2279+
}
2280+
}
22682281
}
2282+
}
2283+
2284+
return resolveIdentifierType(cast<IdentTypeRepr>(repr), options);
22692285
}
22702286

22712287
case TypeReprKind::Function: {

test/type/opaque_parameterized_existential.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -disable-availability-checking -typecheck -verify %s
2+
// RUN: %target-swift-frontend -disable-availability-checking -enable-experimental-implicit-some -typecheck -verify %s
23

34
// I do not like nested some type params,
45
// I do not like them Σam-i-am

0 commit comments

Comments
 (0)