Skip to content

Commit

Permalink
Add feature gate for box syntax
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
P-E-P committed Jun 11, 2024
1 parent 32ccdf4 commit ca17895
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 4 deletions.
11 changes: 11 additions & 0 deletions gcc/rust/checks/errors/rust-feature-gate.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
3 changes: 1 addition & 2 deletions gcc/rust/checks/errors/rust-feature-gate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}
Expand All @@ -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 {}
Expand Down Expand Up @@ -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 {}
Expand Down
6 changes: 5 additions & 1 deletion gcc/rust/checks/errors/rust-feature.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 ();
}
Expand All @@ -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>
Expand All @@ -73,4 +77,4 @@ Feature::as_name (const std::string &name)
return tl::nullopt;
}

} // namespace Rust
} // namespace Rust
3 changes: 2 additions & 1 deletion gcc/rust/checks/errors/rust-feature.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class Feature
EXTERN_TYPES,
LANG_ITEMS,
NO_CORE,
BOX_SYNTAX,
};

const std::string &as_string () { return m_name_str; }
Expand Down Expand Up @@ -79,4 +80,4 @@ class Feature
};

} // namespace Rust
#endif
#endif

0 comments on commit ca17895

Please sign in to comment.