Skip to content

Commit 22d15ea

Browse files
authored
Auto merge of #36555 - jseyfried:issue_36540, r=eddyb
Visit and fold macro invocations in the same order Fixes #36540. r? @nrc
2 parents f39039e + c7e4ae0 commit 22d15ea

File tree

3 files changed

+55
-58
lines changed

3 files changed

+55
-58
lines changed

src/libsyntax/fold.rs

+31-53
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ pub fn noop_fold_parenthesized_parameter_data<T: Folder>(data: ParenthesizedPara
478478
pub fn noop_fold_local<T: Folder>(l: P<Local>, fld: &mut T) -> P<Local> {
479479
l.map(|Local {id, pat, ty, init, span, attrs}| Local {
480480
id: fld.new_id(id),
481-
ty: ty.map(|t| fld.fold_ty(t)),
482481
pat: fld.fold_pat(pat),
482+
ty: ty.map(|t| fld.fold_ty(t)),
483483
init: init.map(|e| fld.fold_expr(e)),
484484
span: fld.new_span(span),
485485
attrs: fold_attrs(attrs.into(), fld).into(),
@@ -860,65 +860,46 @@ pub fn noop_fold_item_kind<T: Folder>(i: ItemKind, folder: &mut T) -> ItemKind {
860860
ItemKind::Const(folder.fold_ty(t), folder.fold_expr(e))
861861
}
862862
ItemKind::Fn(decl, unsafety, constness, abi, generics, body) => {
863-
ItemKind::Fn(
864-
folder.fold_fn_decl(decl),
865-
unsafety,
866-
constness,
867-
abi,
868-
folder.fold_generics(generics),
869-
folder.fold_block(body)
870-
)
863+
let generics = folder.fold_generics(generics);
864+
let decl = folder.fold_fn_decl(decl);
865+
let body = folder.fold_block(body);
866+
ItemKind::Fn(decl, unsafety, constness, abi, generics, body)
871867
}
872868
ItemKind::Mod(m) => ItemKind::Mod(folder.fold_mod(m)),
873869
ItemKind::ForeignMod(nm) => ItemKind::ForeignMod(folder.fold_foreign_mod(nm)),
874870
ItemKind::Ty(t, generics) => {
875871
ItemKind::Ty(folder.fold_ty(t), folder.fold_generics(generics))
876872
}
877873
ItemKind::Enum(enum_definition, generics) => {
878-
ItemKind::Enum(
879-
ast::EnumDef {
880-
variants: enum_definition.variants.move_map(|x| folder.fold_variant(x)),
881-
},
882-
folder.fold_generics(generics))
874+
let generics = folder.fold_generics(generics);
875+
let variants = enum_definition.variants.move_map(|x| folder.fold_variant(x));
876+
ItemKind::Enum(ast::EnumDef { variants: variants }, generics)
883877
}
884878
ItemKind::Struct(struct_def, generics) => {
885-
let struct_def = folder.fold_variant_data(struct_def);
886-
ItemKind::Struct(struct_def, folder.fold_generics(generics))
879+
let generics = folder.fold_generics(generics);
880+
ItemKind::Struct(folder.fold_variant_data(struct_def), generics)
887881
}
888882
ItemKind::Union(struct_def, generics) => {
889-
let struct_def = folder.fold_variant_data(struct_def);
890-
ItemKind::Union(struct_def, folder.fold_generics(generics))
883+
let generics = folder.fold_generics(generics);
884+
ItemKind::Union(folder.fold_variant_data(struct_def), generics)
891885
}
892886
ItemKind::DefaultImpl(unsafety, ref trait_ref) => {
893887
ItemKind::DefaultImpl(unsafety, folder.fold_trait_ref((*trait_ref).clone()))
894888
}
895-
ItemKind::Impl(unsafety, polarity, generics, ifce, ty, impl_items) => {
896-
let new_impl_items = impl_items.move_flat_map(|item| {
897-
folder.fold_impl_item(item)
898-
});
899-
let ifce = match ifce {
900-
None => None,
901-
Some(ref trait_ref) => {
902-
Some(folder.fold_trait_ref((*trait_ref).clone()))
903-
}
904-
};
905-
ItemKind::Impl(unsafety,
906-
polarity,
907-
folder.fold_generics(generics),
908-
ifce,
909-
folder.fold_ty(ty),
910-
new_impl_items)
911-
}
912-
ItemKind::Trait(unsafety, generics, bounds, items) => {
913-
let bounds = folder.fold_bounds(bounds);
914-
let items = items.move_flat_map(|item| {
915-
folder.fold_trait_item(item)
916-
});
917-
ItemKind::Trait(unsafety,
918-
folder.fold_generics(generics),
919-
bounds,
920-
items)
921-
}
889+
ItemKind::Impl(unsafety, polarity, generics, ifce, ty, impl_items) => ItemKind::Impl(
890+
unsafety,
891+
polarity,
892+
folder.fold_generics(generics),
893+
ifce.map(|trait_ref| folder.fold_trait_ref(trait_ref.clone())),
894+
folder.fold_ty(ty),
895+
impl_items.move_flat_map(|item| folder.fold_impl_item(item)),
896+
),
897+
ItemKind::Trait(unsafety, generics, bounds, items) => ItemKind::Trait(
898+
unsafety,
899+
folder.fold_generics(generics),
900+
folder.fold_bounds(bounds),
901+
items.move_flat_map(|item| folder.fold_trait_item(item)),
902+
),
922903
ItemKind::Mac(m) => ItemKind::Mac(folder.fold_mac(m)),
923904
}
924905
}
@@ -954,9 +935,9 @@ pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T)
954935
-> SmallVector<ImplItem> {
955936
SmallVector::one(ImplItem {
956937
id: folder.new_id(i.id),
938+
vis: folder.fold_vis(i.vis),
957939
ident: folder.fold_ident(i.ident),
958940
attrs: fold_attrs(i.attrs, folder),
959-
vis: folder.fold_vis(i.vis),
960941
defaultness: i.defaultness,
961942
node: match i.node {
962943
ast::ImplItemKind::Const(ty, expr) => {
@@ -1031,22 +1012,20 @@ pub fn noop_fold_item<T: Folder>(i: P<Item>, folder: &mut T) -> SmallVector<P<It
10311012
// fold one item into exactly one item
10321013
pub fn noop_fold_item_simple<T: Folder>(Item {id, ident, attrs, node, vis, span}: Item,
10331014
folder: &mut T) -> Item {
1034-
let id = folder.new_id(id);
1035-
let node = folder.fold_item_kind(node);
1036-
10371015
Item {
1038-
id: id,
1016+
id: folder.new_id(id),
1017+
vis: folder.fold_vis(vis),
10391018
ident: folder.fold_ident(ident),
10401019
attrs: fold_attrs(attrs, folder),
1041-
node: node,
1042-
vis: folder.fold_vis(vis),
1020+
node: folder.fold_item_kind(node),
10431021
span: folder.new_span(span)
10441022
}
10451023
}
10461024

10471025
pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem {
10481026
ForeignItem {
10491027
id: folder.new_id(ni.id),
1028+
vis: folder.fold_vis(ni.vis),
10501029
ident: folder.fold_ident(ni.ident),
10511030
attrs: fold_attrs(ni.attrs, folder),
10521031
node: match ni.node {
@@ -1057,7 +1036,6 @@ pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> For
10571036
ForeignItemKind::Static(folder.fold_ty(t), m)
10581037
}
10591038
},
1060-
vis: folder.fold_vis(ni.vis),
10611039
span: folder.new_span(ni.span)
10621040
}
10631041
}

src/libsyntax/visit.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,8 @@ pub fn walk_fn_kind<V: Visitor>(visitor: &mut V, function_kind: FnKind) {
532532
pub fn walk_fn<V>(visitor: &mut V, kind: FnKind, declaration: &FnDecl, body: &Block, _span: Span)
533533
where V: Visitor,
534534
{
535-
walk_fn_decl(visitor, declaration);
536535
walk_fn_kind(visitor, kind);
536+
walk_fn_decl(visitor, declaration);
537537
visitor.visit_block(body)
538538
}
539539

@@ -652,13 +652,13 @@ pub fn walk_expr<V: Visitor>(visitor: &mut V, expression: &Expr) {
652652
walk_list!(visitor, visit_expr, subexpressions);
653653
}
654654
ExprKind::Call(ref callee_expression, ref arguments) => {
655+
visitor.visit_expr(callee_expression);
655656
walk_list!(visitor, visit_expr, arguments);
656-
visitor.visit_expr(callee_expression)
657657
}
658658
ExprKind::MethodCall(ref ident, ref types, ref arguments) => {
659659
visitor.visit_ident(ident.span, ident.node);
660-
walk_list!(visitor, visit_expr, arguments);
661660
walk_list!(visitor, visit_ty, types);
661+
walk_list!(visitor, visit_expr, arguments);
662662
}
663663
ExprKind::Binary(_, ref left_expression, ref right_expression) => {
664664
visitor.visit_expr(left_expression);
@@ -717,12 +717,12 @@ pub fn walk_expr<V: Visitor>(visitor: &mut V, expression: &Expr) {
717717
}
718718
ExprKind::Block(ref block) => visitor.visit_block(block),
719719
ExprKind::Assign(ref left_hand_expression, ref right_hand_expression) => {
720+
visitor.visit_expr(left_hand_expression);
720721
visitor.visit_expr(right_hand_expression);
721-
visitor.visit_expr(left_hand_expression)
722722
}
723723
ExprKind::AssignOp(_, ref left_expression, ref right_expression) => {
724+
visitor.visit_expr(left_expression);
724725
visitor.visit_expr(right_expression);
725-
visitor.visit_expr(left_expression)
726726
}
727727
ExprKind::Field(ref subexpression, ref ident) => {
728728
visitor.visit_expr(subexpression);

src/test/run-pass/type-macros-simple.rs

+19
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,22 @@ macro_rules! Tuple {
1515
fn main() {
1616
let x: Tuple!(i32, i32) = (1, 2);
1717
}
18+
19+
fn issue_36540() {
20+
let i32 = 0;
21+
macro_rules! m { () => { i32 } }
22+
struct S<T = m!()>(m!(), T) where T: Trait<m!()>;
23+
24+
let x: m!() = m!();
25+
std::cell::Cell::<m!()>::new(m!());
26+
impl<T = m!()> std::ops::Index<m!()> for Trait<(m!(), T)>
27+
where T: Trait<m!()>
28+
{
29+
type Output = m!();
30+
fn index(&self, i: m!()) -> &m!() {
31+
unimplemented!()
32+
}
33+
}
34+
}
35+
36+
trait Trait<T> {}

0 commit comments

Comments
 (0)