From 182db4ad089629b7235b1bb67bc0d221d4ce173a Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sat, 24 Jun 2023 12:21:44 +0100 Subject: [PATCH] gccrs: Expand expressions/types correctly in more contexts. Expressions are expanded in constant/static items, match expressions and in parentheses now. Types are expanded in enum variants. gcc/rust/ChangeLog: * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Expand expressions in more contexts. * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit): Visit enum variants. gcc/testsuite/ChangeLog: * rust/compile/macro54.rs: New test. * rust/compile/macro55.rs: New test. Signed-off-by: Matthew Jasper --- gcc/rust/expand/rust-expand-visitor.cc | 16 ++++----- gcc/rust/resolve/rust-early-name-resolver.cc | 30 +++++++++++----- gcc/testsuite/rust/compile/macro54.rs | 38 ++++++++++++++++++++ gcc/testsuite/rust/compile/macro55.rs | 10 ++++++ 4 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/rust/compile/macro54.rs create mode 100644 gcc/testsuite/rust/compile/macro55.rs diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index 055f723fc75f..cbd0e5057ca3 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -724,7 +724,7 @@ ExpandVisitor::visit (AST::CompoundAssignmentExpr &expr) void ExpandVisitor::visit (AST::GroupedExpr &expr) { - visit (expr.get_expr_in_parens ()); + maybe_expand_expr (expr.get_expr_in_parens ()); } void @@ -995,9 +995,9 @@ ExpandVisitor::visit (AST::MatchExpr &expr) visit (pattern); if (arm.has_match_arm_guard ()) - visit (arm.get_guard_expr ()); + maybe_expand_expr (arm.get_guard_expr ()); - visit (match_case.get_expr ()); + maybe_expand_expr (match_case.get_expr ()); } } @@ -1153,7 +1153,7 @@ ExpandVisitor::visit (AST::EnumItemStruct &item) void ExpandVisitor::visit (AST::EnumItemDiscriminant &item) { - visit (item.get_expr ()); + maybe_expand_expr (item.get_expr ()); } void @@ -1163,7 +1163,7 @@ ExpandVisitor::visit (AST::Enum &enum_item) visit (generic); for (auto &variant : enum_item.get_variants ()) - visit (variant); + variant->accept_vis (*this); } void @@ -1180,7 +1180,7 @@ ExpandVisitor::visit (AST::ConstantItem &const_item) { maybe_expand_type (const_item.get_type ()); - visit (const_item.get_expr ()); + maybe_expand_expr (const_item.get_expr ()); } void @@ -1188,7 +1188,7 @@ ExpandVisitor::visit (AST::StaticItem &static_item) { maybe_expand_type (static_item.get_type ()); - visit (static_item.get_expr ()); + maybe_expand_expr (static_item.get_expr ()); } void @@ -1215,7 +1215,7 @@ ExpandVisitor::visit (AST::TraitItemConst &const_item) maybe_expand_type (const_item.get_type ()); if (const_item.has_expr ()) - visit (const_item.get_expr ()); + maybe_expand_expr (const_item.get_expr ()); } void diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc index 17ec10cdddf3..caa6e12c4465 100644 --- a/gcc/rust/resolve/rust-early-name-resolver.cc +++ b/gcc/rust/resolve/rust-early-name-resolver.cc @@ -714,20 +714,34 @@ EarlyNameResolver::visit (AST::EnumItem &) {} void -EarlyNameResolver::visit (AST::EnumItemTuple &) -{} +EarlyNameResolver::visit (AST::EnumItemTuple &item) +{ + for (auto &field : item.get_tuple_fields ()) + field.get_field_type ()->accept_vis (*this); +} void -EarlyNameResolver::visit (AST::EnumItemStruct &) -{} +EarlyNameResolver::visit (AST::EnumItemStruct &item) +{ + for (auto &field : item.get_struct_fields ()) + field.get_field_type ()->accept_vis (*this); +} void -EarlyNameResolver::visit (AST::EnumItemDiscriminant &) -{} +EarlyNameResolver::visit (AST::EnumItemDiscriminant &item) +{ + item.get_expr ()->accept_vis (*this); +} void -EarlyNameResolver::visit (AST::Enum &) -{} +EarlyNameResolver::visit (AST::Enum &enum_item) +{ + for (auto &generic : enum_item.get_generic_params ()) + generic->accept_vis (*this); + + for (auto &variant : enum_item.get_variants ()) + variant->accept_vis (*this); +} void EarlyNameResolver::visit (AST::Union &) diff --git a/gcc/testsuite/rust/compile/macro54.rs b/gcc/testsuite/rust/compile/macro54.rs new file mode 100644 index 000000000000..afb20263566c --- /dev/null +++ b/gcc/testsuite/rust/compile/macro54.rs @@ -0,0 +1,38 @@ +macro_rules! foo { + () => {"foo"}; + (number) => { 12 }; + (false) => { false }; +} + +pub const A: &'static str = foo!(); +pub static B: &'static str = foo!(); + +pub trait Number { + const VALUE: u32; +} + +impl Number for u32 { + const VALUE: u32 = foo!(number); +} + +impl u32 { + pub const TWELVE: u32 = foo!(number); +} + +pub enum E { + Variant = foo!(number), +} + +pub fn f(c: bool) -> &'static str { + match c { + false => foo!(), + true if foo!(false) => "abc", + _ => "xyz" + } +} + + +fn main() { + let _ = A; + let _ = u32::VALUE - u32::TWELVE; +} diff --git a/gcc/testsuite/rust/compile/macro55.rs b/gcc/testsuite/rust/compile/macro55.rs new file mode 100644 index 000000000000..808718cfa45a --- /dev/null +++ b/gcc/testsuite/rust/compile/macro55.rs @@ -0,0 +1,10 @@ +macro_rules! id { + ($i:ident) => { $i } +} + +pub enum F { + Tuple(id!(u32)), + Struct { field: id!(u64) }, +} + +fn main() {} -- 2.47.2