@@ -1968,7 +1968,7 @@ namespace {
1968
1968
return diags.diagnose (std::forward<ArgTypes>(Args)...);
1969
1969
}
1970
1970
1971
- Type diagnoseDisallowedExistential (TypeRepr *repr, Type type );
1971
+ bool diagnoseDisallowedExistential (TypeRepr *repr);
1972
1972
1973
1973
NeverNullType resolveOpenedExistentialArchetype (
1974
1974
TypeAttributes &attrs, TypeRepr *repr,
@@ -2136,7 +2136,7 @@ Type ResolveTypeRequest::evaluate(Evaluator &evaluator,
2136
2136
return result;
2137
2137
}
2138
2138
2139
- Type TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr, Type type ) {
2139
+ bool TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr) {
2140
2140
auto options = resolution.getOptions ();
2141
2141
if (!(options & TypeResolutionFlags::SilenceErrors) &&
2142
2142
options.contains (TypeResolutionFlags::DisallowOpaqueTypes)) {
@@ -2148,9 +2148,10 @@ Type TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr, Type type) {
2148
2148
// FIXME: We shouldn't have to invalid the type repr here, but not
2149
2149
// doing so causes a double-diagnostic.
2150
2150
repr->setInvalid ();
2151
+ return true ;
2152
+ } else {
2153
+ return false ;
2151
2154
}
2152
-
2153
- return type;
2154
2155
}
2155
2156
2156
2157
NeverNullType TypeResolver::resolveType (TypeRepr *repr,
@@ -2250,9 +2251,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2250
2251
auto *DC = getDeclContext ();
2251
2252
if (getASTContext ().LangOpts .hasFeature (Feature::ImplicitSome)) {
2252
2253
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2253
- if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr))
2254
- return diagnoseDisallowedExistential (repr,
2255
- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2254
+ if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)){
2255
+ diagnoseDisallowedExistential (repr);
2256
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2257
+ }
2256
2258
}
2257
2259
}
2258
2260
@@ -2272,10 +2274,12 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2272
2274
// evaluation of an `OpaqueResultTypeRequest`.
2273
2275
auto opaqueRepr = cast<OpaqueReturnTypeRepr>(repr);
2274
2276
auto *DC = getDeclContext ();
2277
+
2278
+ bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2279
+
2275
2280
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2276
2281
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr))
2277
- return diagnoseDisallowedExistential (opaqueRepr,
2278
- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2282
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2279
2283
}
2280
2284
2281
2285
// Check whether any of the generic parameters in the context represents
@@ -2285,17 +2289,18 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2285
2289
if (auto genericParams = genericContext->getGenericParams ()) {
2286
2290
for (auto genericParam : *genericParams) {
2287
2291
if (genericParam->getOpaqueTypeRepr () == opaqueRepr)
2288
- return diagnoseDisallowedExistential (opaqueRepr,
2289
- genericParam->getDeclaredInterfaceType ());
2292
+ return genericParam->getDeclaredInterfaceType ();
2290
2293
}
2291
2294
}
2292
2295
}
2293
2296
}
2294
-
2295
- // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2296
- if (!(options & TypeResolutionFlags::SilenceErrors)) {
2297
- diagnose (opaqueRepr->getOpaqueLoc (),
2298
- diag::unsupported_opaque_type);
2297
+
2298
+ if (!isInExistential){
2299
+ // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2300
+ if (!(options & TypeResolutionFlags::SilenceErrors)) {
2301
+ diagnose (opaqueRepr->getOpaqueLoc (),
2302
+ diag::unsupported_opaque_type);
2303
+ }
2299
2304
}
2300
2305
2301
2306
// Try to resolve the constraint upper bound type as a placeholder.
@@ -3889,8 +3894,8 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
3889
3894
// Check whether this type is an implicit opaque result type.
3890
3895
if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
3891
3896
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
3892
- return diagnoseDisallowedExistential (
3893
- repr, getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal) );
3897
+ diagnoseDisallowedExistential (repr);
3898
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
3894
3899
}
3895
3900
}
3896
3901
0 commit comments