Skip to content

Commit afa2edb

Browse files
authored
Rollup merge of rust-lang#95860 - c410-f3r:stabilize-meta, r=joshtriplett
Stabilize `$$` in Rust 1.63.0 # Stabilization proposal This PR proposes the stabilization of a subset of `#![feature(macro_metavar_expr)]` or more specifically, the stabilization of dollar-dollar (`$$`). Tracking issue: rust-lang#83527 Version: 1.63 (2022-06-28 => beta, 2022-08-11 => stable). ## What is stabilized ```rust macro_rules! foo { () => { macro_rules! bar { ( $$( $$any:tt )* ) => { $$( $$any )* }; } }; } fn main() { foo!(); } ``` ## Motivation For more examples, see the [RFC](https://github.com/markbt/rfcs/blob/macro_metavar_expr/text/0000-macro-metavar-expr.md). Users must currently resort to a tricky and not so well-known hack to declare nested macros with repetitions. ```rust macro_rules! foo { ($dollar:tt) => { macro_rules! bar { ( $dollar ( $any:tt )* ) => { $dollar ( $any )* }; } }; } fn main() { foo!($); } ``` As seen above, such hack is fragile and makes work with declarative macros much more unpleasant. Dollar-dollar (`$$`), on the other hand, makes nested macros more intuitive. ## What isn't stabilized `count`, `ignore`, `index` and `length` are not being stabilized due to the lack of consensus. ## History * 2021-02-22, [RFC: Declarative macro metavariable expressions](rust-lang/rfcs#3086) * 2021-03-26, [Tracking Issue for RFC 3086: macro metavariable expressions](rust-lang#83527) * 2022-02-01, [Implement macro meta-variable expressions](rust-lang#93545) * 2022-02-25, [[1/2] Implement macro meta-variable expressions](rust-lang#94368) * 2022-03-11, [[2/2] Implement macro meta-variable expressions](rust-lang#94833) * 2022-03-12, [Fix remaining meta-variable expression TODOs](rust-lang#94884) * 2019-03-21, [[macro-metavar-expr] Fix generated tokens hygiene](rust-lang#95188) * 2022-04-07, [Kickstart the inner usage of macro_metavar_expr](rust-lang#95761) * 2022-04-07, [[macro_metavar_expr] Add tests to ensure the feature requirement](rust-lang#95764) ## Non-stabilized expressions rust-lang#83527 lists several concerns about some characteristics of `count`, `index` and `length` that effectively make their stabilization unfeasible. `$$` and `ignore`, however, are not part of any discussion and thus are suitable for stabilization. It is not in the scope of this PR to detail each concern or suggest any possible converging solution. Such thing should be restrained in this tracking issue. ## Tests This list is a subset of https://github.com/rust-lang/rust/tree/master/src/test/ui/macros/rfc-3086-metavar-expr * [Ensures that nested macros have correct behavior](https://github.com/rust-lang/rust/blob/master/src/test/ui/macros/rfc-3086-metavar-expr/dollar-dollar-has-correct-behavior.rs) * [Compares produced tokens to assert expected outputs](https://github.com/rust-lang/rust/blob/master/src/test/ui/macros/rfc-3086-metavar-expr/feature-gate-macro_metavar_expr.rs) * [Checks the declarations of the feature](https://github.com/rust-lang/rust/blob/master/src/test/ui/macros/rfc-3086-metavar-expr/required-feature.rs) * [Verifies all possible errors that can occur due to incorrect user input](https://github.com/rust-lang/rust/blob/master/src/test/ui/macros/rfc-3086-metavar-expr/syntax-errors.rs) ## Possible future work Once consensus is achieved, other nightly expressions can be stabilized. Thanks ``@markbt`` for creating the RFC and thanks to ``@petrochenkov`` and ``@mark-i-m`` for reviewing the implementations.
2 parents f14ccdb + 9edaa76 commit afa2edb

File tree

4 files changed

+19
-57
lines changed

4 files changed

+19
-57
lines changed

compiler/rustc_expand/src/mbe/quoted.rs

-2
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,6 @@ fn parse_tree(
234234
sess,
235235
&Token { kind: token::Dollar, span },
236236
);
237-
} else {
238-
maybe_emit_macro_metavar_expr_feature(features, sess, span);
239237
}
240238
TokenTree::token(token::Dollar, span)
241239
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// check-pass
2+
3+
macro_rules! dollar_dollar {
4+
() => {
5+
macro_rules! bar {
6+
( $$( $$any:tt )* ) => { $$( $$any )* };
7+
}
8+
};
9+
}
10+
11+
fn main() {
12+
}

src/test/ui/macros/rfc-3086-metavar-expr/required-feature.rs src/test/ui/macros/rfc-3086-metavar-expr/required-features.rs

