aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-20 20:06:14 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-07-20 20:06:14 +0100
commit857953b3c70a170955afb181018b0231a16a63df (patch)
tree63ca1463f6aecb90ec27a1a32adf22ecddde799a /gcc
parent02713d245aaffd45d8daaf8c914b1dda5baa6eb4 (diff)
downloadgcc-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.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 {
- }
- ()
-}