aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-expr.h5
-rw-r--r--gcc/rust/hir/rust-ast-lower-block.h31
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.h5
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-expr.h5
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h6
-rw-r--r--gcc/testsuite/rust/compile/torture/unsafe1.rs12
-rw-r--r--gcc/testsuite/rust/compile/torture/unsafe2.rs4
-rw-r--r--gcc/testsuite/rust/compile/unsafe.rs5
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 {
- }
- ()
-}