diff options
author | Mahmoud Mohamed <mahadelr19@gmail.com> | 2023-03-08 02:57:24 +0300 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-14 10:24:48 +0000 |
commit | 43590461e0033ff677ba4f3bf90cd289cf0b2518 (patch) | |
tree | d269c94448e739baa252ebd64ccdf8cba34a535b /gcc | |
parent | 362c6d7f14bfc84a670bd84a4ea11ae3da916fa9 (diff) | |
download | gcc-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.cc | 48 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-fnparam.h | 4 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.cc | 17 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.h | 4 | ||||
-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.rs | 7 | ||||
-rw-r--r-- | 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 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 |