https://gcc.gnu.org/g:1e430a7957e7a3cf79f6f22f112f3d764706f50f

commit r15-8148-g1e430a7957e7a3cf79f6f22f112f3d764706f50f
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Sun May 19 02:44:42 2024 +0200

    gccrs: Add feature gate for box syntax
    
    The box syntax is experimental even though it is used in the standard
    library. It should be feature gated to prevent anyone from using it in
    stable rust.
    
    gcc/rust/ChangeLog:
    
            * checks/errors/rust-feature-gate.cc (FeatureGate::visit): Allow
            visitor recursion in functions. Also add the gate for the box 
syntax.
            * checks/errors/rust-feature-gate.h: Remove several recursion fences
            in the feature gate visitor.
            * checks/errors/rust-feature.cc (Feature::create): Add a new 
feature.
            (Feature::as_name): Likewise.
            * checks/errors/rust-feature.h: Add box_syntax gate.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/checks/errors/rust-feature-gate.cc | 11 +++++++++++
 gcc/rust/checks/errors/rust-feature-gate.h  |  3 +--
 gcc/rust/checks/errors/rust-feature.cc      |  6 +++++-
 gcc/rust/checks/errors/rust-feature.h       |  3 ++-
 4 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/gcc/rust/checks/errors/rust-feature-gate.cc 
b/gcc/rust/checks/errors/rust-feature-gate.cc
index 6ef2d1f710fb..69348cb90e85 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.cc
+++ b/gcc/rust/checks/errors/rust-feature-gate.cc
@@ -134,6 +134,8 @@ FeatureGate::visit (AST::Function &function)
 {
   if (!function.is_external ())
     check_rustc_attri (function.get_outer_attrs ());
+
+  AST::DefaultASTVisitor::visit (function);
 }
 
 void
@@ -153,4 +155,13 @@ FeatureGate::visit (AST::TraitImpl &impl)
          "negative_impls are not yet implemented");
 };
 
+void
+FeatureGate::visit (AST::BoxExpr &expr)
+{
+  gate (
+    Feature::Name::BOX_SYNTAX, expr.get_locus (),
+    "box expression syntax is experimental; you can call `Box::new` instead");
+  AST::DefaultASTVisitor::visit (expr);
+}
+
 } // namespace Rust
diff --git a/gcc/rust/checks/errors/rust-feature-gate.h 
b/gcc/rust/checks/errors/rust-feature-gate.h
index de48f2255987..bef7cf1b449c 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.h
+++ b/gcc/rust/checks/errors/rust-feature-gate.h
@@ -81,7 +81,6 @@ public:
   void visit (AST::MethodCallExpr &expr) override {}
   void visit (AST::FieldAccessExpr &expr) override {}
   void visit (AST::ClosureExprInner &expr) override {}
-  void visit (AST::BlockExpr &expr) override {}
   void visit (AST::ClosureExprInnerTyped &expr) override {}
   void visit (AST::ContinueExpr &expr) override {}
   void visit (AST::BreakExpr &expr) override {}
@@ -92,6 +91,7 @@ public:
   void visit (AST::RangeFromToInclExpr &expr) override {}
   void visit (AST::RangeToInclExpr &expr) override {}
   void visit (AST::ReturnExpr &expr) override {}
+  void visit (AST::BoxExpr &expr) override;
   void visit (AST::UnsafeBlockExpr &expr) override {}
   void visit (AST::LoopExpr &expr) override {}
   void visit (AST::WhileLoopExpr &expr) override {}
@@ -166,7 +166,6 @@ public:
   void visit (AST::SlicePattern &pattern) override {}
   void visit (AST::AltPattern &pattern) override {}
   void visit (AST::EmptyStmt &stmt) override {}
-  void visit (AST::LetStmt &stmt) override {}
   void visit (AST::ExprStmt &stmt) override {}
   void visit (AST::TraitBound &bound) override {}
   void visit (AST::ImplTraitType &type) override {}
diff --git a/gcc/rust/checks/errors/rust-feature.cc 
b/gcc/rust/checks/errors/rust-feature.cc
index 1e11bd541a58..f993bbb7245b 100644
--- a/gcc/rust/checks/errors/rust-feature.cc
+++ b/gcc/rust/checks/errors/rust-feature.cc
@@ -45,6 +45,9 @@ Feature::create (Feature::Name name)
     case Feature::Name::NEGATIVE_IMPLS:
       return Feature (Feature::Name::NEGATIVE_IMPLS, Feature::State::ACTIVE,
                      "negative_impls", "1.0.0", 68318, tl::nullopt, "");
+    case Feature::Name::BOX_SYNTAX:
+      return Feature (Feature::Name::BOX_SYNTAX, Feature::State::ACTIVE,
+                     "box_syntax", "1.0.0", 49733, tl::nullopt, "");
     default:
       rust_unreachable ();
     }
@@ -62,6 +65,7 @@ const std::map<std::string, Feature::Name> 
Feature::name_hash_map = {
   {"extern_types", Feature::Name::EXTERN_TYPES},
   {"lang_items", Feature::Name::LANG_ITEMS},
   {"no_core", Feature::Name::NO_CORE},
+  {"box_syntax", Feature::Name::BOX_SYNTAX},
 }; // namespace Rust
 
 tl::optional<Feature::Name>
@@ -73,4 +77,4 @@ Feature::as_name (const std::string &name)
   return tl::nullopt;
 }
 
-} // namespace Rust
\ No newline at end of file
+} // namespace Rust
diff --git a/gcc/rust/checks/errors/rust-feature.h 
b/gcc/rust/checks/errors/rust-feature.h
index 611dceaa2c94..736d97e1cde6 100644
--- a/gcc/rust/checks/errors/rust-feature.h
+++ b/gcc/rust/checks/errors/rust-feature.h
@@ -46,6 +46,7 @@ public:
     EXTERN_TYPES,
     LANG_ITEMS,
     NO_CORE,
+    BOX_SYNTAX,
   };
 
   const std::string &as_string () { return m_name_str; }
@@ -79,4 +80,4 @@ private:
 };
 
 } // namespace Rust
-#endif
\ No newline at end of file
+#endif

Reply via email to