From bab227ddea02218645cd7b419572ea1a72113483 Mon Sep 17 00:00:00 2001 From: Sima Nerush Date: Tue, 13 Jun 2023 23:16:12 -0700 Subject: [PATCH 1/2] Ban explicit local variable packs --- lib/Sema/TypeCheckType.cpp | 2 +- lib/Sema/TypeCheckType.h | 7 +------ test/Constraints/pack-expansion-expressions.swift | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/Sema/TypeCheckType.cpp b/lib/Sema/TypeCheckType.cpp index 6926bef6593d0..43a05f21621a2 100644 --- a/lib/Sema/TypeCheckType.cpp +++ b/lib/Sema/TypeCheckType.cpp @@ -4617,7 +4617,7 @@ NeverNullType TypeResolver::resolvePackExpansionType(PackExpansionTypeRepr *repr } // We might not allow variadic expansions here at all. - if (!options.isPackExpansionSupported(getDeclContext())) { + if (!options.isPackExpansionSupported()) { diagnose(repr->getLoc(), diag::expansion_not_allowed, result); return ErrorType::get(ctx); } diff --git a/lib/Sema/TypeCheckType.h b/lib/Sema/TypeCheckType.h index 621349220e058..483fd718ce23e 100644 --- a/lib/Sema/TypeCheckType.h +++ b/lib/Sema/TypeCheckType.h @@ -335,7 +335,7 @@ class TypeResolutionOptions { } /// Whether pack expansion types are supported in this context. - bool isPackExpansionSupported(DeclContext *dc) const { + bool isPackExpansionSupported() const { switch (context) { case Context::FunctionInput: case Context::VariadicFunctionInput: @@ -343,12 +343,7 @@ class TypeResolutionOptions { case Context::TupleElement: case Context::GenericArgument: return true; - - // Local variable packs are supported, but property packs - // are not. case Context::PatternBindingDecl: - return !dc->isTypeContext(); - case Context::None: case Context::ProtocolGenericArgument: case Context::Inherited: diff --git a/test/Constraints/pack-expansion-expressions.swift b/test/Constraints/pack-expansion-expressions.swift index b773c333cc3c5..3de129489875b 100644 --- a/test/Constraints/pack-expansion-expressions.swift +++ b/test/Constraints/pack-expansion-expressions.swift @@ -37,7 +37,7 @@ func coerceExpansion(_ value: repeat each T) { func localValuePack(_ t: repeat each T) -> (repeat each T, repeat each T) { let local = repeat each t let localAnnotated: repeat each T = repeat each t - // expected-error@-1{{value pack expansion can only appear inside a function argument list or tuple element}} + // expected-error@-1{{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}} return (repeat each local, repeat each localAnnotated) } From 5fbed1d83520a45fdefebb7bfa39be4b87bd2175 Mon Sep 17 00:00:00 2001 From: Sima Nerush Date: Wed, 14 Jun 2023 22:20:01 -0700 Subject: [PATCH 2/2] Ban inferred local variable packs --- lib/Sema/TypeCheckStorage.cpp | 7 +++++++ test/Constraints/pack-expansion-expressions.swift | 1 + 2 files changed, 8 insertions(+) diff --git a/lib/Sema/TypeCheckStorage.cpp b/lib/Sema/TypeCheckStorage.cpp index 59e5aed5f5b63..97964e2e1dc0d 100644 --- a/lib/Sema/TypeCheckStorage.cpp +++ b/lib/Sema/TypeCheckStorage.cpp @@ -457,6 +457,13 @@ const PatternBindingEntry *PatternBindingEntryRequest::evaluate( return &pbe; } + // Local variable packs are not allowed. + if (binding->getDeclContext()->isLocalContext() && + binding->getInit(entryNumber)->getType()->is()) { + binding->diagnose(diag::expansion_not_allowed, + binding->getInit(entryNumber)->getType()); + } + // A pattern binding at top level is not allowed to pick up another decl's // opaque result type as its type by type inference. if (!binding->getDeclContext()->isLocalContext() && diff --git a/test/Constraints/pack-expansion-expressions.swift b/test/Constraints/pack-expansion-expressions.swift index 3de129489875b..de9d9a4869702 100644 --- a/test/Constraints/pack-expansion-expressions.swift +++ b/test/Constraints/pack-expansion-expressions.swift @@ -36,6 +36,7 @@ func coerceExpansion(_ value: repeat each T) { func localValuePack(_ t: repeat each T) -> (repeat each T, repeat each T) { let local = repeat each t + // expected-error@-1{{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}} let localAnnotated: repeat each T = repeat each t // expected-error@-1{{pack expansion 'repeat each T' can only appear in a function parameter list, tuple element, or generic argument list}}