diff --git a/include/swift/Basic/Features.def b/include/swift/Basic/Features.def index 2f889e2fefc..17017eecb06 100644 --- a/include/swift/Basic/Features.def +++ b/include/swift/Basic/Features.def @@ -490,7 +490,7 @@ SUPPRESSIBLE_EXPERIMENTAL_FEATURE(ExecutionAttribute, false) ADOPTABLE_EXPERIMENTAL_FEATURE(AsyncCallerExecution, false) /// Allow custom availability domains to be defined and referenced. -SUPPRESSIBLE_EXPERIMENTAL_FEATURE(CustomAvailability, true) +EXPERIMENTAL_FEATURE(CustomAvailability, true) /// Allow public enumerations to be extensible by default /// regardless of whether the module they are declared in diff --git a/lib/AST/ASTPrinter.cpp b/lib/AST/ASTPrinter.cpp index 765b5d7b498..cf7f9bb5c96 100644 --- a/lib/AST/ASTPrinter.cpp +++ b/lib/AST/ASTPrinter.cpp @@ -3301,14 +3301,6 @@ suppressingFeatureAddressableTypes(PrintOptions &options, action(); } -static void -suppressingFeatureCustomAvailability(PrintOptions &options, - llvm::function_ref action) { - // FIXME: [availability] Save and restore a bit controlling whether - // @available attributes for custom domains are printed. - action(); -} - static void suppressingFeatureExecutionAttribute(PrintOptions &options, llvm::function_ref action) { diff --git a/lib/AST/FeatureSet.cpp b/lib/AST/FeatureSet.cpp index 2197edead58..c4a9c9d9343 100644 --- a/lib/AST/FeatureSet.cpp +++ b/lib/AST/FeatureSet.cpp @@ -468,8 +468,10 @@ static bool usesFeatureCoroutineAccessors(Decl *decl) { } static bool usesFeatureCustomAvailability(Decl *decl) { - // FIXME: [availability] Check whether @available attributes for custom - // domains are attached to the decl. + for (auto attr : decl->getSemanticAvailableAttrs()) { + if (attr.getDomain().isCustom()) + return true; + } return false; } diff --git a/test/ModuleInterface/availability_custom_domains.swift b/test/ModuleInterface/availability_custom_domains.swift new file mode 100644 index 00000000000..c31eca0c8b0 --- /dev/null +++ b/test/ModuleInterface/availability_custom_domains.swift @@ -0,0 +1,32 @@ +// RUN: %empty-directory(%t) + +// RUN: %target-swift-emit-module-interface(%t/Test.swiftinterface) %s \ +// RUN: -I %S/../Inputs/custom-modules/availability-domains \ +// RUN: -enable-experimental-feature CustomAvailability \ +// RUN: -module-name Test + +// RUN: %target-swift-typecheck-module-from-interface(%t/Test.swiftinterface) \ +// RUN: -I %S/../Inputs/custom-modules/availability-domains \ +// RUN: -module-name Test + +// RUN: %FileCheck %s < %t/Test.swiftinterface + +// REQUIRES: swift_feature_CustomAvailability + +import Oceans // re-exports Rivers + +// CHECK: #if compiler(>=5.3) && $CustomAvailability +// CHECK-NEXT: @available(Colorado) +// CHECK-NEXT: public func availableInColorado() +// CHECK-NEXT: #endif +@available(Colorado) +public func availableInColorado() { } + +// CHECK: #if compiler(>=5.3) && $CustomAvailability +// CHECK-NEXT: @available(Arctic, unavailable) +// CHECK-NEXT: @available(Pacific) +// CHECK-NEXT: public func unavailableInArcticButAvailableInPacific() +// CHECK-NEXT: #endif +@available(Arctic, unavailable) +@available(Pacific) +public func unavailableInArcticButAvailableInPacific() { }