public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] unsafe: check use of `target_feature` attribute
@ 2023-01-12 7:43 Thomas Schwinge
0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2023-01-12 7:43 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:aa7698dca97505737ff092c6b9758d08f03daf2a
commit aa7698dca97505737ff092c6b9758d08f03daf2a
Author: Prajwal S N <prajwalnadig21@gmail.com>
Date: Sat Dec 31 12:49:02 2022 +0530
unsafe: check use of `target_feature` attribute
The `target_feature` attribute is for conditional compilation and may or
may not compile on all platforms. Using it requires an unsafe function
or block.
Signed-off-by: Prajwal S N <prajwalnadig21@gmail.com>
Diff:
---
gcc/rust/checks/errors/rust-unsafe-checker.cc | 29 ++++++++++++++++++++++++++-
gcc/rust/checks/errors/rust-unsafe-checker.h | 5 +++++
gcc/rust/util/rust-attributes.cc | 3 +++
gcc/testsuite/rust/compile/unsafe11.rs | 8 ++++++++
4 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index 82bde0ecb33..f68243020b1 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -179,6 +179,31 @@ UnsafeChecker::check_function_call (HirId node_id, Location locus)
locus);
}
+static void
+check_target_attr (HIR::Function *fn, Location locus)
+{
+ if (std::any_of (fn->get_outer_attrs ().begin (),
+ fn->get_outer_attrs ().end (),
+ [] (const AST::Attribute &attr) {
+ return attr.get_path ().as_string () == "target_feature";
+ }))
+ rust_error_at (locus,
+ "call to function with %<#[target_feature]%> requires "
+ "unsafe function or block");
+}
+
+void
+UnsafeChecker::check_function_attr (HirId node_id, Location locus)
+{
+ if (unsafe_context.is_in_context ())
+ return;
+
+ auto maybe_fn = mappings.lookup_hir_item (node_id);
+
+ if (maybe_fn && maybe_fn->get_item_kind () == Item::ItemKind::Function)
+ check_target_attr (static_cast<Function *> (maybe_fn), locus);
+}
+
void
UnsafeChecker::visit (Lifetime &)
{}
@@ -398,11 +423,13 @@ UnsafeChecker::visit (CallExpr &expr)
rust_assert (mappings.lookup_node_to_hir (ref_node_id, &definition_id));
- // At this point we have the function's HIR Id. There are two checks we
+ // At this point we have the function's HIR Id. There are three checks we
// must perform:
// 1. The function is an unsafe one
// 2. The function is an extern one
+ // 3. The function is marked with a target_feature attribute
check_function_call (definition_id, expr.get_locus ());
+ check_function_attr (definition_id, expr.get_locus ());
if (expr.has_params ())
for (auto &arg : expr.get_arguments ())
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.h b/gcc/rust/checks/errors/rust-unsafe-checker.h
index fe564a2088e..540e5c33f6d 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.h
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.h
@@ -46,6 +46,11 @@ private:
*/
void check_function_call (HirId node_id, Location locus);
+ /**
+ * Check if any unsafe attributes are present on a function
+ */
+ void check_function_attr (HirId node_id, Location locus);
+
StackedContexts<HirId> unsafe_context;
Resolver::TypeCheckContext &context;
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 1cdc122177c..9de86db7cc1 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -41,6 +41,9 @@ static const BuiltinAttrDefinition __definitions[]
{"repr", CODE_GENERATION},
{"path", EXPANSION},
{"macro_use", NAME_RESOLUTION},
+ // FIXME: This is not implemented yet, see
+ // https://github.com/Rust-GCC/gccrs/issues/1475
+ {"target_feature", CODE_GENERATION},
// From now on, these are reserved by the compiler and gated through
// #![feature(rustc_attrs)]
{"rustc_inherit_overflow_checks", CODE_GENERATION}};
diff --git a/gcc/testsuite/rust/compile/unsafe11.rs b/gcc/testsuite/rust/compile/unsafe11.rs
new file mode 100644
index 00000000000..c87902fcd5f
--- /dev/null
+++ b/gcc/testsuite/rust/compile/unsafe11.rs
@@ -0,0 +1,8 @@
+#[target_feature(sse)]
+fn foo() {
+ let a: usize = 0;
+}
+
+fn main() {
+ foo() // { dg-error "requires unsafe function or block" }
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-01-12 7:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-12 7:43 [gcc/devel/rust/master] unsafe: check use of `target_feature` attribute Thomas Schwinge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).