Skip to content

Commit 531ad28

Browse files
committed
Sema: Specify compatibility margin for access_control_non_objc_open_member
This diagnostic was staged in #38991 as a warning to not break source. Give it a reasonable margin and, in turn, convey that it is in fact a compatibility warning and will become an error.
1 parent b31b90d commit 531ad28

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2176,7 +2176,7 @@ ERROR(access_control_extension_open,none,
21762176
ERROR(access_control_open_bad_decl,none,
21772177
"only classes and overridable class members can be declared 'open';"
21782178
" use 'public'", ())
2179-
WARNING(access_control_non_objc_open_member,none,
2179+
ERROR(access_control_non_objc_open_member,none,
21802180
"non-'@objc' %0 in extensions cannot be overridden; use 'public' instead",
21812181
(DescriptiveDeclKind))
21822182
ERROR(access_control_requires_package_name, none,

lib/Sema/TypeCheckAttr.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1329,7 +1329,8 @@ void AttributeChecker::visitAccessControlAttr(AccessControlAttr *attr) {
13291329
diagnose(attr->getLocation(),
13301330
diag::access_control_non_objc_open_member,
13311331
VD->getDescriptiveKind())
1332-
.fixItReplace(attr->getRange(), "public");
1332+
.fixItReplace(attr->getRange(), "public")
1333+
.warnUntilSwiftVersion(7);
13331334
}
13341335
}
13351336
}

test/attr/open_objc.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ open class InvalidOpenExtension {
99
open var openVar: Int { 3 } // No warning: Pure Swift properties can be open inside the class declaration.
1010
}
1111
extension InvalidOpenExtension {
12-
open func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' instance method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
13-
open class func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' class method in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
14-
open var nonObjcOpenVar: Int { 3 } // expected-warning {{non-'@objc' property in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
15-
open subscript(_ index: Int) -> Int { 3 } // expected-warning {{non-'@objc' subscript in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
16-
open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} // expected-warning {{non-'@objc' initializer in extensions cannot be overridden; use 'public' instead}}
12+
open func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' instance method in extensions cannot be overridden; use 'public' instead; this will be an error in a future Swift language mode}} {{3-7=public}}
13+
open class func nonObjcOpenMethod() { } // expected-warning {{non-'@objc' class method in extensions cannot be overridden; use 'public' instead; this will be an error in a future Swift language mode}} {{3-7=public}}
14+
open var nonObjcOpenVar: Int { 3 } // expected-warning {{non-'@objc' property in extensions cannot be overridden; use 'public' instead; this will be an error in a future Swift language mode}} {{3-7=public}}
15+
open subscript(_ index: Int) -> Int { 3 } // expected-warning {{non-'@objc' subscript in extensions cannot be overridden; use 'public' instead; this will be an error in a future Swift language mode}} {{3-7=public}}
16+
open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} // expected-warning {{non-'@objc' initializer in extensions cannot be overridden; use 'public' instead; this will be an error in a future Swift language mode}}
1717

1818
@objc open func objcOpenMethod() { } // No warning: @objc methods can be open inside extensions.
1919
@objc open var objcOpenVar: Int { 3 } // No warning: @objc methods can be open inside extensions.

0 commit comments

Comments
 (0)