@@ -1990,8 +1990,9 @@ namespace {
1990
1990
return diags.diagnose (std::forward<ArgTypes>(Args)...);
1991
1991
}
1992
1992
1993
- Type diagnoseDisallowedExistential (TypeRepr *repr, Type type);
1994
1993
bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
1994
+
1995
+ bool diagnoseDisallowedExistential (TypeRepr *repr);
1995
1996
1996
1997
NeverNullType resolveOpenedExistentialArchetype (
1997
1998
TypeAttributes &attrs, TypeRepr *repr,
@@ -2205,7 +2206,7 @@ static Type evaluateTypeResolution(const TypeResolution *resolution,
2205
2206
return result;
2206
2207
}
2207
2208
2208
- Type TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr, Type type ) {
2209
+ bool TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr) {
2209
2210
auto options = resolution.getOptions ();
2210
2211
if (!(options & TypeResolutionFlags::SilenceErrors) &&
2211
2212
options.contains (TypeResolutionFlags::DisallowOpaqueTypes)) {
@@ -2217,9 +2218,10 @@ Type TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr, Type type) {
2217
2218
// FIXME: We shouldn't have to invalid the type repr here, but not
2218
2219
// doing so causes a double-diagnostic.
2219
2220
repr->setInvalid ();
2221
+ return true ;
2222
+ } else {
2223
+ return false ;
2220
2224
}
2221
-
2222
- return type;
2223
2225
}
2224
2226
2225
2227
// / Checks the given type, assuming that it appears as an argument for a
@@ -2336,9 +2338,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2336
2338
auto *DC = getDeclContext ();
2337
2339
if (getASTContext ().LangOpts .hasFeature (Feature::ImplicitSome)) {
2338
2340
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2339
- if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr))
2340
- return diagnoseDisallowedExistential (repr,
2341
- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2341
+ if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)){
2342
+ diagnoseDisallowedExistential (repr);
2343
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2344
+ }
2342
2345
}
2343
2346
}
2344
2347
@@ -2358,10 +2361,12 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2358
2361
// evaluation of an `OpaqueResultTypeRequest`.
2359
2362
auto opaqueRepr = cast<OpaqueReturnTypeRepr>(repr);
2360
2363
auto *DC = getDeclContext ();
2364
+
2365
+ bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2366
+
2361
2367
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2362
2368
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr))
2363
- return diagnoseDisallowedExistential (opaqueRepr,
2364
- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2369
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2365
2370
}
2366
2371
2367
2372
// Check whether any of the generic parameters in the context represents
@@ -2371,17 +2376,18 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2371
2376
if (auto genericParams = genericContext->getGenericParams ()) {
2372
2377
for (auto genericParam : *genericParams) {
2373
2378
if (genericParam->getOpaqueTypeRepr () == opaqueRepr)
2374
- return diagnoseDisallowedExistential (opaqueRepr,
2375
- genericParam->getDeclaredInterfaceType ());
2379
+ return genericParam->getDeclaredInterfaceType ();
2376
2380
}
2377
2381
}
2378
2382
}
2379
2383
}
2380
-
2381
- // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2382
- if (!(options & TypeResolutionFlags::SilenceErrors)) {
2383
- diagnose (opaqueRepr->getOpaqueLoc (),
2384
- diag::unsupported_opaque_type);
2384
+
2385
+ if (!isInExistential){
2386
+ // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2387
+ if (!(options & TypeResolutionFlags::SilenceErrors)) {
2388
+ diagnose (opaqueRepr->getOpaqueLoc (),
2389
+ diag::unsupported_opaque_type);
2390
+ }
2385
2391
}
2386
2392
2387
2393
// Try to resolve the constraint upper bound type as a placeholder.
@@ -4074,8 +4080,8 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4074
4080
// Check whether this type is an implicit opaque result type.
4075
4081
if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
4076
4082
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
4077
- return diagnoseDisallowedExistential (
4078
- repr, getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal) );
4083
+ diagnoseDisallowedExistential (repr);
4084
+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
4079
4085
}
4080
4086
}
4081
4087
0 commit comments