-12
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,6 @@ macro_rules! count {
55
};
66
}
77

8-
macro_rules! dollar_dollar {
9-
() => {
10-
macro_rules! bar {
11-
( $$( $$any:tt )* ) => { $$( $$any )* };
12-
//~^ ERROR meta-variable expressions are unstable
13-
//~| ERROR meta-variable expressions are unstable
14-
//~| ERROR meta-variable expressions are unstable
15-
//~| ERROR meta-variable expressions are unstable
16-
}
17-
};
18-
}
19-
208
macro_rules! index {
219
( $( $e:stmt ),* ) => {
2210
$( ${ignore(e)} ${index()} )*
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0658]: meta-variable expressions are unstable
2-
--> $DIR/required-feature.rs:3:10
2+
--> $DIR/required-features.rs:3:10
33
|
44
LL | ${ count(e) }
55
| ^^^^^^^^^^^^
@@ -8,43 +8,7 @@ LL | ${ count(e) }
88
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
99

1010
error[E0658]: meta-variable expressions are unstable
11-
--> $DIR/required-feature.rs:11:16
12-
|
13-
LL | ( $$( $$any:tt )* ) => { $$( $$any )* };
14-
| ^
15-
|
16-
= note: see issue #83527 <https://github.com/rust-lang/rust/issues/83527> for more information
17-
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
18-
19-
error[E0658]: meta-variable expressions are unstable
20-
--> $DIR/required-feature.rs:11:20
21-
|
22-
LL | ( $$( $$any:tt )* ) => { $$( $$any )* };
23-
| ^
24-
|
25-
= note: see issue #83527 <https://github.com/rust-lang/rust/issues/83527> for more information
26-
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
27-
28-
error[E0658]: meta-variable expressions are unstable
29-
--> $DIR/required-feature.rs:11:39
30-
|
31-
LL | ( $$( $$any:tt )* ) => { $$( $$any )* };
32-
| ^
33-
|
34-
= note: see issue #83527 <https://github.com/rust-lang/rust/issues/83527> for more information
35-
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
36-
37-
error[E0658]: meta-variable expressions are unstable
38-
--> $DIR/required-feature.rs:11:43
39-
|
40-
LL | ( $$( $$any:tt )* ) => { $$( $$any )* };
41-
| ^
42-
|
43-
= note: see issue #83527 <https://github.com/rust-lang/rust/issues/83527> for more information
44-
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
45-
46-
error[E0658]: meta-variable expressions are unstable
47-
--> $DIR/required-feature.rs:22:13
11+
--> $DIR/required-features.rs:10:13
4812
|
4913
LL | $( ${ignore(e)} ${index()} )*
5014
| ^^^^^^^^^^^
@@ -53,7 +17,7 @@ LL | $( ${ignore(e)} ${index()} )*
5317
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
5418

5519
error[E0658]: meta-variable expressions are unstable
56-
--> $DIR/required-feature.rs:22:26
20+
--> $DIR/required-features.rs:10:26
5721
|
5822
LL | $( ${ignore(e)} ${index()} )*
5923
| ^^^^^^^^^
@@ -62,7 +26,7 @@ LL | $( ${ignore(e)} ${index()} )*
6226
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
6327

6428
error[E0658]: meta-variable expressions are unstable
65-
--> $DIR/required-feature.rs:30:19
29+
--> $DIR/required-features.rs:18:19
6630
|
6731
LL | 0 $( + 1 ${ignore(i)} )*
6832
| ^^^^^^^^^^^
@@ -71,7 +35,7 @@ LL | 0 $( + 1 ${ignore(i)} )*
7135
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
7236

7337
error[E0658]: meta-variable expressions are unstable
74-
--> $DIR/required-feature.rs:37:13
38+
--> $DIR/required-features.rs:25:13
7539
|
7640
LL | $( ${ignore(e)} ${length()} )*
7741
| ^^^^^^^^^^^
@@ -80,14 +44,14 @@ LL | $( ${ignore(e)} ${length()} )*
8044
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
8145

8246
error[E0658]: meta-variable expressions are unstable
83-
--> $DIR/required-feature.rs:37:26
47+
--> $DIR/required-features.rs:25:26
8448
|
8549
LL | $( ${ignore(e)} ${length()} )*
8650
| ^^^^^^^^^^
8751
|
8852
= note: see issue #83527 <https://github.com/rust-lang/rust/issues/83527> for more information
8953
= help: add `#![feature(macro_metavar_expr)]` to the crate attributes to enable
9054

91-
error: aborting due to 10 previous errors
55+
error: aborting due to 6 previous errors
9256

9357
For more information about this error, try `rustc --explain E0658`.

0 commit comments

Comments
 (0)