Skip to content

Commit f167090

Browse files
authored
Unrolled build for #156184
Rollup merge of #156184 - cyrgani:macros-are-weird, r=petrochenkov Revert "remove `MethodReceiverExpr` special-casing" This reverts commit 5ad560f and adds a regression test. Fixes #156084. r? @petrochenkov
2 parents 740679e + ee35020 commit f167090

4 files changed

Lines changed: 33 additions & 9 deletions

File tree

compiler/rustc_expand/src/base.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -423,10 +423,6 @@ pub trait MacResult {
423423
None
424424
}
425425

426-
fn make_method_receiver_expr(self: Box<Self>) -> Option<Box<ast::Expr>> {
427-
self.make_expr()
428-
}
429-
430426
/// Creates zero or more items.
431427
fn make_items(self: Box<Self>) -> Option<SmallVec<[Box<ast::Item>; 1]>> {
432428
None

compiler/rustc_expand/src/expand.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,23 @@ macro_rules! ast_fragments {
6868
/// Can also serve as an input and intermediate result for macro expansion operations.
6969
pub enum AstFragment {
7070
OptExpr(Option<Box<ast::Expr>>),
71+
MethodReceiverExpr(Box<ast::Expr>),
7172
$($Kind($AstTy),)*
7273
}
7374

7475
/// "Discriminant" of an AST fragment.
7576
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
7677
pub enum AstFragmentKind {
7778
OptExpr,
79+
MethodReceiverExpr,
7880
$($Kind,)*
7981
}
8082

8183
impl AstFragmentKind {
8284
pub fn name(self) -> &'static str {
8385
match self {
8486
AstFragmentKind::OptExpr => "expression",
87+
AstFragmentKind::MethodReceiverExpr => "expression",
8588
$(AstFragmentKind::$Kind => $kind_name,)*
8689
}
8790
}
@@ -90,6 +93,8 @@ macro_rules! ast_fragments {
9093
match self {
9194
AstFragmentKind::OptExpr =>
9295
result.make_expr().map(Some).map(AstFragment::OptExpr),
96+
AstFragmentKind::MethodReceiverExpr =>
97+
result.make_expr().map(AstFragment::MethodReceiverExpr),
9398
$(AstFragmentKind::$Kind => result.$make_ast().map(AstFragment::$Kind),)*
9499
}
95100
}
@@ -116,6 +121,13 @@ macro_rules! ast_fragments {
116121
}
117122
}
118123

124+
pub(crate) fn make_method_receiver_expr(self) -> Box<ast::Expr> {
125+
match self {
126+
AstFragment::MethodReceiverExpr(expr) => expr,
127+
_ => panic!("AstFragment::make_method_receiver_expr called on the wrong kind of fragment"),
128+
}
129+
}
130+
119131
$(pub fn $make_ast(self) -> $AstTy {
120132
match self {
121133
AstFragment::$Kind(ast) => ast,
@@ -134,6 +146,7 @@ macro_rules! ast_fragments {
134146
*opt_expr = vis.filter_map_expr(expr)
135147
}
136148
}
149+
AstFragment::MethodReceiverExpr(expr) => vis.visit_method_receiver_expr(expr),
137150
$($(AstFragment::$Kind(ast) => vis.$visit_ast(ast),)?)*
138151
$($(AstFragment::$Kind(ast) =>
139152
ast.flat_map_in_place(|ast| vis.$flat_map_ast_elt(ast, $($args)*)),)?)*
@@ -144,6 +157,7 @@ macro_rules! ast_fragments {
144157
match self {
145158
AstFragment::OptExpr(Some(expr)) => try_visit!(visitor.visit_expr(expr)),
146159
AstFragment::OptExpr(None) => {}
160+
AstFragment::MethodReceiverExpr(expr) => try_visit!(visitor.visit_method_receiver_expr(expr)),
147161
$($(AstFragment::$Kind(ast) => try_visit!(visitor.$visit_ast(ast)),)?)*
148162
$($(AstFragment::$Kind(ast) => walk_list!(visitor, $visit_ast_elt, &ast[..], $($args)*),)?)*
149163
}
@@ -166,11 +180,6 @@ ast_fragments! {
166180
one fn visit_expr;
167181
fn make_expr;
168182
}
169-
MethodReceiverExpr(Box<ast::Expr>) {
170-
"expression";
171-
one fn visit_method_receiver_expr;
172-
fn make_method_receiver_expr;
173-
}
174183
Pat(Box<ast::Pat>) {
175184
"pattern";
176185
one fn visit_pat;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#[macro_export]
2+
macro_rules! outer {
3+
($inner:ident) => { $inner![1, 2, 3]; };
4+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//! Regression test for https://github.com/rust-lang/rust/issues/156084.
2+
//! This test can probably be removed again once
3+
//! `semicolon_in_expressions_from_macros` is a hard error.
4+
//@ check-pass
5+
//@ aux-build:semicolon-in-exprs.rs
6+
//@ edition: 2021
7+
8+
extern crate semicolon_in_exprs;
9+
10+
macro_rules! inner {
11+
[$($x:expr),*] => { [$($x),*] };
12+
}
13+
fn main() {
14+
let _v: Vec<i32> = semicolon_in_exprs::outer!(inner).into_iter().collect();
15+
}

0 commit comments

Comments
 (0)