mirror of git://gcc.gnu.org/git/gcc.git
hir: Add const blocks
gcc/rust/ChangeLog: * hir/tree/rust-hir-expr.h: New classes. * hir/tree/rust-hir-full-decls.h: Likewise. * hir/tree/rust-hir.cc: Handle AnonConst and ConstBlock. * backend/rust-compile-block.cc: Likewise. * backend/rust-compile-block.h: Likewise. * backend/rust-compile-expr.cc (CompileExpr::visit): Likewise. * backend/rust-compile-expr.h: Likewise. * checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Likewise. * checks/errors/borrowck/rust-bir-builder-expr-stmt.h: Likewise. * checks/errors/borrowck/rust-bir-builder-lazyboolexpr.h: Likewise. * checks/errors/borrowck/rust-bir-builder-struct.h: Likewise. * checks/errors/borrowck/rust-function-collector.h: Likewise. * checks/errors/privacy/rust-privacy-reporter.cc (PrivacyReporter::visit): Likewise. * checks/errors/privacy/rust-privacy-reporter.h: Likewise. * checks/errors/rust-const-checker.cc (ConstChecker::visit): Likewise. * checks/errors/rust-const-checker.h: Likewise. * checks/errors/rust-hir-pattern-analysis.cc (PatternChecker::visit): Likewise. * checks/errors/rust-hir-pattern-analysis.h: Likewise. * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Likewise. * checks/errors/rust-unsafe-checker.h: Likewise. * hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise. (translate_operand_out): Likewise. (translate_operand_inout): Likewise. (translate_operand_const): Likewise. * hir/rust-ast-lower-expr.h: Likewise. * hir/rust-hir-dump.cc (Dump::visit): Likewise. * hir/rust-hir-dump.h: Likewise. * hir/tree/rust-hir-expr-abstract.h: Likewise. * hir/tree/rust-hir-expr.cc (AnonConst::AnonConst): Likewise. (AnonConst::operator=): Likewise. (ConstBlock::ConstBlock): Likewise. (ConstBlock::operator=): Likewise. * hir/tree/rust-hir-visitor.h: * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Likewise. (typecheck_inline_asm_operand): Likewise. * typecheck/rust-hir-type-check-expr.h: Likewise.
This commit is contained in:
parent
01b433d67a
commit
70fab4b0ce
|
|
@ -19,6 +19,7 @@
|
|||
#include "rust-compile-block.h"
|
||||
#include "rust-compile-stmt.h"
|
||||
#include "rust-compile-expr.h"
|
||||
#include "rust-hir-expr.h"
|
||||
|
||||
namespace Rust {
|
||||
namespace Compile {
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@ public:
|
|||
void visit (HIR::MethodCallExpr &) override {}
|
||||
void visit (HIR::FieldAccessExpr &) override {}
|
||||
void visit (HIR::BlockExpr &) override {}
|
||||
void visit (HIR::AnonConst &) override {}
|
||||
void visit (HIR::ConstBlock &) override {}
|
||||
void visit (HIR::ContinueExpr &) override {}
|
||||
void visit (HIR::BreakExpr &) override {}
|
||||
void visit (HIR::RangeFromToExpr &) override {}
|
||||
|
|
@ -138,6 +140,12 @@ public:
|
|||
translated = CompileBlock::compile (expr, ctx, result);
|
||||
}
|
||||
|
||||
void visit (HIR::ConstBlock &expr) override
|
||||
{
|
||||
rust_unreachable ();
|
||||
// translated = CompileExpr::compile (expr, ctx, result);
|
||||
}
|
||||
|
||||
// Empty visit for unused Expression HIR nodes.
|
||||
void visit (HIR::PathInExpression &) override {}
|
||||
void visit (HIR::QualifiedPathInExpression &) override {}
|
||||
|
|
@ -184,6 +192,7 @@ public:
|
|||
void visit (HIR::AsyncBlockExpr &) override {}
|
||||
void visit (HIR::InlineAsm &) override {}
|
||||
void visit (HIR::LlvmInlineAsm &) override {}
|
||||
void visit (HIR::AnonConst &) override {}
|
||||
|
||||
private:
|
||||
CompileExprWithBlock (Context *ctx, Bvariable *result)
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "realmpfr.h"
|
||||
#include "convert.h"
|
||||
#include "print-tree.h"
|
||||
#include "rust-hir-expr.h"
|
||||
#include "rust-system.h"
|
||||
#include "rust-tyty.h"
|
||||
|
||||
|
|
@ -440,6 +441,18 @@ CompileExpr::visit (HIR::BlockExpr &expr)
|
|||
translated = Backend::var_expression (tmp, expr.get_locus ());
|
||||
}
|
||||
|
||||
void
|
||||
CompileExpr::visit (HIR::AnonConst &expr)
|
||||
{
|
||||
expr.get_inner_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
CompileExpr::visit (HIR::ConstBlock &expr)
|
||||
{
|
||||
expr.get_const_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
CompileExpr::visit (HIR::UnsafeBlockExpr &expr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@ public:
|
|||
void visit (HIR::IfExpr &expr) override;
|
||||
void visit (HIR::IfExprConseqElse &expr) override;
|
||||
void visit (HIR::BlockExpr &expr) override;
|
||||
void visit (HIR::AnonConst &expr) override;
|
||||
void visit (HIR::ConstBlock &expr) override;
|
||||
void visit (HIR::UnsafeBlockExpr &expr) override;
|
||||
void visit (HIR::StructExprStruct &struct_expr) override;
|
||||
void visit (HIR::StructExprStructFields &struct_expr) override;
|
||||
|
|
|
|||
|
|
@ -414,6 +414,18 @@ ExprStmtBuilder::visit (HIR::BlockExpr &block)
|
|||
ctx.place_db.pop_scope ();
|
||||
}
|
||||
|
||||
void
|
||||
ExprStmtBuilder::visit (HIR::AnonConst &block)
|
||||
{
|
||||
rust_unreachable ();
|
||||
}
|
||||
|
||||
void
|
||||
ExprStmtBuilder::visit (HIR::ConstBlock &block)
|
||||
{
|
||||
rust_unreachable ();
|
||||
}
|
||||
|
||||
void
|
||||
ExprStmtBuilder::visit (HIR::ContinueExpr &cont)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ protected: // Expr
|
|||
void visit (HIR::MethodCallExpr &expr) override;
|
||||
void visit (HIR::FieldAccessExpr &expr) override;
|
||||
void visit (HIR::BlockExpr &block) override;
|
||||
void visit (HIR::AnonConst &block) override;
|
||||
void visit (HIR::ConstBlock &block) override;
|
||||
void visit (HIR::ContinueExpr &cont) override;
|
||||
void visit (HIR::BreakExpr &brk) override;
|
||||
void visit (HIR::RangeFromToExpr &range) override;
|
||||
|
|
|
|||
|
|
@ -169,6 +169,14 @@ public:
|
|||
{
|
||||
return_place (ExprStmtBuilder (ctx).build (expr), expr.get_locus ());
|
||||
}
|
||||
void visit (HIR::AnonConst &expr) override
|
||||
{
|
||||
return_place (ExprStmtBuilder (ctx).build (expr), expr.get_locus ());
|
||||
}
|
||||
void visit (HIR::ConstBlock &expr) override
|
||||
{
|
||||
return_place (ExprStmtBuilder (ctx).build (expr), expr.get_locus ());
|
||||
}
|
||||
void visit (HIR::UnsafeBlockExpr &expr) override
|
||||
{
|
||||
return_place (ExprStmtBuilder (ctx).build (expr), expr.get_locus ());
|
||||
|
|
|
|||
|
|
@ -133,6 +133,8 @@ protected:
|
|||
void visit (HIR::MethodCallExpr &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::FieldAccessExpr &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::BlockExpr &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::AnonConst &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::ConstBlock &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::ClosureExpr &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::ContinueExpr &expr) override { rust_unreachable (); }
|
||||
void visit (HIR::BreakExpr &expr) override { rust_unreachable (); }
|
||||
|
|
|
|||
|
|
@ -104,6 +104,8 @@ public:
|
|||
void visit (HIR::MethodCallExpr &expr) override {}
|
||||
void visit (HIR::FieldAccessExpr &expr) override {}
|
||||
void visit (HIR::BlockExpr &expr) override {}
|
||||
void visit (HIR::AnonConst &expr) override {}
|
||||
void visit (HIR::ConstBlock &expr) override {}
|
||||
void visit (HIR::ContinueExpr &expr) override {}
|
||||
void visit (HIR::BreakExpr &expr) override {}
|
||||
void visit (HIR::RangeFromToExpr &expr) override {}
|
||||
|
|
|
|||
|
|
@ -518,6 +518,18 @@ PrivacyReporter::visit (HIR::BlockExpr &expr)
|
|||
expr.get_final_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PrivacyReporter::visit (HIR::AnonConst &expr)
|
||||
{
|
||||
expr.get_inner_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PrivacyReporter::visit (HIR::ConstBlock &expr)
|
||||
{
|
||||
expr.get_const_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PrivacyReporter::visit (HIR::ContinueExpr &)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -106,6 +106,8 @@ types
|
|||
virtual void visit (HIR::MethodCallExpr &expr);
|
||||
virtual void visit (HIR::FieldAccessExpr &expr);
|
||||
virtual void visit (HIR::BlockExpr &expr);
|
||||
virtual void visit (HIR::AnonConst &expr);
|
||||
virtual void visit (HIR::ConstBlock &expr);
|
||||
virtual void visit (HIR::ContinueExpr &expr);
|
||||
virtual void visit (HIR::BreakExpr &expr);
|
||||
virtual void visit (HIR::RangeFromToExpr &expr);
|
||||
|
|
|
|||
|
|
@ -416,6 +416,26 @@ ConstChecker::visit (BlockExpr &expr)
|
|||
expr.get_final_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
ConstChecker::visit (AnonConst &expr)
|
||||
{
|
||||
const_context.enter (expr.get_mappings ().get_hirid ());
|
||||
|
||||
expr.get_inner_expr ().accept_vis (*this);
|
||||
|
||||
const_context.exit ();
|
||||
}
|
||||
|
||||
void
|
||||
ConstChecker::visit (ConstBlock &expr)
|
||||
{
|
||||
const_context.enter (expr.get_mappings ().get_hirid ());
|
||||
|
||||
expr.get_const_expr ().accept_vis (*this);
|
||||
|
||||
const_context.exit ();
|
||||
}
|
||||
|
||||
void
|
||||
ConstChecker::visit (ContinueExpr &)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -113,6 +113,8 @@ private:
|
|||
virtual void visit (FieldAccessExpr &expr) override;
|
||||
virtual void visit (ClosureExpr &expr) override;
|
||||
virtual void visit (BlockExpr &expr) override;
|
||||
virtual void visit (AnonConst &expr) override;
|
||||
virtual void visit (ConstBlock &expr) override;
|
||||
virtual void visit (ContinueExpr &expr) override;
|
||||
virtual void visit (BreakExpr &expr) override;
|
||||
virtual void visit (RangeFromToExpr &expr) override;
|
||||
|
|
|
|||
|
|
@ -294,6 +294,18 @@ PatternChecker::visit (BlockExpr &expr)
|
|||
expr.get_final_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PatternChecker::visit (AnonConst &expr)
|
||||
{
|
||||
expr.get_inner_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PatternChecker::visit (ConstBlock &expr)
|
||||
{
|
||||
expr.get_const_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
PatternChecker::visit (ContinueExpr &)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ private:
|
|||
virtual void visit (MethodCallExpr &expr) override;
|
||||
virtual void visit (FieldAccessExpr &expr) override;
|
||||
virtual void visit (BlockExpr &expr) override;
|
||||
virtual void visit (AnonConst &expr) override;
|
||||
virtual void visit (ConstBlock &expr) override;
|
||||
virtual void visit (ClosureExpr &expr) override;
|
||||
virtual void visit (ContinueExpr &expr) override;
|
||||
virtual void visit (BreakExpr &expr) override;
|
||||
|
|
|
|||
|
|
@ -539,6 +539,18 @@ UnsafeChecker::visit (BlockExpr &expr)
|
|||
expr.get_final_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
UnsafeChecker::visit (AnonConst &expr)
|
||||
{
|
||||
expr.get_inner_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
UnsafeChecker::visit (ConstBlock &expr)
|
||||
{
|
||||
expr.get_const_expr ().accept_vis (*this);
|
||||
}
|
||||
|
||||
void
|
||||
UnsafeChecker::visit (ContinueExpr &)
|
||||
{}
|
||||
|
|
|
|||
|
|
@ -95,6 +95,8 @@ private:
|
|||
virtual void visit (FieldAccessExpr &expr) override;
|
||||
virtual void visit (ClosureExpr &expr) override;
|
||||
virtual void visit (BlockExpr &expr) override;
|
||||
virtual void visit (AnonConst &expr) override;
|
||||
virtual void visit (ConstBlock &expr) override;
|
||||
virtual void visit (ContinueExpr &expr) override;
|
||||
virtual void visit (BreakExpr &expr) override;
|
||||
virtual void visit (RangeFromToExpr &expr) override;
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include "rust-ast-lower-type.h"
|
||||
#include "rust-ast.h"
|
||||
#include "rust-diagnostics.h"
|
||||
#include "rust-hir-map.h"
|
||||
#include "rust-system.h"
|
||||
#include "tree/rust-hir-expr.h"
|
||||
|
||||
|
|
@ -126,6 +127,43 @@ ASTLoweringExpr::visit (AST::BlockExpr &expr)
|
|||
translated = ASTLoweringBlock::translate (expr, &terminated);
|
||||
}
|
||||
|
||||
void
|
||||
ASTLoweringExpr::visit (AST::AnonConst &expr)
|
||||
{
|
||||
auto inner_expr = ASTLoweringExpr::translate (expr.get_inner_expr ());
|
||||
|
||||
auto &mappings = Analysis::Mappings::get ();
|
||||
auto crate_num = mappings.get_current_crate ();
|
||||
auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
|
||||
mappings.get_next_hir_id (crate_num),
|
||||
UNKNOWN_LOCAL_DEFID);
|
||||
|
||||
translated = new HIR::AnonConst (std::move (mapping),
|
||||
std::unique_ptr<Expr> (inner_expr),
|
||||
expr.get_locus ());
|
||||
}
|
||||
|
||||
void
|
||||
ASTLoweringExpr::visit (AST::ConstBlock &expr)
|
||||
{
|
||||
auto inner_expr = ASTLoweringExpr::translate (expr.get_const_expr ());
|
||||
|
||||
// we know this will always be an `AnonConst`, or we have an issue. Let's
|
||||
// assert just to be sure.
|
||||
rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
|
||||
auto anon_const = static_cast<AnonConst *> (inner_expr);
|
||||
|
||||
auto &mappings = Analysis::Mappings::get ();
|
||||
auto crate_num = mappings.get_current_crate ();
|
||||
auto mapping = Analysis::NodeMapping (crate_num, expr.get_node_id (),
|
||||
mappings.get_next_hir_id (crate_num),
|
||||
UNKNOWN_LOCAL_DEFID);
|
||||
|
||||
translated
|
||||
= new HIR::ConstBlock (std::move (mapping), std::move (*anon_const),
|
||||
expr.get_locus (), expr.get_outer_attrs ());
|
||||
}
|
||||
|
||||
void
|
||||
ASTLoweringExpr::visit (AST::UnsafeBlockExpr &expr)
|
||||
{
|
||||
|
|
@ -841,6 +879,7 @@ translate_operand_out (const AST::InlineAsmOperand &operand)
|
|||
*out_value.expr.get ())));
|
||||
return out;
|
||||
}
|
||||
|
||||
HIR::InlineAsmOperand
|
||||
translate_operand_inout (const AST::InlineAsmOperand &operand)
|
||||
{
|
||||
|
|
@ -851,6 +890,7 @@ translate_operand_inout (const AST::InlineAsmOperand &operand)
|
|||
*inout_value.expr.get ())));
|
||||
return inout;
|
||||
}
|
||||
|
||||
HIR::InlineAsmOperand
|
||||
translate_operand_split_in_out (const AST::InlineAsmOperand &operand)
|
||||
{
|
||||
|
|
@ -863,19 +903,21 @@ translate_operand_split_in_out (const AST::InlineAsmOperand &operand)
|
|||
ASTLoweringExpr::translate (*split_in_out_value.out_expr.get ())));
|
||||
return split_in_out;
|
||||
}
|
||||
|
||||
HIR::InlineAsmOperand
|
||||
translate_operand_const (const AST::InlineAsmOperand &operand)
|
||||
{
|
||||
auto const_value = operand.get_const ();
|
||||
struct HIR::AnonConst anon_const (
|
||||
const_value.anon_const.get_node_id (),
|
||||
std::unique_ptr<Expr> (
|
||||
ASTLoweringExpr::translate (const_value.anon_const.get_inner_expr ())));
|
||||
struct HIR::InlineAsmOperand::Const cnst
|
||||
{
|
||||
anon_const
|
||||
};
|
||||
return cnst;
|
||||
|
||||
auto inner_expr = ASTLoweringExpr::translate (const_value.anon_const);
|
||||
|
||||
// Like `ConstBlock`, we know this should only be an `AnonConst` - let's
|
||||
// assert to make sure and static cast
|
||||
rust_assert (inner_expr->get_expression_type () == Expr::ExprType::AnonConst);
|
||||
|
||||
auto anon_const = static_cast<AnonConst *> (inner_expr);
|
||||
|
||||
return HIR::InlineAsmOperand::Const{*anon_const};
|
||||
}
|
||||
|
||||
HIR::InlineAsmOperand
|
||||
|
|
|
|||
|
|
@ -82,6 +82,8 @@ public:
|
|||
void visit (AST::IfLetExpr &expr) override;
|
||||
void visit (AST::IfLetExprConseqElse &expr) override;
|
||||
void visit (AST::BlockExpr &expr) override;
|
||||
void visit (AST::AnonConst &expr) override;
|
||||
void visit (AST::ConstBlock &expr) override;
|
||||
void visit (AST::UnsafeBlockExpr &expr) override;
|
||||
void visit (AST::PathInExpression &expr) override;
|
||||
void visit (AST::QualifiedPathInExpression &expr) override;
|
||||
|
|
|
|||
|
|
@ -1296,6 +1296,28 @@ Dump::visit (BlockExpr &e)
|
|||
end ("BlockExpr");
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (AnonConst &e)
|
||||
{
|
||||
begin ("AnonConst");
|
||||
do_expr (e);
|
||||
|
||||
visit_field ("inner", e.get_inner_expr ());
|
||||
|
||||
end ("AnonConst");
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (ConstBlock &e)
|
||||
{
|
||||
begin ("ConstBlock");
|
||||
do_expr (e);
|
||||
|
||||
visit_field ("inner", e.get_const_expr ());
|
||||
|
||||
end ("ConstBlock");
|
||||
}
|
||||
|
||||
void
|
||||
Dump::visit (ContinueExpr &e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -146,6 +146,8 @@ private:
|
|||
virtual void visit (FieldAccessExpr &) override;
|
||||
virtual void visit (ClosureExpr &) override;
|
||||
virtual void visit (BlockExpr &) override;
|
||||
virtual void visit (AnonConst &) override;
|
||||
virtual void visit (ConstBlock &) override;
|
||||
virtual void visit (ContinueExpr &) override;
|
||||
virtual void visit (BreakExpr &) override;
|
||||
virtual void visit (RangeFromToExpr &) override;
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ public:
|
|||
WITHOUT_BLOCK,
|
||||
};
|
||||
|
||||
enum ExprType
|
||||
enum class ExprType
|
||||
{
|
||||
Lit,
|
||||
Operator,
|
||||
|
|
@ -58,6 +58,8 @@ public:
|
|||
FieldAccess,
|
||||
Closure,
|
||||
Block,
|
||||
AnonConst,
|
||||
ConstBlock,
|
||||
Continue,
|
||||
Break,
|
||||
Range,
|
||||
|
|
|
|||
|
|
@ -790,6 +790,50 @@ BlockExpr::operator= (BlockExpr const &other)
|
|||
return *this;
|
||||
}
|
||||
|
||||
AnonConst::AnonConst (Analysis::NodeMapping mappings,
|
||||
std::unique_ptr<Expr> &&expr, location_t locus)
|
||||
: ExprWithBlock (std::move (mappings), {}), locus (locus),
|
||||
expr (std::move (expr))
|
||||
{
|
||||
rust_assert (this->expr);
|
||||
}
|
||||
|
||||
AnonConst::AnonConst (const AnonConst &other)
|
||||
: ExprWithBlock (other), locus (other.locus), expr (other.expr->clone_expr ())
|
||||
{}
|
||||
|
||||
AnonConst
|
||||
AnonConst::operator= (const AnonConst &other)
|
||||
{
|
||||
ExprWithBlock::operator= (other);
|
||||
|
||||
locus = other.locus;
|
||||
expr = other.expr->clone_expr ();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
ConstBlock::ConstBlock (Analysis::NodeMapping mappings, AnonConst &&expr,
|
||||
location_t locus, AST::AttrVec outer_attrs)
|
||||
: ExprWithBlock (std::move (mappings), std::move (outer_attrs)),
|
||||
expr (std::move (expr)), locus (locus)
|
||||
{}
|
||||
|
||||
ConstBlock::ConstBlock (const ConstBlock &other)
|
||||
: ExprWithBlock (other), expr (other.expr), locus (other.locus)
|
||||
{}
|
||||
|
||||
ConstBlock
|
||||
ConstBlock::operator= (const ConstBlock &other)
|
||||
{
|
||||
ExprWithBlock::operator= (other);
|
||||
|
||||
expr = other.expr;
|
||||
locus = other.locus;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
ContinueExpr::ContinueExpr (Analysis::NodeMapping mappings, location_t locus,
|
||||
tl::optional<Lifetime> label,
|
||||
AST::AttrVec outer_attribs)
|
||||
|
|
@ -1310,26 +1354,6 @@ OperatorExprMeta::OperatorExprMeta (HIR::ComparisonExpr &expr)
|
|||
locus (expr.get_locus ())
|
||||
{}
|
||||
|
||||
AnonConst::AnonConst (NodeId id, std::unique_ptr<Expr> expr)
|
||||
: id (id), expr (std::move (expr))
|
||||
{
|
||||
rust_assert (this->expr != nullptr);
|
||||
}
|
||||
|
||||
AnonConst::AnonConst (const AnonConst &other)
|
||||
{
|
||||
id = other.id;
|
||||
expr = other.expr->clone_expr ();
|
||||
}
|
||||
|
||||
AnonConst
|
||||
AnonConst::operator= (const AnonConst &other)
|
||||
{
|
||||
id = other.id;
|
||||
expr = other.expr->clone_expr ();
|
||||
return *this;
|
||||
}
|
||||
|
||||
InlineAsmOperand::In::In (
|
||||
const tl::optional<struct AST::InlineAsmRegOrRegClass> ®,
|
||||
std::unique_ptr<Expr> expr)
|
||||
|
|
|
|||
|
|
@ -19,12 +19,14 @@
|
|||
#ifndef RUST_HIR_EXPR_H
|
||||
#define RUST_HIR_EXPR_H
|
||||
|
||||
#include "rust-ast.h"
|
||||
#include "rust-hir-expr-abstract.h"
|
||||
#include "rust-hir-literal.h"
|
||||
#include "rust-common.h"
|
||||
#include "rust-hir-bound.h"
|
||||
#include "rust-hir-attrs.h"
|
||||
#include "rust-expr.h"
|
||||
#include "rust-hir-map.h"
|
||||
|
||||
namespace Rust {
|
||||
namespace HIR {
|
||||
|
|
@ -1800,6 +1802,71 @@ protected:
|
|||
}
|
||||
};
|
||||
|
||||
class AnonConst : public ExprWithBlock
|
||||
{
|
||||
public:
|
||||
AnonConst (Analysis::NodeMapping mappings, std::unique_ptr<Expr> &&expr,
|
||||
location_t locus = UNKNOWN_LOCATION);
|
||||
AnonConst (const AnonConst &other);
|
||||
AnonConst operator= (const AnonConst &other);
|
||||
|
||||
std::string as_string () const override;
|
||||
|
||||
void accept_vis (HIRFullVisitor &vis) override;
|
||||
void accept_vis (HIRExpressionVisitor &vis) override;
|
||||
|
||||
ExprType get_expression_type () const final override
|
||||
{
|
||||
return ExprType::AnonConst;
|
||||
}
|
||||
|
||||
location_t get_locus () const override { return locus; }
|
||||
Expr &get_inner_expr () { return *expr; }
|
||||
const Expr &get_inner_expr () const { return *expr; }
|
||||
|
||||
private:
|
||||
location_t locus;
|
||||
std::unique_ptr<Expr> expr;
|
||||
|
||||
AnonConst *clone_expr_with_block_impl () const override
|
||||
{
|
||||
return new AnonConst (*this);
|
||||
}
|
||||
};
|
||||
|
||||
class ConstBlock : public ExprWithBlock
|
||||
{
|
||||
public:
|
||||
ConstBlock (Analysis::NodeMapping mappings, AnonConst &&expr,
|
||||
location_t locus = UNKNOWN_LOCATION,
|
||||
AST::AttrVec outer_attrs = {});
|
||||
ConstBlock (const ConstBlock &other);
|
||||
ConstBlock operator= (const ConstBlock &other);
|
||||
|
||||
void accept_vis (HIRFullVisitor &vis) override;
|
||||
void accept_vis (HIRExpressionVisitor &vis) override;
|
||||
|
||||
std::string as_string () const override;
|
||||
|
||||
ExprType get_expression_type () const final override
|
||||
{
|
||||
return ExprType::ConstBlock;
|
||||
}
|
||||
|
||||
location_t get_locus () const override { return locus; }
|
||||
AnonConst &get_const_expr () { return expr; }
|
||||
const AnonConst &get_const_expr () const { return expr; }
|
||||
|
||||
private:
|
||||
AnonConst expr;
|
||||
location_t locus;
|
||||
|
||||
ConstBlock *clone_expr_with_block_impl () const override
|
||||
{
|
||||
return new ConstBlock (*this);
|
||||
}
|
||||
};
|
||||
|
||||
// HIR node representing continue expression within loops
|
||||
class ContinueExpr : public ExprWithoutBlock
|
||||
{
|
||||
|
|
@ -2892,18 +2959,6 @@ class InlineAsmRegClass
|
|||
std::string placeholder;
|
||||
};
|
||||
|
||||
struct AnonConst
|
||||
{
|
||||
NodeId id;
|
||||
std::unique_ptr<Expr> expr;
|
||||
|
||||
AnonConst (NodeId id, std::unique_ptr<Expr> expr);
|
||||
|
||||
AnonConst (const AnonConst &other);
|
||||
|
||||
AnonConst operator= (const AnonConst &other);
|
||||
};
|
||||
|
||||
class InlineAsmOperand
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -95,6 +95,8 @@ class FieldAccessExpr;
|
|||
struct ClosureParam;
|
||||
class ClosureExpr;
|
||||
class BlockExpr;
|
||||
class AnonConst;
|
||||
class ConstBlock;
|
||||
class ContinueExpr;
|
||||
class BreakExpr;
|
||||
class RangeExpr;
|
||||
|
|
@ -123,7 +125,6 @@ class AwaitExpr;
|
|||
class AsyncBlockExpr;
|
||||
class InlineAsmReg;
|
||||
class InlineAsmRegClass;
|
||||
struct AnonConst;
|
||||
class InlineAsmOperand;
|
||||
class InlineAsm;
|
||||
class LlvmInlineAsm;
|
||||
|
|
|
|||
|
|
@ -64,6 +64,8 @@ public:
|
|||
virtual void visit (MethodCallExpr &expr) = 0;
|
||||
virtual void visit (FieldAccessExpr &expr) = 0;
|
||||
virtual void visit (BlockExpr &expr) = 0;
|
||||
virtual void visit (AnonConst &expr) = 0;
|
||||
virtual void visit (ConstBlock &expr) = 0;
|
||||
virtual void visit (ClosureExpr &expr) = 0;
|
||||
virtual void visit (ContinueExpr &expr) = 0;
|
||||
virtual void visit (BreakExpr &expr) = 0;
|
||||
|
|
@ -201,6 +203,8 @@ public:
|
|||
virtual void visit (FieldAccessExpr &) override {}
|
||||
virtual void visit (ClosureExpr &) override {}
|
||||
virtual void visit (BlockExpr &) override {}
|
||||
virtual void visit (AnonConst &) override {}
|
||||
virtual void visit (ConstBlock &) override {}
|
||||
virtual void visit (ContinueExpr &) override {}
|
||||
virtual void visit (BreakExpr &) override {}
|
||||
virtual void visit (RangeFromToExpr &) override {}
|
||||
|
|
@ -427,6 +431,8 @@ public:
|
|||
virtual void visit (MethodCallExpr &expr) = 0;
|
||||
virtual void visit (FieldAccessExpr &expr) = 0;
|
||||
virtual void visit (BlockExpr &expr) = 0;
|
||||
virtual void visit (AnonConst &expr) = 0;
|
||||
virtual void visit (ConstBlock &expr) = 0;
|
||||
virtual void visit (ContinueExpr &expr) = 0;
|
||||
virtual void visit (BreakExpr &expr) = 0;
|
||||
virtual void visit (RangeFromToExpr &expr) = 0;
|
||||
|
|
|
|||
|
|
@ -1047,6 +1047,33 @@ BlockExpr::as_string () const
|
|||
return str;
|
||||
}
|
||||
|
||||
std::string
|
||||
AnonConst::as_string () const
|
||||
{
|
||||
std::string istr = indent_spaces (enter);
|
||||
std::string str = istr + "AnonConst:\n" + istr;
|
||||
|
||||
str += get_inner_expr ().as_string ();
|
||||
|
||||
str += "\n" + indent_spaces (out);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string
|
||||
ConstBlock::as_string () const
|
||||
{
|
||||
std::string istr = indent_spaces (enter);
|
||||
|
||||
std::string str = istr + "ConstBlock:\n" + istr;
|
||||
|
||||
str += get_const_expr ().as_string ();
|
||||
|
||||
str += "\n" + indent_spaces (out);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string
|
||||
TypeAlias::as_string () const
|
||||
{
|
||||
|
|
@ -4054,6 +4081,18 @@ BlockExpr::accept_vis (HIRFullVisitor &vis)
|
|||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
AnonConst::accept_vis (HIRFullVisitor &vis)
|
||||
{
|
||||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
ConstBlock::accept_vis (HIRFullVisitor &vis)
|
||||
{
|
||||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
ContinueExpr::accept_vis (HIRFullVisitor &vis)
|
||||
{
|
||||
|
|
@ -5026,6 +5065,18 @@ BlockExpr::accept_vis (HIRExpressionVisitor &vis)
|
|||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
AnonConst::accept_vis (HIRExpressionVisitor &vis)
|
||||
{
|
||||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
ConstBlock::accept_vis (HIRExpressionVisitor &vis)
|
||||
{
|
||||
vis.visit (*this);
|
||||
}
|
||||
|
||||
void
|
||||
Function::accept_vis (HIRStmtVisitor &vis)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -642,6 +642,18 @@ TypeCheckExpr::visit (HIR::BlockExpr &expr)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
TypeCheckExpr::visit (HIR::AnonConst &expr)
|
||||
{
|
||||
infered = TypeCheckExpr::Resolve (expr.get_inner_expr ());
|
||||
}
|
||||
|
||||
void
|
||||
TypeCheckExpr::visit (HIR::ConstBlock &expr)
|
||||
{
|
||||
infered = TypeCheckExpr::Resolve (expr.get_const_expr ());
|
||||
}
|
||||
|
||||
void
|
||||
TypeCheckExpr::visit (HIR::RangeFromToExpr &expr)
|
||||
{
|
||||
|
|
@ -813,7 +825,7 @@ typecheck_inline_asm_operand (HIR::InlineAsm &expr)
|
|||
}
|
||||
case RegisterType::Const: {
|
||||
auto anon_const = operand.get_const ().anon_const;
|
||||
TypeCheckExpr::Resolve (*anon_const.expr);
|
||||
TypeCheckExpr::Resolve (anon_const.get_inner_expr ());
|
||||
break;
|
||||
}
|
||||
case RegisterType::Sym: {
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ public:
|
|||
void visit (HIR::IfExpr &expr) override;
|
||||
void visit (HIR::IfExprConseqElse &expr) override;
|
||||
void visit (HIR::BlockExpr &expr) override;
|
||||
void visit (HIR::AnonConst &expr) override;
|
||||
void visit (HIR::ConstBlock &expr) override;
|
||||
void visit (HIR::UnsafeBlockExpr &expr) override;
|
||||
void visit (HIR::ArrayIndexExpr &expr) override;
|
||||
void visit (HIR::ArrayExpr &expr) override;
|
||||
|
|
|
|||
Loading…
Reference in New Issue