Rollup merge of #116162 - fmease:gate-n-validate-rustc_safe_intrinsic, r=Nilstrieb
Gate and validate `#[rustc_safe_intrinsic]` Copied over from #116159: > This was added as ungated in https://github.com/rust-lang/rust/pull/100719/files#diff-09c366d3ad3ec9a42125253b610ca83cad6b156aa2a723f6c7e83eddef7b1e8fR502, probably because the author looked at the surrounding attributes, which are ungated because they are gated specially behind the staged_api feature. > > I don't think we need to crater this, the attribute is entirely useless without the intrinsics feature, which is already unstable.. r? ``@Nilstrieb``
This commit is contained in:
commit
6f4a0a1eb2
@ -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" {
|
||||
|
@ -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" {
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -1,4 +1,4 @@
|
||||
#![feature(intrinsics)]
|
||||
#![feature(intrinsics, rustc_attrs)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
#[rustc_safe_intrinsic]
|
||||
|
2
tests/ui/extern/extern-with-type-bounds.rs
vendored
2
tests/ui/extern/extern-with-type-bounds.rs
vendored
@ -1,4 +1,4 @@
|
||||
#![feature(intrinsics)]
|
||||
#![feature(intrinsics, rustc_attrs)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
// Real example from libcore
|
||||
|
6
tests/ui/intrinsics/feature-gate-safe-intrinsic.rs
Normal file
6
tests/ui/intrinsics/feature-gate-safe-intrinsic.rs
Normal file
@ -0,0 +1,6 @@
|
||||
#[rustc_safe_intrinsic]
|
||||
//~^ ERROR the `#[rustc_safe_intrinsic]` attribute is used internally to mark intrinsics as safe
|
||||
//~| ERROR attribute should be applied to intrinsic functions
|
||||
fn safe() {}
|
||||
|
||||
fn main() {}
|
20
tests/ui/intrinsics/feature-gate-safe-intrinsic.stderr
Normal file
20
tests/ui/intrinsics/feature-gate-safe-intrinsic.stderr
Normal file
@ -0,0 +1,20 @@
|
||||
error[E0658]: the `#[rustc_safe_intrinsic]` attribute is used internally to mark intrinsics as safe
|
||||
--> $DIR/feature-gate-safe-intrinsic.rs:1:1
|
||||
|
|
||||
LL | #[rustc_safe_intrinsic]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
|
||||
error: attribute should be applied to intrinsic functions
|
||||
--> $DIR/feature-gate-safe-intrinsic.rs:1:1
|
||||
|
|
||||
LL | #[rustc_safe_intrinsic]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | fn safe() {}
|
||||
| ------------ not an intrinsic function
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
@ -1,7 +1,7 @@
|
||||
// run-pass
|
||||
// ignore-wasm32-bare seems not important to test here
|
||||
|
||||
#![feature(intrinsics)]
|
||||
#![feature(intrinsics, rustc_attrs)]
|
||||
|
||||
mod rusti {
|
||||
extern "rust-intrinsic" {
|
||||
|
@ -5,7 +5,7 @@
|
||||
// [avr] compile-flags: --target=avr-unknown-gnu-atmega328 --crate-type=rlib
|
||||
// [msp430] needs-llvm-components: msp430
|
||||
// [msp430] compile-flags: --target=msp430-none-elf --crate-type=rlib
|
||||
#![feature(no_core, lang_items, intrinsics, staged_api)]
|
||||
#![feature(no_core, lang_items, intrinsics, staged_api, rustc_attrs)]
|
||||
#![no_core]
|
||||
#![crate_type = "lib"]
|
||||
#![stable(feature = "", since = "")]
|
||||
|
@ -3,7 +3,7 @@
|
||||
#![allow(unused_unsafe)]
|
||||
// Issue #2303
|
||||
|
||||
#![feature(intrinsics)]
|
||||
#![feature(intrinsics, rustc_attrs)]
|
||||
|
||||
use std::mem;
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
// Issue #2303
|
||||
|
||||
#![feature(intrinsics)]
|
||||
#![feature(intrinsics, rustc_attrs)]
|
||||
|
||||
use std::mem;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user