public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] hir: Provide basic handling for ReferencePattern in function parameter
@ 2023-03-14 11:44 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2023-03-14 11:44 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:43590461e0033ff677ba4f3bf90cd289cf0b2518

commit 43590461e0033ff677ba4f3bf90cd289cf0b2518
Author: Mahmoud Mohamed <mahadelr19@gmail.com>
Date:   Wed Mar 8 02:57:24 2023 +0300

    hir: Provide basic handling for ReferencePattern in function parameter
    
    Added an implementation for
    `CompilePatternBindings::visit (HIR::ReferencePattern)` where we
    dereference the initial expression and recurse.
    Added an implementation for
    `CompilePatternBindings::visit (HIR::IdentifierPattern)` as well since it's
    the simplest base case.
    
    In addition to this, a small refactor for the shared code in
    `StructPattern` and `TupleStructPattern` visits was added as a helper
    function called `create_tmp_param_var`.
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-fnparam.cc (CompileFnParam::visit):
            Added visit implementation for ReferencePattern.
            (CompileFnParam::create_tmp_param_var):
            Refactored duplicated code into a helper function.
            * backend/rust-compile-fnparam.h: Added visit implementation for
            ReferencePattern.
            * backend/rust-compile-pattern.cc (CompilePatternBindings::visit):
            Added visit implementation for ReferencePattern and
            IdentifierPattern.
            * backend/rust-compile-pattern.h: Added visit implementation for
            ReferencePattern and IdentifierPattern.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/ref_pattern_fn_param.rs: Moved to...
            * rust/compile/ref_pattern_fn_param1.rs: ...here.
            * rust/compile/ref_pattern_fn_param2.rs: New test.
            * rust/execute/torture/ref-pattern1.rs: New test.
    
    Signed-off-by: Mahmoud Mohamed <mahadelr19@gmail.com>

Diff:
---
 gcc/rust/backend/rust-compile-fnparam.cc           | 48 +++++++++++-----------
 gcc/rust/backend/rust-compile-fnparam.h            |  4 +-
 gcc/rust/backend/rust-compile-pattern.cc           | 17 ++++++++
 gcc/rust/backend/rust-compile-pattern.h            |  4 +-
 ...attern_fn_param.rs => ref_pattern_fn_param1.rs} |  0
 .../rust/compile/ref_pattern_fn_param2.rs          |  7 ++++
 gcc/testsuite/rust/execute/torture/ref-pattern1.rs |  8 ++++
 7 files changed, 62 insertions(+), 26 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-fnparam.cc b/gcc/rust/backend/rust-compile-fnparam.cc
index dda47bd0220..cec6340c3de 100644
--- a/gcc/rust/backend/rust-compile-fnparam.cc
+++ b/gcc/rust/backend/rust-compile-fnparam.cc
@@ -72,35 +72,22 @@ CompileFnParam::visit (HIR::WildcardPattern &pattern)
 void
 CompileFnParam::visit (HIR::StructPattern &pattern)
 {
-  // generate the anon param
-  tree tmp_ident = create_tmp_var_name ("RSTPRM");
-  std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
-
-  decl_type = ctx->get_backend ()->immutable_type (decl_type);
-  compiled_param
-    = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
-					       decl_type, locus);
-
-  // setup the pattern bindings
-  tree anon_param = ctx->get_backend ()->var_expression (compiled_param, locus);
-  CompilePatternBindings::Compile (&pattern, anon_param, ctx);
+  tree tmp_param_var = create_tmp_param_var (decl_type);
+  CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
 }
 
 void
 CompileFnParam::visit (HIR::TupleStructPattern &pattern)
 {
-  // generate the anon param
-  tree tmp_ident = create_tmp_var_name ("RSTPRM");
-  std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
-
-  decl_type = ctx->get_backend ()->immutable_type (decl_type);
-  compiled_param
-    = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
-					       decl_type, locus);
+  tree tmp_param_var = create_tmp_param_var (decl_type);
+  CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
+}
 
-  // setup the pattern bindings
-  tree anon_param = ctx->get_backend ()->var_expression (compiled_param, locus);
-  CompilePatternBindings::Compile (&pattern, anon_param, ctx);
+void
+CompileFnParam::visit (HIR::ReferencePattern &pattern)
+{
+  tree tmp_param_var = create_tmp_param_var (decl_type);
+  CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
 }
 
 Bvariable *
@@ -117,5 +104,20 @@ CompileSelfParam::compile (Context *ctx, tree fndecl, HIR::SelfParam &self,
 						  locus);
 }
 
+tree
+CompileFnParam::create_tmp_param_var (tree decl_type)
+{
+  // generate the anon param
+  tree tmp_ident = create_tmp_var_name ("RSTPRM");
+  std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
+
+  decl_type = ctx->get_backend ()->immutable_type (decl_type);
+  compiled_param
+    = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
+					       decl_type, locus);
+
+  return ctx->get_backend ()->var_expression (compiled_param, locus);
+}
+
 } // namespace Compile
 } // namespace Rust
