diff --git a/include/swift/AST/PrintOptions.h b/include/swift/AST/PrintOptions.h index 09c7d40d739c8..8b67c7cf0724c 100644 --- a/include/swift/AST/PrintOptions.h +++ b/include/swift/AST/PrintOptions.h @@ -575,10 +575,6 @@ struct PrintOptions { /// compilers that might parse the result. bool PrintCompatibilityFeatureChecks = false; - /// Whether to print @_specialize attributes that have an availability - /// parameter. - bool PrintSpecializeAttributeWithAvailability = true; - /// Whether to always desugar array types from `[base_type]` to `Array` bool AlwaysDesugarArraySliceTypes = false; diff --git a/include/swift/Basic/Features.def b/include/swift/Basic/Features.def index 99010b4048c04..3ff6ffc6edca6 100644 --- a/include/swift/Basic/Features.def +++ b/include/swift/Basic/Features.def @@ -162,7 +162,7 @@ BASELINE_LANGUAGE_FEATURE(BuiltinAllocVector, 0, "Builtin.allocVector") BASELINE_LANGUAGE_FEATURE(BuiltinTaskRunInline, 0, "Builtin.taskRunInline") BASELINE_LANGUAGE_FEATURE(BuiltinUnprotectedAddressOf, 0, "Builtin.unprotectedAddressOf") BASELINE_LANGUAGE_FEATURE(NewCxxMethodSafetyHeuristics, 0, "Only import C++ methods that return pointers (projections) on owned types as unsafe") -SUPPRESSIBLE_LANGUAGE_FEATURE(SpecializeAttributeWithAvailability, 0, "@_specialize attribute with availability") +BASELINE_LANGUAGE_FEATURE(SpecializeAttributeWithAvailability, 0, "@_specialize attribute with availability") BASELINE_LANGUAGE_FEATURE(BuiltinAssumeAlignment, 0, "Builtin.assumeAlignment") BASELINE_LANGUAGE_FEATURE(BuiltinCreateTaskGroupWithFlags, 0, "Builtin.createTaskGroupWithFlags") BASELINE_LANGUAGE_FEATURE(UnsafeInheritExecutor, 0, "@_unsafeInheritExecutor") diff --git a/lib/AST/ASTPrinter.cpp b/lib/AST/ASTPrinter.cpp index 7644f6e6883d0..33e33d0e8a450 100644 --- a/lib/AST/ASTPrinter.cpp +++ b/lib/AST/ASTPrinter.cpp @@ -3061,14 +3061,6 @@ void PrintAST::printExtension(ExtensionDecl *decl) { } } -static void suppressingFeatureSpecializeAttributeWithAvailability( - PrintOptions &options, - llvm::function_ref action) { - llvm::SaveAndRestore scope( - options.PrintSpecializeAttributeWithAvailability, false); - action(); -} - static void suppressingFeatureIsolatedAny(PrintOptions &options, llvm::function_ref action) { llvm::SaveAndRestore scope(options.SuppressIsolatedAny, true); diff --git a/lib/AST/Attr.cpp b/lib/AST/Attr.cpp index cccec29574a36..33bbe9fd2aee3 100644 --- a/lib/AST/Attr.cpp +++ b/lib/AST/Attr.cpp @@ -1465,12 +1465,6 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options, if (Options.printPublicInterface() && !attr->getSPIGroups().empty()) return false; - // Don't print the _specialize attribute if we are asked to skip the ones - // with availability parameters. - if (!Options.PrintSpecializeAttributeWithAvailability && - !attr->getAvailableAttrs().empty()) - return false; - Printer << "@" << getAttrName() << "("; auto exported = attr->isExported() ? "true" : "false"; auto kind = attr->isPartialSpecialization() ? "partial" : "full"; diff --git a/lib/AST/FeatureSet.cpp b/lib/AST/FeatureSet.cpp index f0b97f7e4bca0..d9b3923ddb2f2 100644 --- a/lib/AST/FeatureSet.cpp +++ b/lib/AST/FeatureSet.cpp @@ -50,16 +50,6 @@ static bool usesTypeMatching(Decl *decl, llvm::function_ref fn) { #define UNINTERESTING_FEATURE(FeatureName) \ static bool usesFeature##FeatureName(Decl *decl) { return false; } -static bool usesFeatureSpecializeAttributeWithAvailability(Decl *decl) { - if (auto func = dyn_cast(decl)) { - for (auto specialize : func->getAttrs().getAttributes()) { - if (!specialize->getAvailableAttrs().empty()) - return true; - } - } - return false; -} - // ---------------------------------------------------------------------------- // MARK: - Upcoming Features // ---------------------------------------------------------------------------- diff --git a/test/ModuleInterface/features.swift b/test/ModuleInterface/features.swift index 1f8c8b8ceb6c4..57b02af438171 100644 --- a/test/ModuleInterface/features.swift +++ b/test/ModuleInterface/features.swift @@ -23,16 +23,6 @@ // feature is old enough. The --implicit-check-not arguments to FileCheck above // verify that those guards no longer pollute the emitted interface. -// CHECK: #if compiler(>=5.3) && $SpecializeAttributeWithAvailability -// CHECK: @_specialize(exported: true, kind: full, availability: macOS, introduced: 12; where T == Swift.Int) -// CHECK: public func specializeWithAvailability(_ t: T) -// CHECK: #else -// CHECK: public func specializeWithAvailability(_ t: T) -// CHECK: #endif -@_specialize(exported: true, availability: macOS 12, *; where T == Int) -public func specializeWithAvailability(_ t: T) { -} - // CHECK: public actor MyActor // CHECK: @_semantics("defaultActor") nonisolated final public var unownedExecutor: _Concurrency.UnownedSerialExecutor { // CHECK-NEXT: get @@ -135,12 +125,6 @@ public func asyncIsh(@_inheritActorContext operation: @Sendable @escaping () asy @_unsafeInheritExecutor public func unsafeInheritExecutor() async {} -// CHECK: #if compiler(>=5.3) && $SpecializeAttributeWithAvailability -// CHECK: @_specialize{{.*}} -// CHECK: public func unsafeInheritExecutorAndSpecialize(value: T) async -@_unsafeInheritExecutor -@_specialize(exported: true, availability: SwiftStdlib 5.1, *; where T == Int) -public func unsafeInheritExecutorAndSpecialize(value: T) async {} // CHECK: @_unavailableFromAsync(message: "Test") public func unavailableFromAsyncFunc() @_unavailableFromAsync(message: "Test") diff --git a/test/ModuleInterface/specialize-attr.swift b/test/ModuleInterface/specialize-attr.swift new file mode 100644 index 0000000000000..953f9bdb1dbf3 --- /dev/null +++ b/test/ModuleInterface/specialize-attr.swift @@ -0,0 +1,19 @@ +// RUN: %empty-directory(%t) +// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name Test +// R/UN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name Test -disable-experimental-parser-round-trip +// RUN: %FileCheck %s --implicit-check-not "\$SpecializeAttributeWithAvailability" < %t.swiftinterface + +// CHECK: @_specialize(exported: false, kind: full, where T == Swift.Double) +// CHECK: public func specialize(_ t: T) +@_specialize(exported: false, where T == Double) +public func specialize(_ t: T) {} + +// CHECK: @_specialize(exported: true, kind: full, availability: macOS, introduced: 12; where T == Swift.Int) +// CHECK: public func specializeWithAvailability(_ t: T) +@_specialize(exported: true, availability: macOS 12, *; where T == Int) +public func specializeWithAvailability(_ t: T) {} + +// CHECK: @_specialize(exported: true, kind: full, availability: macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *; where T == Swift.Int) +// CHECK: public func specializeWithStdlibAvailability(value: T) async +@_specialize(exported: true, availability: SwiftStdlib 5.1, *; where T == Int) +public func specializeWithStdlibAvailability(value: T) async {}