diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2024-05-19 02:44:42 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-03-17 16:35:30 +0100 |
commit | 1e430a7957e7a3cf79f6f22f112f3d764706f50f (patch) | |
tree | 7b594bb2b4ad86e5aa786f222f3c3829811cb911 | |
parent | 813a1e617bdd70d730ef3c9a84780b3cb3a6f28d (diff) | |
download | gcc-1e430a7957e7a3cf79f6f22f112f3d764706f50f.zip gcc-1e430a7957e7a3cf79f6f22f112f3d764706f50f.tar.gz gcc-1e430a7957e7a3cf79f6f22f112f3d764706f50f.tar.bz2 |
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.patry@embecosm.com>
-rw-r--r-- | gcc/rust/checks/errors/rust-feature-gate.cc | 11 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-feature-gate.h | 3 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-feature.cc | 6 | ||||
-rw-r--r-- | 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 6ef2d1f..69348cb 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 de48f22..bef7cf1 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 1e11bd5..f993bbb 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 611dcea..736d97e 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 |