From: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

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>
---
 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 6ef2d1f710f..69348cb90e8 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 de48f225598..bef7cf1b449 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 1e11bd541a5..f993bbb7245 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 611dceaa2c9..736d97e1cde 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
-- 
2.45.2

Reply via email to