]> gcc.gnu.org Git - gcc.git/commitdiff
gccrs: Expand expressions/types correctly in more contexts.
authorMatthew Jasper <mjjasper1@gmail.com>
Sat, 24 Jun 2023 11:21:44 +0000 (12:21 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:46:29 +0000 (18:46 +0100)
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>
gcc/rust/expand/rust-expand-visitor.cc
gcc/rust/resolve/rust-early-name-resolver.cc
gcc/testsuite/rust/compile/macro54.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/macro55.rs [new file with mode: 0644]

index 055f723fc75faf016f9ab60540e60e1ebdb5861f..cbd0e5057ca31b768397282c0dd9074dd995c33b 100644 (file)
@@ -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
index 17ec10cdddf3db78222ef5f321dc561a46de7b5e..caa6e12c44654603c49ee22fcf40514c0057bd4b 100644 (file)
@@ -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 (file)
index 0000000..afb2026
--- /dev/null
@@ -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 (file)
index 0000000..808718c
--- /dev/null
@@ -0,0 +1,10 @@
+macro_rules! id {
+    ($i:ident) => { $i }
+}
+
+pub enum F {
+    Tuple(id!(u32)),
+    Struct { field: id!(u64) },
+}
+
+fn main() {}
This page took 0.104051 seconds and 5 git commands to generate.