@@ -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
@@ -1993,6 +1992,8 @@ namespace {
19931992 bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
19941993
19951994 bool diagnoseDisallowedExistential (TypeRepr *repr);
1995+
1996+ bool diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr);
19961997
19971998 NeverNullType resolveOpenedExistentialArchetype (
19981999 TypeAttributes &attrs, TypeRepr *repr,
@@ -2224,6 +2225,14 @@ bool TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr) {
22242225 }
22252226}
22262227
2228+ bool TypeResolver::diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr) {
2229+ if (repr->getConstraint ()->isInvalid ()){
2230+ if (isa<PlaceholderTypeRepr>(repr->getConstraint ()))
2231+ return true ;
2232+ }
2233+ return false ;
2234+ }
2235+
22272236// / Checks the given type, assuming that it appears as an argument for a
22282237// / generic parameter in the \c repr, to see if it is move-only.
22292238// /
@@ -2340,7 +2349,7 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23402349 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
23412350 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)){
23422351 diagnoseDisallowedExistential (repr);
2343- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2352+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
23442353 }
23452354 }
23462355 }
@@ -2363,11 +2372,12 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23632372 auto *DC = getDeclContext ();
23642373
23652374 bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2375+ bool hasInvalidPlaceholder = diagnoseInvalidPlaceHolder (opaqueRepr);
23662376
23672377 if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
23682378 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr)){
2369- if ( !isInExistential)
2370- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal );
2379+ return !isInExistential ? getOpaqueArchetypeIdentity (opaqueDecl, *ordinal )
2380+ : ErrorType::get ( getASTContext () );
23712381 }
23722382 }
23732383
@@ -2383,15 +2393,13 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
23832393 }
23842394 }
23852395 }
2386-
2387- if (!repr->isInvalid ()){
2396+ if (!repr->isInvalid () && !hasInvalidPlaceholder){
23882397 // We are not inside an `OpaqueTypeDecl`, so diagnose an error.
23892398 if (!(options & TypeResolutionFlags::SilenceErrors)) {
23902399 diagnose (opaqueRepr->getOpaqueLoc (),
23912400 diag::unsupported_opaque_type);
23922401 }
23932402 }
2394-
23952403 // Try to resolve the constraint upper bound type as a placeholder.
23962404 options |= TypeResolutionFlags::SilenceErrors;
23972405 auto constraintType = resolveType (opaqueRepr->getConstraint (),
@@ -2455,9 +2463,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
24552463 return ty;
24562464
24572465 // Complain if we're allowed to and bail out with an error.
2458- if (!options.contains (TypeResolutionFlags::SilenceErrors))
2466+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
24592467 ctx.Diags .diagnose (repr->getLoc (),
24602468 diag::placeholder_type_not_allowed);
2469+ }
24612470
24622471 return ErrorType::get (resolution.getASTContext ());
24632472 }
@@ -4083,7 +4092,7 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
40834092 if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
40844093 if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
40854094 diagnoseDisallowedExistential (repr);
4086- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
4095+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
40874096 }
40884097 }
40894098
0 commit comments