Skip to content

Commit 4f2ab59

Browse files
authored
Merge pull request #64875 from slavapestov/parameter-packs-feature-flag
Guard usage of variadic generics with $ParameterPacks in module interface files
2 parents cb86b7c + 093fa28 commit 4f2ab59

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ SUPPRESSIBLE_LANGUAGE_FEATURE(
100100
hasSwiftSwiftParser)
101101
LANGUAGE_FEATURE(AttachedMacros, 389, "Attached macros", hasSwiftSwiftParser)
102102
LANGUAGE_FEATURE(MoveOnly, 390, "noncopyable types", true)
103+
LANGUAGE_FEATURE(ParameterPacks, 393, "Value and type parameter packs", true)
103104

104105
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
105106
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)

lib/AST/ASTPrinter.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3328,15 +3328,15 @@ static bool usesFeatureFreestandingExpressionMacros(Decl *decl) {
33283328
static void
33293329
suppressingFeatureFreestandingExpressionMacros(PrintOptions &options,
33303330
llvm::function_ref<void()> action) {
3331-
llvm::SaveAndRestore<PrintOptions> orignalOptions(options);
3331+
llvm::SaveAndRestore<PrintOptions> originalOptions(options);
33323332
options.SuppressingFreestandingExpression = true;
33333333
action();
33343334
}
33353335

33363336
static void
33373337
suppressingFeatureNoAsyncAvailability(PrintOptions &options,
33383338
llvm::function_ref<void()> action) {
3339-
llvm::SaveAndRestore<PrintOptions> orignalOptions(options);
3339+
llvm::SaveAndRestore<PrintOptions> originalOptions(options);
33403340
options.SuppressNoAsyncAvailabilityAttr = true;
33413341
action();
33423342
}
@@ -3350,6 +3350,43 @@ static bool usesFeatureBuiltinModule(Decl *decl) {
33503350
return false;
33513351
}
33523352

3353+
static bool hasParameterPacks(Decl *decl) {
3354+
if (auto genericContext = decl->getAsGenericContext()) {
3355+
auto sig = genericContext->getGenericSignature();
3356+
if (llvm::any_of(
3357+
sig.getGenericParams(),
3358+
[&](const GenericTypeParamType *GP) { return GP->isParameterPack(); })) {
3359+
return true;
3360+
}
3361+
}
3362+
3363+
return false;
3364+
}
3365+
3366+
/// A declaration needs the $ParameterPacks feature if it declares a
3367+
/// generic parameter pack, or if its type references a generic nominal
3368+
/// or type alias which declares a generic parameter pack.
3369+
static bool usesFeatureParameterPacks(Decl *decl) {
3370+
if (hasParameterPacks(decl))
3371+
return true;
3372+
3373+
if (auto *valueDecl = dyn_cast<ValueDecl>(decl)) {
3374+
if (valueDecl->getInterfaceType().findIf(
3375+
[&](Type t) {
3376+
if (auto *alias = dyn_cast<TypeAliasType>(t.getPointer()))
3377+
return hasParameterPacks(alias->getDecl());
3378+
if (auto *nominal = t->getAnyNominal())
3379+
return hasParameterPacks(nominal);
3380+
3381+
return false;
3382+
})) {
3383+
return true;
3384+
}
3385+
}
3386+
3387+
return false;
3388+
}
3389+
33533390
/// Suppress the printing of a particular feature.
33543391
static void suppressingFeature(PrintOptions &options, Feature feature,
33553392
llvm::function_ref<void()> action) {

test/ModuleInterface/pack_expansion_type.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
// Experimental features require an asserts compiler
66
// REQUIRES: asserts
77

8-
// CHECK: public func variadicFunction<each T, each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) where (repeat (each T, each U)) : Any
8+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
9+
// CHECK-NEXT: public func variadicFunction<each T, each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) where (repeat (each T, each U)) : Any
910
public func variadicFunction<each T, each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) {}
11+
// CHECK-NEXT: #endif
1012

11-
// CHECK: public struct VariadicType<each T> {
13+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
14+
// CHECK-NEXT: public struct VariadicType<each T> {
1215
public struct VariadicType<each T> {
1316
// CHECK: public func variadicMethod<each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) where (repeat (each T, each U)) : Any
1417
public func variadicMethod<each U>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) {}
@@ -17,24 +20,35 @@ public struct VariadicType<each T> {
1720
public func returnsSelf() -> Self {}
1821
}
1922
// CHECK: }
23+
// CHECK-NEXT: #endif
2024

2125
// CHECK: public func returnsVariadicType() -> PackExpansionType.VariadicType<>
2226
public func returnsVariadicType() -> VariadicType< > {}
2327

2428
// CHECK: public func returnsVariadicType() -> PackExpansionType.VariadicType<Swift.Int, Swift.String, Swift.Float>
2529
public func returnsVariadicType() -> VariadicType<Int, String, Float> {}
2630

27-
// CHECK: public func returnsVariadicType<each T>() -> PackExpansionType.VariadicType<repeat each T>
31+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
32+
// CHECK-NEXT: public func returnsVariadicType<each T>() -> PackExpansionType.VariadicType<repeat each T>
2833
public func returnsVariadicType<each T>() -> VariadicType<repeat each T> {}
34+
// CHECK-NEXT: #endif
2935

30-
// CHECK: public typealias VariadicAlias<each T> = PackExpansionType.VariadicType<repeat Swift.Array<each T>>
36+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
37+
// CHECK-NEXT: public typealias VariadicAlias<each T> = PackExpansionType.VariadicType<repeat Swift.Array<each T>>
38+
// CHECK-NEXT: #endif
3139
public typealias VariadicAlias<each T> = VariadicType<repeat Array<each T>>
3240

33-
// CHECK: public func returnsVariadicAlias() -> PackExpansionType.VariadicAlias<>
41+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
42+
// CHECK-NEXT: public func returnsVariadicAlias() -> PackExpansionType.VariadicAlias<>
43+
// CHECK-NEXT: #endif
3444
public func returnsVariadicAlias() -> VariadicAlias< > {}
3545

36-
// CHECK: public func returnsVariadicAlias() -> PackExpansionType.VariadicAlias<Swift.Int, Swift.String, Swift.Float>
46+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
47+
// CHECK-NEXT: public func returnsVariadicAlias() -> PackExpansionType.VariadicAlias<Swift.Int, Swift.String, Swift.Float>
48+
// CHECK-NEXT: #endif
3749
public func returnsVariadicAlias() -> VariadicAlias<Int, String, Float> {}
3850

39-
// CHECK: public func returnsVariadicAlias<each T>() -> PackExpansionType.VariadicAlias<repeat each T>
51+
// CHECK: #if compiler(>=5.3) && $ParameterPacks
52+
// CHECK-NEXT: public func returnsVariadicAlias<each T>() -> PackExpansionType.VariadicAlias<repeat each T>
53+
// CHECK-NEXT: #endif
4054
public func returnsVariadicAlias<each T>() -> VariadicAlias<repeat each T> {}

0 commit comments

Comments
 (0)