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 @@ class FeatureGate : public AST::DefaultASTVisitor 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 @@ class FeatureGate : public AST::DefaultASTVisitor 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 @@ class FeatureGate : public AST::DefaultASTVisitor 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 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 @@ -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 @@ class Feature EXTERN_TYPES, LANG_ITEMS, NO_CORE, + BOX_SYNTAX, }; const std::string &as_string () { return m_name_str; } @@ -79,4 +80,4 @@ class Feature }; } // namespace Rust -#endif \ No newline at end of file +#endif