aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir/tree/rust-hir-stmt.h
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2024-10-15 15:22:56 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-21 12:32:57 +0100
commit417f4bd3e0bb82e74664417a6c9a7a878e4df462 (patch)
treebc19e9c0131237710c05338da6996e545a50fb6c /gcc/rust/hir/tree/rust-hir-stmt.h
parentd123f43e42f623dfd7dbe63f484197a99ea7f9ed (diff)
downloadgcc-417f4bd3e0bb82e74664417a6c9a7a878e4df462.zip
gcc-417f4bd3e0bb82e74664417a6c9a7a878e4df462.tar.gz
gcc-417f4bd3e0bb82e74664417a6c9a7a878e4df462.tar.bz2
gccrs: Refactor hir to avoid raw pointers and unneeded fwd
Refactor the hir tree files to remove raw pointer usage and most forward declarations. Move implementation out of headers and split headers into smaller and more manageable units. gcc/rust/ChangeLog: * Make-lang.in: Add new files. * hir/tree/rust-hir-item.h: Move Item definition and remove implementations to their corresponding cc file. * hir/tree/rust-hir-expr.h: Move implementation to the corresponding cc file. * hir/tree/rust-hir-path.h: Likewise. * hir/tree/rust-hir-pattern.h: Likewise. * hir/tree/rust-hir-stmt.h: Likewise. * hir/tree/rust-hir-type.h: Likewise. * hir/tree/rust-hir-visitor.h: Likewise. * hir/tree/rust-hir.h: Likewise. * hir/tree/rust-hir.cc (Crate::Crate): Add implementations from Crate and remove ConstGenericParam implementations to move them to their own file. * hir/tree/rust-hir-attrs.h: New file. * hir/tree/rust-hir-bound-abstract.h: New file. * hir/tree/rust-hir-bound.h: New file. * hir/tree/rust-hir-expr-abstract.h: New file. * hir/tree/rust-hir-expr.cc: New file. * hir/tree/rust-hir-generic-param.cc: New file. * hir/tree/rust-hir-generic-param.h: New file. * hir/tree/rust-hir-item.cc: New file. * hir/tree/rust-hir-literal.h: New file. * hir/tree/rust-hir-node.h: New file. * hir/tree/rust-hir-path.cc: New file. * hir/tree/rust-hir-pattern-abstract.h: New file. * hir/tree/rust-hir-simple-path.h: New file. * hir/tree/rust-hir-stmt.cc: New file. * hir/tree/rust-hir-trait-bound.h: New file. * hir/tree/rust-hir-type-abstract.cc: New file. * hir/tree/rust-hir-type-abstract.h: New file. * hir/tree/rust-hir-type-no-bounds.h: New file. * hir/tree/rust-hir-type.cc: New file. * hir/tree/rust-hir-visibility.h: New file. * hir/tree/rust-hir-visitable.h: New file. * checks/lints/rust-lint-marklive.h: Use References. * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Reformat vectors. * hir/rust-hir-dump.cc (Dump::visit): Use reference. * typecheck/rust-hir-type-check-struct.cc (TypeCheckStructExpr::resolve): Use references. * typecheck/rust-tyty-bounds.cc: Likewise. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust/hir/tree/rust-hir-stmt.h')
-rw-r--r--gcc/rust/hir/tree/rust-hir-stmt.h105
1 files changed, 45 insertions, 60 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-stmt.h b/gcc/rust/hir/tree/rust-hir-stmt.h
index 7320bb6..7540dfa 100644
--- a/gcc/rust/hir/tree/rust-hir-stmt.h
+++ b/gcc/rust/hir/tree/rust-hir-stmt.h
@@ -25,6 +25,44 @@
namespace Rust {
namespace HIR {
+/* Base statement abstract class. Note that most "statements" are not allowed in
+ * top-level module scope - only a subclass of statements called "items" are. */
+class Stmt : public Node, public FullVisitable
+{
+public:
+ using FullVisitable::accept_vis;
+
+ // Unique pointer custom clone function
+ std::unique_ptr<Stmt> clone_stmt () const
+ {
+ return std::unique_ptr<Stmt> (clone_stmt_impl ());
+ }
+
+ BaseKind get_hir_kind () override { return STMT; }
+
+ virtual ~Stmt () {}
+
+ virtual std::string as_string () const = 0;
+
+ virtual void accept_vis (HIRStmtVisitor &vis) = 0;
+
+ virtual location_t get_locus () const = 0;
+
+ virtual bool is_unit_check_needed () const { return false; }
+
+ const Analysis::NodeMapping &get_mappings () const { return mappings; }
+
+ virtual bool is_item () const = 0;
+
+protected:
+ Stmt (Analysis::NodeMapping mappings) : mappings (std::move (mappings)) {}
+
+ // Clone function implementation as pure virtual method
+ virtual Stmt *clone_stmt_impl () const = 0;
+
+ Analysis::NodeMapping mappings;
+};
+
// Just a semi-colon, which apparently is a statement.
class EmptyStmt : public Stmt
{
@@ -82,52 +120,13 @@ public:
LetStmt (Analysis::NodeMapping mappings,
std::unique_ptr<Pattern> variables_pattern,
std::unique_ptr<Expr> init_expr, std::unique_ptr<Type> type,
- AST::AttrVec outer_attrs, location_t locus)
- : Stmt (std::move (mappings)), outer_attrs (std::move (outer_attrs)),
- variables_pattern (std::move (variables_pattern)),
- type (std::move (type)), init_expr (std::move (init_expr)), locus (locus)
- {}
+ AST::AttrVec outer_attrs, location_t locus);
// Copy constructor with clone
- LetStmt (LetStmt const &other)
- : Stmt (other.mappings), outer_attrs (other.outer_attrs),
- locus (other.locus)
- {
- // guard to prevent null dereference (only required if error state)
- if (other.variables_pattern != nullptr)
- variables_pattern = other.variables_pattern->clone_pattern ();
-
- // guard to prevent null dereference (always required)
- if (other.init_expr != nullptr)
- init_expr = other.init_expr->clone_expr ();
- if (other.type != nullptr)
- type = other.type->clone_type ();
- }
+ LetStmt (LetStmt const &other);
// Overloaded assignment operator to clone
- LetStmt &operator= (LetStmt const &other)
- {
- outer_attrs = other.outer_attrs;
- locus = other.locus;
-
- // guard to prevent null dereference (only required if error state)
- if (other.variables_pattern != nullptr)
- variables_pattern = other.variables_pattern->clone_pattern ();
- else
- variables_pattern = nullptr;
-
- // guard to prevent null dereference (always required)
- if (other.init_expr != nullptr)
- init_expr = other.init_expr->clone_expr ();
- else
- init_expr = nullptr;
- if (other.type != nullptr)
- type = other.type->clone_type ();
- else
- type = nullptr;
-
- return *this;
- }
+ LetStmt &operator= (LetStmt const &other);
// move constructors
LetStmt (LetStmt &&other) = default;
@@ -167,15 +166,10 @@ class ExprStmt : public Stmt
public:
ExprStmt (Analysis::NodeMapping mappings, std::unique_ptr<Expr> expr,
- location_t locus, bool must_be_unit)
- : Stmt (std::move (mappings)), expr (std::move (expr)), locus (locus),
- must_be_unit (must_be_unit)
- {}
+ location_t locus, bool must_be_unit);
ExprStmt (Analysis::NodeMapping mappings, std::unique_ptr<Expr> expr,
- location_t locus)
- : ExprStmt (std::move (mappings), std::move (expr), locus, false)
- {}
+ location_t locus);
std::string as_string () const override;
@@ -189,19 +183,10 @@ public:
Expr &get_expr () { return *expr; }
// Copy constructor with clone
- ExprStmt (ExprStmt const &other)
- : Stmt (other), expr (other.expr->clone_expr ()), locus (other.locus)
- {}
+ ExprStmt (ExprStmt const &other);
// Overloaded assignment operator to clone
- ExprStmt &operator= (ExprStmt const &other)
- {
- Stmt::operator= (other);
- expr = other.expr->clone_expr ();
- locus = other.locus;
-
- return *this;
- }
+ ExprStmt &operator= (ExprStmt const &other);
// move constructors
ExprStmt (ExprStmt &&other) = default;