Skip to content

Commit dbac940

Browse files
authored
Merge pull request #21325 from slavapestov/invalid-generic-typealias-5.0
Sema: Don't allow generic typealiases to have an unbound generic underlying type [5.0]
2 parents 12e873d + 083ca48 commit dbac940

File tree

5 files changed

+21
-6
lines changed

5 files changed

+21
-6
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3563,7 +3563,11 @@ void TypeChecker::typeCheckDecl(Decl *D) {
35633563

35643564
/// Validate the underlying type of the given typealias.
35653565
static void validateTypealiasType(TypeChecker &tc, TypeAliasDecl *typeAlias) {
3566-
TypeResolutionOptions options(TypeResolverContext::TypeAliasDecl);
3566+
TypeResolutionOptions options(
3567+
(typeAlias->getGenericParams() ?
3568+
TypeResolverContext::GenericTypeAliasDecl :
3569+
TypeResolverContext::TypeAliasDecl));
3570+
35673571
if (!typeAlias->getDeclContext()->isCascadingContextForLookup(
35683572
/*functionsAreNonCascading*/true)) {
35693573
options |= TypeResolutionFlags::KnownNonCascadingDependency;
@@ -4566,7 +4570,10 @@ void TypeChecker::validateDeclForNameLookup(ValueDecl *D) {
45664570
if (typealias->isBeingValidated()) return;
45674571

45684572
auto helper = [&] {
4569-
TypeResolutionOptions options(TypeResolverContext::TypeAliasDecl);
4573+
TypeResolutionOptions options(
4574+
(typealias->getGenericParams() ?
4575+
TypeResolverContext::GenericTypeAliasDecl :
4576+
TypeResolverContext::TypeAliasDecl));
45704577
if (validateType(typealias->getUnderlyingTypeLoc(),
45714578
TypeResolution::forStructural(typealias), options)) {
45724579
typealias->setInvalid();

lib/Sema/TypeCheckType.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2894,6 +2894,7 @@ Type TypeResolver::resolveImplicitlyUnwrappedOptionalType(
28942894
case TypeResolverContext::EnumElementDecl:
28952895
case TypeResolverContext::EnumPatternPayload:
28962896
case TypeResolverContext::TypeAliasDecl:
2897+
case TypeResolverContext::GenericTypeAliasDecl:
28972898
case TypeResolverContext::GenericRequirement:
28982899
case TypeResolverContext::ImmediateOptionalTypeArgument:
28992900
case TypeResolverContext::InExpression:

lib/Sema/TypeCheckType.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,12 @@ enum class TypeResolverContext : uint8_t {
118118
/// Whether this is the payload subpattern of an enum pattern.
119119
EnumPatternPayload,
120120

121-
/// Whether we are checking the underlying type of a typealias.
121+
/// Whether we are checking the underlying type of a non-generic typealias.
122122
TypeAliasDecl,
123123

124+
/// Whether we are checking the underlying type of a generic typealias.
125+
GenericTypeAliasDecl,
126+
124127
/// Whether we are in a requirement of a generic declaration
125128
GenericRequirement,
126129

@@ -207,6 +210,7 @@ class TypeResolutionOptions {
207210
case Context::EnumElementDecl:
208211
case Context::EnumPatternPayload:
209212
case Context::TypeAliasDecl:
213+
case Context::GenericTypeAliasDecl:
210214
case Context::GenericRequirement:
211215
case Context::ImmediateOptionalTypeArgument:
212216
case Context::AbstractFunctionDecl:

test/decl/nested/type_in_type.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,9 @@ extension OuterGeneric.MidGeneric : HasAssocType {
298298
func takesAssocType(first: D, second: F) {}
299299
}
300300

301-
typealias OuterGenericMidGeneric<T> = OuterGeneric<T>.MidGeneric
301+
typealias OuterGenericMidNonGeneric<T> = OuterGeneric<T>.MidNonGeneric
302302

303-
extension OuterGenericMidGeneric {
303+
extension OuterGenericMidNonGeneric {
304304

305305
}
306306

test/decl/typealias/generic.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %target-typecheck-verify-swift
22

3-
struct MyType<TyA, TyB> {
3+
struct MyType<TyA, TyB> { // expected-note {{generic type 'MyType' declared here}}
44
var a : TyA, b : TyB
55
}
66

@@ -105,6 +105,9 @@ _ = C(a: 42, // expected-error {{'Int' is not convertible to 'String'}}
105105
_ = G(a: "foo", b: 42)
106106
_ = G<Int, String>(a: "foo", b: 42)
107107

108+
// Generic typealias cannot have unbound generic type.
109+
typealias VeryBad1<T> = MyType // expected-error {{reference to generic type 'MyType' requires arguments in <...>}}
110+
typealias VeryBad2<T> = Swift.Array // expected-error {{reference to generic type 'Array' requires arguments in <...>}}
108111

109112
struct MyTypeWithHashable<TyA, TyB : Hashable> {
110113
}

0 commit comments

Comments
 (0)