diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2023-02-14 10:23:32 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-14 10:23:32 +0000 |
commit | 2006ca18fed788182e9111aaec13a32e4db040a1 (patch) | |
tree | bed9237305c361b50d76b80daaea9fc2a7044ee4 /gcc/rust | |
parent | cc23831ec66ac39f8955b1915fd7f6585dbccbe9 (diff) | |
parent | debb72b0e9cc9ae0cbd151fb809d3f2fda0b4785 (diff) | |
download | gcc-2006ca18fed788182e9111aaec13a32e4db040a1.zip gcc-2006ca18fed788182e9111aaec13a32e4db040a1.tar.gz gcc-2006ca18fed788182e9111aaec13a32e4db040a1.tar.bz2 |
Merge #1825
1825: Add feature gate for "rust-intrinsic". r=CohenArthur a=TuringKi
This commit implemented a feature gate to check `intrinsics`.
gcc/rust/ChangeLog:
* checks/errors/rust-feature-gate.cc: Add implementation for `void FeatureGate::visit (AST::ExternBlock &block)`. Add `valid_feature` construction process in `FeatureGate::check`.
* checks/errors/rust-feature-gate.h: Add declaration for `void FeatureGate::visit (AST::ExternBlock &block)`. Add private variable `valid_feature`.
* checks/errors/rust-feature.h: Change `issue` to `m_issue`.
gcc/testsuite/ChangeLog:
* rust/compile/const-issue1440.rs: Add crate feature: `intrinsics`.
* rust/compile/feature_intrinsics.rs: New file.
* rust/compile/issue-1031.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1130.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1131.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1237.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1289.rs: Add crate feature: `intrinsics`.
* rust/compile/rust-const-blog-issue.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-3.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-4.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-5.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-6.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-7.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1024.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1075.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1432.rs: Add crate feature: `intrinsics`.
* rust/compile/unsafe10.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/atomic_load.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/atomic_store.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/copy_nonoverlapping1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/issue-1120.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/issue-1133.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/issue-1232.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/slice-magic.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/slice-magic2.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/str-layout1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/transmute1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/wrapping_op1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/wrapping_op2.rs: Add crate feature: `intrinsics`.
Signed-off-by: Xiao Ma <mxlol233@outlook.com>
Co-authored-by: mxlol233 <mxlol233@outlook.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/checks/errors/rust-feature-gate.cc | 61 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-feature-gate.h | 7 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-feature.h | 5 |
3 files changed, 62 insertions, 11 deletions
diff --git a/gcc/rust/checks/errors/rust-feature-gate.cc b/gcc/rust/checks/errors/rust-feature-gate.cc index 31ce367..bd01b52 100644 --- a/gcc/rust/checks/errors/rust-feature-gate.cc +++ b/gcc/rust/checks/errors/rust-feature-gate.cc @@ -17,14 +17,15 @@ // <http://www.gnu.org/licenses/>. #include "rust-feature-gate.h" -#include "rust-feature.h" +#include "rust-abi.h" namespace Rust { void FeatureGate::check (AST::Crate &crate) { - std::vector<Feature> valid_features; + valid_features.clear (); + for (const auto &attr : crate.inner_attrs) { if (attr.get_path ().as_string () == "feature") @@ -39,20 +40,22 @@ FeatureGate::check (AST::Crate &crate) option.parse_to_meta_item ()); for (const auto &item : meta_item->get_items ()) { - const auto &name = item->as_string (); - auto tname = Feature::as_name (name); + const auto &name_str = item->as_string (); + auto tname = Feature::as_name (name_str); if (!tname.is_none ()) - valid_features.push_back (Feature::create (tname.get ())); + { + auto name = tname.get (); + valid_features.insert (name); + } + else rust_error_at (item->get_locus (), "unknown feature '%s'", - name.c_str ()); + name_str.c_str ()); } } } } - valid_features.shrink_to_fit (); - // TODO (mxlol233): add the real feature gate stuff. auto &items = crate.items; for (auto it = items.begin (); it != items.end (); it++) { @@ -60,4 +63,46 @@ FeatureGate::check (AST::Crate &crate) item->accept_vis (*this); } } + +void +FeatureGate::gate (Feature::Name name, Location loc, + const std::string &error_msg) +{ + if (!valid_features.count (name)) + { + auto feature = Feature::create (name); + auto issue = feature.issue (); + if (issue > 0) + { + const char *fmt_str + = "%s. see issue %ld " + "<https://github.com/rust-lang/rust/issues/%ld> for more " + "information. add `#![feature(%s)]` to the crate attributes to " + "enable."; + rust_error_at (loc, fmt_str, error_msg.c_str (), issue, issue, + feature.as_string ().c_str ()); + } + else + { + const char *fmt_str + = "%s. add `#![feature(%s)]` to the crate attributes to enable."; + rust_error_at (loc, fmt_str, error_msg.c_str (), + feature.as_string ().c_str ()); + } + } +} + +void +FeatureGate::visit (AST::ExternBlock &block) +{ + if (block.has_abi ()) + { + const auto abi = block.get_abi (); + + if (get_abi_from_string (abi) == ABI::INTRINSIC) + gate (Feature::Name::INTRINSICS, block.get_locus (), + "intrinsics are subject to change"); + } +} + } // namespace Rust
\ No newline at end of file diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h index dc95c6b..6768c4c 100644 --- a/gcc/rust/checks/errors/rust-feature-gate.h +++ b/gcc/rust/checks/errors/rust-feature-gate.h @@ -21,6 +21,7 @@ #include "rust-ast-visitor.h" #include "rust-ast-full.h" +#include "rust-feature.h" namespace Rust { @@ -136,7 +137,7 @@ public: void visit (AST::TraitImpl &impl) override {} void visit (AST::ExternalStaticItem &item) override {} void visit (AST::ExternalFunctionItem &item) override {} - void visit (AST::ExternBlock &block) override {} + void visit (AST::ExternBlock &block) override; void visit (AST::MacroMatchFragment &match) override {} void visit (AST::MacroMatchRepetition &match) override {} void visit (AST::MacroMatcher &matcher) override {} @@ -186,6 +187,10 @@ public: void visit (AST::SliceType &type) override {} void visit (AST::InferredType &type) override {} void visit (AST::BareFunctionType &type) override {} + +private: + void gate (Feature::Name name, Location loc, const std::string &error_msg); + std::set<Feature::Name> valid_features; }; } // namespace Rust #endif
\ No newline at end of file diff --git a/gcc/rust/checks/errors/rust-feature.h b/gcc/rust/checks/errors/rust-feature.h index 1425e26..7bd76c0 100644 --- a/gcc/rust/checks/errors/rust-feature.h +++ b/gcc/rust/checks/errors/rust-feature.h @@ -47,6 +47,7 @@ public: Name name () { return m_name; } const std::string &description () { return m_description; } State state () { return m_state; } + uint64_t issue () { return m_issue; } static Optional<Name> as_name (const std::string &name); static Feature create (Name name); @@ -57,7 +58,7 @@ private: const Optional<CompileOptions::Edition> &edition, const char *description) : m_state (state), m_name (name), m_name_str (name_str), - m_rustc_since (rustc_since), issue (issue_number), edition (edition), + m_rustc_since (rustc_since), m_issue (issue_number), edition (edition), m_description (description) {} @@ -65,7 +66,7 @@ private: Name m_name; std::string m_name_str; std::string m_rustc_since; - uint64_t issue; + uint64_t m_issue; Optional<CompileOptions::Edition> edition; std::string m_description; |