]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add feature gate for box syntax
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Sun, 19 May 2024 00:44:42 +0000 (02:44 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 17 Mar 2025 15:35:30 +0000 (16:35 +0100)
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.patry@embecosm.com>
gcc/rust/checks/errors/rust-feature-gate.cc
gcc/rust/checks/errors/rust-feature-gate.h
gcc/rust/checks/errors/rust-feature.cc
gcc/rust/checks/errors/rust-feature.h

index 6ef2d1f710fb8c2103f48ea48f2274ea8ffeee3a..69348cb90e859ee37e7490c217f2b172ac760cbd 100644 (file)
@@ -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
index de48f22559871f2886907274733e00c0cc17fdf1..bef7cf1b449c1f020f1816335c0108d09ed71417 100644 (file)
@@ -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 {}
index 1e11bd541a58d9f21a23c4a25450e75814f74c70..f993bbb7245b40d3ae7892e4a5d6c4ae936c9dd5 100644 (file)
@@ -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
index 611dceaa2c9445e4847deda951d610abed1daee8..736d97e1cde6eeeb07b13676991510b5e31652e0 100644 (file)
@@ -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