[gcc r14-7691] gccrs: Expand expressions/types correctly in more contexts.

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:54:08 GMT 2024


https://gcc.gnu.org/g:182db4ad089629b7235b1bb67bc0d221d4ce173a

commit r14-7691-g182db4ad089629b7235b1bb67bc0d221d4ce173a
Author: Matthew Jasper <mjjasper1@gmail.com>
Date:   Sat Jun 24 12:21:44 2023 +0100

    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 <mjjasper1@gmail.com>

Diff:
---
 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(-)

diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc
index 055f723fc75..cbd0e5057ca 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 17ec10cdddf..caa6e12c446 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 00000000000..afb20263566
--- /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 00000000000..808718cfa45
--- /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() {}


More information about the Gcc-cvs mailing list