Skip to content

Commit f9e93a8

Browse files
committed
Only emit warning for function and variable decl
1 parent 44f3915 commit f9e93a8

File tree

3 files changed

+23
-11
lines changed

3 files changed

+23
-11
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,8 +1515,8 @@ ERROR(access_control_open_bad_decl,none,
15151515
"only classes and overridable class members can be declared 'open';"
15161516
" use 'public'", ())
15171517
WARNING(access_control_non_objc_open_member,none,
1518-
"non-'@objc' %select{properties|methods}0 in extensions cannot be overridden; use 'public' instead",
1519-
(bool))
1518+
"non-'@objc' %0 in extensions cannot be overridden; use 'public' instead",
1519+
(DescriptiveDeclKind))
15201520

15211521
ERROR(invalid_decl_attribute,none,
15221522
"'%0' attribute cannot be applied to this declaration", (DeclAttribute))

lib/Sema/TypeCheckAttr.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -874,13 +874,15 @@ void AttributeChecker::visitAccessControlAttr(AccessControlAttr *attr) {
874874
}
875875
} else {
876876
if (auto VD = dyn_cast<ValueDecl>(D)) {
877-
// Emit warning when trying to declare non-@objc `open` member inside an
878-
// extension.
879-
if (!VD->isObjC() && attr->getAccess() == AccessLevel::Open) {
880-
diagnose(attr->getLocation(),
881-
diag::access_control_non_objc_open_member,
882-
isa<AbstractFunctionDecl>(VD))
883-
.fixItReplace(attr->getRange(), "public");
877+
if (!isa<NominalTypeDecl>(VD)) {
878+
// Emit warning when trying to declare non-@objc `open` member inside
879+
// an extension.
880+
if (!VD->isObjC() && attr->getAccess() == AccessLevel::Open) {
881+
diagnose(attr->getLocation(),
882+
diag::access_control_non_objc_open_member,
883+
VD->getDescriptiveKind())
884+
.fixItReplace(attr->getRange(), "public");
885+
}
884886
}
885887
}
886888
}

test/attr/open_objc.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,17 @@ 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' methods in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
13-
open var nonObjcOpenVar: Int { 3 } // expected-warning {{non-'@objc' properties in extensions cannot be overridden; use 'public' instead}} {{3-7=public}}
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}}
17+
1418
@objc open func objcOpenMethod() { } // No warning: @objc methods can be open inside extensions.
1519
@objc open var objcOpenVar: Int { 3 } // No warning: @objc methods can be open inside extensions.
20+
21+
open class nonObjcClassDecl { }
22+
open enum nonObjcEnumDecl { case one } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}} {{3-7=public}}
1623
}
1724

1825
// For extensions with access level less than open, '`open` modifier conflicts with...' warning will always precede the 'non-@objc member...' warning.
@@ -28,7 +35,10 @@ public extension InvalidOpenExtension {
2835
open class ValidOpenExtension { }
2936
extension ValidOpenExtension {
3037
open func objcOpenMethod() { } // No warning: This declaration is implicitly @objc
38+
open class func objcOpenMethod() { } // No warning: This declaration is implicitly @objc
3139
open var objcOpenVar: Int { 3 } // No warning: This declaration is implicitly @objc
40+
open subscript(_ index: Int) -> Int { 3 } // No warning: This declaration is implicitly @objc
41+
open convenience init(index: Int) { self.init() } // expected-error {{only classes and overridable class members can be declared 'open'; use 'public'}}
3242
}
3343

3444
public extension ValidOpenExtension {

0 commit comments

Comments
 (0)