]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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)
committerP-E-P <32375388+P-E-P@users.noreply.github.com>
Tue, 11 Jun 2024 11:19:26 +0000 (11:19 +0000)
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 eb23192e11fe4cb7ef7db76e143a4f7c9ed6bd0e..33b038745cc1a00bcf9bc0a975d7063c63b084e3 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 d7c84a5b72e575c8b93b588c9911f285a2607305..aa90ae2092b9924f5ab224ea7be1d44ec512f9e7 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 62497585575cb04d9e6b9ac7707c9924855632b2..18cfa33e1e56840325417a61d7021768b35b1daf 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 306baf283981a246e28c0cf4424b607b9b401b32..238bf0792dca6341909c4a12fc673cb510f135ea 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