Skip to content

Commit f899f2e

Browse files
committed
Lower error to warning, fix tests for objc interopg
1 parent 345da29 commit f899f2e

File tree

4 files changed

+50
-28
lines changed

4 files changed

+50
-28
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,8 +1504,8 @@ ERROR(access_control_extension_open,none,
15041504
ERROR(access_control_open_bad_decl,none,
15051505
"only classes and overridable class members can be declared 'open';"
15061506
" use 'public'", ())
1507-
ERROR(access_control_non_objc_open_func,none,
1508-
"non-@objc %select{properties|methods}0 in extensions cannot be overriden; use 'public' instead",
1507+
WARNING(access_control_non_objc_open_member,none,
1508+
"non-'@objc' %select{properties|methods}0 in extensions cannot be overridden; use 'public' instead",
15091509
(bool))
15101510

15111511
ERROR(invalid_decl_attribute,none,

lib/Sema/TypeCheckAttr.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -794,14 +794,17 @@ void AttributeChecker::visitAccessControlAttr(AccessControlAttr *attr) {
794794
extAttr->getAccess())
795795
.fixItRemove(attr->getRange());
796796
}
797-
}
798-
799-
if (auto VD = dyn_cast<ValueDecl>(D)) {
800-
if (!VD->isObjC() && attr->getAccess() == AccessLevel::Open) {
801-
diagnose(attr->getLocation(), diag::access_control_non_objc_open_func,
802-
isa<FuncDecl>(VD))
803-
.fixItReplace(attr->getRange(), "public");
804-
attr->setInvalid();
797+
} else {
798+
if (auto VD = dyn_cast<ValueDecl>(D)) {
799+
// Emit warning when trying to declare non-@objc `open` member inside an
800+
// extension.
801+
if (!VD->isObjC() && attr->getAccess() == AccessLevel::Open) {
802+
diagnose(attr->getLocation(),
803+
diag::access_control_non_objc_open_member,
804+
isa<AbstractFunctionDecl>(VD))
805+
.fixItReplace(attr->getRange(), "public");
806+
attr->setInvalid();
807+
}
805808
}
806809
}
807810
}

test/attr/open.swift

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -134,21 +134,3 @@ open class OpenSubClass : OpenSuperClass {
134134
open override subscript(index: MarkerForNonOpenSubscripts) -> Int { return 0 }
135135

136136
}
137-
138-
open class InvalidOpenExtension {
139-
open func openMethod() { } // No error
140-
}
141-
extension InvalidOpenExtension {
142-
open func nonObjcOpenMethod() { } // expected-error {{non-@objc methods in extensions cannot be overriden; use 'public' instead}} {{3-7=public}}
143-
open var nonObjcOpenVar: Int { 3 } // expected-error {{non-@objc properties in extensions cannot be overriden; use 'public' instead}} {{3-7=public}}
144-
@objc open func objcOpenMethod() { } // No error
145-
@objc open var objcOpenVar: Int { 3 } // No error
146-
}
147-
148-
@objcMembers
149-
open class ValidOpenExtension { }
150-
extension ValidOpenExtension {
151-
open func objcOpenMethod() { } // No error
152-
open var objcOpenVar: Int { 3 } // No error
153-
}
154-

test/attr/open_objc.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-typecheck-verify-swift -sdk %clang-importer-sdk -I %t
3+
// REQUIRES: objc_interop
4+
5+
import Foundation
6+
7+
open class InvalidOpenExtension {
8+
open func openMethod() { } // No warning: Pure Swift methods can be open inside the class declaration.
9+
open var openVar: Int { 3 } // No warning: Pure Swift properties can be open inside the class declaration.
10+
}
11+
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}}
14+
@objc open func objcOpenMethod() { } // No warning: @objc methods can be open inside extensions.
15+
@objc open var objcOpenVar: Int { 3 } // No warning: @objc methods can be open inside extensions.
16+
}
17+
18+
// For extensions with access level less than open, '`open` modifier conflicts with...' warning will always precede the 'non-@objc member...' warning.
19+
// For extensions with open access level, invalid open extension error will precede the 'non-@objc member...' warning.
20+
public extension InvalidOpenExtension {
21+
open func nonObjcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
22+
open var nonObjcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
23+
@objc open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
24+
@objc open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
25+
}
26+
27+
@objcMembers
28+
open class ValidOpenExtension { }
29+
extension ValidOpenExtension {
30+
open func objcOpenMethod() { } // No warning: This declaration is implicitly @objc
31+
open var objcOpenVar: Int { 3 } // No warning: This declaration is implicitly @objc
32+
}
33+
34+
public extension ValidOpenExtension {
35+
open func objcOpenMethod2() { } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
36+
open var objcOpenVar2: Int { 3 } // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
37+
}

0 commit comments

Comments
 (0)