Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gate and validate #[rustc_safe_intrinsic] #116162

Merged
merged 1 commit into from
Sep 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions compiler/rustc_error_codes/src/error_codes/E0094.md
Original file line number Diff line number Diff line change
Expand Up @@ -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" {
Expand All @@ -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" {
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_error_codes/src/error_codes/E0211.md
Original file line number Diff line number Diff line change
Expand Up @@ -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" {
Expand Down Expand Up @@ -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" {
Expand Down
5 changes: 4 additions & 1 deletion compiler/rustc_feature/src/builtin_attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down Expand Up @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions compiler/rustc_passes/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions compiler/rustc_passes/src/check_attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down Expand Up @@ -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,
Expand Down
9 changes: 9 additions & 0 deletions compiler/rustc_passes/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/error-codes/E0094.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]

extern "rust-intrinsic" {
#[rustc_safe_intrinsic]
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/extern/extern-with-type-bounds.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]

extern "rust-intrinsic" {
// Real example from libcore
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/intrinsics/feature-gate-safe-intrinsic.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 20 additions & 0 deletions tests/ui/intrinsics/feature-gate-safe-intrinsic.stderr
Original file line number Diff line number Diff line change
@@ -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`.
2 changes: 1 addition & 1 deletion tests/ui/intrinsics/intrinsic-alignment.rs
Original file line number Diff line number Diff line change
@@ -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" {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/repr/16-bit-repr-c-enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "")]
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/structs-enums/rec-align-u32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#![allow(unused_unsafe)]
// Issue #2303

#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]

use std::mem;

Expand Down
2 changes: 1 addition & 1 deletion tests/ui/structs-enums/rec-align-u64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

// Issue #2303

#![feature(intrinsics)]
#![feature(intrinsics, rustc_attrs)]

use std::mem;

Expand Down