You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Don't fix access of an 'open' decl in a 'public' extension
This is reasonable to diagnose with a warning, but dropping the 'open'
down to 'public' isn't the right fix, because now it's not a valid
override. The declaration has to get moved to another extension instead,
or the extension has to not set a default access level.
This turned out to be a source compat issue because the same logic
that emits the fix-it also updates the access of the member, which
then resulted in "must be as accessible as the declaration it
overrides" in the /same/ build. It's not immediately clear what caused
this; probably something's just being validated in a different order
than it was before. The change makes sense either way.
Stepping back, it's weird that a warning would change how the compiler
saw the code, and while we could check for 'override' explicitly, we
can't know if the member might be satisfying a protocol requirement.
Better to just not guess at the right answer here.
rdar://problem/47557376&28493971
Copy file name to clipboardExpand all lines: test/Compatibility/accessibility.swift
+14-14Lines changed: 14 additions & 14 deletions
Original file line number
Diff line number
Diff line change
@@ -80,17 +80,17 @@ public extension PublicStruct {
80
80
privatefunc extImplPublic(){}
81
81
}
82
82
internalextensionPublicStruct{
83
-
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{3-10=}}
83
+
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
84
84
fileprivatefunc extFuncInternal(){}
85
85
privatefunc extImplInternal(){}
86
86
}
87
87
fileprivateextensionPublicStruct{
88
-
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{3-10=}}
88
+
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
89
89
fileprivatefunc extFuncFilePrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
90
90
privatefunc extImplFilePrivate(){}
91
91
}
92
92
privateextensionPublicStruct{
93
-
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{3-10=}}
93
+
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
94
94
fileprivatefunc extFuncPrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
95
95
privatefunc extImplPrivate(){}
96
96
}
@@ -100,17 +100,17 @@ public extension InternalStruct { // expected-error {{extension of internal stru
100
100
privatefunc extImplPublic(){}
101
101
}
102
102
internalextensionInternalStruct{
103
-
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{3-10=}}
103
+
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
104
104
fileprivatefunc extFuncInternal(){}
105
105
privatefunc extImplInternal(){}
106
106
}
107
107
fileprivateextensionInternalStruct{
108
-
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{3-10=}}
108
+
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
109
109
fileprivatefunc extFuncFilePrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
110
110
privatefunc extImplFilePrivate(){}
111
111
}
112
112
privateextensionInternalStruct{
113
-
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{3-10=}}
113
+
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
114
114
fileprivatefunc extFuncPrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
115
115
privatefunc extImplPrivate(){}
116
116
}
@@ -120,17 +120,17 @@ public extension FilePrivateStruct { // expected-error {{extension of fileprivat
120
120
privatefunc extImplPublic(){}
121
121
}
122
122
internalextensionFilePrivateStruct{ // expected-error {{extension of fileprivate struct cannot be declared internal}} {{1-10=}}
123
-
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{3-10=}}
123
+
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
124
124
fileprivatefunc extFuncInternal(){}
125
125
privatefunc extImplInternal(){}
126
126
}
127
127
fileprivateextensionFilePrivateStruct{
128
-
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{3-10=}}
128
+
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
129
129
fileprivatefunc extFuncFilePrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
130
130
privatefunc extImplFilePrivate(){}
131
131
}
132
132
privateextensionFilePrivateStruct{
133
-
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{3-10=}}
133
+
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
134
134
fileprivatefunc extFuncPrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
135
135
privatefunc extImplPrivate(){}
136
136
}
@@ -140,17 +140,17 @@ public extension PrivateStruct { // expected-error {{extension of private struct
140
140
privatefunc extImplPublic(){}
141
141
}
142
142
internalextensionPrivateStruct{ // expected-error {{extension of private struct cannot be declared internal}} {{1-10=}}
143
-
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{3-10=}}
143
+
publicfunc extMemberInternal(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}}
144
144
fileprivatefunc extFuncInternal(){}
145
145
privatefunc extImplInternal(){}
146
146
}
147
147
fileprivateextensionPrivateStruct{ // expected-error {{extension of private struct cannot be declared fileprivate}} {{1-13=}}
148
-
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{3-10=}}
148
+
publicfunc extMemberFilePrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'fileprivate'}} {{none}}
149
149
fileprivatefunc extFuncFilePrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a fileprivate extension}} {{3-15=}}
150
150
privatefunc extImplFilePrivate(){}
151
151
}
152
152
privateextensionPrivateStruct{
153
-
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{3-10=}}
153
+
publicfunc extMemberPrivate(){} // expected-warning {{'public' modifier conflicts with extension's default access of 'private'}} {{none}}
154
154
fileprivatefunc extFuncPrivate(){} // expected-warning {{'fileprivate' modifier is redundant for instance method declared in a private (equivalent to fileprivate) extension}} {{3-15=}}
155
155
privatefunc extImplPrivate(){}
156
156
}
@@ -175,10 +175,10 @@ public class Base {
175
175
176
176
177
177
publicextensionBase{
178
-
openfunc extMemberPublic(){} // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}}
178
+
openfunc extMemberPublic(){} // expected-warning {{'open' modifier conflicts with extension's default access of 'public'}} {{none}}
179
179
}
180
180
internalextensionBase{
181
-
openfunc extMemberInternal(){} // expected-warning {{'open' modifier conflicts with extension's default access of 'internal'}}
181
+
openfunc extMemberInternal(){} // expected-warning {{'open' modifier conflicts with extension's default access of 'internal'}} {{none}}
0 commit comments