1
Fork 0

Gate and validate #[rustc_safe_intrinsic]

This commit is contained in:
León Orell Valerian Liehr 2023-09-25 21:40:40 +02:00
parent aadb5718dd
commit f54db7c3a9
No known key found for this signature in database
GPG key ID: D17A07215F68E713
14 changed files with 79 additions and 11 deletions

View file

@ -3,7 +3,7 @@ An invalid number of generic parameters was passed to an intrinsic function.
Erroneous code example:
```compile_fail,E0094
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]
#![allow(internal_features)]
extern "rust-intrinsic" {
@ -18,7 +18,7 @@ and verify with the function declaration in the Rust source code.
Example:
```
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]
#![allow(internal_features)]
extern "rust-intrinsic" {

View file

@ -4,7 +4,7 @@ You used a function or type which doesn't fit the requirements for where it was
used. Erroneous code examples:
```compile_fail
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]
#![allow(internal_features)]
extern "rust-intrinsic" {
@ -41,7 +41,7 @@ impl Foo {
For the first code example, please check the function definition. Example:
```
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]
#![allow(internal_features)]
extern "rust-intrinsic" {

View file

@ -537,7 +537,6 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
allow_internal_unsafe, Normal, template!(Word), WarnFollowing,
"allow_internal_unsafe side-steps the unsafe_code lint",
),
ungated!(rustc_safe_intrinsic, Normal, template!(Word), DuplicatesOk),
rustc_attr!(rustc_allowed_through_unstable_modules, Normal, template!(Word), WarnFollowing,
"rustc_allowed_through_unstable_modules special cases accidental stabilizations of stable items \
through unstable paths"),
@ -806,6 +805,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
rustc_doc_primitive, Normal, template!(NameValueStr: "primitive name"), ErrorFollowing,
r#"`rustc_doc_primitive` is a rustc internal attribute"#,
),
rustc_attr!(
rustc_safe_intrinsic, Normal, template!(Word), WarnFollowing,
"the `#[rustc_safe_intrinsic]` attribute is used internally to mark intrinsics as safe"
),
// ==========================================================================
// Internal attributes, Testing:

View file

@ -648,6 +648,10 @@ passes_rustc_lint_opt_ty =
`#[rustc_lint_opt_ty]` should be applied to a struct
.label = not a struct
passes_rustc_safe_intrinsic =
attribute should be applied to intrinsic functions
.label = not an intrinsic function
passes_rustc_std_internal_symbol =
attribute should be applied to functions or statics
.label = not a function or static

View file

@ -195,6 +195,9 @@ impl CheckAttrVisitor<'_> {
| sym::rustc_promotable => self.check_stability_promotable(&attr, span, target),
sym::link_ordinal => self.check_link_ordinal(&attr, span, target),
sym::rustc_confusables => self.check_confusables(&attr, target),
sym::rustc_safe_intrinsic => {
self.check_rustc_safe_intrinsic(hir_id, attr, span, target)
}
_ => true,
};
@ -2042,6 +2045,29 @@ impl CheckAttrVisitor<'_> {
}
}
fn check_rustc_safe_intrinsic(
&self,
hir_id: HirId,
attr: &Attribute,
span: Span,
target: Target,
) -> bool {
let hir = self.tcx.hir();
if let Target::ForeignFn = target
&& let Some(parent) = hir.opt_parent_id(hir_id)
&& let hir::Node::Item(Item {
kind: ItemKind::ForeignMod { abi: Abi::RustIntrinsic | Abi::PlatformIntrinsic, .. },
..
}) = hir.get(parent)
{
return true;
}
self.tcx.sess.emit_err(errors::RustcSafeIntrinsic { attr_span: attr.span, span });
false
}
fn check_rustc_std_internal_symbol(
&self,
attr: &Attribute,

View file

@ -620,6 +620,15 @@ pub struct RustcAllowConstFnUnstable {
pub span: Span,
}
#[derive(Diagnostic)]
#[diag(passes_rustc_safe_intrinsic)]
pub struct RustcSafeIntrinsic {
#[primary_span]
pub attr_span: Span,
#[label]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag(passes_rustc_std_internal_symbol)]
pub struct RustcStdInternalSymbol {