diff --git a/lib/Sema/CodeSynthesis.cpp b/lib/Sema/CodeSynthesis.cpp index d28b0c56c8aa7..f172ef89cdbd6 100644 --- a/lib/Sema/CodeSynthesis.cpp +++ b/lib/Sema/CodeSynthesis.cpp @@ -2030,9 +2030,12 @@ static void configureDesignatedInitAttributes(TypeChecker &tc, ctor->getAttrs().add(clonedAttr); } - // Make sure the constructor is only as available as its superclass's - // constructor. - AvailabilityInference::applyInferredAvailableAttrs(ctor, superclassCtor, ctx); + // If the superclass has its own availability, make sure the synthesized + // constructor is only as available as its superclass's constructor. + if (superclassCtor->getAttrs().hasAttribute()) { + AvailabilityInference::applyInferredAvailableAttrs( + ctor, {classDecl, superclassCtor}, ctx); + } if (superclassCtor->isObjC()) { // Inherit the @objc name from the superclass initializer, if it diff --git a/test/Sema/availability_versions.swift b/test/Sema/availability_versions.swift index 064ead5e25700..5ec3829887c60 100644 --- a/test/Sema/availability_versions.swift +++ b/test/Sema/availability_versions.swift @@ -985,6 +985,19 @@ func useUnavailableExtension() { // expected-note@-1 {{add 'if #available' version check}} } +// Availability of synthesized designated initializers. + +@available(OSX, introduced: 10.51) +class WidelyAvailableBase { + init() {} + + @available(OSX, introduced: 10.52) + init(thing: ()) {} +} + +@available(OSX, introduced: 10.53) +class EsotericSmallBatchHipsterThing : WidelyAvailableBase {} + // Useless #available(...) checks func functionWithDefaultAvailabilityAndUselessCheck(_ p: Bool) {