https://gcc.gnu.org/g:ca178958c4bb599da331f62cc5cc8a480ea5371e
commit ca178958c4bb599da331f62cc5cc8a480ea5371e Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com> Date: Sun May 19 02:44:42 2024 +0200 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 eb23192e11fe..33b038745cc1 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 d7c84a5b72e5..aa90ae2092b9 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 62497585575c..18cfa33e1e56 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 306baf283981..238bf0792dca 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