diff options
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 { - } - () -} |