From d3f8fd8fd71cc822e540ab687d20ef3e53a68f7a Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Fri, 30 May 2025 00:01:58 -0700 Subject: [PATCH] [AST/Sema] Hide `using` declaration behind `DefaultIsolationPerFile` experimental feature (cherry picked from commit c246a7a37281dcc93b8b837a8fca8de9d5878ddd) --- include/swift/AST/DiagnosticsParse.def | 2 ++ include/swift/Basic/Features.def | 4 ++++ lib/AST/FeatureSet.cpp | 4 ++++ lib/ASTGen/Sources/ASTGen/SourceFile.swift | 1 + lib/Parse/ParseDecl.cpp | 4 ++++ test/ASTGen/decls.swift | 5 ++++- test/ASTGen/diagnostics.swift | 8 ++++++-- test/ModuleInterface/using.swift | 4 +++- test/Parse/using.swift | 4 +++- 9 files changed, 31 insertions(+), 5 deletions(-) diff --git a/include/swift/AST/DiagnosticsParse.def b/include/swift/AST/DiagnosticsParse.def index 90e2b4481ad..e9aff09c3e6 100644 --- a/include/swift/AST/DiagnosticsParse.def +++ b/include/swift/AST/DiagnosticsParse.def @@ -2186,6 +2186,8 @@ ERROR(nonisolated_nonsending_repeated,none, ERROR(using_decl_invalid_specifier,PointsToFirstBadToken, "'using' declaration does not support %0 %select{modifier|attribute}1", (Identifier, bool)) +ERROR(experimental_using_decl_disabled,PointsToFirstBadToken, + "'using' is an experimental feature that is currently disabled", ()) #define UNDEFINE_DIAGNOSTIC_MACROS #include "DefineDiagnosticMacros.h" diff --git a/include/swift/Basic/Features.def b/include/swift/Basic/Features.def index cf8c7fd5312..fd3a88d2e8e 100644 --- a/include/swift/Basic/Features.def +++ b/include/swift/Basic/Features.def @@ -522,6 +522,10 @@ EXPERIMENTAL_FEATURE(AllowRuntimeSymbolDeclarations, true) /// Optimize copies of ObjectiveC blocks. EXPERIMENTAL_FEATURE(CopyBlockOptimization, true) +/// Allow use of `using` declaration that control default isolation +/// in a file scope. +EXPERIMENTAL_FEATURE(DefaultIsolationPerFile, false) + #undef EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE #undef EXPERIMENTAL_FEATURE #undef UPCOMING_FEATURE diff --git a/lib/AST/FeatureSet.cpp b/lib/AST/FeatureSet.cpp index e859c8b742d..92310ada143 100644 --- a/lib/AST/FeatureSet.cpp +++ b/lib/AST/FeatureSet.cpp @@ -632,6 +632,10 @@ static bool usesFeatureAlwaysInheritActorContext(Decl *decl) { return false; } +static bool usesFeatureDefaultIsolationPerFile(Decl *D) { + return isa(D); +} + // ---------------------------------------------------------------------------- // MARK: - FeatureSet // ---------------------------------------------------------------------------- diff --git a/lib/ASTGen/Sources/ASTGen/SourceFile.swift b/lib/ASTGen/Sources/ASTGen/SourceFile.swift index ada0514e033..03c13f0193f 100644 --- a/lib/ASTGen/Sources/ASTGen/SourceFile.swift +++ b/lib/ASTGen/Sources/ASTGen/SourceFile.swift @@ -78,6 +78,7 @@ extension Parser.ExperimentalFeatures { mapFeature(.OldOwnershipOperatorSpellings, to: .oldOwnershipOperatorSpellings) mapFeature(.KeyPathWithMethodMembers, to: .keypathWithMethodMembers) mapFeature(.InlineArrayTypeSugar, to: .inlineArrayTypeSugar) + mapFeature(.DefaultIsolationPerFile, to: .defaultIsolationPerFile) } } diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index b775989a1cd..36c8ec43038 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -6647,6 +6647,10 @@ ParserResult Parser::parseDeclUsing(ParseDeclOptions Flags, assert(Tok.isContextualKeyword("using")); DebuggerContextChange DCC(*this); + if (!Context.LangOpts.hasFeature(Feature::DefaultIsolationPerFile)) { + diagnose(Tok, diag::experimental_using_decl_disabled); + } + SourceLoc UsingLoc = consumeToken(); if (Tok.is(tok::code_complete)) { diff --git a/test/ASTGen/decls.swift b/test/ASTGen/decls.swift index b376c6c335d..aebef050c77 100644 --- a/test/ASTGen/decls.swift +++ b/test/ASTGen/decls.swift @@ -2,19 +2,22 @@ // RUN: %empty-directory(%t) // RUN: %target-swift-frontend-dump-parse -disable-availability-checking -enable-experimental-move-only -enable-experimental-concurrency -enable-experimental-feature ParserASTGen \ // RUN: -enable-experimental-feature CoroutineAccessors \ +// RUN: -enable-experimental-feature DefaultIsolationPerFile \ // RUN: | %sanitize-address > %t/astgen.ast // RUN: %target-swift-frontend-dump-parse -disable-availability-checking -enable-experimental-move-only -enable-experimental-concurrency \ // RUN: -enable-experimental-feature CoroutineAccessors \ +// RUN: -enable-experimental-feature DefaultIsolationPerFile \ // RUN: | %sanitize-address > %t/cpp-parser.ast // RUN: %diff -u %t/astgen.ast %t/cpp-parser.ast -// RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -Xfrontend -enable-experimental-concurrency -enable-experimental-feature CoroutineAccessors -enable-experimental-feature ParserASTGen) +// RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -Xfrontend -enable-experimental-concurrency -enable-experimental-feature CoroutineAccessors -enable-experimental-feature DefaultIsolationPerFile -enable-experimental-feature ParserASTGen) // REQUIRES: executable_test // REQUIRES: swift_swift_parser // REQUIRES: swift_feature_ParserASTGen // REQUIRES: swift_feature_CoroutineAccessors +// REQUIRES: swift_feature_DefaultIsolationPerFile // rdar://116686158 // UNSUPPORTED: asan diff --git a/test/ASTGen/diagnostics.swift b/test/ASTGen/diagnostics.swift index fa14a16e658..c78ad917d96 100644 --- a/test/ASTGen/diagnostics.swift +++ b/test/ASTGen/diagnostics.swift @@ -1,9 +1,13 @@ // RUN: %empty-directory(%t) -// RUN: %target-typecheck-verify-swift -disable-availability-checking -enable-bare-slash-regex -enable-experimental-feature ParserASTGen +// RUN: %target-typecheck-verify-swift -disable-availability-checking \ +// RUN: -enable-bare-slash-regex \ +// RUN: -enable-experimental-feature ParserASTGen \ +// RUN: -enable-experimental-feature DefaultIsolationPerFile // REQUIRES: swift_swift_parser // REQUIRES: swift_feature_ParserASTGen +// REQUIRES: swift_feature_DefaultIsolationPerFile // rdar://116686158 // UNSUPPORTED: asan @@ -75,4 +79,4 @@ using @Test // expected-error@-1 {{default isolation can only be set to '@MainActor' or 'nonisolated'}} using test -// expected-error@-1 {{default isolation can only be set to '@MainActor' or 'nonisolated'}} +// expected-error@-1 {{default isolation can only be set to '@MainActor' or 'nonisolated'}} \ No newline at end of file diff --git a/test/ModuleInterface/using.swift b/test/ModuleInterface/using.swift index 68cc22c78a8..9b773ce1de0 100644 --- a/test/ModuleInterface/using.swift +++ b/test/ModuleInterface/using.swift @@ -1,9 +1,11 @@ -// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s +// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -enable-experimental-feature DefaultIsolationPerFile // RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) // RUN: %FileCheck %s --input-file %t.swiftinterface +// REQUIRES: swift_feature_DefaultIsolationPerFile + using @MainActor // CHECK-NOT: using @MainActor diff --git a/test/Parse/using.swift b/test/Parse/using.swift index a33f4764802..7b7500f1ddf 100644 --- a/test/Parse/using.swift +++ b/test/Parse/using.swift @@ -1,4 +1,6 @@ -// RUN: %target-typecheck-verify-swift +// RUN: %target-typecheck-verify-swift -enable-experimental-feature DefaultIsolationPerFile + +// REQUIRES: swift_feature_DefaultIsolationPerFile // REQUIRES: concurrency