mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Enable SE-0422 Expression macro as caller-side default argument
This commit is contained in:
27
CHANGELOG.md
27
CHANGELOG.md
@@ -4,6 +4,33 @@
|
||||
> This is in reverse chronological order, so newer entries are added to the top.
|
||||
|
||||
## Swift 5.11
|
||||
* [SE-0422][]:
|
||||
Non-built-in expression macros can now be used as default arguments that
|
||||
expand at each call site. For example, a custom `#CurrentFile` macro used as
|
||||
a default argument in 'Library.swift' won't be expanded to `"Library.swift"`:
|
||||
|
||||
```swift
|
||||
@freestanding(expression)
|
||||
public macro CurrentFile() -> String = ...
|
||||
|
||||
public func currentFile(name: String = #CurrentFile) { name }
|
||||
```
|
||||
|
||||
Instead, it will be expanded at where the function is called:
|
||||
|
||||
```swift
|
||||
print(currentFile())
|
||||
// Prints "main.swift"
|
||||
```
|
||||
|
||||
The expanded code can also use declarations from the caller side context:
|
||||
|
||||
```swift
|
||||
var person = "client"
|
||||
greetPerson(/* greeting: #informalGreeting */)
|
||||
// Prints "Hi client" if macro expands to "Hi \(person)"
|
||||
```
|
||||
|
||||
* [SE-0417][]:
|
||||
Tasks now gain the ability to respect Task Executor preference.
|
||||
This allows tasks executing default actors (which do not declare a custom executor),
|
||||
|
||||
@@ -7535,9 +7535,6 @@ ERROR(extension_macro_invalid_conformance,none,
|
||||
ERROR(macro_attached_to_invalid_decl,none,
|
||||
"'%0' macro cannot be attached to %1 (%base2)",
|
||||
(StringRef, DescriptiveDeclKind, const Decl *))
|
||||
ERROR(macro_as_default_argument, none,
|
||||
"non-built-in macro cannot be used as default argument",
|
||||
())
|
||||
ERROR(conformance_macro,none,
|
||||
"conformance macros are replaced by extension macros",
|
||||
())
|
||||
|
||||
@@ -114,6 +114,7 @@ SUPPRESSIBLE_LANGUAGE_FEATURE(RetroactiveAttribute, 364, "@retroactive")
|
||||
SUPPRESSIBLE_LANGUAGE_FEATURE(ExtensionMacroAttr, 0, "@attached(extension)")
|
||||
LANGUAGE_FEATURE(TypedThrows, 413, "Typed throws")
|
||||
SUPPRESSIBLE_LANGUAGE_FEATURE(Extern, 0, "@_extern")
|
||||
LANGUAGE_FEATURE(ExpressionMacroDefaultArguments, 422, "Expression macro as caller-side default argument")
|
||||
|
||||
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
|
||||
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)
|
||||
@@ -135,7 +136,6 @@ EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)
|
||||
EXPERIMENTAL_FEATURE(FlowSensitiveConcurrencyCaptures, false)
|
||||
EXPERIMENTAL_FEATURE(CodeItemMacros, false)
|
||||
EXPERIMENTAL_FEATURE(BodyMacros, true)
|
||||
EXPERIMENTAL_FEATURE(ExpressionMacroDefaultArguments, false)
|
||||
EXPERIMENTAL_FEATURE(TupleConformances, false)
|
||||
|
||||
// Whether to enable @_used and @_section attributes
|
||||
|
||||
@@ -1027,13 +1027,6 @@ static bool checkExpressionMacroDefaultValueRestrictions(ParamDecl *param) {
|
||||
auto *initExpr = param->getStructuralDefaultExpr();
|
||||
assert(initExpr);
|
||||
|
||||
// Prohibit default argument that is a non-built-in macro to avoid confusion,
|
||||
// unless the experimental feature flag is set.
|
||||
if (!ctx.LangOpts.hasFeature(Feature::ExpressionMacroDefaultArguments)) {
|
||||
ctx.Diags.diagnose(initExpr->getLoc(), diag::macro_as_default_argument);
|
||||
return false;
|
||||
}
|
||||
|
||||
#if SWIFT_BUILD_SWIFT_SYNTAX
|
||||
auto *DC = param->getInnermostDeclContext();
|
||||
const SourceFile *SF = DC->getParentSourceFile();
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
// REQUIRES: swift_swift_parser
|
||||
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s
|
||||
|
||||
@freestanding(expression)
|
||||
macro MagicLine() -> Int = #externalMacro(module: "MacroDefinition", type: "MagicLineMacro")
|
||||
|
||||
struct LineContainer {
|
||||
let line: Int
|
||||
}
|
||||
|
||||
func partOfDefaultArgumentOkay(container: LineContainer = .init(line: #MagicLine)) {
|
||||
print(container.line)
|
||||
}
|
||||
|
||||
func parenthesizedExpansionAtDeclOkay(line: Int = (#MagicLine)) {
|
||||
print(line)
|
||||
}
|
||||
|
||||
func builtInOkay(line: Int = #line) {
|
||||
print(line)
|
||||
}
|
||||
|
||||
// expected-error@+1{{non-built-in macro cannot be used as default argument}}
|
||||
func asDefaultArgument(line: Int = #MagicLine) {
|
||||
print(line)
|
||||
}
|
||||
|
||||
asDefaultArgument()
|
||||
@@ -3,7 +3,7 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -enable-experimental-feature ExpressionMacroDefaultArguments
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s
|
||||
|
||||
public typealias Stringified<T> = (T, String)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -enable-experimental-feature ExpressionMacroDefaultArguments -enable-bare-slash-regex
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -enable-bare-slash-regex
|
||||
|
||||
public typealias Stringified<T> = (T, String)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name CheckInterface -load-plugin-library %t/%target-library-name(MacroDefinition) -enable-experimental-feature ExpressionMacroDefaultArguments -I %t
|
||||
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name CheckInterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t
|
||||
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name CheckInterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t
|
||||
|
||||
// RUN: %FileCheck %s < %t.swiftinterface
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(Serialized)) %S/macro_default_argument_library.swift -module-name Serialized -emit-module -emit-module-path %t/Serialized.swiftmodule -load-plugin-library %t/%target-library-name(MacroDefinition) -enable-experimental-feature ExpressionMacroDefaultArguments -I %t -swift-version 5
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(Serialized)) %S/macro_default_argument_library.swift -module-name Serialized -emit-module -emit-module-path %t/Serialized.swiftmodule -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t -swift-version 5
|
||||
|
||||
// RUN: %target-build-swift -enable-experimental-feature ExpressionMacroDefaultArguments -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lSerialized
|
||||
// RUN: %target-build-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lSerialized
|
||||
// RUN: %target-codesign %t/main
|
||||
// RUN: %target-run %t/main | %FileCheck %s
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(WithMacroDefaultArg)) %S/Inputs/with_macro_default_arg_module.swift -module-name WithMacroDefaultArg -emit-module -emit-module-path %t/WithMacroDefaultArg.swiftmodule -load-plugin-library %t/%target-library-name(MacroDefinition) -enable-experimental-feature ExpressionMacroDefaultArguments -I %t -swift-version 5
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(WithMacroDefaultArg)) %S/Inputs/with_macro_default_arg_module.swift -module-name WithMacroDefaultArg -emit-module -emit-module-path %t/WithMacroDefaultArg.swiftmodule -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t -swift-version 5
|
||||
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(WithMacroDefaultArgInterface)) %S/Inputs/with_macro_default_arg_interface.swift -module-name WithMacroDefaultArgInterface -enable-library-evolution -emit-module-interface-path %t/WithMacroDefaultArgInterface.swiftinterface -load-plugin-library %t/%target-library-name(MacroDefinition) -enable-experimental-feature ExpressionMacroDefaultArguments -I %t -swift-version 5
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(WithMacroDefaultArgInterface)) %S/Inputs/with_macro_default_arg_interface.swift -module-name WithMacroDefaultArgInterface -enable-library-evolution -emit-module-interface-path %t/WithMacroDefaultArgInterface.swiftinterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t -swift-version 5
|
||||
|
||||
// RUN: %target-build-swift -enable-experimental-feature ExpressionMacroDefaultArguments -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %S/Inputs/with_macro_default_arg_same_module.swift %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lWithMacroDefaultArg -lWithMacroDefaultArgInterface
|
||||
// RUN: %target-build-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %S/Inputs/with_macro_default_arg_same_module.swift %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lWithMacroDefaultArg -lWithMacroDefaultArgInterface
|
||||
// RUN: %target-codesign %t/main
|
||||
// RUN: %target-run %t/main | %FileCheck %s
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
||||
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(Interface)) %S/macro_default_argument_library.swift -module-name Interface -enable-library-evolution -emit-module-interface-path %t/Interface.swiftinterface -load-plugin-library %t/%target-library-name(MacroDefinition) -enable-experimental-feature ExpressionMacroDefaultArguments -I %t -swift-version 5
|
||||
// RUN: %target-build-swift-dylib(%t/%target-library-name(Interface)) %S/macro_default_argument_library.swift -module-name Interface -enable-library-evolution -emit-module-interface-path %t/Interface.swiftinterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t -swift-version 5
|
||||
|
||||
// RUN: %target-build-swift -enable-experimental-feature ExpressionMacroDefaultArguments -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lInterface
|
||||
// RUN: %target-build-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -o %t/main -module-name MacroUser -emit-tbd -emit-tbd-path %t/MacroUser.tbd -I %t -L %t %target-rpath(%t) -lInterface
|
||||
// RUN: %target-codesign %t/main
|
||||
// RUN: %target-run %t/main | %FileCheck %s
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
// RUN: not %target-swift-frontend -typecheck-module-from-interface %t/UnbuildableCurrent.swiftinterface 2>&1 | %FileCheck -check-prefixes=ALL,CURRENT-VERIFY %s
|
||||
// RUN: not %target-swift-frontend -typecheck-module-from-interface %t/UnbuildableFuture.swiftinterface 2>&1 | %FileCheck -check-prefixes=ALL,FUTURE-VERIFY %s
|
||||
|
||||
// ALL: Unbuildable{{[^.]+}}.swiftinterface:{{[0-9]+}}:{{[0-9]+}}: error: non-built-in macro cannot be used as default argument
|
||||
// ALL: Unbuildable{{[^.]+}}.swiftinterface:{{[0-9]+}}:{{[0-9]+}}: error: no macro named 'somethingYouveNeverHeardOf'
|
||||
|
||||
#if CURRENT
|
||||
import UnbuildableCurrent
|
||||
|
||||
Reference in New Issue
Block a user