Enable SE-0422 Expression macro as caller-side default argument

This commit is contained in:
Apollo Zhu
2024-02-14 17:49:26 -08:00
parent 0558bde15e
commit 9ccfb574fd
12 changed files with 39 additions and 54 deletions

View File

@@ -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),

View File

@@ -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",
())

View File

@@ -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

View File

@@ -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();

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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