Skip to content

Commit 3ecbfcf

Browse files
authored
Merge pull request #71637 from apple/ApolloZhu/SE-0422/accepted
2 parents 28c0e4d + 9ccfb57 commit 3ecbfcf

12 files changed

+39
-54
lines changed

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,33 @@
44
> This is in reverse chronological order, so newer entries are added to the top.
55
66
## Swift 5.11
7+
* [SE-0422][]:
8+
Non-built-in expression macros can now be used as default arguments that
9+
expand at each call site. For example, a custom `#CurrentFile` macro used as
10+
a default argument in 'Library.swift' won't be expanded to `"Library.swift"`:
11+
12+
```swift
13+
@freestanding(expression)
14+
public macro CurrentFile() -> String = ...
15+
16+
public func currentFile(name: String = #CurrentFile) { name }
17+
```
18+
19+
Instead, it will be expanded at where the function is called:
20+
21+
```swift
22+
print(currentFile())
23+
// Prints "main.swift"
24+
```
25+
26+
The expanded code can also use declarations from the caller side context:
27+
28+
```swift
29+
var person = "client"
30+
greetPerson(/* greeting: #informalGreeting */)
31+
// Prints "Hi client" if macro expands to "Hi \(person)"
32+
```
33+
734
* [SE-0417][]:
835
Tasks now gain the ability to respect Task Executor preference.
936
This allows tasks executing default actors (which do not declare a custom executor),

include/swift/AST/DiagnosticsSema.def

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7535,9 +7535,6 @@ ERROR(extension_macro_invalid_conformance,none,
75357535
ERROR(macro_attached_to_invalid_decl,none,
75367536
"'%0' macro cannot be attached to %1 (%base2)",
75377537
(StringRef, DescriptiveDeclKind, const Decl *))
7538-
ERROR(macro_as_default_argument, none,
7539-
"non-built-in macro cannot be used as default argument",
7540-
())
75417538
ERROR(conformance_macro,none,
75427539
"conformance macros are replaced by extension macros",
75437540
())

include/swift/Basic/Features.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ SUPPRESSIBLE_LANGUAGE_FEATURE(RetroactiveAttribute, 364, "@retroactive")
123123
SUPPRESSIBLE_LANGUAGE_FEATURE(ExtensionMacroAttr, 0, "@attached(extension)")
124124
LANGUAGE_FEATURE(TypedThrows, 413, "Typed throws")
125125
SUPPRESSIBLE_LANGUAGE_FEATURE(Extern, 0, "@_extern")
126+
LANGUAGE_FEATURE(ExpressionMacroDefaultArguments, 422, "Expression macro as caller-side default argument")
126127

127128
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
128129
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)
@@ -144,7 +145,6 @@ EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)
144145
EXPERIMENTAL_FEATURE(FlowSensitiveConcurrencyCaptures, false)
145146
EXPERIMENTAL_FEATURE(CodeItemMacros, false)
146147
EXPERIMENTAL_FEATURE(BodyMacros, true)
147-
EXPERIMENTAL_FEATURE(ExpressionMacroDefaultArguments, false)
148148
EXPERIMENTAL_FEATURE(TupleConformances, false)
149149

150150
// Whether to enable @_used and @_section attributes

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,13 +1027,6 @@ static bool checkExpressionMacroDefaultValueRestrictions(ParamDecl *param) {
10271027
auto *initExpr = param->getStructuralDefaultExpr();
10281028
assert(initExpr);
10291029

1030-
// Prohibit default argument that is a non-built-in macro to avoid confusion,
1031-
// unless the experimental feature flag is set.
1032-
if (!ctx.LangOpts.hasFeature(Feature::ExpressionMacroDefaultArguments)) {
1033-
ctx.Diags.diagnose(initExpr->getLoc(), diag::macro_as_default_argument);
1034-
return false;
1035-
}
1036-
10371030
#if SWIFT_BUILD_SWIFT_SYNTAX
10381031
auto *DC = param->getInnermostDeclContext();
10391032
const SourceFile *SF = DC->getParentSourceFile();

test/Macros/macro_default_argument.swift

Lines changed: 0 additions & 32 deletions
This file was deleted.

test/Macros/macro_default_argument_access_level.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// RUN: %empty-directory(%t)
44
// 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
55

6-
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -enable-experimental-feature ExpressionMacroDefaultArguments
6+
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s
77

88
public typealias Stringified<T> = (T, String)
99

test/Macros/macro_default_argument_diagnostics.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// RUN: %empty-directory(%t)
44
// 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
55

6-
// 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
6+
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) %s -enable-bare-slash-regex
77

88
public typealias Stringified<T> = (T, String)
99

test/Macros/macro_default_argument_library.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
// 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
66

7-
// 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
7+
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name CheckInterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t
88
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name CheckInterface -load-plugin-library %t/%target-library-name(MacroDefinition) -I %t
99

1010
// RUN: %FileCheck %s < %t.swiftinterface

test/Macros/macro_default_argument_serialized.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
// 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
77

8-
// 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
8+
// 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
99

10-
// 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
10+
// 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
1111
// RUN: %target-codesign %t/main
1212
// RUN: %target-run %t/main | %FileCheck %s
1313

test/Macros/macro_default_argument_source_location.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
// 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
77

8-
// 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
8+
// 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
99

10-
// 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
10+
// 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
1111

12-
// 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
12+
// 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
1313
// RUN: %target-codesign %t/main
1414
// RUN: %target-run %t/main | %FileCheck %s
1515

0 commit comments

Comments
 (0)