Skip to content

Commit de93ba0

Browse files
authored
Merge pull request swiftlang#22188 from jrose-apple/open-your-heart
Don't fix access of an 'open' override in a 'public' extension rdar://problem/47557376&28493971
2 parents fb7d9ed + 15056ed commit de93ba0

File tree

8 files changed

+84
-45
lines changed

8 files changed

+84
-45
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,9 +1210,10 @@ WARNING(access_control_setter_redundant,none,
12101210
"%1",
12111211
(AccessLevel, DescriptiveDeclKind, AccessLevel))
12121212
WARNING(access_control_ext_member_more,none,
1213-
"declaring %select{%error|a fileprivate|an internal|a public|open}0 %1 in "
1214-
"%select{a private|a fileprivate|an internal|a public|%error}2 extension",
1215-
(AccessLevel, DescriptiveDeclKind, AccessLevel))
1213+
"'%select{%error|fileprivate|internal|public|open}0' modifier conflicts "
1214+
"with extension's default access of "
1215+
"'%select{private|fileprivate|internal|public|%error}1'",
1216+
(AccessLevel, AccessLevel))
12161217
WARNING(access_control_ext_member_redundant,none,
12171218
"'%select{%error|fileprivate|internal|public|%error}0' modifier is redundant "
12181219
"for %1 declared in %select{a private (equivalent to fileprivate)|a fileprivate"

lib/Sema/TypeCheckAttr.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,19 +1640,18 @@ void AttributeChecker::visitAccessControlAttr(AccessControlAttr *attr) {
16401640
auto diag = TC.diagnose(attr->getLocation(),
16411641
diag::access_control_ext_member_more,
16421642
attr->getAccess(),
1643-
D->getDescriptiveKind(),
16441643
extAttr->getAccess());
1645-
swift::fixItAccess(diag, cast<ValueDecl>(D), defaultAccess, false,
1646-
true);
1647-
return;
1644+
// Don't try to fix this one; it's just a warning, and fixing it can
1645+
// lead to diagnostic fights between this and "declaration must be at
1646+
// least this accessible" checking for overrides and protocol
1647+
// requirements.
16481648
} else if (attr->getAccess() == defaultAccess) {
16491649
TC.diagnose(attr->getLocation(),
16501650
diag::access_control_ext_member_redundant,
16511651
attr->getAccess(),
16521652
D->getDescriptiveKind(),
16531653
extAttr->getAccess())
16541654
.fixItRemove(attr->getRange());
1655-
return;
16561655
}
16571656
}
16581657
}

test/ClangImporter/Inputs/custom-modules/ObjCParseExtras.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,11 @@ struct NonTrivialToCopyWrapper {
241241
struct TrivialToCopy {
242242
__unsafe_unretained id field;
243243
};
244+
245+
@interface OverrideInExtensionBase : NSObject
246+
- (void)method;
247+
- (void)accessWarning;
248+
@end
249+
250+
@interface OverrideInExtensionSub : OverrideInExtensionBase
251+
@end

test/ClangImporter/objc_override.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ class MyHashableNSObject: NSObject {
116116
}
117117
}
118118

119+
// rdar://problem/47557376
120+
// Adding an override to someone else's class in an extension like this isn't
121+
// really sound, but it's allowed in Objective-C too.
122+
extension OverrideInExtensionSub {
123+
open override func method() {}
124+
}
125+
public extension OverrideInExtensionSub {
126+
open override func accessWarning() {} // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
127+
}
119128

120129
// FIXME: Remove -verify-ignore-unknown.
121130
// <unknown>:0: error: unexpected note produced: overridden declaration is here

