@@ -360,7 +360,7 @@ TypeChecker::getDynamicBridgedThroughObjCClass(DeclContext *dc,
360360}
361361
362362// / Retrieve the identity form of the opaque type archetype type.
363- static Type getIdentityOpaqueTypeArchetypeType (
363+ static Type getOpaqueArchetypeIdentity (
364364 OpaqueTypeDecl *opaqueDecl, unsigned ordinal) {
365365 auto outerGenericSignature = opaqueDecl->getNamingDecl ()
366366 ->getInnermostDeclContext ()
@@ -418,8 +418,7 @@ Type TypeResolution::resolveTypeInContext(TypeDecl *typeDecl,
418418 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
419419 if (genericParam->getDepth () ==
420420 opaqueDecl->getOpaqueGenericParams ().front ()->getDepth ()) {
421- return getIdentityOpaqueTypeArchetypeType (
422- opaqueDecl, genericParam->getIndex ());
421+ return getOpaqueArchetypeIdentity (opaqueDecl, genericParam->getIndex ());
423422 }
424423 }
425424
@@ -1990,8 +1989,11 @@ namespace {
19901989 return diags.diagnose (std::forward<ArgTypes>(Args)...);
19911990 }
19921991
1993- Type diagnoseDisallowedExistential (TypeRepr *repr, Type type);
19941992 bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
1993+
1994+ bool diagnoseDisallowedExistential (TypeRepr *repr);
1995+
1996+ bool diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr);
19951997
19961998 NeverNullType resolveOpenedExistentialArchetype (
19971999 TypeAttributes &attrs, TypeRepr *repr,
@@ -2205,7 +2207,7 @@ static Type evaluateTypeResolution(const TypeResolution *resolution,
22052207 return result;
22062208}
22072209
2208- Type TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr, Type type ) {
2210+ bool TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr) {
22092211 auto options = resolution.getOptions ();
22102212 if (!(options & TypeResolutionFlags::SilenceErrors) &&
22112213 options.contains (TypeResolutionFlags::DisallowOpaqueTypes)) {
@@ -2217,9 +2219,18 @@ Type TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr, Type type) {
22172219 // FIXME: We shouldn't have to invalid the type repr here, but not
22182220 // doing so causes a double-diagnostic.
22192221 repr->setInvalid ();
2222+ return true ;
2223+ } else {
2224+ return false ;
22202225 }
2226+ }
22212227
2222- return type;
2228+ bool TypeResolver::diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr) {
2229+ if (repr->getConstraint ()->isInvalid ()){
2230+ if (isa<PlaceholderTypeRepr>(repr->getConstraint ()))
2231+ return true ;
2232+ }
2233+ return false ;
22232234}
22242235
22252236// / Checks the given type, assuming that it appears as an argument for a
@@ -2336,9 +2347,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23362347 auto *DC = getDeclContext ();
23372348 if (getASTContext ().LangOpts .hasFeature (Feature::ImplicitSome)) {
23382349 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2339- if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr))
2340- return diagnoseDisallowedExistential (repr,
2341- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2350+ if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)){
2351+ diagnoseDisallowedExistential (repr);
2352+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
2353+ }
23422354 }
23432355 }
23442356
@@ -2358,10 +2370,15 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23582370 // evaluation of an `OpaqueResultTypeRequest`.
23592371 auto opaqueRepr = cast<OpaqueReturnTypeRepr>(repr);
23602372 auto *DC = getDeclContext ();
2373+
2374+ bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2375+ bool hasInvalidPlaceholder = diagnoseInvalidPlaceHolder (opaqueRepr);
2376+
23612377 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2362- if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr))
2363- return diagnoseDisallowedExistential (opaqueRepr,
2364- getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal));
2378+ if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr)){
2379+ return !isInExistential ? getOpaqueArchetypeIdentity (opaqueDecl, *ordinal)
2380+ : ErrorType::get (getASTContext ());
2381+ }
23652382 }
23662383
23672384 // Check whether any of the generic parameters in the context represents
@@ -2371,19 +2388,18 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23712388 if (auto genericParams = genericContext->getGenericParams ()) {
23722389 for (auto genericParam : *genericParams) {
23732390 if (genericParam->getOpaqueTypeRepr () == opaqueRepr)
2374- return diagnoseDisallowedExistential (opaqueRepr,
2375- genericParam->getDeclaredInterfaceType ());
2391+ return genericParam->getDeclaredInterfaceType ();
23762392 }
23772393 }
23782394 }
23792395 }
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);
2396+ if (!repr->isInvalid () && !hasInvalidPlaceholder){
2397+ // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2398+ if (!(options & TypeResolutionFlags::SilenceErrors)) {
2399+ diagnose (opaqueRepr->getOpaqueLoc (),
2400+ diag::unsupported_opaque_type);
2401+ }
23852402 }
2386-
23872403 // Try to resolve the constraint upper bound type as a placeholder.
23882404 options |= TypeResolutionFlags::SilenceErrors;
23892405 auto constraintType = resolveType (opaqueRepr->getConstraint (),
@@ -2447,9 +2463,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
24472463 return ty;
24482464
24492465 // Complain if we're allowed to and bail out with an error.
2450- if (!options.contains (TypeResolutionFlags::SilenceErrors))
2466+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
24512467 ctx.Diags .diagnose (repr->getLoc (),
24522468 diag::placeholder_type_not_allowed);
2469+ }
24532470
24542471 return ErrorType::get (resolution.getASTContext ());
24552472 }
@@ -4074,8 +4091,8 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
40744091 // Check whether this type is an implicit opaque result type.
40754092 if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
40764093 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
4077- return diagnoseDisallowedExistential (
4078- repr, getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal) );
4094+ diagnoseDisallowedExistential (repr);
4095+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
40794096 }
40804097 }
40814098
@@ -4706,6 +4723,7 @@ TypeResolver::resolveExistentialType(ExistentialTypeRepr *repr,
47064723 if (constraintType->hasError ())
47074724 return ErrorType::get (getASTContext ());
47084725
4726+ // TO-DO: generalize this and emit the same erorr for some P?
47094727 if (!constraintType->isConstraintType ()) {
47104728 // Emit a tailored diagnostic for the incorrect optional
47114729 // syntax 'any P?' with a fix-it to add parenthesis.
0 commit comments