diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-08-11 19:45:52 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-08-19 14:36:10 +0100 |
commit | b9c1a73e6d8331f8b4e5bc9bdba8ddda29c8007f (patch) | |
tree | 17e44aad70a21d5afb0f7060729b5cc4b31ee369 /gcc | |
parent | 2148d2f9749d71a866f93335e1482f133d189b4e (diff) | |
download | gcc-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.h | 26 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 21 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.h | 4 |
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 |