aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-ast-collector.cc8
-rw-r--r--gcc/rust/ast/rust-ast-collector.h1
-rw-r--r--gcc/rust/ast/rust-ast-visitor.cc7
-rw-r--r--gcc/rust/ast/rust-ast-visitor.h2
-rw-r--r--gcc/rust/ast/rust-ast.cc12
-rw-r--r--gcc/rust/ast/rust-expr.h73
-rw-r--r--gcc/rust/expand/rust-derive.h1
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.cc5
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.h1
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.cc8
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.h1
-rw-r--r--gcc/rust/parse/rust-parse-impl.h23
-rw-r--r--gcc/rust/parse/rust-parse.h3
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.cc4
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.h1
15 files changed, 150 insertions, 0 deletions
diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc
index 5c44d3d..a7f6ed5 100644
--- a/gcc/rust/ast/rust-ast-collector.cc
+++ b/gcc/rust/ast/rust-ast-collector.cc
@@ -20,6 +20,7 @@
#include "rust-diagnostics.h"
#include "rust-item.h"
#include "rust-keyword-values.h"
+#include "rust-token.h"
namespace Rust {
namespace AST {
@@ -1316,6 +1317,13 @@ TokenCollector::visit (RangeToInclExpr &expr)
}
void
+TokenCollector::visit (BoxExpr &expr)
+{
+ push (Rust::Token::make (BOX, expr.get_locus ()));
+ visit (expr.get_boxed_expr ());
+}
+
+void
TokenCollector::visit (ReturnExpr &expr)
{
push (Rust::Token::make (RETURN_KW, expr.get_locus ()));
diff --git a/gcc/rust/ast/rust-ast-collector.h b/gcc/rust/ast/rust-ast-collector.h
index def9551..7b418bb 100644
--- a/gcc/rust/ast/rust-ast-collector.h
+++ b/gcc/rust/ast/rust-ast-collector.h
@@ -288,6 +288,7 @@ public:
void visit (RangeFromToInclExpr &expr);
void visit (RangeToInclExpr &expr);
void visit (ReturnExpr &expr);
+ void visit (BoxExpr &expr);
void visit (UnsafeBlockExpr &expr);
void visit (LoopExpr &expr);
void visit (WhileLoopExpr &expr);
diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 2021012..ba3eb67 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -532,6 +532,13 @@ DefaultASTVisitor::visit (AST::ReturnExpr &expr)
}
void
+DefaultASTVisitor::visit (AST::BoxExpr &expr)
+{
+ visit_outer_attrs (expr);
+ visit (expr.get_boxed_expr ());
+}
+
+void
DefaultASTVisitor::visit (AST::UnsafeBlockExpr &expr)
{
visit_outer_attrs (expr);
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index 5da8a7b..1d96304 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -112,6 +112,7 @@ public:
virtual void visit (RangeFromToInclExpr &expr) = 0;
virtual void visit (RangeToInclExpr &expr) = 0;
virtual void visit (ReturnExpr &expr) = 0;
+ virtual void visit (BoxExpr &expr) = 0;
virtual void visit (UnsafeBlockExpr &expr) = 0;
virtual void visit (LoopExpr &expr) = 0;
virtual void visit (WhileLoopExpr &expr) = 0;
@@ -297,6 +298,7 @@ protected:
virtual void visit (AST::RangeFromToInclExpr &expr) override;
virtual void visit (AST::RangeToInclExpr &expr) override;
virtual void visit (AST::ReturnExpr &expr) override;
+ virtual void visit (AST::BoxExpr &expr) override;
virtual void visit (AST::UnsafeBlockExpr &expr) override;
virtual void visit (AST::LoopExpr &expr) override;
virtual void visit (AST::WhileLoopExpr &expr) override;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 6da0d82..bc89692 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -1582,6 +1582,18 @@ BorrowExpr::as_string () const
}
std::string
+BoxExpr::as_string () const
+{
+ return "box " + expr->as_string ();
+}
+
+void
+BoxExpr::accept_vis (ASTVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+std::string
ReturnExpr::as_string () const
{
/* TODO: find way to incorporate outer attrs - may have to represent in
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index 015680b..c3b93d4 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -3310,6 +3310,79 @@ protected:
}
};
+class BoxExpr : public ExprWithoutBlock
+{
+ std::unique_ptr<Expr> expr;
+ std::vector<Attribute> outer_attrs;
+ location_t locus;
+
+public:
+ BoxExpr (std::unique_ptr<Expr> expr, std::vector<Attribute> outer_attrs,
+ location_t locus)
+ : expr (std::move (expr)), outer_attrs (outer_attrs), locus (locus)
+ {}
+
+ // Copy constructor with clone
+ BoxExpr (BoxExpr const &other)
+ : ExprWithoutBlock (other), outer_attrs (other.outer_attrs),
+ locus (other.locus)
+ {
+ // guard to protect from null pointer dereference
+ if (other.expr != nullptr)
+ expr = other.expr->clone_expr ();
+ }
+
+ BoxExpr &operator= (BoxExpr const &other)
+ {
+ ExprWithoutBlock::operator= (other);
+ locus = other.locus;
+ outer_attrs = other.outer_attrs;
+
+ // guard to protect from null pointer dereference
+ if (other.expr != nullptr)
+ expr = other.expr->clone_expr ();
+ else
+ expr = nullptr;
+
+ return *this;
+ }
+
+ // move constructors
+ BoxExpr (BoxExpr &&other) = default;
+ BoxExpr &operator= (BoxExpr &&other) = default;
+
+ location_t get_locus () const override final { return locus; }
+
+ void accept_vis (ASTVisitor &vis) override;
+
+ void mark_for_strip () override { expr = nullptr; }
+ bool is_marked_for_strip () const override { return expr == nullptr; }
+
+ const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
+ std::vector<Attribute> &get_outer_attrs () override { return outer_attrs; }
+
+ void set_outer_attrs (std::vector<Attribute> new_attrs) override
+ {
+ outer_attrs = std::move (new_attrs);
+ }
+
+ std::string as_string () const override;
+
+ Expr &get_boxed_expr ()
+ {
+ rust_assert (expr != nullptr);
+ return *expr;
+ }
+
+protected:
+ /* Use covariance to implement clone function as returning this object rather
+ * than base */
+ BoxExpr *clone_expr_without_block_impl () const override
+ {
+ return new BoxExpr (*this);
+ }
+};
+
// Return expression AST node representation
class ReturnExpr : public ExprWithoutBlock
{
diff --git a/gcc/rust/expand/rust-derive.h b/gcc/rust/expand/rust-derive.h
index 0faf4f0..c92f9c0 100644
--- a/gcc/rust/expand/rust-derive.h
+++ b/gcc/rust/expand/rust-derive.h
@@ -130,6 +130,7 @@ private:
virtual void visit (RangeFromToInclExpr &expr) override final{};
virtual void visit (RangeToInclExpr &expr) override final{};
virtual void visit (ReturnExpr &expr) override final{};
+ virtual void visit (BoxExpr &expr) override final{};
virtual void visit (UnsafeBlockExpr &expr) override final{};
virtual void visit (LoopExpr &expr) override final{};
virtual void visit (WhileLoopExpr &expr) override final{};
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index 6803ad4..9696978 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -213,6 +213,11 @@ ASTLoweringBase::visit (AST::RangeFromToInclExpr &)
void
ASTLoweringBase::visit (AST::RangeToInclExpr &)
{}
+
+void
+ASTLoweringBase::visit (AST::BoxExpr &)
+{}
+
void
ASTLoweringBase::visit (AST::ReturnExpr &)
{}
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 2987bb1..94e0e48 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -137,6 +137,7 @@ public:
virtual void visit (AST::RangeFullExpr &expr);
virtual void visit (AST::RangeFromToInclExpr &expr);
virtual void visit (AST::RangeToInclExpr &expr);
+ virtual void visit (AST::BoxExpr &expr);
virtual void visit (AST::ReturnExpr &expr);
virtual void visit (AST::UnsafeBlockExpr &expr);
virtual void visit (AST::LoopExpr &expr);
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc
index 6927139..515d36a 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -24,6 +24,7 @@
#include "rust-ast-lower-type.h"
#include "rust-ast.h"
#include "rust-diagnostics.h"
+#include "rust-system.h"
namespace Rust {
namespace HIR {
@@ -142,6 +143,13 @@ ASTLoweringExpr::visit (AST::QualifiedPathInExpression &expr)
}
void
+ASTLoweringExpr::visit (AST::BoxExpr &expr)
+{
+ // Not implemented
+ rust_unreachable ();
+}
+
+void
ASTLoweringExpr::visit (AST::ReturnExpr &expr)
{
terminated = true;
diff --git a/gcc/rust/hir/rust-ast-lower-expr.h b/gcc/rust/hir/rust-ast-lower-expr.h
index 52caa4d..cd7b74a 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-expr.h
@@ -85,6 +85,7 @@ public:
void visit (AST::UnsafeBlockExpr &expr) override;
void visit (AST::PathInExpression &expr) override;
void visit (AST::QualifiedPathInExpression &expr) override;
+ void visit (AST::BoxExpr &expr) override;
void visit (AST::ReturnExpr &expr) override;
void visit (AST::CallExpr &expr) override;
void visit (AST::MethodCallExpr &expr) override;
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 9e186cc..d1f5b6b 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -7550,6 +7550,27 @@ Parser<ManagedTokenSource>::parse_literal_expr (AST::AttrVec outer_attrs)
t->get_locus ()));
}
+template <typename ManagedTokenSource>
+std::unique_ptr<AST::BoxExpr>
+Parser<ManagedTokenSource>::parse_box_expr (AST::AttrVec outer_attrs,
+ location_t pratt_parsed_loc)
+{
+ location_t locus = pratt_parsed_loc;
+ if (locus == UNKNOWN_LOCATION)
+ {
+ locus = lexer.peek_token ()->get_locus ();
+ skip_token (BOX);
+ }
+
+ ParseRestrictions restrictions;
+ restrictions.expr_can_be_null = false;
+
+ std::unique_ptr<AST::Expr> expr = parse_expr (AST::AttrVec (), restrictions);
+
+ return std::unique_ptr<AST::BoxExpr> (
+ new AST::BoxExpr (std::move (expr), std::move (outer_attrs), locus));
+}
+
// Parses a return expression (including any expression to return).
template <typename ManagedTokenSource>
std::unique_ptr<AST::ReturnExpr>
@@ -12461,6 +12482,8 @@ Parser<ManagedTokenSource>::null_denotation_not_path (
case UNSAFE:
return parse_unsafe_block_expr (std::move (outer_attrs),
tok->get_locus ());
+ case BOX:
+ return parse_box_expr (std::move (outer_attrs), tok->get_locus ());
case UNDERSCORE:
add_error (
Error (tok->get_locus (),
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index c00bf9c..95c0a0b 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -622,6 +622,9 @@ private:
= AST::AttrVec ());
AST::ClosureParam parse_closure_param ();
+ std::unique_ptr<AST::BoxExpr> parse_box_expr (AST::AttrVec outer_attrs,
+ location_t pratt_parsed_loc
+ = UNKNOWN_LOCATION);
// When given a pratt_parsed_loc, use it as the location of the
// first token parsed in the expression (the parsing of that first
// token should be skipped).
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc b/gcc/rust/resolve/rust-ast-resolve-base.cc
index 22c04a3..66ce5bf 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-base.cc
@@ -267,6 +267,10 @@ ResolverBase::visit (AST::RangeToInclExpr &)
{}
void
+ResolverBase::visit (AST::BoxExpr &)
+{}
+
+void
ResolverBase::visit (AST::ReturnExpr &)
{}
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index 93d75aa..46bcac6 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -89,6 +89,7 @@ public:
void visit (AST::RangeFullExpr &);
void visit (AST::RangeFromToInclExpr &);
void visit (AST::RangeToInclExpr &);
+ void visit (AST::BoxExpr &);
void visit (AST::ReturnExpr &);
void visit (AST::UnsafeBlockExpr &);
void visit (AST::LoopExpr &);