aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-02-03 20:17:06 +0000
committerGitHub <noreply@github.com>2023-02-03 20:17:06 +0000
commit8d96698ffcb5d716e9ab41ba0c1775adb3ef15fe (patch)
tree9cace9ecf941671fce016825eac5b020a5c3b08d /gcc
parent868b0626e50af583e396761d87522e3c58c412bd (diff)
parent1b46cfb35ac4ea7e5e00ac9a332ac7daeeeeb0ba (diff)
downloadgcc-8d96698ffcb5d716e9ab41ba0c1775adb3ef15fe.zip
gcc-8d96698ffcb5d716e9ab41ba0c1775adb3ef15fe.tar.gz
gcc-8d96698ffcb5d716e9ab41ba0c1775adb3ef15fe.tar.bz2
Merge #1818
1818: Implement lowering ReferencePattern from AST to HIR r=CohenArthur a=powerboat9 gcc/rust/ChangeLog: * ast/rust-pattern.h (ReferencePattern::get_has_two_amps): Add method. (ReferencePattern::get_is_mut): Add method. * hir/rust-ast-lower-pattern.cc (ASTLoweringPattern::visit): Add ReferencePattern visitor. * hir/rust-ast-lower-pattern.h (ASTLoweringPattern::visit): Add ReferencePattern visitor. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com> Partially addresses #1813 Co-authored-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-pattern.h4
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.cc29
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-test.cc5
-rw-r--r--gcc/rust/hir/tree/rust-hir-pattern.h13
5 files changed, 39 insertions, 13 deletions
diff --git a/gcc/rust/ast/rust-pattern.h b/gcc/rust/ast/rust-pattern.h
index 247af5d..1337bc0 100644
--- a/gcc/rust/ast/rust-pattern.h
+++ b/gcc/rust/ast/rust-pattern.h
@@ -469,6 +469,10 @@ public:
return pattern;
}
+ bool is_double_reference () const { return has_two_amps; }
+
+ bool get_is_mut () const { return is_mut; }
+
NodeId get_node_id () const { return node_id; }
NodeId get_pattern_node_id () const override final { return node_id; }
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc
index 237fa2e..57cf17c 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.cc
+++ b/gcc/rust/hir/rust-ast-lower-pattern.cc
@@ -249,5 +249,34 @@ ASTLoweringPattern::visit (AST::GroupedPattern &pattern)
pattern.get_pattern_in_parens ()->accept_vis (*this);
}
+void
+ASTLoweringPattern::visit (AST::ReferencePattern &pattern)
+{
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, pattern.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ HIR::Pattern *inner
+ = ASTLoweringPattern::translate (pattern.get_referenced_pattern ().get ());
+
+ translated
+ = new HIR::ReferencePattern (mapping, std::unique_ptr<HIR::Pattern> (inner),
+ pattern.get_is_mut () ? Mutability::Mut
+ : Mutability::Imm,
+ pattern.get_locus ());
+
+ if (pattern.is_double_reference ())
+ {
+ Analysis::NodeMapping mapping2 (crate_num, pattern.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+ translated
+ = new HIR::ReferencePattern (mapping2,
+ std::unique_ptr<HIR::Pattern> (translated),
+ Mutability::Imm, pattern.get_locus ());
+ }
+}
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.h b/gcc/rust/hir/rust-ast-lower-pattern.h
index 20a5529..c7ef31a 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.h
+++ b/gcc/rust/hir/rust-ast-lower-pattern.h
@@ -40,6 +40,7 @@ public:
void visit (AST::LiteralPattern &pattern) override;
void visit (AST::RangePattern &pattern) override;
void visit (AST::GroupedPattern &pattern) override;
+ void visit (AST::ReferencePattern &pattern) override;
private:
ASTLoweringPattern ();
diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc
index d02188a..d065b76 100644
--- a/gcc/rust/hir/tree/rust-hir-full-test.cc
+++ b/gcc/rust/hir/tree/rust-hir-full-test.cc
@@ -2583,11 +2583,6 @@ ReferencePattern::as_string () const
{
std::string str ("&");
- if (has_two_amps)
- {
- str += "&";
- }
-
if (is_mut ())
{
str += "mut ";
diff --git a/gcc/rust/hir/tree/rust-hir-pattern.h b/gcc/rust/hir/tree/rust-hir-pattern.h
index 069d0cb..c1c392f 100644
--- a/gcc/rust/hir/tree/rust-hir-pattern.h
+++ b/gcc/rust/hir/tree/rust-hir-pattern.h
@@ -424,7 +424,6 @@ protected:
// HIR node for pattern based on dereferencing the pointers given
class ReferencePattern : public Pattern
{
- bool has_two_amps;
Mutability mut;
std::unique_ptr<Pattern> pattern;
Location locus;
@@ -435,16 +434,15 @@ public:
ReferencePattern (Analysis::NodeMapping mappings,
std::unique_ptr<Pattern> pattern, Mutability reference_mut,
- bool ref_has_two_amps, Location locus)
- : has_two_amps (ref_has_two_amps), mut (reference_mut),
- pattern (std::move (pattern)), locus (locus), mappings (mappings)
+ Location locus)
+ : mut (reference_mut), pattern (std::move (pattern)), locus (locus),
+ mappings (mappings)
{}
// Copy constructor requires clone
ReferencePattern (ReferencePattern const &other)
- : has_two_amps (other.has_two_amps), mut (other.mut),
- pattern (other.pattern->clone_pattern ()), locus (other.locus),
- mappings (other.mappings)
+ : mut (other.mut), pattern (other.pattern->clone_pattern ()),
+ locus (other.locus), mappings (other.mappings)
{}
// Overload assignment operator to clone
@@ -452,7 +450,6 @@ public:
{
pattern = other.pattern->clone_pattern ();
mut = other.mut;
- has_two_amps = other.has_two_amps;
locus = other.locus;
mappings = other.mappings;