diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-07-20 20:06:14 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-07-20 20:06:14 +0100 |
commit | 857953b3c70a170955afb181018b0231a16a63df (patch) | |
tree | 63ca1463f6aecb90ec27a1a32adf22ecddde799a /gcc | |
parent | 02713d245aaffd45d8daaf8c914b1dda5baa6eb4 (diff) | |
download | gcc-857953b3c70a170955afb181018b0231a16a63df.zip gcc-857953b3c70a170955afb181018b0231a16a63df.tar.gz gcc-857953b3c70a170955afb181018b0231a16a63df.tar.bz2 |
HIR and GENERIC lowering for unsafe blocks
This does not implement the rules for unsafe this wires up the code so we
can compile unsafe blocks. No checks are being performed on the code yet.
Fixes #382
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.h | 5 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-block.h | 31 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-expr.h | 5 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-expr.h | 2 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-expr.h | 5 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/unsafe1.rs | 12 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/unsafe2.rs | 4 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/unsafe.rs | 5 |
9 files changed, 69 insertions, 6 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h index fc8ad81..dff4712 100644 --- a/gcc/rust/backend/rust-compile-expr.h +++ b/gcc/rust/backend/rust-compile-expr.h @@ -527,6 +527,11 @@ public: } } + void visit (HIR::UnsafeBlockExpr &expr) override + { + expr.get_block_expr ()->accept_vis (*this); + } + void visit (HIR::StructExprStruct &struct_expr) override { TyTy::BaseType *tyty = nullptr; diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h index b29bd14..36b3e68 100644 --- a/gcc/rust/hir/rust-ast-lower-block.h +++ b/gcc/rust/hir/rust-ast-lower-block.h @@ -46,7 +46,31 @@ public: return resolver.translated; } - ~ASTLoweringBlock () {} + static HIR::UnsafeBlockExpr *translate (AST::UnsafeBlockExpr *expr, + bool *terminated) + { + ASTLoweringBlock resolver; + + HIR::BlockExpr *block + = ASTLoweringBlock::translate (expr->get_block_expr ().get (), + terminated); + auto crate_num = resolver.mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, expr->get_node_id (), + resolver.mappings->get_next_hir_id ( + crate_num), + UNKNOWN_LOCAL_DEFID); + + HIR::UnsafeBlockExpr *translated + = new HIR::UnsafeBlockExpr (mapping, + std::unique_ptr<HIR::BlockExpr> (block), + expr->get_outer_attrs (), expr->get_locus ()); + + resolver.mappings->insert_hir_expr ( + translated->get_mappings ().get_crate_num (), + translated->get_mappings ().get_hirid (), translated); + + return translated; + } void visit (AST::BlockExpr &expr) override; @@ -140,6 +164,11 @@ public: translated = ASTLoweringBlock::translate (&expr, &terminated); } + void visit (AST::UnsafeBlockExpr &expr) override + { + translated = ASTLoweringBlock::translate (&expr, &terminated); + } + void visit (AST::LoopExpr &expr) override { HIR::BlockExpr *loop_block diff --git a/gcc/rust/hir/rust-ast-lower-expr.h b/gcc/rust/hir/rust-ast-lower-expr.h index 19ce8c2..7bc3ab4 100644 --- a/gcc/rust/hir/rust-ast-lower-expr.h +++ b/gcc/rust/hir/rust-ast-lower-expr.h @@ -135,6 +135,11 @@ public: translated = ASTLoweringBlock::translate (&expr, &terminated); } + void visit (AST::UnsafeBlockExpr &expr) override + { + translated = ASTLoweringBlock::translate (&expr, &terminated); + } + void visit (AST::PathInExpression &expr) override { translated = ASTLowerPathInExpression::translate (&expr); diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index 2b1e938..1d5b6e6 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.h +++ b/gcc/rust/hir/tree/rust-hir-expr.h @@ -3138,6 +3138,8 @@ public: void accept_vis (HIRVisitor &vis) override; + std::unique_ptr<BlockExpr> &get_block_expr () { return expr; } + protected: /* Use covariance to implement clone function as returning this object rather * than base */ diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h index ec89f6c..7abf10a 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.h +++ b/gcc/rust/resolve/rust-ast-resolve-expr.h @@ -196,6 +196,11 @@ public: void visit (AST::BlockExpr &expr) override; + void visit (AST::UnsafeBlockExpr &expr) override + { + expr.get_block_expr ()->accept_vis (*this); + } + void visit (AST::ArrayElemsValues &elems) override { elems.iterate ([&] (AST::Expr *elem) mutable -> bool { diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index b53cd46..8197119 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -711,6 +711,12 @@ public: void visit (HIR::BlockExpr &expr) override; + void visit (HIR::UnsafeBlockExpr &expr) override + { + infered + = TypeCheckExpr::Resolve (expr.get_block_expr ().get (), inside_loop); + } + void visit (HIR::ArrayIndexExpr &expr) override { TyTy::BaseType *size_ty; diff --git a/gcc/testsuite/rust/compile/torture/unsafe1.rs b/gcc/testsuite/rust/compile/torture/unsafe1.rs new file mode 100644 index 0000000..f57ef52 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/unsafe1.rs @@ -0,0 +1,12 @@ +fn test() -> i32 { + unsafe { + let a; + a = 123; + a + } +} + +fn main() { + let a; + a = test(); +} diff --git a/gcc/testsuite/rust/compile/torture/unsafe2.rs b/gcc/testsuite/rust/compile/torture/unsafe2.rs new file mode 100644 index 0000000..0b3aad5 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/unsafe2.rs @@ -0,0 +1,4 @@ +fn main() { + unsafe {} + () +} diff --git a/gcc/testsuite/rust/compile/unsafe.rs b/gcc/testsuite/rust/compile/unsafe.rs deleted file mode 100644 index d0cb87d..0000000 --- a/gcc/testsuite/rust/compile/unsafe.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn main() { // { dg-ice "#382" } - unsafe { - } - () -} |