Skip to content

Commit a09d71d

Browse files
committed
Deprecate Application-Specific Main Entrypoint Attributes
Issue a deprecation warning in Swift 5 and an error in Swift 6 when we encounter @UIApplicationMain and @NSApplicationMain. These attributes are unnecessary now that @main works with UIApplicationDelegate and NSApplicationDelegate. As these conformances are required when working with the corresponding attributes, we can migrate users off of them by replacing them with @main.
1 parent 5c5598e commit a09d71d

17 files changed

+69
-5
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3601,6 +3601,11 @@ ERROR(attr_ApplicationMain_with_script,none,
36013601
"%" SELECT_APPLICATION_MAIN "0 attribute cannot be used in a module that contains "
36023602
"top-level code",
36033603
(unsigned))
3604+
ERROR(attr_ApplicationMain_deprecated,none,
3605+
"%" SELECT_APPLICATION_MAIN "0 is deprecated",
3606+
(unsigned))
3607+
NOTE(attr_ApplicationMain_deprecated_use_attr_main,none,
3608+
"use @main instead", ())
36043609

36053610
NOTE(attr_ApplicationMain_parse_as_library,none,
36063611
"pass '-parse-as-library' to compiler invocation if this is intentional",

lib/Sema/TypeCheckAttr.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,6 +2340,16 @@ void AttributeChecker::checkApplicationMainAttribute(DeclAttribute *attr,
23402340
attr->setInvalid();
23412341
}
23422342

2343+
diagnose(attr->getLocation(),
2344+
diag::attr_ApplicationMain_deprecated,
2345+
applicationMainKind)
2346+
.warnUntilSwiftVersion(6);
2347+
2348+
diagnose(attr->getLocation(),
2349+
diag::attr_ApplicationMain_deprecated_use_attr_main)
2350+
.fixItReplace(attr->getRange(), "@main");
2351+
2352+
23432353
if (attr->isInvalid())
23442354
return;
23452355

test/TBD/objc-entry-point.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import AppKit
99
// present in the TBD.
1010
let globalConstantWithLazyInitializer: String = "hello, world"
1111

12-
@NSApplicationMain
12+
@NSApplicationMain // expected-warning {{'NSApplicationMain' is deprecated and will be removed in a future release; use '@main' instead}}
13+
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
1314
class MyDelegate: NSObject, NSApplicationDelegate {
1415
}

test/attr/ApplicationMain/attr_NSApplicationMain.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import AppKit
66

7-
@NSApplicationMain
7+
@NSApplicationMain // expected-warning {{'NSApplicationMain' is deprecated; this is an error in Swift 6}}
8+
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
89
class MyDelegate: NSObject, NSApplicationDelegate {
910
}

test/attr/ApplicationMain/attr_NSApplicationMain_inherited.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import AppKit
66

77
class DelegateBase : NSObject, NSApplicationDelegate { }
88

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

test/attr/ApplicationMain/attr_NSApplicationMain_multi_file/another_delegate.swift

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

1111
@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}}
1214
class EvilDelegate: NSObject, NSApplicationDelegate {
1315
}
1416

test/attr/ApplicationMain/attr_NSApplicationMain_multi_file/delegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +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}}
1113
class MyDelegate: NSObject, NSApplicationDelegate {
1214
}
1315

test/attr/ApplicationMain/attr_NSApplicationMain_multiple.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
import AppKit
66

77
@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}}
810
class MyDelegate1: NSObject, NSApplicationDelegate {
911
}
1012

1113
@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}}
1216
class MyDelegate2: NSObject, NSApplicationDelegate {
1317
}
1418

1519
@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}}
1622
class MyDelegate3: NSObject, NSApplicationDelegate {
1723
}

test/attr/ApplicationMain/attr_NSApplicationMain_not_NSApplicationDelegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@
55
import AppKit
66

77
@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}}
810
class MyNonDelegate {
911
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -swift-version 6 -typecheck -parse-as-library -verify %s
2+
3+
// REQUIRES: objc_interop
4+
5+
import AppKit
6+
7+
@NSApplicationMain // expected-error {{'NSApplicationMain' is deprecated}}
8+
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
9+
class MyDelegate: NSObject, NSApplicationDelegate {
10+
}

test/attr/ApplicationMain/attr_NSApplicationMain_with_main/delegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +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}}
1113
class MyDelegate: NSObject, NSApplicationDelegate {
1214
}
1315

test/attr/ApplicationMain/attr_UIApplicationMain.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import UIKit
66

7-
@UIApplicationMain
7+
@UIApplicationMain // expected-warning {{'UIApplicationMain' is deprecated; this is an error in Swift 6}}
8+
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
89
class MyDelegate: NSObject, UIApplicationDelegate {
910
}

test/attr/ApplicationMain/attr_UIApplicationMain_inherited.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import UIKit
66

77
class DelegateBase : NSObject, UIApplicationDelegate { }
88

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

test/attr/ApplicationMain/attr_UIApplicationMain_multiple.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@
55
import UIKit
66

77
@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}}
810
class MyDelegate1: NSObject, UIApplicationDelegate {
911
}
1012

1113
@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}}
1216
class MyDelegate2: NSObject, UIApplicationDelegate {
1317
}
1418

1519
@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}}
1622
class MyDelegate3: NSObject, UIApplicationDelegate {
1723
}

test/attr/ApplicationMain/attr_UIApplicationMain_not_UIApplicationDelegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@
55
import UIKit
66

77
@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}}
810
class MyNonDelegate {
911
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -swift-version 6 -typecheck -parse-as-library -verify %s
2+
3+
// REQUIRES: objc_interop
4+
5+
import UIKit
6+
7+
@UIApplicationMain // expected-error {{'UIApplicationMain' is deprecated}}
8+
// expected-note@-1 {{use @main instead}} {{1-19=@main}}
9+
class MyDelegate: NSObject, UIApplicationDelegate {
10+
}

test/attr/ApplicationMain/attr_UIApplicationMain_with_main/delegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +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}}
1113
class MyDelegate: NSObject, UIApplicationDelegate {
1214
}
1315

0 commit comments

Comments
 (0)