Skip to content

Commit cba7389

Browse files
committed
[Sema] Prevent duplicate diagnostics in oqaque types
1 parent 4a9722e commit cba7389

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

test/type/parameterized_existential.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ struct Collapse<T: DoubleWide>: DoubleWide {
4646

4747
func test() -> any DoubleWide<some DoubleWide<Int, Int>, some DoubleWide<Int, Int>> { return Collapse<Int>(x: 42) }
4848
// expected-error@-1 {{'some' types cannot be used in constraints on existential types}}
49-
// expected-error@-2 {{'some' types cannot be used in constraints on existential types}}
5049

5150
func diagonalizeAny(_ x: any Sequence<Int>) -> any Sequence<(Int, Int)> {
5251
return x.map { ($0, $0) }

0 commit comments

Comments
 (0)