Skip to content

Commit 093fa28

Browse files
committed
Guard usage of variadic generics with $ParameterPacks in module interface files
Fixes rdar://107559541.
1 parent 756fe15 commit 093fa28

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
@@ -3320,15 +3320,15 @@ static bool usesFeatureFreestandingExpressionMacros(Decl *decl) {
33203320
static void
33213321
suppressingFeatureFreestandingExpressionMacros(PrintOptions &options,
33223322
llvm::function_ref<void()> action) {
3323-
llvm::SaveAndRestore<PrintOptions> orignalOptions(options);
3323+
llvm::SaveAndRestore<PrintOptions> originalOptions(options);
33243324
options.SuppressingFreestandingExpression = true;
33253325
action();
33263326
}
33273327

33283328
static void
33293329
suppressingFeatureNoAsyncAvailability(PrintOptions &options,
33303330
llvm::function_ref<void()> action) {
3331-
llvm::SaveAndRestore<PrintOptions> orignalOptions(options);
3331+
llvm::SaveAndRestore<PrintOptions> originalOptions(options);
33323332
options.SuppressNoAsyncAvailabilityAttr = true;
33333333
action();
33343334
}
@@ -3342,6 +3342,43 @@ static bool usesFeatureBuiltinModule(Decl *decl) {
33423342
return false;
33433343
}
33443344

3345+
static bool hasParameterPacks(Decl *decl) {
3346+
if (auto genericContext = decl->getAsGenericContext()) {
3347+
auto sig = genericContext->getGenericSignature();
3348+
if (llvm::any_of(
3349+
sig.getGenericParams(),
3350+
[&](const GenericTypeParamType *GP) { return GP->isParameterPack(); })) {
3351+
return true;
3352+
}
3353+
}
3354+
3355+
return false;
3356+
}
3357+
3358+
/// A declaration needs the $ParameterPacks feature if it declares a
3359+
/// generic parameter pack, or if its type references a generic nominal
3360+
/// or type alias which declares a generic parameter pack.
3361+
static bool usesFeatureParameterPacks(Decl *decl) {
3362+
if (hasParameterPacks(decl))
3363+
return true;
3364+
3365+
if (auto *valueDecl = dyn_cast<ValueDecl>(decl)) {
3366+
if (valueDecl->getInterfaceType().findIf(
3367+
[&](Type t) {
3368+
if (auto *alias = dyn_cast<TypeAliasType>(t.getPointer()))
3369+
return hasParameterPacks(alias->getDecl());
3370+
if (auto *nominal = t->getAnyNominal())
3371+
return hasParameterPacks(nominal);
3372+
3373+
return false;
3374+
})) {
3375+
return true;
3376+
}
3377+
}
3378+
3379+
return false;
3380+
}
3381+
33453382
/// Suppress the printing of a particular feature.
33463383
static void suppressingFeature(PrintOptions &options, Feature feature,
33473384
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)