]> git.ipfire.org Git - people/ms/gcc.git/commitdiff
hir: Provide basic handling for ReferencePattern in function parameter
authorMahmoud Mohamed <mahadelr19@gmail.com>
Tue, 7 Mar 2023 23:57:24 +0000 (02:57 +0300)
committerPhilip Herron <philip.herron@embecosm.com>
Tue, 14 Mar 2023 10:24:48 +0000 (10:24 +0000)
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>
gcc/rust/backend/rust-compile-fnparam.cc
gcc/rust/backend/rust-compile-fnparam.h
gcc/rust/backend/rust-compile-pattern.cc
gcc/rust/backend/rust-compile-pattern.h
gcc/testsuite/rust/compile/ref_pattern_fn_param1.rs [moved from gcc/testsuite/rust/compile/ref_pattern_fn_param.rs with 100% similarity]
gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs [new file with mode: 0644]
gcc/testsuite/rust/execute/torture/ref-pattern1.rs [new file with mode: 0644]

index dda47bd0220d9a6db7b80b83f62bb60fed170b78..cec6340c3def5dc907d46cc9c529ffe7a5b74ba8 100644 (file)
@@ -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
index c5b08e3a0190549aba9431dd125758186d52f64c..8e35a46299144d3d2eda05e478a8ce50c4d13ed3 100644 (file)
@@ -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;
index d98f7beb0e8a6b507fac21d3c5ab2d0fd5712e5d..8e5954860642b58edc2b376c4743e261ef93fe40 100644 (file)
@@ -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)
 {
index 93faeeae8d1167db1adb558ce80ce6f3de285986..4fb395476b5d2fc24c3ab8522a0d0cce18f5066b 100644 (file)
@@ -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_param2.rs b/gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs
new file mode 100644 (file)
index 0000000..8fddc90
--- /dev/null
@@ -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 (file)
index 0000000..4e6e604
--- /dev/null
@@ -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