@@ -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
@@ -1990,8 +1989,11 @@ namespace {
1990
1989
return diags.diagnose (std::forward<ArgTypes>(Args)...);
1991
1990
}
1992
1991
1993
- Type diagnoseDisallowedExistential (TypeRepr *repr, Type type);
1994
1992
bool diagnoseMoveOnly (TypeRepr *repr, Type genericArgTy);
1993
+
1994
+ bool diagnoseDisallowedExistential (TypeRepr *repr);
1995
+
1996
+ bool diagnoseInvalidPlaceHolder (OpaqueReturnTypeRepr *repr);
1995
1997
1996
1998
NeverNullType resolveOpenedExistentialArchetype (
1997
1999
TypeAttributes &attrs, TypeRepr *repr,
@@ -2205,7 +2207,7 @@ static Type evaluateTypeResolution(const TypeResolution *resolution,
2205
2207
return result;
2206
2208
}
2207
2209
2208
- Type TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr, Type type ) {
2210
+ bool TypeResolver::diagnoseDisallowedExistential (TypeRepr *repr) {
2209
2211
auto options = resolution.getOptions ();
2210
2212
if (!(options & TypeResolutionFlags::SilenceErrors) &&
2211
2213
options.contains (TypeResolutionFlags::DisallowOpaqueTypes)) {
@@ -2217,9 +2219,18 @@ Type TypeResolver::diagnoseDisallowedExistential(TypeRepr *repr, Type type) {
2217
2219
// FIXME: We shouldn't have to invalid the type repr here, but not
2218
2220
// doing so causes a double-diagnostic.
2219
2221
repr->setInvalid ();
2222
+ return true ;
2223
+ } else {
2224
+ return false ;
2220
2225
}
2226
+ }
2221
2227
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 ;
2223
2234
}
2224
2235
2225
2236
// / Checks the given type, assuming that it appears as an argument for a
@@ -2336,9 +2347,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2336
2347
auto *DC = getDeclContext ();
2337
2348
if (getASTContext ().LangOpts .hasFeature (Feature::ImplicitSome)) {
2338
2349
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
+ }
2342
2354
}
2343
2355
}
2344
2356
@@ -2358,10 +2370,15 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2358
2370
// evaluation of an `OpaqueResultTypeRequest`.
2359
2371
auto opaqueRepr = cast<OpaqueReturnTypeRepr>(repr);
2360
2372
auto *DC = getDeclContext ();
2373
+
2374
+ bool isInExistential = diagnoseDisallowedExistential (opaqueRepr);
2375
+ bool hasInvalidPlaceholder = diagnoseInvalidPlaceHolder (opaqueRepr);
2376
+
2361
2377
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
+ }
2365
2382
}
2366
2383
2367
2384
// Check whether any of the generic parameters in the context represents
@@ -2371,19 +2388,18 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2371
2388
if (auto genericParams = genericContext->getGenericParams ()) {
2372
2389
for (auto genericParam : *genericParams) {
2373
2390
if (genericParam->getOpaqueTypeRepr () == opaqueRepr)
2374
- return diagnoseDisallowedExistential (opaqueRepr,
2375
- genericParam->getDeclaredInterfaceType ());
2391
+ return genericParam->getDeclaredInterfaceType ();
2376
2392
}
2377
2393
}
2378
2394
}
2379
2395
}
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
+ }
2385
2402
}
2386
-
2387
2403
// Try to resolve the constraint upper bound type as a placeholder.
2388
2404
options |= TypeResolutionFlags::SilenceErrors;
2389
2405
auto constraintType = resolveType (opaqueRepr->getConstraint (),
@@ -2447,9 +2463,10 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
2447
2463
return ty;
2448
2464
2449
2465
// Complain if we're allowed to and bail out with an error.
2450
- if (!options.contains (TypeResolutionFlags::SilenceErrors))
2466
+ if (!options.contains (TypeResolutionFlags::SilenceErrors)) {
2451
2467
ctx.Diags .diagnose (repr->getLoc (),
2452
2468
diag::placeholder_type_not_allowed);
2469
+ }
2453
2470
2454
2471
return ErrorType::get (resolution.getASTContext ());
2455
2472
}
@@ -4074,8 +4091,8 @@ TypeResolver::resolveDeclRefTypeRepr(DeclRefTypeRepr *repr,
4074
4091
// Check whether this type is an implicit opaque result type.
4075
4092
if (auto *opaqueDecl = dyn_cast<OpaqueTypeDecl>(getDeclContext ())) {
4076
4093
if (auto ordinal = opaqueDecl->getAnonymousOpaqueParamOrdinal (repr)) {
4077
- return diagnoseDisallowedExistential (
4078
- repr, getIdentityOpaqueTypeArchetypeType (opaqueDecl, *ordinal) );
4094
+ diagnoseDisallowedExistential (repr);
4095
+ return getOpaqueArchetypeIdentity (opaqueDecl, *ordinal);
4079
4096
}
4080
4097
}
4081
4098
@@ -4706,6 +4723,7 @@ TypeResolver::resolveExistentialType(ExistentialTypeRepr *repr,
4706
4723
if (constraintType->hasError ())
4707
4724
return ErrorType::get (getASTContext ());
4708
4725
4726
+ // TO-DO: generalize this and emit the same erorr for some P?
4709
4727
if (!constraintType->isConstraintType ()) {
4710
4728
// Emit a tailored diagnostic for the incorrect optional
4711
4729
// syntax 'any P?' with a fix-it to add parenthesis.
0 commit comments