]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: 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)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:21:09 +0000 (18:21 +0100)
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 faa95dcdcd94b38ca8bd77a19b1091f84ff095c4..9f08ea1369f47aa046c1eff8a09cfe6f92f6f82b 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 6f7f0653fe96fee4b4cd22bc88d84474d58141eb..fa249a240fe892127d293e64c8c9902fab3b8907 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 763ddb2923205c4c87accc24b4a6c494df065521..20a550d2a02c550ac797385a9cdda66deeea4dd8 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 a7bd115269f774e565d49fa9edeb7115733b72ba..3fba9c51f051af40f45f3d8336bfe570b242b5b0 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