aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMahmoud Mohamed <mahadelr19@gmail.com>2023-03-08 02:57:24 +0300
committerPhilip Herron <philip.herron@embecosm.com>2023-03-14 10:24:48 +0000
commit43590461e0033ff677ba4f3bf90cd289cf0b2518 (patch)
treed269c94448e739baa252ebd64ccdf8cba34a535b /gcc
parent362c6d7f14bfc84a670bd84a4ea11ae3da916fa9 (diff)
downloadgcc-43590461e0033ff677ba4f3bf90cd289cf0b2518.zip
gcc-43590461e0033ff677ba4f3bf90cd289cf0b2518.tar.gz
gcc-43590461e0033ff677ba4f3bf90cd289cf0b2518.tar.bz2
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-fnparam.cc48
-rw-r--r--gcc/rust/backend/rust-compile-fnparam.h4
-rw-r--r--gcc/rust/backend/rust-compile-pattern.cc17
-rw-r--r--gcc/rust/backend/rust-compile-pattern.h4
-rw-r--r--gcc/testsuite/rust/compile/ref_pattern_fn_param1.rs (renamed from gcc/testsuite/rust/compile/ref_pattern_fn_param.rs)0
-rw-r--r--gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs7
-rw-r--r--gcc/testsuite/rust/execute/torture/ref-pattern1.rs8
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 dda47bd..cec6340 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 c5b08e3a..8e35a462 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 d98f7be..8e59548 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -330,6 +330,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)
{
Bvariable *var = nullptr;
diff --git a/gcc/rust/backend/rust-compile-pattern.h b/gcc/rust/backend/rust-compile-pattern.h
index 93faeeae..4fb3954 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
index 67ea033..67ea033 100644
--- a/gcc/testsuite/rust/compile/ref_pattern_fn_param.rs
+++ b/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 0000000..8fddc90
--- /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 0000000..4e6e604
--- /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