aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-08-11 19:45:52 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-08-19 14:36:10 +0100
commitb9c1a73e6d8331f8b4e5bc9bdba8ddda29c8007f (patch)
tree17e44aad70a21d5afb0f7060729b5cc4b31ee369 /gcc
parent2148d2f9749d71a866f93335e1482f133d189b4e (diff)
downloadgcc-b9c1a73e6d8331f8b4e5bc9bdba8ddda29c8007f.zip
gcc-b9c1a73e6d8331f8b4e5bc9bdba8ddda29c8007f.tar.gz
gcc-b9c1a73e6d8331f8b4e5bc9bdba8ddda29c8007f.tar.bz2
Trait item functions contain a block expression for its body
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-implitem.h26
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h21
-rw-r--r--gcc/rust/hir/tree/rust-hir.h4
3 files changed, 33 insertions, 18 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h
index cbc80d3..f50e66f 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.h
+++ b/gcc/rust/hir/rust-ast-lower-implitem.h
@@ -354,10 +354,12 @@ public:
std::move (function_params),
std::move (return_type),
std::move (where_clause));
- HIR::Expr *block_expr
- = func.has_definition ()
- ? ASTLoweringExpr::translate (func.get_definition ().get ())
- : nullptr;
+ bool terminated = false;
+ std::unique_ptr<HIR::BlockExpr> block_expr
+ = func.has_definition () ? std::unique_ptr<HIR::BlockExpr> (
+ ASTLoweringBlock::translate (func.get_definition ().get (),
+ &terminated))
+ : nullptr;
auto crate_num = mappings->get_current_crate ();
Analysis::NodeMapping mapping (crate_num, func.get_node_id (),
@@ -366,8 +368,8 @@ public:
HIR::TraitItemFunc *trait_item
= new HIR::TraitItemFunc (mapping, std::move (decl),
- std::unique_ptr<HIR::Expr> (block_expr),
- func.get_outer_attrs (), func.get_locus ());
+ std::move (block_expr), func.get_outer_attrs (),
+ func.get_locus ());
translated = trait_item;
mappings->insert_hir_trait_item (mapping.get_crate_num (),
mapping.get_hirid (), translated);
@@ -423,10 +425,12 @@ public:
std::move (function_params),
std::move (return_type),
std::move (where_clause));
- HIR::Expr *block_expr
- = method.has_definition ()
- ? ASTLoweringExpr::translate (method.get_definition ().get ())
- : nullptr;
+ bool terminated = false;
+ std::unique_ptr<HIR::BlockExpr> block_expr
+ = method.has_definition () ? std::unique_ptr<HIR::BlockExpr> (
+ ASTLoweringBlock::translate (method.get_definition ().get (),
+ &terminated))
+ : nullptr;
auto crate_num = mappings->get_current_crate ();
Analysis::NodeMapping mapping (crate_num, method.get_node_id (),
@@ -435,7 +439,7 @@ public:
HIR::TraitItemFunc *trait_item
= new HIR::TraitItemFunc (mapping, std::move (decl),
- std::unique_ptr<HIR::Expr> (block_expr),
+ std::move (block_expr),
method.get_outer_attrs (), method.get_locus ());
translated = trait_item;
mappings->insert_hir_trait_item (mapping.get_crate_num (),
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 32ee317..3ce1342 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -2270,7 +2270,7 @@ class TraitItemFunc : public TraitItem
{
AST::AttrVec outer_attrs;
TraitFunctionDecl decl;
- std::unique_ptr<Expr> block_expr;
+ std::unique_ptr<BlockExpr> block_expr;
Location locus;
public:
@@ -2278,8 +2278,8 @@ public:
bool has_definition () const { return block_expr != nullptr; }
TraitItemFunc (Analysis::NodeMapping mappings, TraitFunctionDecl decl,
- std::unique_ptr<Expr> block_expr, AST::AttrVec outer_attrs,
- Location locus)
+ std::unique_ptr<BlockExpr> block_expr,
+ AST::AttrVec outer_attrs, Location locus)
: TraitItem (mappings), outer_attrs (std::move (outer_attrs)),
decl (std::move (decl)), block_expr (std::move (block_expr)),
locus (locus)
@@ -2291,7 +2291,7 @@ public:
decl (other.decl), locus (other.locus)
{
if (other.block_expr != nullptr)
- block_expr = other.block_expr->clone_expr ();
+ block_expr = other.block_expr->clone_block_expr ();
}
// Overloaded assignment operator to clone
@@ -2303,7 +2303,7 @@ public:
locus = other.locus;
mappings = other.mappings;
if (other.block_expr != nullptr)
- block_expr = other.block_expr->clone_expr ();
+ block_expr = other.block_expr->clone_block_expr ();
return *this;
}
@@ -2322,12 +2322,17 @@ public:
bool has_block_defined () const { return block_expr != nullptr; }
- std::unique_ptr<Expr> &get_block_expr ()
+ std::unique_ptr<BlockExpr> &get_block_expr ()
{
rust_assert (has_block_defined ());
return block_expr;
}
+ const std::string trait_identifier () const override final
+ {
+ return decl.get_function_name ();
+ }
+
protected:
// Clone function implementation as (not pure) virtual method
TraitItemFunc *clone_trait_item_impl () const override
@@ -2400,6 +2405,8 @@ public:
return expr;
}
+ const std::string trait_identifier () const override final { return name; }
+
protected:
// Clone function implementation as (not pure) virtual method
TraitItemConst *clone_trait_item_impl () const override
@@ -2474,6 +2481,8 @@ public:
return type_param_bounds;
}
+ const std::string trait_identifier () const override final { return name; }
+
protected:
// Clone function implementation as (not pure) virtual method
TraitItemType *clone_trait_item_impl () const override
diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h
index 20408bb..b8acf1a 100644
--- a/gcc/rust/hir/tree/rust-hir.h
+++ b/gcc/rust/hir/tree/rust-hir.h
@@ -646,7 +646,9 @@ public:
virtual void accept_vis (HIRVisitor &vis) = 0;
- const Analysis::NodeMapping &get_mappings () const { return mappings; }
+ virtual const std::string trait_identifier () const = 0;
+
+ const Analysis::NodeMapping get_mappings () const { return mappings; }
};
class ImplItem