test/Compatibility/accessibility.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,17 @@ public extension PublicStruct {
8080
private func extImplPublic() {}
8181
}
8282
internal extension PublicStruct {
83-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
83+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
8484
fileprivate func extFuncInternal() {}
8585
private func extImplInternal() {}
8686
}
8787
fileprivate extension PublicStruct {
88-
public func extMemberFilePrivate() {} // expected-warning {{declaring a public instance method in a fileprivate extension}} {{3-10=}}
88+
public func extMemberFilePrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
8989
fileprivate func extFuncFilePrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
9090
private func extImplFilePrivate() {}
9191
}
9292
private extension PublicStruct {
93-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
93+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
9494
fileprivate func extFuncPrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
9595
private func extImplPrivate() {}
9696
}
@@ -100,17 +100,17 @@ public extension InternalStruct { // expected-error {{extension of internal stru
100100
private func extImplPublic() {}
101101
}
102102
internal extension InternalStruct {
103-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
103+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
104104
fileprivate func extFuncInternal() {}
105105
private func extImplInternal() {}
106106
}
107107
fileprivate extension InternalStruct {
108-
public func extMemberFilePrivate() {} // expected-warning {{declaring a public instance method in a fileprivate extension}} {{3-10=}}
108+
public func extMemberFilePrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
109109
fileprivate func extFuncFilePrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
110110
private func extImplFilePrivate() {}
111111
}
112112
private extension InternalStruct {
113-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
113+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
114114
fileprivate func extFuncPrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
115115
private func extImplPrivate() {}
116116
}
@@ -120,17 +120,17 @@ public extension FilePrivateStruct { // expected-error {{extension of fileprivat
120120
private func extImplPublic() {}
121121
}
122122
internal extension FilePrivateStruct { // expected-error {{extension of fileprivate struct cannot be declared internal}} {{1-10=}}
123-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
123+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
124124
fileprivate func extFuncInternal() {}
125125
private func extImplInternal() {}
126126
}
127127
fileprivate extension FilePrivateStruct {
128-
public func extMemberFilePrivate() {} // expected-warning {{declaring a public instance method in a fileprivate extension}} {{3-10=}}
128+
public func extMemberFilePrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
129129
fileprivate func extFuncFilePrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
130130
private func extImplFilePrivate() {}
131131
}
132132
private extension FilePrivateStruct {
133-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
133+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
134134
fileprivate func extFuncPrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
135135
private func extImplPrivate() {}
136136
}
@@ -140,17 +140,17 @@ public extension PrivateStruct { // expected-error {{extension of private struct
140140
private func extImplPublic() {}
141141
}
142142
internal extension PrivateStruct { // expected-error {{extension of private struct cannot be declared internal}} {{1-10=}}
143-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
143+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
144144
fileprivate func extFuncInternal() {}
145145
private func extImplInternal() {}
146146
}
147147
fileprivate extension PrivateStruct { // expected-error {{extension of private struct cannot be declared fileprivate}} {{1-13=}}
148-
public func extMemberFilePrivate() {} // expected-warning {{declaring a public instance method in a fileprivate extension}} {{3-10=}}
148+
public func extMemberFilePrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
149149
fileprivate func extFuncFilePrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
150150
private func extImplFilePrivate() {}
151151
}
152152
private extension PrivateStruct {
153-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
153+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
154154
fileprivate func extFuncPrivate() {} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
155155
private func extImplPrivate() {}
156156
}
@@ -175,10 +175,10 @@ public class Base {
175175

176176

177177
public extension Base {
178-
open func extMemberPublic() {} // expected-warning {{declaring open instance method in a public extension}}
178+
open func extMemberPublic() {} // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} {{none}}
179179
}
180180
internal extension Base {
181-
open func extMemberInternal() {} // expected-warning {{declaring open instance method in an internal extension}}
181+
open func extMemberInternal() {} // expected-warning {{'open' modifier conflicts with extension's default access of 'internal'}} {{none}}
182182
}
183183

184184
public class PublicSub: Base {

test/SILGen/accessibility_warnings.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,35 +65,35 @@ public extension PublicStruct {
6565
}
6666

6767
internal extension PublicStruct {
68-
// CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings12PublicStructV17extMemberInternalyyF
69-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
68+
// CHECK-DAG: sil [ossa] @$s22accessibility_warnings12PublicStructV17extMemberInternalyyF
69+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
7070
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings12PublicStructV15extImplInternal33_5D2F2E026754A901C0FF90C404896D02LLyyF
7171
private func extImplInternal() {}
7272
}
7373
private extension PublicStruct {
74-
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings12PublicStructV16extMemberPrivate33_5D2F2E026754A901C0FF90C404896D02LLyyF
75-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
74+
// CHECK-DAG: sil [ossa] @$s22accessibility_warnings12PublicStructV16extMemberPrivateyyF
75+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
7676
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings12PublicStructV14extImplPrivate33_5D2F2E026754A901C0FF90C404896D02LLyyF
7777
private func extImplPrivate() {}
7878
}
7979

8080
internal extension InternalStruct {
8181
// CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings14InternalStructV09extMemberC0yyF
82-
public func extMemberInternal() {} // expected-warning {{declaring a public instance method in an internal extension}} {{3-10=}}
82+
public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
8383
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings14InternalStructV07extImplC033_5D2F2E026754A901C0FF90C404896D02LLyyF
8484
private func extImplInternal() {}
8585
}
8686
private extension InternalStruct {
87-
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings14InternalStructV16extMemberPrivate33_5D2F2E026754A901C0FF90C404896D02LLyyF
88-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
87+
// CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings14InternalStructV16extMemberPrivateyyF
88+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
8989
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings14InternalStructV14extImplPrivate33_5D2F2E026754A901C0FF90C404896D02LLyyF
9090
private func extImplPrivate() {}
9191
}
9292

9393

9494
private extension PrivateStruct {
9595
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings13PrivateStruct33_5D2F2E026754A901C0FF90C404896D02LLV09extMemberC0yyF
96-
public func extMemberPrivate() {} // expected-warning {{declaring a public instance method in a private extension}} {{3-10=}}
96+
public func extMemberPrivate() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
9797
// CHECK-DAG: sil private [ossa] @$s22accessibility_warnings13PrivateStruct33_5D2F2E026754A901C0FF90C404896D02LLV07extImplC0yyF
9898
private func extImplPrivate() {}
9999
}

0 commit comments

Comments
 (0)