@@ -360,7 +360,7 @@ TypeChecker::getDynamicBridgedThroughObjCClass(DeclContext *dc,
360
360
}
361
361
362
362
// / Retrieve the identity form of the opaque type archetype type.
363
- static Type getIdentityOpaqueTypeArchetypeType (
363
+ static Type getOpaqueArchetypeIdentity (
364
364
OpaqueTypeDecl *opaqueDecl, unsigned ordinal) {
365
365
auto outerGenericSignature = opaqueDecl->getNamingDecl ()
366
366
->getInnermostDeclContext ()
@@ -418,8 +418,7 @@ Type TypeResolution::resolveTypeInContext(TypeDecl *typeDecl,
418
418
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
419
419
if (genericParam->getDepth () ==
420
420
opaqueDecl->getOpaqueGenericParams ().front ()->getDepth ()) {
421
- return getIdentityOpaqueTypeArchetypeType (
422
- opaqueDecl, genericParam->getIndex ());
421
+ return getOpaqueArchetypeIdentity (opaqueDecl, genericParam->getIndex ());
423
422
}
424
423
}
425
424
@@ -1993,6 +1992,8 @@ namespace {
1993
1992
bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
1994
1993
1995
1994
bool diagnoseDisallowedExistential (TypeRepr *repr);
1995
+
1996
+ bool diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr);
1996
1997
1997
1998
NeverNullType resolveOpenedExistentialArchetype (
1998
1999
TypeAttributes &attrs, TypeRepr *repr,
@@ -2224,6 +2225,14 @@ bool TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr) {
2224
2225
}
2225
2226
}
2226
2227
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
+
2227
2236
// / Checks the given type, assuming that it appears as an argument for a
2228
2237
// / generic parameter in the \c repr, to see if it is move-only.
2229
2238
// /
@@ -2340,7 +2349,7 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2340
2349
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2341
2350
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)){
2342
2351
diagnoseDisallowedExistential (repr);
2343
- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
2352
+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
2344
2353
}
2345
2354
}
2346
2355
}
@@ -2363,11 +2372,12 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2363
2372
auto *DC = getDeclContext ();
2364
2373
2365
2374
bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2375
+ bool hasInvalidPlaceholder = diagnoseInvalidPlaceHolder (opaqueRepr);
2366
2376
2367
2377
if (auto opaqueDecl = dyn_cast<OpaqueTypeDecl>(DC)) {
2368
2378
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (opaqueRepr)){
2369
- if ( !isInExistential)
2370
- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal );
2379
+ return !isInExistential ? getOpaqueArchetypeIdentity (opaqueDecl, *ordinal )
2380
+ : ErrorType::get ( getASTContext () );
2371
2381
}
2372
2382
}
2373
2383
@@ -2383,15 +2393,13 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2383
2393
}
2384
2394
}
2385
2395
}
2386
-
2387
- if (!repr->isInvalid ()){
2396
+ if (!repr->isInvalid () && !hasInvalidPlaceholder){
2388
2397
// We are not inside an `OpaqueTypeDecl`, so diagnose an error.
2389
2398
if (!(options & TypeResolutionFlags::SilenceErrors)) {
2390
2399
diagnose (opaqueRepr->getOpaqueLoc (),
2391
2400
diag::unsupported_opaque_type);
2392
2401
}
2393
2402
}
2394
-
2395
2403
// Try to resolve the constraint upper bound type as a placeholder.
2396
2404
options |= TypeResolutionFlags::SilenceErrors;
2397
2405
auto constraintType = resolveType (opaqueRepr->getConstraint (),
@@ -2455,9 +2463,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2455
2463
return ty;
2456
2464
2457
2465
// Complain if we're allowed to and bail out with an error.
2458
- if (!options.contains (TypeResolutionFlags::SilenceErrors))
2466
+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
2459
2467
ctx.Diags .diagnose (repr->getLoc (),
2460
2468
diag::placeholder_type_not_allowed);
2469
+ }
2461
2470
2462
2471
return ErrorType::get (resolution.getASTContext ());
2463
2472
}
@@ -4083,7 +4092,7 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4083
4092
if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
4084
4093
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
4085
4094
diagnoseDisallowedExistential (repr);
4086
- return getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal);
4095
+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
4087
4096
}
4088
4097
}
4089
4098
0 commit comments