aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormxlol233 <mxlol233@outlook.com>2023-03-01 19:31:19 +0800
committerCohenArthur <arthur.cohen@embecosm.com>2023-03-01 15:02:21 +0000
commit9c46a853be4b5a9c2e1b965fa0dcd44beed71924 (patch)
treece78941f0f79ef1d7a514fa097480ebdb44e36f0
parent9dce6f995c2b3bc021a97872b413807de7d294b1 (diff)
downloadgcc-9c46a853be4b5a9c2e1b965fa0dcd44beed71924.zip
gcc-9c46a853be4b5a9c2e1b965fa0dcd44beed71924.tar.gz
gcc-9c46a853be4b5a9c2e1b965fa0dcd44beed71924.tar.bz2
Add feature gate definition for `extern_types`.
This commit add a basic implementation to gating `ExternalTypeItem` AST node. gcc/rust/ChangeLog: * checks/errors/rust-feature-gate.cc: Add definition for `extern_types`. * checks/errors/rust-feature-gate.h: Likewise. * checks/errors/rust-feature.cc: Likewise. * checks/errors/rust-feature.h: Likewise. gcc/testsuite/ChangeLog: * rust/compile/feature_extern_types.rs:New file. Signed-off-by: Xiao Ma <mxlol233@outlook.com>
-rw-r--r--gcc/rust/checks/errors/rust-feature-gate.cc13
-rw-r--r--gcc/rust/checks/errors/rust-feature-gate.h2
-rw-r--r--gcc/rust/checks/errors/rust-feature.cc5
-rw-r--r--gcc/rust/checks/errors/rust-feature.h1
-rw-r--r--gcc/testsuite/rust/compile/feature_extern_types.rs8
5 files changed, 28 insertions, 1 deletions
diff --git a/gcc/rust/checks/errors/rust-feature-gate.cc b/gcc/rust/checks/errors/rust-feature-gate.cc
index 9b2f025..07d367e 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.cc
+++ b/gcc/rust/checks/errors/rust-feature-gate.cc
@@ -103,6 +103,10 @@ FeatureGate::visit (AST::ExternBlock &block)
gate (Feature::Name::INTRINSICS, block.get_locus (),
"intrinsics are subject to change");
}
+ for (const auto &item : block.get_extern_items ())
+ {
+ item->accept_vis (*this);
+ }
}
void
@@ -155,4 +159,13 @@ FeatureGate::visit (AST::Function &function)
check_rustc_attri (function.get_outer_attrs ());
}
+void
+FeatureGate::visit (AST::ExternalTypeItem &item)
+{
+ // TODO(mxlol233): The gating needs a complete visiting chain to activate
+ // `AST::ExternalTypeItem`.
+ gate (Feature::Name::EXTERN_TYPES, item.get_locus (),
+ "extern types are experimental");
+}
+
} // 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 0262903..c442fd3 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.h
+++ b/gcc/rust/checks/errors/rust-feature-gate.h
@@ -133,7 +133,7 @@ public:
void visit (AST::Trait &trait) override {}
void visit (AST::InherentImpl &impl) override;
void visit (AST::TraitImpl &impl) override;
- void visit (AST::ExternalTypeItem &item) override {}
+ void visit (AST::ExternalTypeItem &item) override;
void visit (AST::ExternalStaticItem &item) override {}
void visit (AST::ExternalFunctionItem &item) override {}
void visit (AST::ExternBlock &block) override;
diff --git a/gcc/rust/checks/errors/rust-feature.cc b/gcc/rust/checks/errors/rust-feature.cc
index ceae2aa..e36e540 100644
--- a/gcc/rust/checks/errors/rust-feature.cc
+++ b/gcc/rust/checks/errors/rust-feature.cc
@@ -43,6 +43,10 @@ Feature::create (Feature::Name name)
return Feature (Feature::Name::DECL_MACRO, Feature::State::ACCEPTED,
"decl_macro", "1.0.0", 0,
Optional<CompileOptions::Edition>::none (), "");
+ case Feature::Name::EXTERN_TYPES:
+ return Feature (Feature::Name::EXTERN_TYPES, Feature::State::ACTIVE,
+ "extern_types", "1.23.0", 43467,
+ Optional<CompileOptions::Edition>::none (), "");
default:
gcc_unreachable ();
}
@@ -56,6 +60,7 @@ const std::map<std::string, Feature::Name> Feature::name_hash_map = {
// TODO: Rename to "auto_traits" when supporting
// later Rust versions
{"optin_builtin_traits", Feature::Name::AUTO_TRAITS},
+ {"extern_types", Feature::Name::EXTERN_TYPES},
}; // namespace Rust
Optional<Feature::Name>
diff --git a/gcc/rust/checks/errors/rust-feature.h b/gcc/rust/checks/errors/rust-feature.h
index 1f580a0..7562eaf 100644
--- a/gcc/rust/checks/errors/rust-feature.h
+++ b/gcc/rust/checks/errors/rust-feature.h
@@ -42,6 +42,7 @@ public:
RUSTC_ATTRS,
DECL_MACRO,
AUTO_TRAITS,
+ EXTERN_TYPES,
};
const std::string &as_string () { return m_name_str; }
diff --git a/gcc/testsuite/rust/compile/feature_extern_types.rs b/gcc/testsuite/rust/compile/feature_extern_types.rs
new file mode 100644
index 0000000..5e31493
--- /dev/null
+++ b/gcc/testsuite/rust/compile/feature_extern_types.rs
@@ -0,0 +1,8 @@
+extern "C" {
+ type F; //{ dg-error "extern types are experimental." "" { target *-*-* } }
+}
+
+
+fn main() {
+
+}