diff --git a/lib/Sema/TypeCheckDeclOverride.cpp b/lib/Sema/TypeCheckDeclOverride.cpp index 5e7d6cabad8aa..40256cfd1db4d 100644 --- a/lib/Sema/TypeCheckDeclOverride.cpp +++ b/lib/Sema/TypeCheckDeclOverride.cpp @@ -1774,9 +1774,9 @@ static bool isAvailabilitySafeForOverride(ValueDecl *override, // Allow overrides that are not as available as the base decl as long as the // override is as available as its context. - auto overrideTypeAvailability = AvailabilityInference::inferForType( - override->getDeclContext()->getSelfTypeInContext()); - + auto overrideTypeAvailability = AvailabilityInference::availableRange( + override->getDeclContext()->getSelfNominalTypeDecl(), ctx); + return overrideTypeAvailability.isContainedIn(overrideInfo); } diff --git a/test/Sema/availability_versions.swift b/test/Sema/availability_versions.swift index 79cbbad4a4cf4..46d179f43890d 100644 --- a/test/Sema/availability_versions.swift +++ b/test/Sema/availability_versions.swift @@ -218,6 +218,44 @@ class SubClassOverridingPotentiallyUnavailableMethod : ClassWithPotentiallyUnava } } +protocol BaseProto { + associatedtype A + + var property: A { get set } // expected-note {{overridden declaration is here}} + + @available(OSX 10.51, *) + var newProperty: A { get set } // expected-note {{overridden declaration is here}} + + func method() // expected-note {{overridden declaration is here}} +} + +protocol RefinesBaseProto_AsAvailableOverrides: BaseProto { + var property: A { get set } + + @available(OSX 10.51, *) + var newProperty: A { get set } + + func method() +} + +protocol RefinesBaseProto_LessAvailableOverrides: BaseProto { + @available(OSX 10.52, *) + var property: A { get set } // expected-error {{overriding 'property' must be as available as declaration it overrides}} + + @available(OSX 10.52, *) + var newProperty: A { get set } // expected-error {{overriding 'newProperty' must be as available as declaration it overrides}} + + @available(OSX 10.52, *) + func method() // expected-error {{overriding 'method' must be as available as declaration it overrides}} +} + +@available(OSX 10.52, *) +protocol RefinesBaseProto_LessAvailable: BaseProto { + var property: A { get set } + var newProperty: A { get set } + func method() +} + class ClassWithPotentiallyUnavailableOverloadedMethod { @available(OSX, introduced: 10.9) func overloadedMethod() {}