mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 14:07:04 +00:00
remove support for rustc_intrinsic_must_be_overridden from the compiler
This commit is contained in:
parent
5a58a922e2
commit
6eea027aa9
@ -620,70 +620,31 @@ pub union MaybeUninit<T> {
|
||||
|
||||
pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn min_align_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32 {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool {
|
||||
loop {}
|
||||
}
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bitreverse<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bswap<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
pub mod libc {
|
||||
|
@ -591,70 +591,31 @@ pub union MaybeUninit<T> {
|
||||
|
||||
pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn min_align_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32 {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool {
|
||||
loop {}
|
||||
}
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bitreverse<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn bswap<T>(_x: T) -> T {
|
||||
loop {}
|
||||
}
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize) {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
pub mod libc {
|
||||
|
@ -36,10 +36,7 @@ mod intrinsics {
|
||||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -36,10 +36,7 @@ mod intrinsics {
|
||||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -59,10 +59,7 @@ mod libc {
|
||||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
@ -61,10 +61,7 @@ mod libc {
|
||||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
@ -67,10 +67,7 @@ mod libc {
|
||||
mod intrinsics {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
#[lang = "panic"]
|
||||
|
@ -49,10 +49,7 @@ mod intrinsics {
|
||||
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
}
|
||||
|
||||
mod libc {
|
||||
|
@ -7,12 +7,8 @@ Erroneous code example:
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T, U>() -> usize // error: intrinsic has wrong number
|
||||
// of type parameters
|
||||
{
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T, U>() -> usize; // error: intrinsic has wrong number
|
||||
// of type parameters
|
||||
```
|
||||
|
||||
Please check that you provided the right number of type parameters
|
||||
@ -24,9 +20,5 @@ Example:
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T>() -> usize // ok!
|
||||
{
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T>() -> usize; // ok!
|
||||
```
|
||||
|
@ -1005,10 +1005,6 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
||||
rustc_intrinsic, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes, intrinsics,
|
||||
"the `#[rustc_intrinsic]` attribute is used to declare intrinsics as function items",
|
||||
),
|
||||
gated!(
|
||||
rustc_intrinsic_must_be_overridden, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes, intrinsics,
|
||||
"the `#[rustc_intrinsic_must_be_overridden]` attribute is used to declare intrinsics without real bodies",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_no_mir_inline, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes,
|
||||
"#[rustc_no_mir_inline] prevents the MIR inliner from inlining a function while not affecting codegen"
|
||||
|
@ -1755,13 +1755,12 @@ pub fn intrinsic_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<ty::Intrinsi
|
||||
&& (matches!(tcx.fn_sig(def_id).skip_binder().abi(), ExternAbi::RustIntrinsic)
|
||||
|| tcx.has_attr(def_id, sym::rustc_intrinsic))
|
||||
{
|
||||
let must_be_overridden = tcx.has_attr(def_id, sym::rustc_intrinsic_must_be_overridden)
|
||||
|| match tcx.hir_node_by_def_id(def_id) {
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn { has_body, .. }, .. }) => {
|
||||
!has_body
|
||||
}
|
||||
_ => true,
|
||||
};
|
||||
let must_be_overridden = match tcx.hir_node_by_def_id(def_id) {
|
||||
hir::Node::Item(hir::Item { kind: hir::ItemKind::Fn { has_body, .. }, .. }) => {
|
||||
!has_body
|
||||
}
|
||||
_ => true,
|
||||
};
|
||||
Some(ty::IntrinsicDef {
|
||||
name: tcx.item_name(def_id.into()),
|
||||
must_be_overridden,
|
||||
|
@ -1764,7 +1764,6 @@ symbols! {
|
||||
rustc_insignificant_dtor,
|
||||
rustc_intrinsic,
|
||||
rustc_intrinsic_const_stable_indirect,
|
||||
rustc_intrinsic_must_be_overridden,
|
||||
rustc_layout,
|
||||
rustc_layout_scalar_valid_range_end,
|
||||
rustc_layout_scalar_valid_range_start,
|
||||
|
@ -62,13 +62,19 @@ These must be implemented by all backends.
|
||||
|
||||
### `#[rustc_intrinsic]` declarations
|
||||
|
||||
These are written like intrinsics with fallback bodies, but the body is irrelevant.
|
||||
Use `loop {}` for the body or call the intrinsic recursively and add
|
||||
`#[rustc_intrinsic_must_be_overridden]` to the function to ensure that backends don't
|
||||
invoke the body.
|
||||
These are written without a body:
|
||||
```rust
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
pub fn abort() -> !;
|
||||
```
|
||||
|
||||
### Legacy extern ABI based intrinsics
|
||||
|
||||
*This style is deprecated, always prefer the above form.*
|
||||
|
||||
These are imported as if they were FFI functions, with the special
|
||||
`rust-intrinsic` ABI. For example, if one was in a freestanding
|
||||
context, but wished to be able to `transmute` between types, and
|
||||
|
@ -51,10 +51,7 @@ enum Ordering {
|
||||
}
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn three_way_compare<T: Copy>(lhs: T, rhs: T) -> Ordering {
|
||||
loop {}
|
||||
}
|
||||
fn three_way_compare<T: Copy>(lhs: T, rhs: T) -> Ordering;
|
||||
|
||||
// ^^^^^ core
|
||||
|
||||
|
@ -9,19 +9,13 @@
|
||||
#[stable(since="1.0.0", feature="rust1")]
|
||||
#[rustc_const_stable(feature = "const_transmute", since = "1.56.0")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub const unsafe fn transmute<T, U>(_: T) -> U {
|
||||
loop {}
|
||||
}
|
||||
pub const unsafe fn transmute<T, U>(_: T) -> U;
|
||||
|
||||
//@ has 'foo/fn.unreachable.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub unsafe fn unreachable() -> !'
|
||||
#[stable(since="1.0.0", feature="rust1")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
|
||||
extern "C" {
|
||||
//@ has 'foo/fn.needs_drop.html'
|
||||
|
@ -11,14 +11,8 @@ trait Sized {}
|
||||
//@ has 'foo/fn.abort.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub fn abort() -> !'
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub fn abort() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub fn abort() -> !;
|
||||
//@ has 'foo/fn.unreachable.html'
|
||||
//@ has - '//pre[@class="rust item-decl"]' 'pub unsafe fn unreachable() -> !'
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
pub unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
pub unsafe fn unreachable() -> !;
|
||||
|
@ -51,13 +51,11 @@ fn test_intrinsics() -> ControlFlow<()> {
|
||||
|
||||
/// This check is unfortunately tight to the implementation of intrinsics.
|
||||
///
|
||||
/// We want to ensure that StableMIR can handle intrinsics with and without fallback body.
|
||||
/// We want to ensure that StableMIR can handle intrinsics with and without fallback body:
|
||||
/// for intrinsics without a body, obviously we cannot expose anything.
|
||||
///
|
||||
/// If by any chance this test breaks because you changed how an intrinsic is implemented, please
|
||||
/// update the test to invoke a different intrinsic.
|
||||
///
|
||||
/// In StableMIR, we only expose intrinsic body if they are not marked with
|
||||
/// `rustc_intrinsic_must_be_overridden`.
|
||||
fn check_instance(instance: &Instance) {
|
||||
assert_eq!(instance.kind, InstanceKind::Intrinsic);
|
||||
let name = instance.intrinsic_name().unwrap();
|
||||
|
@ -1,10 +1,7 @@
|
||||
#![feature(intrinsics)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T, U>() -> usize {
|
||||
//~^ ERROR E0094
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T, U>() -> usize;
|
||||
//~^ ERROR E0094
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,7 +1,7 @@
|
||||
error[E0094]: intrinsic has wrong number of type parameters: found 2, expected 1
|
||||
--> $DIR/E0094.rs:5:11
|
||||
--> $DIR/E0094.rs:4:11
|
||||
|
|
||||
LL | fn size_of<T, U>() -> usize {
|
||||
LL | fn size_of<T, U>() -> usize;
|
||||
| ^^^^^^ expected 1 type parameter
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -2,10 +2,7 @@
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
fn size_of<T>() {
|
||||
//~^ ERROR E0308
|
||||
loop {}
|
||||
}
|
||||
fn size_of<T>();
|
||||
//~^ ERROR E0308
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,7 +1,7 @@
|
||||
error[E0308]: intrinsic has wrong type
|
||||
--> $DIR/E0308.rs:6:16
|
||||
--> $DIR/E0308.rs:5:16
|
||||
|
|
||||
LL | fn size_of<T>() {
|
||||
LL | fn size_of<T>();
|
||||
| ^ expected `usize`, found `()`
|
||||
|
|
||||
= note: expected signature `fn() -> usize`
|
||||
|
@ -1,5 +1,5 @@
|
||||
//! Check that `vtable_size` gets overridden by llvm backend even if there is no
|
||||
//! `rustc_intrinsic_must_be_overridden` attribute on this usage.
|
||||
//! Check that `vtable_size` gets overridden by llvm backend even if there is a
|
||||
//! fallback body.
|
||||
#![feature(intrinsics)]
|
||||
//@run-pass
|
||||
|
||||
|
@ -24,10 +24,7 @@ enum Foo {
|
||||
#[stable(feature = "intrinsics_for_test", since = "3.3.3")]
|
||||
#[rustc_const_stable(feature = "intrinsics_for_test", since = "3.3.3")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
const fn size_of<T>() -> usize {
|
||||
loop {}
|
||||
}
|
||||
const fn size_of<T>() -> usize;
|
||||
|
||||
#[lang="sized"]
|
||||
trait Sized {}
|
||||
|
@ -21,10 +21,7 @@ impl Copy for bool {}
|
||||
#[stable(feature = "test", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "test", since = "1.0.0")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_must_be_overridden]
|
||||
const unsafe fn unreachable() -> ! {
|
||||
loop {}
|
||||
}
|
||||
const unsafe fn unreachable() -> !;
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
macro_rules! cfg {
|
||||
|
Loading…
Reference in New Issue
Block a user