@@ -1990,8 +1990,9 @@ namespace {
19901990 return diags.diagnose (std::forward<ArgTypes>(Args)...);
19911991 }
19921992
1993- Type diagnoseDisallowedExistential (TypeRepr *repr, Type type);
19941993 bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
1994+
1995+ bool diagnoseDisallowedExistential (TypeRepr *repr);
19951996
19961997 NeverNullType resolveOpenedExistentialArchetype (
19971998 TypeAttributes &attrs, TypeRepr *repr,
@@ -2205,7 +2206,7 @@ static Type evaluateTypeResolution(const TypeResolution *resolution,
22052206 return result;
22062207}
22072208
2208- Type TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr, Type type ) {
2209+ bool TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr) {
22092210 auto options = resolution.getOptions ();
22102211 if (!(options & TypeResolutionFlags::SilenceErrors) &&
22112212 options.contains (TypeResolutionFlags::DisallowOpaqueTypes)) {
@@ -2217,9 +2218,10 @@ Type TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr, Type type) {
22172218 // FIXME: We shouldn't have to invalid the type repr here, but not
22182219 // doing so causes a double-diagnostic.
22192220 repr->setInvalid ();
2221+ return true ;
2222+ } else {
2223+ return false ;
22202224 }
2221-
2222- return type;
22232225}
22242226
22252227// / Checks the given type, assuming that it appears as an argument for a
@@ -2336,9 +2338,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23362338 auto *DC = getDeclContext ();
23372339 if (getASTContext ().LangOpts .hasFeature (Feature::ImplicitSome)) {
23382340 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+ }
23422345 }
23432346 }
23442347
@@ -2358,10 +2361,12 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23582361 // evaluation of an `OpaqueResultTypeRequest`.
23592362 auto opaqueRepr = cast<OpaqueReturnTypeRepr>(repr);
23602363 auto *DC = getDeclContext ();
2364+
2365+ bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2366+
23612367 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
23622368 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr))
2363- return diagnoseDisallowedExistential (opaqueRepr,
2364- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2369+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
23652370 }
23662371
23672372 // Check whether any of the generic parameters in the context represents
@@ -2371,17 +2376,18 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23712376 if (auto genericParams = genericContext->getGenericParams ()) {
23722377 for (auto genericParam : *genericParams) {
23732378 if (genericParam->getOpaqueTypeRepr () == opaqueRepr)
2374- return diagnoseDisallowedExistential (opaqueRepr,
2375- genericParam->getDeclaredInterfaceType ());
2379+ return genericParam->getDeclaredInterfaceType ();
23762380 }
23772381 }
23782382 }
23792383 }
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+ }
23852391 }
23862392
23872393 // Try to resolve the constraint upper bound type as a placeholder.
@@ -4074,8 +4080,8 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
40744080 // Check whether this type is an implicit opaque result type.
40754081 if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
40764082 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
4077- return diagnoseDisallowedExistential (
4078- repr, getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal) );
4083+ diagnoseDisallowedExistential (repr);
4084+ return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
40794085 }
40804086 }
40814087
0 commit comments