Skip to content

Commit 2aa8d56

Browse files
authored
Merge pull request #70123 from hborla/swift-6-upcoming-features
[Features] Update upcoming feature flags for Swift 6.
2 parents 5405f1a + 575514e commit 2aa8d56

18 files changed

+107
-44
lines changed

include/swift/Basic/Features.def

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,16 @@ SUPPRESSIBLE_LANGUAGE_FEATURE(RetroactiveAttribute, 364, "@retroactive", true)
115115

116116
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
117117
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)
118+
UPCOMING_FEATURE(CompleteConcurrency, 0337, 6)
118119
UPCOMING_FEATURE(BareSlashRegexLiterals, 354, 6)
119-
UPCOMING_FEATURE(ExistentialAny, 335, 6)
120+
UPCOMING_FEATURE(DeprecateApplicationMain, 383, 6)
120121
UPCOMING_FEATURE(ImportObjcForwardDeclarations, 384, 6)
121122
UPCOMING_FEATURE(DisableOutwardActorInference, 401, 6)
122123
UPCOMING_FEATURE(InternalImportsByDefault, 409, 6)
123124
UPCOMING_FEATURE(FullTypedThrows, 413, 6)
124125

126+
UPCOMING_FEATURE(ExistentialAny, 335, 7)
127+
125128
EXPERIMENTAL_FEATURE(StaticAssert, false)
126129
EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)
127130
EXPERIMENTAL_FEATURE(FlowSensitiveConcurrencyCaptures, false)

lib/AST/ASTPrinter.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,6 +3286,10 @@ static bool usesFeatureStrictConcurrency(Decl *decl) {
32863286
return false;
32873287
}
32883288

3289+
static bool usesFeatureDeprecateApplicationMain(Decl *decl) {
3290+
return false;
3291+
}
3292+
32893293
static bool usesFeatureImportObjcForwardDeclarations(Decl *decl) {
32903294
ClangNode clangNode = decl->getClangNode();
32913295
if (!clangNode)
@@ -3312,6 +3316,10 @@ static bool usesFeatureForwardTrailingClosures(Decl *decl) {
33123316
return false;
33133317
}
33143318

3319+
static bool usesFeatureCompleteConcurrency(Decl *decl) {
3320+
return false;
3321+
}
3322+
33153323
static bool usesFeatureBareSlashRegexLiterals(Decl *decl) {
33163324
return false;
33173325
}

lib/Frontend/CompilerInvocation.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,12 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
888888
Opts.Features.insert(*feature);
889889
}
890890

891+
// CompleteConcurrency enables all data-race safety upcoming features.
892+
if (Opts.hasFeature(Feature::CompleteConcurrency)) {
893+
Opts.StrictConcurrencyLevel = StrictConcurrency::Complete;
894+
Opts.Features.insert(Feature::DisableOutwardActorInference);
895+
}
896+
891897
// Map historical flags over to experimental features. We do this for all
892898
// compilers because that's how existing experimental feature flags work.
893899
if (Args.hasArg(OPT_enable_experimental_static_assert))
@@ -1002,7 +1008,8 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
10021008