diff --git a/gcc/rust/backend/rust-compile-fnparam.h b/gcc/rust/backend/rust-compile-fnparam.h
index c5b08e3a019..8e35a462991 100644
--- a/gcc/rust/backend/rust-compile-fnparam.h
+++ b/gcc/rust/backend/rust-compile-fnparam.h
@@ -37,6 +37,7 @@ public:
   void visit (HIR::WildcardPattern &pattern) override;
   void visit (HIR::StructPattern &) override;
   void visit (HIR::TupleStructPattern &) override;
+  void visit (HIR::ReferencePattern &) override;
 
   // Empty visit for unused Pattern HIR nodes.
   void visit (HIR::AltPattern &) override {}
@@ -44,13 +45,14 @@ public:
   void visit (HIR::PathInExpression &) override {}
   void visit (HIR::QualifiedPathInExpression &) override {}
   void visit (HIR::RangePattern &) override {}
-  void visit (HIR::ReferencePattern &) override {}
   void visit (HIR::SlicePattern &) override {}
   void visit (HIR::TuplePattern &) override {}
 
 private:
   CompileFnParam (Context *ctx, tree fndecl, tree decl_type, Location locus);
 
+  tree create_tmp_param_var (tree decl_type);
+
   tree fndecl;
   tree decl_type;
   Location locus;
diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc
index d98f7beb0e8..8e595486064 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -329,6 +329,23 @@ CompilePatternBindings::visit (HIR::StructPattern &pattern)
     }
 }
 
+void
+CompilePatternBindings::visit (HIR::ReferencePattern &pattern)
+{
+  tree derefed
+    = indirect_expression (match_scrutinee_expr, pattern.get_locus ());
+
+  CompilePatternBindings::Compile (pattern.get_referenced_pattern ().get (),
+				   derefed, ctx);
+}
+
+void
+CompilePatternBindings::visit (HIR::IdentifierPattern &pattern)
+{
+  ctx->insert_pattern_binding (pattern.get_pattern_mappings ().get_hirid (),
+			       match_scrutinee_expr);
+}
+
 void
 CompilePatternLet::visit (HIR::IdentifierPattern &pattern)
 {
diff --git a/gcc/rust/backend/rust-compile-pattern.h b/gcc/rust/backend/rust-compile-pattern.h
index 93faeeae8d1..4fb395476b5 100644
--- a/gcc/rust/backend/rust-compile-pattern.h
+++ b/gcc/rust/backend/rust-compile-pattern.h
@@ -76,6 +76,8 @@ public:
 
   void visit (HIR::StructPattern &pattern) override;
   void visit (HIR::TupleStructPattern &pattern) override;
+  void visit (HIR::ReferencePattern &pattern) override;
+  void visit (HIR::IdentifierPattern &) override;
 
   // unsupported
   void visit (HIR::AltPattern &pattern) override
@@ -85,12 +87,10 @@ public:
   }
 
   // Empty visit for unused Pattern HIR nodes.
-  void visit (HIR::IdentifierPattern &) override {}
   void visit (HIR::LiteralPattern &) override {}
   void visit (HIR::PathInExpression &) override {}
   void visit (HIR::QualifiedPathInExpression &) override {}
   void visit (HIR::RangePattern &) override {}
-  void visit (HIR::ReferencePattern &) override {}
   void visit (HIR::SlicePattern &) override {}
   void visit (HIR::TuplePattern &) override {}
   void visit (HIR::WildcardPattern &) override {}
diff --git a/gcc/testsuite/rust/compile/ref_pattern_fn_param.rs b/gcc/testsuite/rust/compile/ref_pattern_fn_param1.rs
similarity index 100%
rename from gcc/testsuite/rust/compile/ref_pattern_fn_param.rs
rename to gcc/testsuite/rust/compile/ref_pattern_fn_param1.rs
diff --git a/gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs b/gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs
new file mode 100644
index 00000000000..8fddc9008b5
--- /dev/null
+++ b/gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs
@@ -0,0 +1,7 @@
+fn foo(&b: &i32) -> bool {
+  b == 0
+}
+
+fn main() {
+  let _ = foo(&0);
+}
diff --git a/gcc/testsuite/rust/execute/torture/ref-pattern1.rs b/gcc/testsuite/rust/execute/torture/ref-pattern1.rs
new file mode 100644
index 00000000000..4e6e60483aa
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/ref-pattern1.rs
@@ -0,0 +1,8 @@
+fn foo (&a: &i32, b: i32) -> i32 {
+  a + b
+}
+
+fn main() -> i32 {
+  let a = 4;
+  foo(&a, 2) - 6
+}
\ No newline at end of file

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-14 11:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-14 11:44 [gcc/devel/rust/master] hir: Provide basic handling for ReferencePattern in function parameter Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).