https://gcc.gnu.org/g:d7f480b7693d3d02bbd5d8bb9baaa54c1bf7feab

commit r15-8192-gd7f480b7693d3d02bbd5d8bb9baaa54c1bf7feab
Author: jjasmine <tanghocle...@gmail.com>
Date:   Fri May 31 16:09:40 2024 -0700

    gccrs: Partial unsafe support for inline asm
    
    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.

Diff:
---
 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 8d986c72eda5..c6ed92215657 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 ba926729c70d..1fa1fe072da8 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 &param) override;
   virtual void visit (ConstGenericParam &param) 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 a0858a36f04c..9c66f3e79d54 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 5cb224506725..66c6240bfa5a 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)
 {

Reply via email to