10031009
} else if (Args.hasArg(OPT_warn_concurrency)) {
10041010
Opts.StrictConcurrencyLevel = StrictConcurrency::Complete;
1005-
} else if (Opts.hasFeature(Feature::StrictConcurrency)) {
1011+
} else if (Opts.hasFeature(Feature::CompleteConcurrency) ||
1012+
Opts.hasFeature(Feature::StrictConcurrency)) {
10061013
// Already set above.
10071014
} else {
10081015
// Default to minimal checking in Swift 5.x.

lib/Sema/TypeCheckAttr.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,15 +2544,16 @@ void AttributeChecker::checkApplicationMainAttribute(DeclAttribute *attr,
25442544
attr->setInvalid();
25452545
}
25462546

2547-
diagnose(attr->getLocation(),
2548-
diag::attr_ApplicationMain_deprecated,
2549-
applicationMainKind)
2550-
.warnUntilSwiftVersion(6);
2551-
2552-
diagnose(attr->getLocation(),
2553-
diag::attr_ApplicationMain_deprecated_use_attr_main)
2554-
.fixItReplace(attr->getRange(), "@main");
2547+
if (C.LangOpts.hasFeature(Feature::DeprecateApplicationMain)) {
2548+
diagnose(attr->getLocation(),
2549+
diag::attr_ApplicationMain_deprecated,
2550+
applicationMainKind)
2551+
.warnUntilSwiftVersion(6);
25552552

2553+
diagnose(attr->getLocation(),
2554+
diag::attr_ApplicationMain_deprecated_use_attr_main)
2555+
.fixItReplace(attr->getRange(), "@main");
2556+
}
25562557

25572558
if (attr->isInvalid())
25582559
return;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: %target-swift-frontend -disable-availability-checking -parse-as-library -enable-upcoming-feature CompleteConcurrency -emit-sil -o /dev/null -verify %s
2+
3+
// REQUIRES: concurrency
4+
5+
// expected-note@+1 {{class 'NonSendable' does not conform to the 'Sendable' protocol}}
6+
class NonSendable {}
7+
8+
@MainActor func onMain(ns: NonSendable) async {
9+
// expected-warning@+1 {{passing argument of non-sendable type 'NonSendable' outside of main actor-isolated context may introduce data races}}
10+
await onGeneric(ns: ns)
11+
}
12+
13+
@propertyWrapper
14+
struct Wrapper {
15+
// expected-note@+1 {{mutation of this property is only permitted within the actor}}
16+
@preconcurrency @MainActor var wrappedValue: NonSendable
17+
18+
init(wrappedValue: NonSendable) {
19+
// expected-warning@+1 {{main actor-isolated property 'wrappedValue' can not be mutated from a non-isolated context; this is an error in Swift 6}}
20+
self.wrappedValue = wrappedValue
21+
}
22+
}
23+
24+
struct S {
25+
@Wrapper var value: NonSendable = NonSendable()
26+
}
27+
28+
nonisolated func onGeneric(ns: NonSendable) async {
29+
let _ = S()
30+
}

test/TBD/objc-entry-point.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir -o /dev/null -validate-tbd-against-ir=all -parse-as-library -verify -enable-testing %s
22
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir -o /dev/null -validate-tbd-against-ir=all -parse-as-library -verify %s
33

4+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir -o /dev/null -validate-tbd-against-ir=all -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- -enable-testing %s
5+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-upcoming-feature DeprecateApplicationMain -emit-ir -o /dev/null -validate-tbd-against-ir=all -parse-as-library -verify -verify-additional-prefix deprecated- %s
6+
47
// REQUIRES: objc_interop
58
import AppKit
69

@@ -9,7 +12,7 @@ import AppKit
912
// present in the TBD.
1013
let globalConstantWithLazyInitializer: String = "hello, world"
1114

12-
@NSApplicationMain // expected-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
13-
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
15+
@NSApplicationMain // expected-deprecated-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
16+
// expected-deprecated-note@-1 {{use @main instead}} {{1-19=@main}}
1417
class MyDelegate: NSObject, NSApplicationDelegate {
1518
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import AppKit
67

7-
@NSApplicationMain // expected-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
8-
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
8+
@NSApplicationMain // expected-deprecated-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
9+
// expected-deprecated-note@-1 {{use @main instead}} {{1-19=@main}}
910
class MyDelegate: NSObject, NSApplicationDelegate {
1011
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import AppKit
67

78
class DelegateBase : NSObject, NSApplicationDelegate { }
89

9-
@NSApplicationMain // expected-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
10-
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
10+
@NSApplicationMain // expected-deprecated-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
11+
// expected-deprecated-note@-1 {{use @main instead}} {{1-19=@main}}
1112
class MyDelegate : DelegateBase { }
1213

test/attr/ApplicationMain/attr_NSApplicationMain_multi_file/another_delegate.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -module-name main -emit-module-path %t.swiftmodule -primary-file %s %S/delegate.swift
55
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -module-name main -parse-as-library -typecheck %t.swiftmodule -primary-file %S/delegate.swift -verify -verify-ignore-unknown
66

7+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -module-name main -parse-as-library -typecheck -enable-upcoming-feature DeprecateApplicationMain %t.swiftmodule -primary-file %S/delegate.swift -verify -verify-ignore-unknown -verify-additional-prefix deprecated-
8+
79
// REQUIRES: objc_interop
810

911
import AppKit
1012

1113
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute can only apply to one class in a module}}
12-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
13-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
14+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
15+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1416
class EvilDelegate: NSObject, NSApplicationDelegate {
1517
}
1618

test/attr/ApplicationMain/attr_NSApplicationMain_multi_file/delegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import AppKit
99

1010
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute can only apply to one class in a module}}
11-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
12-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
11+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
12+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1313
class MyDelegate: NSObject, NSApplicationDelegate {
1414
}
1515

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
3+
24

