Skip to content

Commit 9faf615

Browse files
committed
Add runtime availability checking for value generics
1 parent 128a30c commit 9faf615

File tree

9 files changed

+37
-8
lines changed

9 files changed

+37
-8
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8026,6 +8026,9 @@ ERROR(missing_value_generic_type,none,
80268026
"value generic %0 must have an explicit value type declared", (Identifier))
80278027
ERROR(value_generics_missing_feature,none,
80288028
"value generics require '-enable-experimental-feature ValueGenerics'", ())
8029+
ERROR(availability_value_generic_type_only_version_newer, none,
8030+
"values in generic types are only available in %0 %1 or newer",
8031+
(StringRef, llvm::VersionTuple))
80298032

80308033
#define UNDEFINE_DIAGNOSTIC_MACROS
80318034
#include "DefineDiagnosticMacros.h"

include/swift/AST/FeatureAvailability.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,13 @@ FEATURE(SwiftExceptionPersonality, (6, 0))
7272
FEATURE(IsolatedAny, (6, 0))
7373

7474
FEATURE(NoncopyableGenerics, (6, 0))
75+
FEATURE(InitRawStructMetadata, (6, 0))
7576

7677
FEATURE(TaskExecutor, FUTURE)
7778
FEATURE(Differentiation, FUTURE)
78-
FEATURE(InitRawStructMetadata, FUTURE)
7979
FEATURE(ClearSensitive, FUTURE)
8080
FEATURE(UpdatePureObjCClassMetadata, FUTURE)
81+
FEATURE(ValueGenericType, FUTURE)
8182

8283
#undef FEATURE
8384
#undef FUTURE

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,17 @@ static void checkGenericParams(GenericContext *ownerCtx) {
588588
hasPack = true;
589589
}
590590

591+
if (gp->isValue()) {
592+
// Value generic nominal types require runtime support.
593+
if (isa<NominalTypeDecl>(decl)) {
594+
TypeChecker::checkAvailability(
595+
gp->getSourceRange(),
596+
ownerCtx->getASTContext().getValueGenericTypeAvailability(),
597+
diag::availability_value_generic_type_only_version_newer,
598+
ownerCtx);
599+
}
600+
}
601+
591602
TypeChecker::checkDeclAttributes(gp);
592603
checkInheritanceClause(gp);
593604
}

test/Interpreter/value_generics.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-run-simple-swift(-enable-experimental-feature ValueGenerics) | %FileCheck %s
1+
// RUN: %target-run-simple-swift(-enable-experimental-feature ValueGenerics -Xfrontend -disable-availability-checking) | %FileCheck %s
22

33
// REQUIRES: executable_test
44

test/ModuleInterface/value_generics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name ValueGeneric -enable-experimental-feature ValueGenerics
3-
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name ValueGeneric
2+
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name ValueGeneric -enable-experimental-feature ValueGenerics -disable-availability-checking
3+
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name ValueGeneric -disable-availability-checking
44
// RUN: %FileCheck %s < %t.swiftinterface
55

66
// CHECK: public struct Vector<Element, let N : Swift.Int>

test/SILGen/closures.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
// RUN: %target-swift-emit-silgen -module-name closures -parse-stdlib -parse-as-library %s -enable-experimental-feature ValueGenerics | %FileCheck %s
3-
// RUN: %target-swift-emit-silgen -module-name closures -parse-stdlib -parse-as-library %s -enable-experimental-feature ValueGenerics | %FileCheck %s --check-prefix=GUARANTEED
2+
// RUN: %target-swift-emit-silgen -module-name closures -parse-stdlib -parse-as-library %s -enable-experimental-feature ValueGenerics -disable-availability-checking | %FileCheck %s
3+
// RUN: %target-swift-emit-silgen -module-name closures -parse-stdlib -parse-as-library %s -enable-experimental-feature ValueGenerics -disable-availability-checking | %FileCheck %s --check-prefix=GUARANTEED
44

55
import Swift
66

test/Sema/value_generics.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 -enable-experimental-feature ValueGenerics -enable-experimental-feature NonescapableTypes
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-feature ValueGenerics -enable-experimental-feature NonescapableTypes -disable-availability-checking
22

33
protocol P {}
44

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-feature ValueGenerics -enable-experimental-feature NonescapableTypes
2+
3+
// REQUIRES: OS=macosx
4+
5+
struct A<let N: Int> {} // expected-error {{values in generic types are only available in macOS 99.99.0 or newer}}
6+
// expected-note@-1 {{add @available attribute to enclosing generic struct}}
7+
8+
class B<let N: Int> {} // expected-error {{values in generic types are only available in macOS 99.99.0 or newer}}
9+
// expected-note@-1 {{add @available attribute to enclosing generic class}}
10+
11+
enum C<let N: Int> {} // expected-error {{values in generic types are only available in macOS 99.99.0 or newer}}
12+
// expected-note@-1 {{add @available attribute to enclosing generic enum}}
13+
14+
func something<let N: Int>(_: A<N>) {} // OK, because A can't reference value generics.

test/Serialization/value_generics.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %empty-directory(%t)
2-
// RUN: %target-swift-frontend %s -emit-module -enable-experimental-feature ValueGenerics -enable-experimental-feature RawLayout -parse-as-library -o %t
2+
// RUN: %target-swift-frontend %s -emit-module -enable-experimental-feature ValueGenerics -enable-experimental-feature RawLayout -disable-availability-checking -parse-as-library -o %t
33
// RUN: %target-sil-opt -enable-sil-verify-all %t/value_generics.swiftmodule -o - | %FileCheck %s
44

55
// CHECK: @_rawLayout(likeArrayOf: Element, count: Count) struct Vector<Element, let Count : Int> : ~Copyable where Element : ~Copyable {

0 commit comments

Comments
 (0)