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).