Skip to content

Commit a9d483a

Browse files
authored
Merge pull request #75977 from tshortli/fix-synthesized-modify-accessor-override-availability-in-protocol
Sema: Fix override availability checking for protocols
2 parents ebf3ec7 + a288422 commit a9d483a

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,9 +1774,9 @@ static bool isAvailabilitySafeForOverride(ValueDecl *override,
17741774

17751775
// Allow overrides that are not as available as the base decl as long as the
17761776
// override is as available as its context.
1777-
auto overrideTypeAvailability = AvailabilityInference::inferForType(
1778-
override->getDeclContext()->getSelfTypeInContext());
1779-
1777+
auto overrideTypeAvailability = AvailabilityInference::availableRange(
1778+
override->getDeclContext()->getSelfNominalTypeDecl(), ctx);
1779+
17801780
return overrideTypeAvailability.isContainedIn(overrideInfo);
17811781
}
17821782

test/Sema/availability_versions.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,44 @@ class SubClassOverridingPotentiallyUnavailableMethod : ClassWithPotentiallyUnava
218218
}
219219
}
220220

221+
protocol BaseProto {
222+
associatedtype A
223+
224+
var property: A { get set } // expected-note {{overridden declaration is here}}
225+
226+
@available(OSX 10.51, *)
227+
var newProperty: A { get set } // expected-note {{overridden declaration is here}}
228+
229+
func method() // expected-note {{overridden declaration is here}}
230+
}
231+
232+
protocol RefinesBaseProto_AsAvailableOverrides: BaseProto {
233+
var property: A { get set }
234+
235+
@available(OSX 10.51, *)
236+
var newProperty: A { get set }
237+
238+
func method()
239+
}
240+
241+
protocol RefinesBaseProto_LessAvailableOverrides: BaseProto {
242+
@available(OSX 10.52, *)
243+
var property: A { get set } // expected-error {{overriding 'property' must be as available as declaration it overrides}}
244+
245+
@available(OSX 10.52, *)
246+
var newProperty: A { get set } // expected-error {{overriding 'newProperty' must be as available as declaration it overrides}}
247+
248+
@available(OSX 10.52, *)
249+
func method() // expected-error {{overriding 'method' must be as available as declaration it overrides}}
250+
}
251+
252+
@available(OSX 10.52, *)
253+
protocol RefinesBaseProto_LessAvailable: BaseProto {
254+
var property: A { get set }
255+
var newProperty: A { get set }
256+
func method()
257+
}
258+
221259
class ClassWithPotentiallyUnavailableOverloadedMethod {
222260
@available(OSX, introduced: 10.9)
223261
func overloadedMethod() {}

0 commit comments

Comments
 (0)