aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2024-05-19 02:44:42 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-17 16:35:30 +0100
commit1e430a7957e7a3cf79f6f22f112f3d764706f50f (patch)
tree7b594bb2b4ad86e5aa786f222f3c3829811cb911
parent813a1e617bdd70d730ef3c9a84780b3cb3a6f28d (diff)
downloadgcc-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.cc11
-rw-r--r--gcc/rust/checks/errors/rust-feature-gate.h3
-rw-r--r--gcc/rust/checks/errors/rust-feature.cc6
-rw-r--r--gcc/rust/checks/errors/rust-feature.h3
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