Skip to content

Commit 363954a

Browse files
committed
Put Variadic Generics Behind a Flag
1 parent 377cdc1 commit 363954a

File tree

9 files changed

+25
-8
lines changed

9 files changed

+25
-8
lines changed

include/swift/Basic/LangOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,9 @@ namespace swift {
352352
/// Enable experimental pairwise `buildBlock` for result builders.
353353
bool EnableExperimentalPairwiseBuildBlock = false;
354354

355+
/// Enable variadic generics.
356+
bool EnableExperimentalVariadicGenerics = false;
357+
355358
/// Disable the implicit import of the _Concurrency module.
356359
bool DisableImplicitConcurrencyModuleImport =
357360
!SWIFT_IMPLICIT_CONCURRENCY_IMPORT;

include/swift/Option/FrontendOptions.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,10 @@ def enable_experimental_string_processing :
546546
Flag<["-"], "enable-experimental-string-processing">,
547547
HelpText<"Enable experimental string processing">;
548548

549+
def enable_experimental_variadic_generics :
550+
Flag<["-"], "enable-experimental-variadic-generics">,
551+
HelpText<"Enable experimental support for variadic generic types">;
552+
549553
def disable_availability_checking : Flag<["-"],
550554
"disable-availability-checking">,
551555
HelpText<"Disable checking for potentially unavailable APIs">;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,9 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
456456
OPT_disable_experimental_opened_existential_types,
457457
false);
458458

459+
Opts.EnableExperimentalVariadicGenerics |=
460+
Args.hasArg(OPT_enable_experimental_variadic_generics);
461+
459462
// SwiftOnoneSupport produces different symbols when opening existentials,
460463
// so disable it.
461464
if (FrontendOpts.ModuleName == SWIFT_ONONE_SUPPORT)

lib/Parse/ParseDecl.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,8 +2802,12 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
28022802
break;
28032803
}
28042804
case DAK_TypeSequence: {
2805-
auto range = SourceRange(Loc, Tok.getRange().getStart());
2806-
Attributes.add(TypeSequenceAttr::create(Context, AtLoc, range));
2805+
if (Context.LangOpts.EnableExperimentalVariadicGenerics) {
2806+
auto range = SourceRange(Loc, Tok.getRange().getStart());
2807+
Attributes.add(TypeSequenceAttr::create(Context, AtLoc, range));
2808+
} else {
2809+
DiscardAttribute = true;
2810+
}
28072811
break;
28082812
}
28092813

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5500,7 +5500,8 @@ ArgumentList *ExprRewriter::coerceCallArguments(
55005500
auto paramLabel = param.getLabel();
55015501

55025502
// Handle variadic generic parameters.
5503-
if (paramInfo.isVariadicGenericParameter(paramIdx)) {
5503+
if (ctx.LangOpts.EnableExperimentalVariadicGenerics &&
5504+
paramInfo.isVariadicGenericParameter(paramIdx)) {
55045505
assert(param.isVariadic());
55055506
assert(!param.isInOut());
55065507

lib/Sema/CSSimplify.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1614,7 +1614,8 @@ static ConstraintSystem::TypeMatchResult matchCallArguments(
16141614
// We pull these out special because variadic parameters ban lots of
16151615
// the more interesting typing constructs called out below like
16161616
// inout and @autoclosure.
1617-
if (paramInfo.isVariadicGenericParameter(paramIdx)) {
1617+
if (cs.getASTContext().LangOpts.EnableExperimentalVariadicGenerics &&
1618+
paramInfo.isVariadicGenericParameter(paramIdx)) {
16181619
auto *PET = paramTy->castTo<PackExpansionType>();
16191620
OpenTypeSequenceElements openTypeSequence{cs, PET};
16201621
for (auto argIdx : parameterBindings[paramIdx]) {

lib/Sema/TypeCheckType.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3772,7 +3772,8 @@ NeverNullType TypeResolver::resolveTupleType(TupleTypeRepr *repr,
37723772

37733773
bool complained = false;
37743774
if (repr->hasEllipsis()) {
3775-
if (repr->getNumElements() == 1 && !repr->hasElementNames()) {
3775+
if (getASTContext().LangOpts.EnableExperimentalVariadicGenerics &&
3776+
repr->getNumElements() == 1 && !repr->hasElementNames()) {
37763777
// This is probably a pack expansion. Try to resolve the pattern type.
37773778
auto patternTy = resolveType(repr->getElementType(0), elementOptions);
37783779
if (patternTy->hasError())

test/Constraints/type_sequence.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-typecheck-verify-swift
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-variadic-generics
22

33
struct TupleStruct<First, @_typeSequence Rest> {
44
var first: First

test/decl/func/vararg.swift

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

3-
var t1a: (Int...) = (1) // expected-error{{cannot create expansion with non-variadic type 'Int'}}
4-
// expected-error@-1 {{cannot convert value of type 'Int' to specified type '(Int...)'}}
3+
var t1a: (Int...) = (1)
4+
// expected-error@-1 {{cannot create a variadic tuple}}
55
var t2d: (Double = 0.0) = 1 // expected-error {{default argument not permitted in a tuple type}} {{18-23=}}
66

77
func f1(_ a: Int...) { for _ in a {} }

0 commit comments

Comments
 (0)