From: jjasmine <tanghocle...@gmail.com> gcc/rust/ChangeLog:
* checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): Partial unsafe support for inline asm * checks/errors/rust-unsafe-checker.h: Likewise. * hir/tree/rust-hir-expr.h: Likewise. * hir/tree/rust-hir.cc (InlineAsm::accept_vis): Likewise. --- gcc/rust/checks/errors/rust-unsafe-checker.cc | 11 +++++++++++ gcc/rust/checks/errors/rust-unsafe-checker.h | 1 + gcc/rust/hir/tree/rust-hir-expr.h | 4 ++-- gcc/rust/hir/tree/rust-hir.cc | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc b/gcc/rust/checks/errors/rust-unsafe-checker.cc index 8d986c72eda..c6ed9221565 100644 --- a/gcc/rust/checks/errors/rust-unsafe-checker.cc +++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc @@ -636,6 +636,17 @@ UnsafeChecker::visit (AsyncBlockExpr &) // TODO: Visit block expression } +void +UnsafeChecker::visit (InlineAsm &expr) +{ + if (unsafe_context.is_in_context ()) + return; + + rust_error_at ( + expr.get_locus (), ErrorCode::E0133, + "use of inline assembly is unsafe and requires unsafe function or block"); +} + void UnsafeChecker::visit (TypeParam &) {} diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.h b/gcc/rust/checks/errors/rust-unsafe-checker.h index ba926729c70..1fa1fe072da 100644 --- a/gcc/rust/checks/errors/rust-unsafe-checker.h +++ b/gcc/rust/checks/errors/rust-unsafe-checker.h @@ -115,6 +115,7 @@ private: virtual void visit (MatchExpr &expr) override; virtual void visit (AwaitExpr &expr) override; virtual void visit (AsyncBlockExpr &expr) override; + virtual void visit (InlineAsm &expr); virtual void visit (TypeParam ¶m) override; virtual void visit (ConstGenericParam ¶m) override; virtual void visit (LifetimeWhereClauseItem &item) override; diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index a0858a36f04..9c66f3e79d5 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.h +++ b/gcc/rust/hir/tree/rust-hir-expr.h @@ -3878,9 +3878,9 @@ public: std::vector<location_t> line_spans; - void accept_vis (HIRExpressionVisitor &vis) override{}; + void accept_vis (HIRExpressionVisitor &vis) override; - void accept_vis (HIRFullVisitor &vis) override{}; + void accept_vis (HIRFullVisitor &vis) override; std::string as_string () const override { return "InlineAsm HIR Node"; } diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc index 5cb22450672..66c6240bfa5 100644 --- a/gcc/rust/hir/tree/rust-hir.cc +++ b/gcc/rust/hir/tree/rust-hir.cc @@ -17,6 +17,7 @@ // <http://www.gnu.org/licenses/>. #include "rust-ast-full.h" +#include "rust-hir-expr.h" #include "rust-hir-full.h" #include "rust-hir-visitor.h" #include "rust-diagnostics.h" @@ -3769,6 +3770,14 @@ BorrowExpr::accept_vis (HIRFullVisitor &vis) vis.visit (*this); } +void +InlineAsm::accept_vis (HIRExpressionVisitor &vis) +{} + +void +InlineAsm::accept_vis (HIRFullVisitor &vis) +{} + void BorrowExpr::accept_vis (HIRExpressionVisitor &vis) { -- 2.45.2