35
// REQUIRES: objc_interop
46

57
import AppKit
68

79
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute can only apply to one class in a module}}
8-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
9-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
10+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
11+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1012
class MyDelegate1: NSObject, NSApplicationDelegate {
1113
}
1214

1315
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute can only apply to one class in a module}}
14-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
15-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
16+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
17+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1618
class MyDelegate2: NSObject, NSApplicationDelegate {
1719
}
1820

1921
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute can only apply to one class in a module}}
20-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
21-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
22+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
23+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
2224
class MyDelegate3: NSObject, NSApplicationDelegate {
2325
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import AppKit
67

78
@NSApplicationMain // expected-error{{'NSApplicationMain' class must conform to the 'NSApplicationDelegate' protocol}}
8-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
9-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
9+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
10+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1011
class MyNonDelegate {
1112
}

test/attr/ApplicationMain/attr_NSApplicationMain_with_main/delegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import AppKit
99

1010
@NSApplicationMain // expected-error{{'NSApplicationMain' attribute cannot be used in a module that contains top-level code}}
11-
// expected-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
12-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
11+
// expected-deprecated-warning@-1 {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
12+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1313
class MyDelegate: NSObject, NSApplicationDelegate {
1414
}
1515

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import UIKit
67

7-
@UIApplicationMain // expected-warning {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
8-
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
8+
@UIApplicationMain // expected-deprecated-warning {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
9+
// expected-deprecated-note@-1 {{use @main instead}} {{1-19=@main}}
910
class MyDelegate: NSObject, UIApplicationDelegate {
1011
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import UIKit
67

78
class DelegateBase : NSObject, UIApplicationDelegate { }
89

9-
@UIApplicationMain // expected-warning {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
10-
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
10+
@UIApplicationMain // expected-deprecated-warning {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
11+
// expected-deprecated-note@-1 {{use @main instead}} {{1-19=@main}}
1112
class MyDelegate : DelegateBase { }
1213

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import UIKit
67

78
@UIApplicationMain // expected-error{{'UIApplicationMain' attribute can only apply to one class in a module}}
8-
// expected-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
9-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
9+
// expected-deprecated-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
10+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1011
class MyDelegate1: NSObject, UIApplicationDelegate {
1112
}
1213

1314
@UIApplicationMain // expected-error{{'UIApplicationMain' attribute can only apply to one class in a module}}
14-
// expected-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
15-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
15+
// expected-deprecated-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
16+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1617
class MyDelegate2: NSObject, UIApplicationDelegate {
1718
}
1819

1920
@UIApplicationMain // expected-error{{'UIApplicationMain' attribute can only apply to one class in a module}}
20-
// expected-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
21-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
21+
// expected-deprecated-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
22+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
2223
class MyDelegate3: NSObject, UIApplicationDelegate {
2324
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -verify %s
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -enable-upcoming-feature DeprecateApplicationMain -verify -verify-additional-prefix deprecated- %s
23

34
// REQUIRES: objc_interop
45

56
import UIKit
67

78
@UIApplicationMain // expected-error{{'UIApplicationMain' class must conform to the 'UIApplicationDelegate' protocol}}
8-
// expected-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
9-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
9+
// expected-deprecated-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
10+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1011
class MyNonDelegate {
1112
}

test/attr/ApplicationMain/attr_UIApplicationMain_with_main/delegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import UIKit
99

1010
@UIApplicationMain // expected-error{{'UIApplicationMain' attribute cannot be used in a module that contains top-level code}}
11-
// expected-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
12-
// expected-note@-2 {{use @main instead}} {{1-19=@main}}
11+
// expected-deprecated-warning@-1 {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
12+
// expected-deprecated-note@-2 {{use @main instead}} {{1-19=@main}}
1313
class MyDelegate: NSObject, UIApplicationDelegate {
1414
}
1515

0 commit comments

Comments
 (0)