mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Auto merge of #138414 - matthiaskrgr:rollup-9ablqdb, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #137314 (change definitely unproductive cycles to error) - #137701 (Convert `ShardedHashMap` to use `hashbrown::HashTable`) - #138269 (uefi: fs: Implement FileType, FilePermissions and FileAttr) - #138331 (Use `RUSTC_LINT_FLAGS` more) - #138345 (Some autodiff cleanups) - #138387 (intrinsics: remove unnecessary leading underscore from argument names) - #138390 (fix incorrect tracing log) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
@@ -1491,6 +1491,7 @@ version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"foldhash",
|
||||
"serde",
|
||||
]
|
||||
@@ -3492,6 +3493,7 @@ dependencies = [
|
||||
"either",
|
||||
"elsa",
|
||||
"ena",
|
||||
"hashbrown 0.15.2",
|
||||
"indexmap",
|
||||
"jobserver",
|
||||
"libc",
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#![cfg_attr(feature = "nightly", feature(rustc_attrs))]
|
||||
#![cfg_attr(feature = "nightly", feature(rustdoc_internals))]
|
||||
#![cfg_attr(feature = "nightly", feature(step_trait))]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
/*! ABI handling for rustc
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#![feature(maybe_uninit_slice)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::alloc::Layout;
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#![feature(never_type)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod util {
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#![cfg_attr(feature = "nightly", allow(internal_features))]
|
||||
#![cfg_attr(feature = "nightly", feature(never_type))]
|
||||
#![cfg_attr(feature = "nightly", feature(rustc_attrs))]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#![feature(iter_is_partitioned)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod ast_validation;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod helpers;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod attributes;
|
||||
|
||||
@@ -81,7 +81,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
#[macro_use]
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
// tidy-alphabetical-start
|
||||
#![allow(elided_lifetimes_in_paths)]
|
||||
#![allow(internal_features)]
|
||||
#![allow(unreachable_pub)] // because this crate is mostly generated code
|
||||
#![doc(rust_logo)]
|
||||
#![feature(rustdoc_internals)]
|
||||
// #![warn(unreachable_pub)] // don't use because this crate is mostly generated code
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(string_from_utf8_lossy_owned)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
@@ -624,25 +624,25 @@ pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
pub unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize);
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
pub unsafe fn transmute<T, U>(e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
pub unsafe fn ctlz_nonzero<T>(x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
pub fn bitreverse<T>(x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
pub fn bswap<T>(x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
pub unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize);
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
@@ -595,25 +595,25 @@ pub mod intrinsics {
|
||||
#[rustc_intrinsic]
|
||||
pub fn size_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
pub unsafe fn size_of_val<T: ?::Sized>(val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub fn min_align_of<T>() -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(_val: *const T) -> usize;
|
||||
pub unsafe fn min_align_of_val<T: ?::Sized>(val: *const T) -> usize;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
pub unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize);
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn transmute<T, U>(_e: T) -> U;
|
||||
pub unsafe fn transmute<T, U>(e: T) -> U;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
pub unsafe fn ctlz_nonzero<T>(x: T) -> u32;
|
||||
#[rustc_intrinsic]
|
||||
pub fn needs_drop<T: ?::Sized>() -> bool;
|
||||
#[rustc_intrinsic]
|
||||
pub fn bitreverse<T>(_x: T) -> T;
|
||||
pub fn bitreverse<T>(x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
pub fn bswap<T>(_x: T) -> T;
|
||||
pub fn bswap<T>(x: T) -> T;
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
pub unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize);
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn unreachable() -> !;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(slice_as_array)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::any::Any;
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(trait_alias)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
//! This crate contains codegen code that is used by all codegen backends (LLVM and others).
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#![feature(unqualified_local_imports)]
|
||||
#![feature(yeet_expr)]
|
||||
#![warn(unqualified_local_imports)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod check_consts;
|
||||
|
||||
@@ -29,6 +29,11 @@ thin-vec = "0.2.12"
|
||||
tracing = "0.1"
|
||||
# tidy-alphabetical-end
|
||||
|
||||
[dependencies.hashbrown]
|
||||
version = "0.15.2"
|
||||
default-features = false
|
||||
features = ["nightly"] # for may_dangle
|
||||
|
||||
[dependencies.parking_lot]
|
||||
version = "0.12"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
use super::*;
|
||||
use crate::fx::FxHashMap;
|
||||
|
||||
pub struct TestGraph {
|
||||
pub(super) struct TestGraph {
|
||||
num_nodes: usize,
|
||||
start_node: usize,
|
||||
successors: FxHashMap<usize, Vec<usize>>,
|
||||
@@ -11,7 +11,7 @@ pub struct TestGraph {
|
||||
}
|
||||
|
||||
impl TestGraph {
|
||||
pub fn new(start_node: usize, edges: &[(usize, usize)]) -> Self {
|
||||
pub(super) fn new(start_node: usize, edges: &[(usize, usize)]) -> Self {
|
||||
let mut graph = TestGraph {
|
||||
num_nodes: start_node + 1,
|
||||
start_node,
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#![feature(dropck_eyepatch)]
|
||||
#![feature(extend_one)]
|
||||
#![feature(file_buffered)]
|
||||
#![feature(hash_raw_entry)]
|
||||
#![feature(macro_metavar_expr)]
|
||||
#![feature(map_try_insert)]
|
||||
#![feature(min_specialization)]
|
||||
|
||||
@@ -76,6 +76,7 @@ macro_rules! impl_dyn_send {
|
||||
[crate::sync::RwLock<T> where T: DynSend]
|
||||
[crate::tagged_ptr::TaggedRef<'a, P, T> where 'a, P: Sync, T: Send + crate::tagged_ptr::Tag]
|
||||
[rustc_arena::TypedArena<T> where T: DynSend]
|
||||
[hashbrown::HashTable<T> where T: DynSend]
|
||||
[indexmap::IndexSet<V, S> where V: DynSend, S: DynSend]
|
||||
[indexmap::IndexMap<K, V, S> where K: DynSend, V: DynSend, S: DynSend]
|
||||
[thin_vec::ThinVec<T> where T: DynSend]
|
||||
@@ -153,6 +154,7 @@ macro_rules! impl_dyn_sync {
|
||||
[crate::tagged_ptr::TaggedRef<'a, P, T> where 'a, P: Sync, T: Sync + crate::tagged_ptr::Tag]
|
||||
[parking_lot::lock_api::Mutex<R, T> where R: DynSync, T: ?Sized + DynSend]
|
||||
[parking_lot::lock_api::RwLock<R, T> where R: DynSync, T: ?Sized + DynSend + DynSync]
|
||||
[hashbrown::HashTable<T> where T: DynSync]
|
||||
[indexmap::IndexSet<V, S> where V: DynSync, S: DynSync]
|
||||
[indexmap::IndexMap<K, V, S> where K: DynSync, V: DynSync, S: DynSync]
|
||||
[smallvec::SmallVec<A> where A: smallvec::Array + DynSync]
|
||||
|
||||
@@ -313,7 +313,7 @@ pub struct Error<O, E> {
|
||||
|
||||
mod helper {
|
||||
use super::*;
|
||||
pub type ObligationTreeIdGenerator = impl Iterator<Item = ObligationTreeId>;
|
||||
pub(super) type ObligationTreeIdGenerator = impl Iterator<Item = ObligationTreeId>;
|
||||
impl<O: ForestObligation> ObligationForest<O> {
|
||||
#[cfg_attr(not(bootstrap), define_opaque(ObligationTreeIdGenerator))]
|
||||
pub fn new() -> ObligationForest<O> {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use std::borrow::Borrow;
|
||||
use std::collections::hash_map::RawEntryMut;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::iter;
|
||||
use std::{iter, mem};
|
||||
|
||||
use either::Either;
|
||||
use hashbrown::hash_table::{Entry, HashTable};
|
||||
|
||||
use crate::fx::{FxHashMap, FxHasher};
|
||||
use crate::fx::FxHasher;
|
||||
use crate::sync::{CacheAligned, Lock, LockGuard, Mode, is_dyn_thread_safe};
|
||||
|
||||
// 32 shards is sufficient to reduce contention on an 8-core Ryzen 7 1700,
|
||||
@@ -140,17 +140,67 @@ pub fn shards() -> usize {
|
||||
1
|
||||
}
|
||||
|
||||
pub type ShardedHashMap<K, V> = Sharded<FxHashMap<K, V>>;
|
||||
pub type ShardedHashMap<K, V> = Sharded<HashTable<(K, V)>>;
|
||||
|
||||
impl<K: Eq, V> ShardedHashMap<K, V> {
|
||||
pub fn with_capacity(cap: usize) -> Self {
|
||||
Self::new(|| FxHashMap::with_capacity_and_hasher(cap, rustc_hash::FxBuildHasher::default()))
|
||||
Self::new(|| HashTable::with_capacity(cap))
|
||||
}
|
||||
pub fn len(&self) -> usize {
|
||||
self.lock_shards().map(|shard| shard.len()).sum()
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Eq + Hash, V> ShardedHashMap<K, V> {
|
||||
#[inline]
|
||||
pub fn get<Q>(&self, key: &Q) -> Option<V>
|
||||
where
|
||||
K: Borrow<Q>,
|
||||
Q: Hash + Eq,
|
||||
V: Clone,
|
||||
{
|
||||
let hash = make_hash(key);
|
||||
let shard = self.lock_shard_by_hash(hash);
|
||||
let (_, value) = shard.find(hash, |(k, _)| k.borrow() == key)?;
|
||||
Some(value.clone())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_or_insert_with(&self, key: K, default: impl FnOnce() -> V) -> V
|
||||
where
|
||||
V: Copy,
|
||||
{
|
||||
let hash = make_hash(&key);
|
||||
let mut shard = self.lock_shard_by_hash(hash);
|
||||
|
||||
match table_entry(&mut shard, hash, &key) {
|
||||
Entry::Occupied(e) => e.get().1,
|
||||
Entry::Vacant(e) => {
|
||||
let value = default();
|
||||
e.insert((key, value));
|
||||
value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn insert(&self, key: K, value: V) -> Option<V> {
|
||||
let hash = make_hash(&key);
|
||||
let mut shard = self.lock_shard_by_hash(hash);
|
||||
|
||||
match table_entry(&mut shard, hash, &key) {
|
||||
Entry::Occupied(e) => {
|
||||
let previous = mem::replace(&mut e.into_mut().1, value);
|
||||
Some(previous)
|
||||
}
|
||||
Entry::Vacant(e) => {
|
||||
e.insert((key, value));
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Eq + Hash + Copy> ShardedHashMap<K, ()> {
|
||||
#[inline]
|
||||
pub fn intern_ref<Q: ?Sized>(&self, value: &Q, make: impl FnOnce() -> K) -> K
|
||||
@@ -160,13 +210,12 @@ pub fn intern_ref<Q: ?Sized>(&self, value: &Q, make: impl FnOnce() -> K) -> K
|
||||
{
|
||||
let hash = make_hash(value);
|
||||
let mut shard = self.lock_shard_by_hash(hash);
|
||||
let entry = shard.raw_entry_mut().from_key_hashed_nocheck(hash, value);
|
||||
|
||||
match entry {
|
||||
RawEntryMut::Occupied(e) => *e.key(),
|
||||
RawEntryMut::Vacant(e) => {
|
||||
match table_entry(&mut shard, hash, value) {
|
||||
Entry::Occupied(e) => e.get().0,
|
||||
Entry::Vacant(e) => {
|
||||
let v = make();
|
||||
e.insert_hashed_nocheck(hash, v, ());
|
||||
e.insert((v, ()));
|
||||
v
|
||||
}
|
||||
}
|
||||
@@ -180,13 +229,12 @@ pub fn intern<Q>(&self, value: Q, make: impl FnOnce(Q) -> K) -> K
|
||||
{
|
||||
let hash = make_hash(&value);
|
||||
let mut shard = self.lock_shard_by_hash(hash);
|
||||
let entry = shard.raw_entry_mut().from_key_hashed_nocheck(hash, &value);
|
||||
|
||||
match entry {
|
||||
RawEntryMut::Occupied(e) => *e.key(),
|
||||
RawEntryMut::Vacant(e) => {
|
||||
match table_entry(&mut shard, hash, &value) {
|
||||
Entry::Occupied(e) => e.get().0,
|
||||
Entry::Vacant(e) => {
|
||||
let v = make(value);
|
||||
e.insert_hashed_nocheck(hash, v, ());
|
||||
e.insert((v, ()));
|
||||
v
|
||||
}
|
||||
}
|
||||
@@ -203,17 +251,30 @@ pub fn contains_pointer_to<T: Hash + IntoPointer>(&self, value: &T) -> bool {
|
||||
let hash = make_hash(&value);
|
||||
let shard = self.lock_shard_by_hash(hash);
|
||||
let value = value.into_pointer();
|
||||
shard.raw_entry().from_hash(hash, |entry| entry.into_pointer() == value).is_some()
|
||||
shard.find(hash, |(k, ())| k.into_pointer() == value).is_some()
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn make_hash<K: Hash + ?Sized>(val: &K) -> u64 {
|
||||
fn make_hash<K: Hash + ?Sized>(val: &K) -> u64 {
|
||||
let mut state = FxHasher::default();
|
||||
val.hash(&mut state);
|
||||
state.finish()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn table_entry<'a, K, V, Q>(
|
||||
table: &'a mut HashTable<(K, V)>,
|
||||
hash: u64,
|
||||
key: &Q,
|
||||
) -> Entry<'a, (K, V)>
|
||||
where
|
||||
K: Hash + Borrow<Q>,
|
||||
Q: ?Sized + Eq,
|
||||
{
|
||||
table.entry(hash, move |(k, _)| k.borrow() == key, |(k, _)| make_hash(k))
|
||||
}
|
||||
|
||||
/// Get a shard with a pre-computed hash value. If `get_shard_by_value` is
|
||||
/// ever used in combination with `get_shard_by_hash` on a single `Sharded`
|
||||
/// instance, then `hash` must be computed with `FxHasher`. Otherwise,
|
||||
|
||||
@@ -88,7 +88,7 @@ pub fn is_dyn_thread_safe() -> bool {
|
||||
|
||||
// Whether thread safety might be enabled.
|
||||
#[inline]
|
||||
pub fn might_be_dyn_thread_safe() -> bool {
|
||||
pub(super) fn might_be_dyn_thread_safe() -> bool {
|
||||
DYN_THREAD_SAFE_MODE.load(Ordering::Relaxed) != DYN_NOT_THREAD_SAFE
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ pub fn parallel_guard<R>(f: impl FnOnce(&ParallelGuard) -> R) -> R {
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn serial_join<A, B, RA, RB>(oper_a: A, oper_b: B) -> (RA, RB)
|
||||
fn serial_join<A, B, RA, RB>(oper_a: A, oper_b: B) -> (RA, RB)
|
||||
where
|
||||
A: FnOnce() -> RA,
|
||||
B: FnOnce() -> RB,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/// A tag type used in [`TaggedRef`] tests.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum Tag2 {
|
||||
enum Tag2 {
|
||||
B00 = 0b00,
|
||||
B01 = 0b01,
|
||||
B10 = 0b10,
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#![feature(result_flattening)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::cmp::max;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#![deny(rustdoc::invalid_codeblock_attributes)]
|
||||
#![doc(rust_logo)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
// This higher-order macro defines the error codes that are in use. It is used
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#![feature(trait_alias)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(yeet_expr)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate self as rustc_errors;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(yeet_expr)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate proc_macro as pm;
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#![allow(internal_features)]
|
||||
#![doc(rust_logo)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod accepted;
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#![feature(proc_macro_span)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(track_path)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
@@ -277,7 +277,6 @@
|
||||
)]
|
||||
#![doc(rust_logo)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#![feature(never_type)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(variant_count)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate self as rustc_hir;
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
#![feature(slice_partition_dedup)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(unwrap_infallible)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
// These are used by Clippy.
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
// tidy-alphabetical-start
|
||||
#![recursion_limit = "256"]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(never_type)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod _match;
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(file_buffered)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod assert_dep_graph;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#![cfg_attr(feature = "nightly", feature(extend_one, step_trait, test))]
|
||||
#![cfg_attr(feature = "nightly", feature(new_range_api))]
|
||||
#![cfg_attr(feature = "nightly", feature(new_zeroed_alloc))]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod bit_set;
|
||||
|
||||
@@ -305,7 +305,7 @@ fn from(value: u32) -> Self {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn newtype(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
pub(crate) fn newtype(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
let input = parse_macro_input!(input as Newtype);
|
||||
input.0.into()
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![recursion_limit = "512"] // For rustdoc
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod errors;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod callbacks;
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
// We want to be able to build this crate with a stable compiler,
|
||||
// so no `#![feature]` attributes should be added.
|
||||
#![deny(unstable_features)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod cursor;
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod async_closures;
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
// tidy-alphabetical-start
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_abi::ExternAbi;
|
||||
use rustc_ast::AttrId;
|
||||
use rustc_ast::attr::AttributeExt;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(extern_types)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::cell::RefCell;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#![feature(proc_macro_diagnostic)]
|
||||
#![feature(proc_macro_span)]
|
||||
#![feature(proc_macro_tracked_env)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#![feature(proc_macro_internals)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(trusted_len)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
@@ -62,7 +62,6 @@
|
||||
#![feature(try_trait_v2_yeet)]
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![feature(yeet_expr)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
@@ -452,12 +452,7 @@ fn reserve_and_set_dedup(self, alloc: GlobalAlloc<'tcx>, salt: usize) -> AllocId
|
||||
}
|
||||
let id = self.alloc_map.reserve();
|
||||
debug!("creating alloc {:?} with id {id:?}", alloc_salt.0);
|
||||
let had_previous = self
|
||||
.alloc_map
|
||||
.to_alloc
|
||||
.lock_shard_by_value(&id)
|
||||
.insert(id, alloc_salt.0.clone())
|
||||
.is_some();
|
||||
let had_previous = self.alloc_map.to_alloc.insert(id, alloc_salt.0.clone()).is_some();
|
||||
// We just reserved, so should always be unique.
|
||||
assert!(!had_previous);
|
||||
dedup.insert(alloc_salt, id);
|
||||
@@ -510,7 +505,7 @@ pub fn reserve_and_set_memory_alloc(self, mem: ConstAllocation<'tcx>) -> AllocId
|
||||
/// local dangling pointers and allocations in constants/statics.
|
||||
#[inline]
|
||||
pub fn try_get_global_alloc(self, id: AllocId) -> Option<GlobalAlloc<'tcx>> {
|
||||
self.alloc_map.to_alloc.lock_shard_by_value(&id).get(&id).cloned()
|
||||
self.alloc_map.to_alloc.get(&id)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -529,9 +524,7 @@ pub fn global_alloc(self, id: AllocId) -> GlobalAlloc<'tcx> {
|
||||
/// Freezes an `AllocId` created with `reserve` by pointing it at an `Allocation`. Trying to
|
||||
/// call this function twice, even with the same `Allocation` will ICE the compiler.
|
||||
pub fn set_alloc_id_memory(self, id: AllocId, mem: ConstAllocation<'tcx>) {
|
||||
if let Some(old) =
|
||||
self.alloc_map.to_alloc.lock_shard_by_value(&id).insert(id, GlobalAlloc::Memory(mem))
|
||||
{
|
||||
if let Some(old) = self.alloc_map.to_alloc.insert(id, GlobalAlloc::Memory(mem)) {
|
||||
bug!("tried to set allocation ID {id:?}, but it was already existing as {old:#?}");
|
||||
}
|
||||
}
|
||||
@@ -539,11 +532,8 @@ pub fn set_alloc_id_memory(self, id: AllocId, mem: ConstAllocation<'tcx>) {
|
||||
/// Freezes an `AllocId` created with `reserve` by pointing it at a static item. Trying to
|
||||
/// call this function twice, even with the same `DefId` will ICE the compiler.
|
||||
pub fn set_nested_alloc_id_static(self, id: AllocId, def_id: LocalDefId) {
|
||||
if let Some(old) = self
|
||||
.alloc_map
|
||||
.to_alloc
|
||||
.lock_shard_by_value(&id)
|
||||
.insert(id, GlobalAlloc::Static(def_id.to_def_id()))
|
||||
if let Some(old) =
|
||||
self.alloc_map.to_alloc.insert(id, GlobalAlloc::Static(def_id.to_def_id()))
|
||||
{
|
||||
bug!("tried to set allocation ID {id:?}, but it was already existing as {old:#?}");
|
||||
}
|
||||
|
||||
@@ -2336,8 +2336,8 @@ pub(crate) fn go(fmt: &mut std::fmt::Formatter<'_>, tcx: TyCtxt<'_>) -> std::fmt
|
||||
$(let mut $variant = total;)*
|
||||
|
||||
for shard in tcx.interners.type_.lock_shards() {
|
||||
let types = shard.keys();
|
||||
for &InternedInSet(t) in types {
|
||||
let types = shard.iter();
|
||||
for &(InternedInSet(t), ()) in types {
|
||||
let variant = match t.internee {
|
||||
ty::Bool | ty::Char | ty::Int(..) | ty::Uint(..) |
|
||||
ty::Float(..) | ty::Str | ty::Never => continue,
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
// The `builder` module used to be named `build`, but that was causing GitHub's
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(never_type)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_middle::ty;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#![feature(never_type)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(yeet_expr)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use hir::ConstContext;
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(impl_trait_in_assoc_type)]
|
||||
#![feature(let_chains)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
|
||||
@@ -12,21 +12,15 @@ fn adjust_activity_to_abi<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>, da: &mut Vec
|
||||
if !matches!(fn_ty.kind(), ty::FnDef(..)) {
|
||||
bug!("expected fn def for autodiff, got {:?}", fn_ty);
|
||||
}
|
||||
let fnc_binder: ty::Binder<'_, ty::FnSig<'_>> = fn_ty.fn_sig(tcx);
|
||||
|
||||
// If rustc compiles the unmodified primal, we know that this copy of the function
|
||||
// also has correct lifetimes. We know that Enzyme won't free the shadow too early
|
||||
// (or actually at all), so let's strip lifetimes when computing the layout.
|
||||
let x = tcx.instantiate_bound_regions_with_erased(fnc_binder);
|
||||
// We don't actually pass the types back into the type system.
|
||||
// All we do is decide how to handle the arguments.
|
||||
let sig = fn_ty.fn_sig(tcx).skip_binder();
|
||||
|
||||
let mut new_activities = vec![];
|
||||
let mut new_positions = vec![];
|
||||
for (i, ty) in x.inputs().iter().enumerate() {
|
||||
for (i, ty) in sig.inputs().iter().enumerate() {
|
||||
if let Some(inner_ty) = ty.builtin_deref(true) {
|
||||
if ty.is_fn_ptr() {
|
||||
// FIXME(ZuseZ4): add a nicer error, or just figure out how to support them,
|
||||
// since Enzyme itself can handle them.
|
||||
tcx.dcx().err("function pointers are currently not supported in autodiff");
|
||||
}
|
||||
if inner_ty.is_slice() {
|
||||
// We know that the length will be passed as extra arg.
|
||||
if !da.is_empty() {
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
// tidy-alphabetical-start
|
||||
#![allow(rustc::usage_of_type_ir_inherent)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod canonicalizer;
|
||||
|
||||
@@ -271,12 +271,39 @@ pub(super) fn typing_mode(&self) -> TypingMode<I> {
|
||||
/// and will need to clearly document it in the rustc-dev-guide before
|
||||
/// stabilization.
|
||||
pub(super) fn step_kind_for_source(&self, source: GoalSource) -> PathKind {
|
||||
match (self.current_goal_kind, source) {
|
||||
(_, GoalSource::NormalizeGoal(step_kind)) => step_kind,
|
||||
(CurrentGoalKind::CoinductiveTrait, GoalSource::ImplWhereBound) => {
|
||||
PathKind::Coinductive
|
||||
match source {
|
||||
// We treat these goals as unknown for now. It is likely that most miscellaneous
|
||||
// nested goals will be converted to an inductive variant in the future.
|
||||
//
|
||||
// Having unknown cycles is always the safer option, as changing that to either
|
||||
// succeed or hard error is backwards compatible. If we incorrectly treat a cycle
|
||||
// as inductive even though it should not be, it may be unsound during coherence and
|
||||
// fixing it may cause inference breakage or introduce ambiguity.
|
||||
GoalSource::Misc => PathKind::Unknown,
|
||||
GoalSource::NormalizeGoal(path_kind) => path_kind,
|
||||
GoalSource::ImplWhereBound => {
|
||||
// We currently only consider a cycle coinductive if it steps
|
||||
// into a where-clause of a coinductive trait.
|
||||
//
|
||||
// We probably want to make all traits coinductive in the future,
|
||||
// so we treat cycles involving their where-clauses as ambiguous.
|
||||
if let CurrentGoalKind::CoinductiveTrait = self.current_goal_kind {
|
||||
PathKind::Coinductive
|
||||
} else {
|
||||
PathKind::Unknown
|
||||
}
|
||||
}
|
||||
_ => PathKind::Inductive,
|
||||
// Relating types is always unproductive. If we were to map proof trees to
|
||||
// corecursive functions as explained in #136824, relating types never
|
||||
// introduces a constructor which could cause the recursion to be guarded.
|
||||
GoalSource::TypeRelating => PathKind::Inductive,
|
||||
// Instantiating a higher ranked goal can never cause the recursion to be
|
||||
// guarded and is therefore unproductive.
|
||||
GoalSource::InstantiateHigherRanked => PathKind::Inductive,
|
||||
// These goal sources are likely unproductive and can be changed to
|
||||
// `PathKind::Inductive`. Keeping them as unknown until we're confident
|
||||
// about this and have an example where it is necessary.
|
||||
GoalSource::AliasBoundConstCondition | GoalSource::AliasWellFormed => PathKind::Unknown,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -606,7 +633,7 @@ fn evaluate_added_goals_step(&mut self) -> Result<Option<Certainty>, NoSolution>
|
||||
|
||||
let (NestedNormalizationGoals(nested_goals), _, certainty) = self.evaluate_goal_raw(
|
||||
GoalEvaluationKind::Nested,
|
||||
GoalSource::Misc,
|
||||
GoalSource::TypeRelating,
|
||||
unconstrained_goal,
|
||||
)?;
|
||||
// Add the nested goals from normalization to our own nested goals.
|
||||
@@ -683,7 +710,7 @@ pub(super) fn cx(&self) -> I {
|
||||
pub(super) fn add_normalizes_to_goal(&mut self, mut goal: Goal<I, ty::NormalizesTo<I>>) {
|
||||
goal.predicate = goal.predicate.fold_with(&mut ReplaceAliasWithInfer::new(
|
||||
self,
|
||||
GoalSource::Misc,
|
||||
GoalSource::TypeRelating,
|
||||
goal.param_env,
|
||||
));
|
||||
self.inspect.add_normalizes_to_goal(self.delegate, self.max_input_universe, goal);
|
||||
@@ -939,7 +966,15 @@ pub(super) fn relate<T: Relate<I>>(
|
||||
rhs: T,
|
||||
) -> Result<(), NoSolution> {
|
||||
let goals = self.delegate.relate(param_env, lhs, variance, rhs, self.origin_span)?;
|
||||
self.add_goals(GoalSource::Misc, goals);
|
||||
if cfg!(debug_assertions) {
|
||||
for g in goals.iter() {
|
||||
match g.predicate.kind().skip_binder() {
|
||||
ty::PredicateKind::Subtype { .. } | ty::PredicateKind::AliasRelate(..) => {}
|
||||
p => unreachable!("unexpected nested goal in `relate`: {p:?}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
self.add_goals(GoalSource::TypeRelating, goals);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@@ -421,7 +421,7 @@ pub(crate) fn add_normalizes_to_goal(
|
||||
self.add_goal(
|
||||
delegate,
|
||||
max_input_universe,
|
||||
GoalSource::Misc,
|
||||
GoalSource::TypeRelating,
|
||||
goal.with(delegate.cx(), goal.predicate),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -313,7 +313,9 @@ fn structurally_normalize_term(
|
||||
ty::AliasRelationDirection::Equate,
|
||||
),
|
||||
);
|
||||
self.add_goal(GoalSource::Misc, alias_relate_goal);
|
||||
// We normalize the self type to be able to relate it with
|
||||
// types from candidates.
|
||||
self.add_goal(GoalSource::TypeRelating, alias_relate_goal);
|
||||
self.try_evaluate_added_goals()?;
|
||||
Ok(self.resolve_vars_if_possible(normalized_term))
|
||||
} else {
|
||||
|
||||
@@ -24,7 +24,8 @@ pub(super) fn compute_projection_goal(
|
||||
ty::AliasRelationDirection::Equate,
|
||||
),
|
||||
);
|
||||
self.add_goal(GoalSource::Misc, goal);
|
||||
// A projection goal holds if the alias is equal to the expected term.
|
||||
self.add_goal(GoalSource::TypeRelating, goal);
|
||||
self.evaluate_added_goals_and_make_canonical_response(Certainty::Yes)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use std::convert::Infallible;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use rustc_type_ir::Interner;
|
||||
use rustc_type_ir::search_graph::{self, PathKind};
|
||||
use rustc_type_ir::solve::{CanonicalInput, Certainty, QueryResult};
|
||||
use rustc_type_ir::solve::{CanonicalInput, Certainty, NoSolution, QueryResult};
|
||||
use rustc_type_ir::{Interner, TypingMode};
|
||||
|
||||
use super::inspect::ProofTreeBuilder;
|
||||
use super::{FIXPOINT_STEP_LIMIT, has_no_inference_or_external_constraints};
|
||||
@@ -47,7 +47,24 @@ fn initial_provisional_result(
|
||||
) -> QueryResult<I> {
|
||||
match kind {
|
||||
PathKind::Coinductive => response_no_constraints(cx, input, Certainty::Yes),
|
||||
PathKind::Inductive => response_no_constraints(cx, input, Certainty::overflow(false)),
|
||||
PathKind::Unknown => response_no_constraints(cx, input, Certainty::overflow(false)),
|
||||
// Even though we know these cycles to be unproductive, we still return
|
||||
// overflow during coherence. This is both as we are not 100% confident in
|
||||
// the implementation yet and any incorrect errors would be unsound there.
|
||||
// The affected cases are also fairly artificial and not necessarily desirable
|
||||
// so keeping this as ambiguity is fine for now.
|
||||
//
|
||||
// See `tests/ui/traits/next-solver/cycles/unproductive-in-coherence.rs` for an
|
||||
// example where this would matter. We likely should change these cycles to `NoSolution`
|
||||
// even in coherence once this is a bit more settled.
|
||||
PathKind::Inductive => match input.typing_mode {
|
||||
TypingMode::Coherence => {
|
||||
response_no_constraints(cx, input, Certainty::overflow(false))
|
||||
}
|
||||
TypingMode::Analysis { .. }
|
||||
| TypingMode::PostBorrowckAnalysis { .. }
|
||||
| TypingMode::PostAnalysis => Err(NoSolution),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,12 +74,7 @@ fn is_initial_provisional_result(
|
||||
input: CanonicalInput<I>,
|
||||
result: QueryResult<I>,
|
||||
) -> bool {
|
||||
match kind {
|
||||
PathKind::Coinductive => response_no_constraints(cx, input, Certainty::Yes) == result,
|
||||
PathKind::Inductive => {
|
||||
response_no_constraints(cx, input, Certainty::overflow(false)) == result
|
||||
}
|
||||
}
|
||||
Self::initial_provisional_result(cx, kind, input) == result
|
||||
}
|
||||
|
||||
fn on_stack_overflow(
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#![feature(iter_intersperse)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(string_from_utf8_lossy_owned)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
html_playground_url = "https://play.rust-lang.org/",
|
||||
test(attr(deny(warnings)))
|
||||
)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub use Alignment::*;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#![feature(map_try_insert)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_middle::query::Providers;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#![allow(rustc::diagnostic_outside_of_impl)]
|
||||
#![allow(rustc::untranslatable_diagnostic)]
|
||||
#![cfg_attr(feature = "rustc", feature(let_chains))]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod constructor;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
use rustc_pattern_analysis::{MatchArm, PatCx, PrivateUninhabitedField};
|
||||
|
||||
/// Sets up `tracing` for easier debugging. Tries to look like the `rustc` setup.
|
||||
pub fn init_tracing() {
|
||||
fn init_tracing() {
|
||||
use tracing_subscriber::Layer;
|
||||
use tracing_subscriber::layer::SubscriberExt;
|
||||
use tracing_subscriber::util::SubscriberInitExt;
|
||||
@@ -24,7 +24,7 @@ pub fn init_tracing() {
|
||||
/// A simple set of types.
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||
pub enum Ty {
|
||||
pub(super) enum Ty {
|
||||
/// Booleans
|
||||
Bool,
|
||||
/// 8-bit unsigned integers
|
||||
@@ -41,7 +41,7 @@ pub enum Ty {
|
||||
|
||||
/// The important logic.
|
||||
impl Ty {
|
||||
pub fn sub_tys(&self, ctor: &Constructor<Cx>) -> Vec<Self> {
|
||||
pub(super) fn sub_tys(&self, ctor: &Constructor<Cx>) -> Vec<Self> {
|
||||
use Constructor::*;
|
||||
match (ctor, *self) {
|
||||
(Struct, Ty::Tuple(tys)) => tys.iter().copied().collect(),
|
||||
@@ -63,7 +63,7 @@ fn is_empty(&self) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ctor_set(&self) -> ConstructorSet<Cx> {
|
||||
fn ctor_set(&self) -> ConstructorSet<Cx> {
|
||||
match *self {
|
||||
Ty::Bool => ConstructorSet::Bool,
|
||||
Ty::U8 => ConstructorSet::Integers {
|
||||
@@ -104,7 +104,7 @@ pub fn ctor_set(&self) -> ConstructorSet<Cx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write_variant_name(
|
||||
fn write_variant_name(
|
||||
&self,
|
||||
f: &mut std::fmt::Formatter<'_>,
|
||||
ctor: &Constructor<Cx>,
|
||||
@@ -120,7 +120,7 @@ pub fn write_variant_name(
|
||||
}
|
||||
|
||||
/// Compute usefulness in our simple context (and set up tracing for easier debugging).
|
||||
pub fn compute_match_usefulness<'p>(
|
||||
pub(super) fn compute_match_usefulness<'p>(
|
||||
arms: &[MatchArm<'p, Cx>],
|
||||
ty: Ty,
|
||||
scrut_validity: PlaceValidity,
|
||||
@@ -137,7 +137,7 @@ pub fn compute_match_usefulness<'p>(
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Cx;
|
||||
pub(super) struct Cx;
|
||||
|
||||
/// The context for pattern analysis. Forwards anything interesting to `Ty` methods.
|
||||
impl PatCx for Cx {
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(try_blocks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod errors;
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#![feature(min_specialization)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_data_structures::stable_hasher::HashStable;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use std::assert_matches::assert_matches;
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::fmt::Debug;
|
||||
use std::hash::Hash;
|
||||
use std::marker::PhantomData;
|
||||
@@ -9,7 +8,7 @@
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::profiling::{QueryInvocationId, SelfProfilerRef};
|
||||
use rustc_data_structures::sharded::{self, Sharded};
|
||||
use rustc_data_structures::sharded::{self, ShardedHashMap};
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::sync::{AtomicU64, Lock};
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
@@ -619,7 +618,7 @@ fn dep_node_index_of_opt(&self, dep_node: &DepNode) -> Option<DepNodeIndex> {
|
||||
if let Some(prev_index) = self.previous.node_to_index_opt(dep_node) {
|
||||
self.current.prev_index_to_index.lock()[prev_index]
|
||||
} else {
|
||||
self.current.new_node_to_index.lock_shard_by_value(dep_node).get(dep_node).copied()
|
||||
self.current.new_node_to_index.get(dep_node)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1048,7 +1047,7 @@ struct EdgeIndex {}
|
||||
/// first, and `data` second.
|
||||
pub(super) struct CurrentDepGraph<D: Deps> {
|
||||
encoder: GraphEncoder<D>,
|
||||
new_node_to_index: Sharded<FxHashMap<DepNode, DepNodeIndex>>,
|
||||
new_node_to_index: ShardedHashMap<DepNode, DepNodeIndex>,
|
||||
prev_index_to_index: Lock<IndexVec<SerializedDepNodeIndex, Option<DepNodeIndex>>>,
|
||||
|
||||
/// This is used to verify that fingerprints do not change between the creation of a node
|
||||
@@ -1117,12 +1116,9 @@ fn new(
|
||||
profiler,
|
||||
previous,
|
||||
),
|
||||
new_node_to_index: Sharded::new(|| {
|
||||
FxHashMap::with_capacity_and_hasher(
|
||||
new_node_count_estimate / sharded::shards(),
|
||||
Default::default(),
|
||||
)
|
||||
}),
|
||||
new_node_to_index: ShardedHashMap::with_capacity(
|
||||
new_node_count_estimate / sharded::shards(),
|
||||
),
|
||||
prev_index_to_index: Lock::new(IndexVec::from_elem_n(None, prev_graph_node_count)),
|
||||
anon_id_seed,
|
||||
#[cfg(debug_assertions)]
|
||||
@@ -1152,14 +1148,9 @@ fn intern_new_node(
|
||||
edges: EdgesVec,
|
||||
current_fingerprint: Fingerprint,
|
||||
) -> DepNodeIndex {
|
||||
let dep_node_index = match self.new_node_to_index.lock_shard_by_value(&key).entry(key) {
|
||||
Entry::Occupied(entry) => *entry.get(),
|
||||
Entry::Vacant(entry) => {
|
||||
let dep_node_index = self.encoder.send(key, current_fingerprint, edges);
|
||||
entry.insert(dep_node_index);
|
||||
dep_node_index
|
||||
}
|
||||
};
|
||||
let dep_node_index = self
|
||||
.new_node_to_index
|
||||
.get_or_insert_with(key, || self.encoder.send(key, current_fingerprint, edges));
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
self.record_edge(dep_node_index, key, current_fingerprint);
|
||||
@@ -1257,7 +1248,7 @@ fn debug_assert_not_in_new_nodes(
|
||||
) {
|
||||
let node = &prev_graph.index_to_node(prev_index);
|
||||
debug_assert!(
|
||||
!self.new_node_to_index.lock_shard_by_value(node).contains_key(node),
|
||||
!self.new_node_to_index.get(node).is_some(),
|
||||
"node from previous graph present in new node collection"
|
||||
);
|
||||
}
|
||||
@@ -1382,7 +1373,7 @@ fn panic_on_forbidden_read<D: Deps>(data: &DepGraphData<D>, dep_node_index: DepN
|
||||
if dep_node.is_none() {
|
||||
// Try to find it among the new nodes
|
||||
for shard in data.current.new_node_to_index.lock_shards() {
|
||||
if let Some((node, _)) = shard.iter().find(|(_, index)| **index == dep_node_index) {
|
||||
if let Some((node, _)) = shard.iter().find(|(_, index)| *index == dep_node_index) {
|
||||
dep_node = Some(*node);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3,10 +3,8 @@
|
||||
#![feature(assert_matches)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(dropck_eyepatch)]
|
||||
#![feature(hash_raw_entry)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(min_specialization)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod cache;
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
use std::hash::Hash;
|
||||
use std::sync::OnceLock;
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::sharded::{self, Sharded};
|
||||
use rustc_data_structures::sharded::ShardedHashMap;
|
||||
pub use rustc_data_structures::vec_cache::VecCache;
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_index::Idx;
|
||||
@@ -36,7 +35,7 @@ pub trait QueryCache: Sized {
|
||||
/// In-memory cache for queries whose keys aren't suitable for any of the
|
||||
/// more specialized kinds of cache. Backed by a sharded hashmap.
|
||||
pub struct DefaultCache<K, V> {
|
||||
cache: Sharded<FxHashMap<K, (V, DepNodeIndex)>>,
|
||||
cache: ShardedHashMap<K, (V, DepNodeIndex)>,
|
||||
}
|
||||
|
||||
impl<K, V> Default for DefaultCache<K, V> {
|
||||
@@ -55,19 +54,14 @@ impl<K, V> QueryCache for DefaultCache<K, V>
|
||||
|
||||
#[inline(always)]
|
||||
fn lookup(&self, key: &K) -> Option<(V, DepNodeIndex)> {
|
||||
let key_hash = sharded::make_hash(key);
|
||||
let lock = self.cache.lock_shard_by_hash(key_hash);
|
||||
let result = lock.raw_entry().from_key_hashed_nocheck(key_hash, key);
|
||||
|
||||
if let Some((_, value)) = result { Some(*value) } else { None }
|
||||
self.cache.get(key)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn complete(&self, key: K, value: V, index: DepNodeIndex) {
|
||||
let mut lock = self.cache.lock_shard_by_value(&key);
|
||||
// We may be overwriting another value. This is all right, since the dep-graph
|
||||
// will check that the fingerprint matches.
|
||||
lock.insert(key, (value, index));
|
||||
self.cache.insert(key, (value, index));
|
||||
}
|
||||
|
||||
fn iter(&self, f: &mut dyn FnMut(&Self::Key, &Self::Value, DepNodeIndex)) {
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::cell::{Cell, RefCell};
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
// tidy-alphabetical-start
|
||||
#![cfg_attr(doc, recursion_limit = "256")] // FIXME(nnethercote): will be removed by #124141
|
||||
#![feature(let_chains)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod cfi;
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#![feature(min_specialization)]
|
||||
#![feature(never_type)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub use self::serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// To generate CodegenOptionsTargetModifiers and UnstableOptionsTargetModifiers enums
|
||||
// with macro_rules, it is necessary to use recursive mechanic ("Incremental TT Munchers").
|
||||
#![recursion_limit = "256"]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod errors;
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
)]
|
||||
#![doc(rust_logo)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod rustc_internal;
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(slice_as_chunks)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
// The code produced by the `Encodable`/`Decodable` derive macros refer to
|
||||
|
||||
@@ -94,7 +94,6 @@
|
||||
#![doc(rust_logo)]
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_hir::def::DefKind;
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#![feature(unwrap_infallible)]
|
||||
#![feature(yeet_expr)]
|
||||
#![recursion_limit = "512"] // For rustdoc
|
||||
#![warn(unreachable_pub)] // For rustdoc
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub mod error_reporting;
|
||||
|
||||
@@ -440,7 +440,7 @@ fn visit_goal(&mut self, goal: &inspect::InspectGoal<'_, 'tcx>) -> Self::Result
|
||||
match (child_mode, nested_goal.source()) {
|
||||
(
|
||||
ChildMode::Trait(_) | ChildMode::Host(_),
|
||||
GoalSource::Misc | GoalSource::NormalizeGoal(_),
|
||||
GoalSource::Misc | GoalSource::TypeRelating | GoalSource::NormalizeGoal(_),
|
||||
) => {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
// tidy-alphabetical-start
|
||||
#![recursion_limit = "256"]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
mod codegen;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// tidy-alphabetical-start
|
||||
#![cfg_attr(doc, recursion_limit = "256")] // FIXME(nnethercote): will be removed by #124141
|
||||
#![feature(never_type)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
pub(crate) use rustc_data_structures::fx::{FxIndexMap as Map, FxIndexSet as Set};
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#![feature(let_chains)]
|
||||
#![feature(never_type)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
use rustc_middle::query::Providers;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
feature(associated_type_defaults, never_type, rustc_attrs, negative_impls)
|
||||
)]
|
||||
#![cfg_attr(feature = "nightly", allow(internal_features))]
|
||||
#![warn(unreachable_pub)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
extern crate self as rustc_type_ir;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
/// behavior as long as the resulting behavior is still correct.
|
||||
use std::cmp::Ordering;
|
||||
use std::collections::BTreeMap;
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::fmt::Debug;
|
||||
use std::hash::Hash;
|
||||
use std::marker::PhantomData;
|
||||
@@ -20,7 +21,7 @@
|
||||
use derive_where::derive_where;
|
||||
use rustc_index::{Idx, IndexVec};
|
||||
#[cfg(feature = "nightly")]
|
||||
use rustc_macros::HashStable_NoContext;
|
||||
use rustc_macros::{HashStable_NoContext, TyDecodable, TyEncodable};
|
||||
use tracing::debug;
|
||||
|
||||
use crate::data_structures::HashMap;
|
||||
@@ -111,21 +112,35 @@ fn propagate_ambiguity(
|
||||
/// In the initial iteration of a cycle, we do not yet have a provisional
|
||||
/// result. In the case we return an initial provisional result depending
|
||||
/// on the kind of cycle.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||
#[cfg_attr(feature = "nightly", derive(HashStable_NoContext))]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
#[cfg_attr(feature = "nightly", derive(TyDecodable, TyEncodable, HashStable_NoContext))]
|
||||
pub enum PathKind {
|
||||
Coinductive,
|
||||
/// A path consisting of only inductive/unproductive steps. Their initial
|
||||
/// provisional result is `Err(NoSolution)`. We currently treat them as
|
||||
/// `PathKind::Unknown` during coherence until we're fully confident in
|
||||
/// our approach.
|
||||
Inductive,
|
||||
/// A path which is not be coinductive right now but we may want
|
||||
/// to change of them to be so in the future. We return an ambiguous
|
||||
/// result in this case to prevent people from relying on this.
|
||||
Unknown,
|
||||
/// A path with at least one coinductive step. Such cycles hold.
|
||||
Coinductive,
|
||||
}
|
||||
|
||||
impl PathKind {
|
||||
/// Returns the path kind when merging `self` with `rest`.
|
||||
///
|
||||
/// Given an inductive path `self` and a coinductive path `rest`,
|
||||
/// the path `self -> rest` would be coinductive.
|
||||
///
|
||||
/// This operation represents an ordering and would be equivalent
|
||||
/// to `max(self, rest)`.
|
||||
fn extend(self, rest: PathKind) -> PathKind {
|
||||
match self {
|
||||
PathKind::Coinductive => PathKind::Coinductive,
|
||||
PathKind::Inductive => rest,
|
||||
match (self, rest) {
|
||||
(PathKind::Coinductive, _) | (_, PathKind::Coinductive) => PathKind::Coinductive,
|
||||
(PathKind::Unknown, _) | (_, PathKind::Unknown) => PathKind::Unknown,
|
||||
(PathKind::Inductive, PathKind::Inductive) => PathKind::Inductive,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -159,9 +174,6 @@ fn merge(self, other: impl Into<Self>) -> Self {
|
||||
}
|
||||
}
|
||||
}
|
||||
fn and_merge(&mut self, other: impl Into<Self>) {
|
||||
*self = self.merge(other);
|
||||
}
|
||||
}
|
||||
|
||||
/// For each goal we track whether the paths from this goal
|
||||
@@ -297,7 +309,7 @@ fn extend_from_child(&mut self, this: StackDepth, step_kind: PathKind, child: &C
|
||||
|
||||
let path_from_entry = match step_kind {
|
||||
PathKind::Coinductive => AllPathsToHeadCoinductive::Yes,
|
||||
PathKind::Inductive => path_from_entry,
|
||||
PathKind::Unknown | PathKind::Inductive => path_from_entry,
|
||||
};
|
||||
|
||||
self.insert(head, path_from_entry);
|
||||
@@ -305,6 +317,63 @@ fn extend_from_child(&mut self, this: StackDepth, step_kind: PathKind, child: &C
|
||||
}
|
||||
}
|
||||
|
||||
bitflags::bitflags! {
|
||||
/// Tracks how nested goals have been accessed. This is necessary to disable
|
||||
/// global cache entries if computing them would otherwise result in a cycle or
|
||||
/// access a provisional cache entry.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct PathsToNested: u8 {
|
||||
/// The initial value when adding a goal to its own nested goals.
|
||||
const EMPTY = 1 << 0;
|
||||
const INDUCTIVE = 1 << 1;
|
||||
const UNKNOWN = 1 << 2;
|
||||
const COINDUCTIVE = 1 << 3;
|
||||
}
|
||||
}
|
||||
impl From<PathKind> for PathsToNested {
|
||||
fn from(path: PathKind) -> PathsToNested {
|
||||
match path {
|
||||
PathKind::Inductive => PathsToNested::INDUCTIVE,
|
||||
PathKind::Unknown => PathsToNested::UNKNOWN,
|
||||
PathKind::Coinductive => PathsToNested::COINDUCTIVE,
|
||||
}
|
||||
}
|
||||
}
|
||||
impl PathsToNested {
|
||||
/// The implementation of this function is kind of ugly. We check whether
|
||||
/// there currently exist 'weaker' paths in the set, if so we upgrade these
|
||||
/// paths to at least `path`.
|
||||
#[must_use]
|
||||
fn extend_with(mut self, path: PathKind) -> Self {
|
||||
match path {
|
||||
PathKind::Inductive => {
|
||||
if self.intersects(PathsToNested::EMPTY) {
|
||||
self.remove(PathsToNested::EMPTY);
|
||||
self.insert(PathsToNested::INDUCTIVE);
|
||||
}
|
||||
}
|
||||
PathKind::Unknown => {
|
||||
if self.intersects(PathsToNested::EMPTY | PathsToNested::INDUCTIVE) {
|
||||
self.remove(PathsToNested::EMPTY | PathsToNested::INDUCTIVE);
|
||||
self.insert(PathsToNested::UNKNOWN);
|
||||
}
|
||||
}
|
||||
PathKind::Coinductive => {
|
||||
if self.intersects(
|
||||
PathsToNested::EMPTY | PathsToNested::INDUCTIVE | PathsToNested::UNKNOWN,
|
||||
) {
|
||||
self.remove(
|
||||
PathsToNested::EMPTY | PathsToNested::INDUCTIVE | PathsToNested::UNKNOWN,
|
||||
);
|
||||
self.insert(PathsToNested::COINDUCTIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
/// The nested goals of each stack entry and the path from the
|
||||
/// stack entry to that nested goal.
|
||||
///
|
||||
@@ -322,15 +391,18 @@ fn extend_from_child(&mut self, this: StackDepth, step_kind: PathKind, child: &C
|
||||
/// results from a the cycle BAB depending on the cycle root.
|
||||
#[derive_where(Debug, Default, Clone; X: Cx)]
|
||||
struct NestedGoals<X: Cx> {
|
||||
nested_goals: HashMap<X::Input, UsageKind>,
|
||||
nested_goals: HashMap<X::Input, PathsToNested>,
|
||||
}
|
||||
impl<X: Cx> NestedGoals<X> {
|
||||
fn is_empty(&self) -> bool {
|
||||
self.nested_goals.is_empty()
|
||||
}
|
||||
|
||||
fn insert(&mut self, input: X::Input, path_from_entry: UsageKind) {
|
||||
self.nested_goals.entry(input).or_insert(path_from_entry).and_merge(path_from_entry);
|
||||
fn insert(&mut self, input: X::Input, paths_to_nested: PathsToNested) {
|
||||
match self.nested_goals.entry(input) {
|
||||
Entry::Occupied(mut entry) => *entry.get_mut() |= paths_to_nested,
|
||||
Entry::Vacant(entry) => drop(entry.insert(paths_to_nested)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Adds the nested goals of a nested goal, given that the path `step_kind` from this goal
|
||||
@@ -341,18 +413,15 @@ fn insert(&mut self, input: X::Input, path_from_entry: UsageKind) {
|
||||
/// the same as for the child.
|
||||
fn extend_from_child(&mut self, step_kind: PathKind, nested_goals: &NestedGoals<X>) {
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
for (input, path_from_entry) in nested_goals.iter() {
|
||||
let path_from_entry = match step_kind {
|
||||
PathKind::Coinductive => UsageKind::Single(PathKind::Coinductive),
|
||||
PathKind::Inductive => path_from_entry,
|
||||
};
|
||||
self.insert(input, path_from_entry);
|
||||
for (input, paths_to_nested) in nested_goals.iter() {
|
||||
let paths_to_nested = paths_to_nested.extend_with(step_kind);
|
||||
self.insert(input, paths_to_nested);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(feature = "nightly", rustc_lint_query_instability)]
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
fn iter(&self) -> impl Iterator<Item = (X::Input, UsageKind)> {
|
||||
fn iter(&self) -> impl Iterator<Item = (X::Input, PathsToNested)> + '_ {
|
||||
self.nested_goals.iter().map(|(i, p)| (*i, *p))
|
||||
}
|
||||
|
||||
@@ -490,7 +559,7 @@ fn update_parent_goal(
|
||||
// goals as this change may cause them to now depend on additional
|
||||
// goals, resulting in new cycles. See the dev-guide for examples.
|
||||
if parent_depends_on_cycle {
|
||||
parent.nested_goals.insert(parent.input, UsageKind::Single(PathKind::Inductive))
|
||||
parent.nested_goals.insert(parent.input, PathsToNested::EMPTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -666,7 +735,7 @@ fn handle_overflow(
|
||||
//
|
||||
// We must therefore not use the global cache entry for `B` in that case.
|
||||
// See tests/ui/traits/next-solver/cycles/hidden-by-overflow.rs
|
||||
last.nested_goals.insert(last.input, UsageKind::Single(PathKind::Inductive));
|
||||
last.nested_goals.insert(last.input, PathsToNested::EMPTY);
|
||||
}
|
||||
|
||||
debug!("encountered stack overflow");
|
||||
@@ -749,16 +818,11 @@ fn rebase_provisional_cache_entries(
|
||||
|
||||
// We now care about the path from the next highest cycle head to the
|
||||
// provisional cache entry.
|
||||
match path_from_head {
|
||||
PathKind::Coinductive => {}
|
||||
PathKind::Inductive => {
|
||||
*path_from_head = Self::cycle_path_kind(
|
||||
&self.stack,
|
||||
stack_entry.step_kind_from_parent,
|
||||
head,
|
||||
)
|
||||
}
|
||||
}
|
||||
*path_from_head = path_from_head.extend(Self::cycle_path_kind(
|
||||
&self.stack,
|
||||
stack_entry.step_kind_from_parent,
|
||||
head,
|
||||
));
|
||||
// Mutate the result of the provisional cache entry in case we did
|
||||
// not reach a fixpoint.
|
||||
*result = mutate_result(input, *result);
|
||||
@@ -858,7 +922,7 @@ fn candidate_is_applicable(
|
||||
for &ProvisionalCacheEntry {
|
||||
encountered_overflow,
|
||||
ref heads,
|
||||
path_from_head,
|
||||
path_from_head: head_to_provisional,
|
||||
result: _,
|
||||
} in entries.iter()
|
||||
{
|
||||
@@ -870,24 +934,19 @@ fn candidate_is_applicable(
|
||||
|
||||
// A provisional cache entry only applies if the path from its highest head
|
||||
// matches the path when encountering the goal.
|
||||
//
|
||||
// We check if any of the paths taken while computing the global goal
|
||||
// would end up with an applicable provisional cache entry.
|
||||
let head = heads.highest_cycle_head();
|
||||
let full_path = match Self::cycle_path_kind(stack, step_kind_from_parent, head) {
|
||||
PathKind::Coinductive => UsageKind::Single(PathKind::Coinductive),
|
||||
PathKind::Inductive => path_from_global_entry,
|
||||
};
|
||||
|
||||
match (full_path, path_from_head) {
|
||||
(UsageKind::Mixed, _)
|
||||
| (UsageKind::Single(PathKind::Coinductive), PathKind::Coinductive)
|
||||
| (UsageKind::Single(PathKind::Inductive), PathKind::Inductive) => {
|
||||
debug!(
|
||||
?full_path,
|
||||
?path_from_head,
|
||||
"cache entry not applicable due to matching paths"
|
||||
);
|
||||
return false;
|
||||
}
|
||||
_ => debug!(?full_path, ?path_from_head, "paths don't match"),
|
||||
let head_to_curr = Self::cycle_path_kind(stack, step_kind_from_parent, head);
|
||||
let full_paths = path_from_global_entry.extend_with(head_to_curr);
|
||||
if full_paths.contains(head_to_provisional.into()) {
|
||||
debug!(
|
||||
?full_paths,
|
||||
?head_to_provisional,
|
||||
"cache entry not applicable due to matching paths"
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -986,8 +1045,8 @@ fn check_cycle_on_stack(
|
||||
let last = &mut self.stack[last_index];
|
||||
last.reached_depth = last.reached_depth.max(next_index);
|
||||
|
||||
last.nested_goals.insert(input, UsageKind::Single(step_kind_from_parent));
|
||||
last.nested_goals.insert(last.input, UsageKind::Single(PathKind::Inductive));
|
||||
last.nested_goals.insert(input, step_kind_from_parent.into());
|
||||
last.nested_goals.insert(last.input, PathsToNested::EMPTY);
|
||||
if last_index != head {
|
||||
last.heads.insert(head, step_kind_from_parent);
|
||||
}
|
||||
|
||||
@@ -58,20 +58,24 @@ pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
|
||||
/// Why a specific goal has to be proven.
|
||||
///
|
||||
/// This is necessary as we treat nested goals different depending on
|
||||
/// their source. This is currently mostly used by proof tree visitors
|
||||
/// but will be used by cycle handling in the future.
|
||||
/// their source. This is used to decide whether a cycle is coinductive.
|
||||
/// See the documentation of `EvalCtxt::step_kind_for_source` for more details
|
||||
/// about this.
|
||||
///
|
||||
/// It is also used by proof tree visitors, e.g. for diagnostics purposes.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||
#[cfg_attr(feature = "nightly", derive(HashStable_NoContext))]
|
||||
pub enum GoalSource {
|
||||
Misc,
|
||||
/// We're proving a where-bound of an impl.
|
||||
/// A nested goal required to prove that types are equal/subtypes.
|
||||
/// This is always an unproductive step.
|
||||
///
|
||||
/// FIXME(-Znext-solver=coinductive): Explain how and why this
|
||||
/// changes whether cycles are coinductive.
|
||||
/// This is also used for all `NormalizesTo` goals as we they are used
|
||||
/// to relate types in `AliasRelate`.
|
||||
TypeRelating,
|
||||
/// We're proving a where-bound of an impl.
|
||||
ImplWhereBound,
|
||||
/// Const conditions that need to hold for `~const` alias bounds to hold.
|
||||
///
|
||||
/// FIXME(-Znext-solver=coinductive): Are these even coinductive?
|
||||
AliasBoundConstCondition,
|
||||
/// Instantiating a higher-ranked goal and re-proving it.
|
||||
InstantiateHigherRanked,
|
||||
@@ -79,7 +83,6 @@ pub enum GoalSource {
|
||||
/// This is used in two places: projecting to an opaque whose hidden type
|
||||
/// is already registered in the opaque type storage, and for rigid projections.
|
||||
AliasWellFormed,
|
||||
|
||||
/// In case normalizing aliases in nested goals cycles, eagerly normalizing these
|
||||
/// aliases in the context of the parent may incorrectly change the cycle kind.
|
||||
/// Normalizing aliases in goals therefore tracks the original path kind for this
|
||||
|
||||
@@ -239,7 +239,7 @@ pub struct Box<
|
||||
/// This is the surface syntax for `box <expr>` expressions.
|
||||
#[rustc_intrinsic]
|
||||
#[unstable(feature = "liballoc_internals", issue = "none")]
|
||||
pub fn box_new<T>(_x: T) -> Box<T>;
|
||||
pub fn box_new<T>(x: T) -> Box<T>;
|
||||
|
||||
impl<T> Box<T> {
|
||||
/// Allocates memory on the heap and then places `x` into it.
|
||||
|
||||
@@ -306,15 +306,15 @@ fn drop(&mut self) {
|
||||
/// `va_copy`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_end(_ap: &mut VaListImpl<'_>);
|
||||
unsafe fn va_end(ap: &mut VaListImpl<'_>);
|
||||
|
||||
/// Copies the current location of arglist `src` to the arglist `dst`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_copy<'f>(_dest: *mut VaListImpl<'f>, _src: &VaListImpl<'f>);
|
||||
unsafe fn va_copy<'f>(dest: *mut VaListImpl<'f>, src: &VaListImpl<'f>);
|
||||
|
||||
/// Loads an argument of type `T` from the `va_list` `ap` and increment the
|
||||
/// argument `ap` points to.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn va_arg<T: sealed_trait::VaArgSafe>(_ap: &mut VaListImpl<'_>) -> T;
|
||||
unsafe fn va_arg<T: sealed_trait::VaArgSafe>(ap: &mut VaListImpl<'_>) -> T;
|
||||
|
||||
+246
-253
@@ -97,7 +97,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_relaxed_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_relaxed_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -106,7 +106,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_relaxed_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_relaxed_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -115,7 +115,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_relaxed_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_relaxed_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -124,7 +124,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acquire_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acquire_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -133,7 +133,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acquire_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -142,7 +142,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acquire_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acquire_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -151,7 +151,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_release_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_release_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -160,7 +160,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_release_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_release_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -169,7 +169,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_release_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -178,7 +178,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acqrel_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -187,7 +187,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acqrel_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -196,7 +196,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_acqrel_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -205,7 +205,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_seqcst_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -214,7 +214,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -223,7 +223,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
||||
/// For example, [`AtomicBool::compare_exchange`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchg_seqcst_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchg_seqcst_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
@@ -259,8 +259,7 @@ pub unsafe fn atomic_cxchgweak_relaxed_acquire<T: Copy>(
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_relaxed_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_relaxed_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -295,8 +294,7 @@ pub unsafe fn atomic_cxchgweak_acquire_acquire<T: Copy>(
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_acquire_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_acquire_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -331,8 +329,7 @@ pub unsafe fn atomic_cxchgweak_release_acquire<T: Copy>(
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_release_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -341,8 +338,7 @@ pub unsafe fn atomic_cxchgweak_release_seqcst<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -351,8 +347,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_relaxed<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -361,7 +356,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -370,8 +365,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_relaxed<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -380,8 +374,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_relaxed<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _src: T)
|
||||
-> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -390,7 +383,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// For example, [`AtomicBool::compare_exchange_weak`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_seqcst<T: Copy>(_dst: *mut T, _old: T, _src: T) -> (T, bool);
|
||||
pub unsafe fn atomic_cxchgweak_seqcst_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
|
||||
|
||||
/// Loads the current value of the pointer.
|
||||
///
|
||||
@@ -399,7 +392,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::load`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_seqcst<T: Copy>(_src: *const T) -> T;
|
||||
pub unsafe fn atomic_load_seqcst<T: Copy>(src: *const T) -> T;
|
||||
/// Loads the current value of the pointer.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -407,7 +400,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::load`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_acquire<T: Copy>(_src: *const T) -> T;
|
||||
pub unsafe fn atomic_load_acquire<T: Copy>(src: *const T) -> T;
|
||||
/// Loads the current value of the pointer.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -415,13 +408,13 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::load`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_relaxed<T: Copy>(_src: *const T) -> T;
|
||||
pub unsafe fn atomic_load_relaxed<T: Copy>(src: *const T) -> T;
|
||||
/// Do NOT use this intrinsic; "unordered" operations do not exist in our memory model!
|
||||
/// In terms of the Rust Abstract Machine, this operation is equivalent to `src.read()`,
|
||||
/// i.e., it performs a non-atomic read.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_unordered<T: Copy>(_src: *const T) -> T;
|
||||
pub unsafe fn atomic_load_unordered<T: Copy>(src: *const T) -> T;
|
||||
|
||||
/// Stores the value at the specified memory location.
|
||||
///
|
||||
@@ -430,7 +423,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::store`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_seqcst<T: Copy>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn atomic_store_seqcst<T: Copy>(dst: *mut T, val: T);
|
||||
/// Stores the value at the specified memory location.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -438,7 +431,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::store`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_release<T: Copy>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn atomic_store_release<T: Copy>(dst: *mut T, val: T);
|
||||
/// Stores the value at the specified memory location.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -446,13 +439,13 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::store`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_relaxed<T: Copy>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn atomic_store_relaxed<T: Copy>(dst: *mut T, val: T);
|
||||
/// Do NOT use this intrinsic; "unordered" operations do not exist in our memory model!
|
||||
/// In terms of the Rust Abstract Machine, this operation is equivalent to `dst.write(val)`,
|
||||
/// i.e., it performs a non-atomic write.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_unordered<T: Copy>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn atomic_store_unordered<T: Copy>(dst: *mut T, val: T);
|
||||
|
||||
/// Stores the value at the specified memory location, returning the old value.
|
||||
///
|
||||
@@ -461,7 +454,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::swap`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xchg_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xchg_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Stores the value at the specified memory location, returning the old value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -469,7 +462,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::swap`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xchg_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xchg_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Stores the value at the specified memory location, returning the old value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -477,7 +470,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::swap`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xchg_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xchg_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Stores the value at the specified memory location, returning the old value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -485,7 +478,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicBool::swap`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xchg_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xchg_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Stores the value at the specified memory location, returning the old value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -493,7 +486,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::swap`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xchg_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xchg_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Adds to the current value, returning the previous value.
|
||||
///
|
||||
@@ -502,7 +495,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicIsize::fetch_add`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xadd_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -510,7 +503,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicIsize::fetch_add`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xadd_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -518,7 +511,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicIsize::fetch_add`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xadd_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -526,7 +519,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicIsize::fetch_add`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xadd_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -534,7 +527,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicIsize::fetch_add`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xadd_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
///
|
||||
@@ -543,7 +536,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicIsize::fetch_sub`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -551,7 +544,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicIsize::fetch_sub`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xsub_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -559,7 +552,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicIsize::fetch_sub`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xsub_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -567,7 +560,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicIsize::fetch_sub`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xsub_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -575,7 +568,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicIsize::fetch_sub`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xsub_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
///
|
||||
@@ -584,7 +577,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::fetch_and`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_and_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -592,7 +585,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::fetch_and`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -600,7 +593,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::fetch_and`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_and_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -608,7 +601,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicBool::fetch_and`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_and_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -616,7 +609,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::fetch_and`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_and_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
///
|
||||
@@ -625,7 +618,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::fetch_nand`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -633,7 +626,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::fetch_nand`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_nand_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -641,7 +634,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::fetch_nand`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_nand_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -649,7 +642,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicBool::fetch_nand`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_nand_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -657,7 +650,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::fetch_nand`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_nand_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
///
|
||||
@@ -666,7 +659,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::fetch_or`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_or_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -674,7 +667,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::fetch_or`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_or_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -682,7 +675,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::fetch_or`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -690,7 +683,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicBool::fetch_or`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_or_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -698,7 +691,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::fetch_or`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_or_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
///
|
||||
@@ -707,7 +700,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicBool::fetch_xor`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -715,7 +708,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicBool::fetch_xor`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xor_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -723,7 +716,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicBool::fetch_xor`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xor_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -731,7 +724,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicBool::fetch_xor`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xor_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -739,7 +732,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicBool::fetch_xor`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_xor_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
///
|
||||
@@ -748,7 +741,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicI32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_max_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -756,7 +749,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicI32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_max_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -764,7 +757,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicI32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_max_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -772,7 +765,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicI32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_max_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -780,7 +773,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicI32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_max_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
///
|
||||
@@ -789,7 +782,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicI32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_min_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -797,7 +790,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicI32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_min_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -805,7 +798,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicI32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_min_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -813,7 +806,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicI32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_min_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -821,7 +814,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicI32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_min_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
///
|
||||
@@ -830,7 +823,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicU32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umin_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -838,7 +831,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicU32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umin_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -846,7 +839,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicU32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umin_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -854,7 +847,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicU32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umin_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -862,7 +855,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicU32::fetch_min`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umin_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
///
|
||||
@@ -871,7 +864,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::SeqCst`] as the `order`. For example, [`AtomicU32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_seqcst<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umax_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -879,7 +872,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Acquire`] as the `order`. For example, [`AtomicU32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_acquire<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umax_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -887,7 +880,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Release`] as the `order`. For example, [`AtomicU32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_release<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umax_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -895,7 +888,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::AcqRel`] as the `order`. For example, [`AtomicU32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_acqrel<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umax_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
@@ -903,7 +896,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// [`Ordering::Relaxed`] as the `order`. For example, [`AtomicU32::fetch_max`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_relaxed<T: Copy>(_dst: *mut T, _src: T) -> T;
|
||||
pub unsafe fn atomic_umax_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
|
||||
/// An atomic fence.
|
||||
///
|
||||
@@ -1002,7 +995,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn prefetch_read_data<T>(_data: *const T, _locality: i32);
|
||||
pub unsafe fn prefetch_read_data<T>(data: *const T, locality: i32);
|
||||
/// The `prefetch` intrinsic is a hint to the code generator to insert a prefetch instruction
|
||||
/// if supported; otherwise, it is a no-op.
|
||||
/// Prefetches have no effect on the behavior of the program but can change its performance
|
||||
@@ -1014,7 +1007,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn prefetch_write_data<T>(_data: *const T, _locality: i32);
|
||||
pub unsafe fn prefetch_write_data<T>(data: *const T, locality: i32);
|
||||
/// The `prefetch` intrinsic is a hint to the code generator to insert a prefetch instruction
|
||||
/// if supported; otherwise, it is a no-op.
|
||||
/// Prefetches have no effect on the behavior of the program but can change its performance
|
||||
@@ -1026,7 +1019,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn prefetch_read_instruction<T>(_data: *const T, _locality: i32);
|
||||
pub unsafe fn prefetch_read_instruction<T>(data: *const T, locality: i32);
|
||||
/// The `prefetch` intrinsic is a hint to the code generator to insert a prefetch instruction
|
||||
/// if supported; otherwise, it is a no-op.
|
||||
/// Prefetches have no effect on the behavior of the program but can change its performance
|
||||
@@ -1038,7 +1031,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(_dst: *mut T, _old: T, _s
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn prefetch_write_instruction<T>(_data: *const T, _locality: i32);
|
||||
pub unsafe fn prefetch_write_instruction<T>(data: *const T, locality: i32);
|
||||
|
||||
/// Executes a breakpoint trap, for inspection by a debugger.
|
||||
///
|
||||
@@ -1539,7 +1532,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_diagnostic_item = "transmute"]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn transmute<Src, Dst>(_src: Src) -> Dst;
|
||||
pub const unsafe fn transmute<Src, Dst>(src: Src) -> Dst;
|
||||
|
||||
/// Like [`transmute`], but even less checked at compile-time: rather than
|
||||
/// giving an error for `size_of::<Src>() != size_of::<Dst>()`, it's
|
||||
@@ -1553,7 +1546,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn transmute_unchecked<Src, Dst>(_src: Src) -> Dst;
|
||||
pub const unsafe fn transmute_unchecked<Src, Dst>(src: Src) -> Dst;
|
||||
|
||||
/// Returns `true` if the actual type given as `T` requires drop
|
||||
/// glue; returns `false` if the actual type provided for `T`
|
||||
@@ -1593,7 +1586,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn offset<Ptr, Delta>(_dst: Ptr, _offset: Delta) -> Ptr;
|
||||
pub const unsafe fn offset<Ptr, Delta>(dst: Ptr, offset: Delta) -> Ptr;
|
||||
|
||||
/// Calculates the offset from a pointer, potentially wrapping.
|
||||
///
|
||||
@@ -1612,7 +1605,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn arith_offset<T>(_dst: *const T, _offset: isize) -> *const T;
|
||||
pub const unsafe fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
|
||||
|
||||
/// Masks out bits of the pointer according to a mask.
|
||||
///
|
||||
@@ -1624,7 +1617,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// Consider using [`pointer::mask`] instead.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn ptr_mask<T>(_ptr: *const T, _mask: usize) -> *const T;
|
||||
pub fn ptr_mask<T>(ptr: *const T, mask: usize) -> *const T;
|
||||
|
||||
/// Equivalent to the appropriate `llvm.memcpy.p0i8.0i8.*` intrinsic, with
|
||||
/// a size of `count` * `size_of::<T>()` and an alignment of
|
||||
@@ -1636,7 +1629,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn volatile_copy_nonoverlapping_memory<T>(_dst: *mut T, _src: *const T, _count: usize);
|
||||
pub unsafe fn volatile_copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: usize);
|
||||
/// Equivalent to the appropriate `llvm.memmove.p0i8.0i8.*` intrinsic, with
|
||||
/// a size of `count * size_of::<T>()` and an alignment of
|
||||
/// `min_align_of::<T>()`
|
||||
@@ -1647,7 +1640,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn volatile_copy_memory<T>(_dst: *mut T, _src: *const T, _count: usize);
|
||||
pub unsafe fn volatile_copy_memory<T>(dst: *mut T, src: *const T, count: usize);
|
||||
/// Equivalent to the appropriate `llvm.memset.p0i8.*` intrinsic, with a
|
||||
/// size of `count * size_of::<T>()` and an alignment of
|
||||
/// `min_align_of::<T>()`.
|
||||
@@ -1658,20 +1651,20 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn volatile_set_memory<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
pub unsafe fn volatile_set_memory<T>(dst: *mut T, val: u8, count: usize);
|
||||
|
||||
/// Performs a volatile load from the `src` pointer.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is [`core::ptr::read_volatile`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn volatile_load<T>(_src: *const T) -> T;
|
||||
pub unsafe fn volatile_load<T>(src: *const T) -> T;
|
||||
/// Performs a volatile store to the `dst` pointer.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is [`core::ptr::write_volatile`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn volatile_store<T>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn volatile_store<T>(dst: *mut T, val: T);
|
||||
|
||||
/// Performs a volatile load from the `src` pointer
|
||||
/// The pointer is not required to be aligned.
|
||||
@@ -1680,7 +1673,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_diagnostic_item = "intrinsics_unaligned_volatile_load"]
|
||||
pub unsafe fn unaligned_volatile_load<T>(_src: *const T) -> T;
|
||||
pub unsafe fn unaligned_volatile_load<T>(src: *const T) -> T;
|
||||
/// Performs a volatile store to the `dst` pointer.
|
||||
/// The pointer is not required to be aligned.
|
||||
///
|
||||
@@ -1688,7 +1681,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_diagnostic_item = "intrinsics_unaligned_volatile_store"]
|
||||
pub unsafe fn unaligned_volatile_store<T>(_dst: *mut T, _val: T);
|
||||
pub unsafe fn unaligned_volatile_store<T>(dst: *mut T, val: T);
|
||||
|
||||
/// Returns the square root of an `f16`
|
||||
///
|
||||
@@ -1696,28 +1689,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::sqrt`](../../std/primitive.f16.html#method.sqrt)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sqrtf16(_x: f16) -> f16;
|
||||
pub unsafe fn sqrtf16(x: f16) -> f16;
|
||||
/// Returns the square root of an `f32`
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::sqrt`](../../std/primitive.f32.html#method.sqrt)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sqrtf32(_x: f32) -> f32;
|
||||
pub unsafe fn sqrtf32(x: f32) -> f32;
|
||||
/// Returns the square root of an `f64`
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::sqrt`](../../std/primitive.f64.html#method.sqrt)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sqrtf64(_x: f64) -> f64;
|
||||
pub unsafe fn sqrtf64(x: f64) -> f64;
|
||||
/// Returns the square root of an `f128`
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::sqrt`](../../std/primitive.f128.html#method.sqrt)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sqrtf128(_x: f128) -> f128;
|
||||
pub unsafe fn sqrtf128(x: f128) -> f128;
|
||||
|
||||
/// Raises an `f16` to an integer power.
|
||||
///
|
||||
@@ -1725,28 +1718,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::powi`](../../std/primitive.f16.html#method.powi)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powif16(_a: f16, _x: i32) -> f16;
|
||||
pub unsafe fn powif16(a: f16, x: i32) -> f16;
|
||||
/// Raises an `f32` to an integer power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::powi`](../../std/primitive.f32.html#method.powi)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powif32(_a: f32, _x: i32) -> f32;
|
||||
pub unsafe fn powif32(a: f32, x: i32) -> f32;
|
||||
/// Raises an `f64` to an integer power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::powi`](../../std/primitive.f64.html#method.powi)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powif64(_a: f64, _x: i32) -> f64;
|
||||
pub unsafe fn powif64(a: f64, x: i32) -> f64;
|
||||
/// Raises an `f128` to an integer power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::powi`](../../std/primitive.f128.html#method.powi)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powif128(_a: f128, _x: i32) -> f128;
|
||||
pub unsafe fn powif128(a: f128, x: i32) -> f128;
|
||||
|
||||
/// Returns the sine of an `f16`.
|
||||
///
|
||||
@@ -1754,28 +1747,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::sin`](../../std/primitive.f16.html#method.sin)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sinf16(_x: f16) -> f16;
|
||||
pub unsafe fn sinf16(x: f16) -> f16;
|
||||
/// Returns the sine of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::sin`](../../std/primitive.f32.html#method.sin)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sinf32(_x: f32) -> f32;
|
||||
pub unsafe fn sinf32(x: f32) -> f32;
|
||||
/// Returns the sine of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::sin`](../../std/primitive.f64.html#method.sin)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sinf64(_x: f64) -> f64;
|
||||
pub unsafe fn sinf64(x: f64) -> f64;
|
||||
/// Returns the sine of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::sin`](../../std/primitive.f128.html#method.sin)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn sinf128(_x: f128) -> f128;
|
||||
pub unsafe fn sinf128(x: f128) -> f128;
|
||||
|
||||
/// Returns the cosine of an `f16`.
|
||||
///
|
||||
@@ -1783,28 +1776,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::cos`](../../std/primitive.f16.html#method.cos)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn cosf16(_x: f16) -> f16;
|
||||
pub unsafe fn cosf16(x: f16) -> f16;
|
||||
/// Returns the cosine of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::cos`](../../std/primitive.f32.html#method.cos)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn cosf32(_x: f32) -> f32;
|
||||
pub unsafe fn cosf32(x: f32) -> f32;
|
||||
/// Returns the cosine of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::cos`](../../std/primitive.f64.html#method.cos)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn cosf64(_x: f64) -> f64;
|
||||
pub unsafe fn cosf64(x: f64) -> f64;
|
||||
/// Returns the cosine of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::cos`](../../std/primitive.f128.html#method.cos)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn cosf128(_x: f128) -> f128;
|
||||
pub unsafe fn cosf128(x: f128) -> f128;
|
||||
|
||||
/// Raises an `f16` to an `f16` power.
|
||||
///
|
||||
@@ -1812,28 +1805,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::powf`](../../std/primitive.f16.html#method.powf)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powf16(_a: f16, _x: f16) -> f16;
|
||||
pub unsafe fn powf16(a: f16, x: f16) -> f16;
|
||||
/// Raises an `f32` to an `f32` power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::powf`](../../std/primitive.f32.html#method.powf)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powf32(_a: f32, _x: f32) -> f32;
|
||||
pub unsafe fn powf32(a: f32, x: f32) -> f32;
|
||||
/// Raises an `f64` to an `f64` power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::powf`](../../std/primitive.f64.html#method.powf)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powf64(_a: f64, _x: f64) -> f64;
|
||||
pub unsafe fn powf64(a: f64, x: f64) -> f64;
|
||||
/// Raises an `f128` to an `f128` power.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::powf`](../../std/primitive.f128.html#method.powf)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn powf128(_a: f128, _x: f128) -> f128;
|
||||
pub unsafe fn powf128(a: f128, x: f128) -> f128;
|
||||
|
||||
/// Returns the exponential of an `f16`.
|
||||
///
|
||||
@@ -1841,28 +1834,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::exp`](../../std/primitive.f16.html#method.exp)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn expf16(_x: f16) -> f16;
|
||||
pub unsafe fn expf16(x: f16) -> f16;
|
||||
/// Returns the exponential of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::exp`](../../std/primitive.f32.html#method.exp)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn expf32(_x: f32) -> f32;
|
||||
pub unsafe fn expf32(x: f32) -> f32;
|
||||
/// Returns the exponential of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::exp`](../../std/primitive.f64.html#method.exp)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn expf64(_x: f64) -> f64;
|
||||
pub unsafe fn expf64(x: f64) -> f64;
|
||||
/// Returns the exponential of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::exp`](../../std/primitive.f128.html#method.exp)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn expf128(_x: f128) -> f128;
|
||||
pub unsafe fn expf128(x: f128) -> f128;
|
||||
|
||||
/// Returns 2 raised to the power of an `f16`.
|
||||
///
|
||||
@@ -1870,28 +1863,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::exp2`](../../std/primitive.f16.html#method.exp2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn exp2f16(_x: f16) -> f16;
|
||||
pub unsafe fn exp2f16(x: f16) -> f16;
|
||||
/// Returns 2 raised to the power of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::exp2`](../../std/primitive.f32.html#method.exp2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn exp2f32(_x: f32) -> f32;
|
||||
pub unsafe fn exp2f32(x: f32) -> f32;
|
||||
/// Returns 2 raised to the power of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::exp2`](../../std/primitive.f64.html#method.exp2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn exp2f64(_x: f64) -> f64;
|
||||
pub unsafe fn exp2f64(x: f64) -> f64;
|
||||
/// Returns 2 raised to the power of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::exp2`](../../std/primitive.f128.html#method.exp2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn exp2f128(_x: f128) -> f128;
|
||||
pub unsafe fn exp2f128(x: f128) -> f128;
|
||||
|
||||
/// Returns the natural logarithm of an `f16`.
|
||||
///
|
||||
@@ -1899,28 +1892,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::ln`](../../std/primitive.f16.html#method.ln)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn logf16(_x: f16) -> f16;
|
||||
pub unsafe fn logf16(x: f16) -> f16;
|
||||
/// Returns the natural logarithm of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::ln`](../../std/primitive.f32.html#method.ln)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn logf32(_x: f32) -> f32;
|
||||
pub unsafe fn logf32(x: f32) -> f32;
|
||||
/// Returns the natural logarithm of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::ln`](../../std/primitive.f64.html#method.ln)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn logf64(_x: f64) -> f64;
|
||||
pub unsafe fn logf64(x: f64) -> f64;
|
||||
/// Returns the natural logarithm of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::ln`](../../std/primitive.f128.html#method.ln)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn logf128(_x: f128) -> f128;
|
||||
pub unsafe fn logf128(x: f128) -> f128;
|
||||
|
||||
/// Returns the base 10 logarithm of an `f16`.
|
||||
///
|
||||
@@ -1928,28 +1921,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::log10`](../../std/primitive.f16.html#method.log10)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log10f16(_x: f16) -> f16;
|
||||
pub unsafe fn log10f16(x: f16) -> f16;
|
||||
/// Returns the base 10 logarithm of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::log10`](../../std/primitive.f32.html#method.log10)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log10f32(_x: f32) -> f32;
|
||||
pub unsafe fn log10f32(x: f32) -> f32;
|
||||
/// Returns the base 10 logarithm of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::log10`](../../std/primitive.f64.html#method.log10)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log10f64(_x: f64) -> f64;
|
||||
pub unsafe fn log10f64(x: f64) -> f64;
|
||||
/// Returns the base 10 logarithm of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::log10`](../../std/primitive.f128.html#method.log10)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log10f128(_x: f128) -> f128;
|
||||
pub unsafe fn log10f128(x: f128) -> f128;
|
||||
|
||||
/// Returns the base 2 logarithm of an `f16`.
|
||||
///
|
||||
@@ -1957,28 +1950,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::log2`](../../std/primitive.f16.html#method.log2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log2f16(_x: f16) -> f16;
|
||||
pub unsafe fn log2f16(x: f16) -> f16;
|
||||
/// Returns the base 2 logarithm of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::log2`](../../std/primitive.f32.html#method.log2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log2f32(_x: f32) -> f32;
|
||||
pub unsafe fn log2f32(x: f32) -> f32;
|
||||
/// Returns the base 2 logarithm of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::log2`](../../std/primitive.f64.html#method.log2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log2f64(_x: f64) -> f64;
|
||||
pub unsafe fn log2f64(x: f64) -> f64;
|
||||
/// Returns the base 2 logarithm of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::log2`](../../std/primitive.f128.html#method.log2)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn log2f128(_x: f128) -> f128;
|
||||
pub unsafe fn log2f128(x: f128) -> f128;
|
||||
|
||||
/// Returns `a * b + c` for `f16` values.
|
||||
///
|
||||
@@ -1986,28 +1979,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::mul_add`](../../std/primitive.f16.html#method.mul_add)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmaf16(_a: f16, _b: f16, _c: f16) -> f16;
|
||||
pub unsafe fn fmaf16(a: f16, b: f16, c: f16) -> f16;
|
||||
/// Returns `a * b + c` for `f32` values.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::mul_add`](../../std/primitive.f32.html#method.mul_add)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmaf32(_a: f32, _b: f32, _c: f32) -> f32;
|
||||
pub unsafe fn fmaf32(a: f32, b: f32, c: f32) -> f32;
|
||||
/// Returns `a * b + c` for `f64` values.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::mul_add`](../../std/primitive.f64.html#method.mul_add)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmaf64(_a: f64, _b: f64, _c: f64) -> f64;
|
||||
pub unsafe fn fmaf64(a: f64, b: f64, c: f64) -> f64;
|
||||
/// Returns `a * b + c` for `f128` values.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::mul_add`](../../std/primitive.f128.html#method.mul_add)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmaf128(_a: f128, _b: f128, _c: f128) -> f128;
|
||||
pub unsafe fn fmaf128(a: f128, b: f128, c: f128) -> f128;
|
||||
|
||||
/// Returns `a * b + c` for `f16` values, non-deterministically executing
|
||||
/// either a fused multiply-add or two operations with rounding of the
|
||||
@@ -2021,7 +2014,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// example.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmuladdf16(_a: f16, _b: f16, _c: f16) -> f16;
|
||||
pub unsafe fn fmuladdf16(a: f16, b: f16, c: f16) -> f16;
|
||||
/// Returns `a * b + c` for `f32` values, non-deterministically executing
|
||||
/// either a fused multiply-add or two operations with rounding of the
|
||||
/// intermediate result.
|
||||
@@ -2034,7 +2027,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// example.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmuladdf32(_a: f32, _b: f32, _c: f32) -> f32;
|
||||
pub unsafe fn fmuladdf32(a: f32, b: f32, c: f32) -> f32;
|
||||
/// Returns `a * b + c` for `f64` values, non-deterministically executing
|
||||
/// either a fused multiply-add or two operations with rounding of the
|
||||
/// intermediate result.
|
||||
@@ -2047,7 +2040,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// example.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmuladdf64(_a: f64, _b: f64, _c: f64) -> f64;
|
||||
pub unsafe fn fmuladdf64(a: f64, b: f64, c: f64) -> f64;
|
||||
/// Returns `a * b + c` for `f128` values, non-deterministically executing
|
||||
/// either a fused multiply-add or two operations with rounding of the
|
||||
/// intermediate result.
|
||||
@@ -2060,7 +2053,7 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// example.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmuladdf128(_a: f128, _b: f128, _c: f128) -> f128;
|
||||
pub unsafe fn fmuladdf128(a: f128, b: f128, c: f128) -> f128;
|
||||
|
||||
/// Returns the largest integer less than or equal to an `f16`.
|
||||
///
|
||||
@@ -2068,28 +2061,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::floor`](../../std/primitive.f16.html#method.floor)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn floorf16(_x: f16) -> f16;
|
||||
pub unsafe fn floorf16(x: f16) -> f16;
|
||||
/// Returns the largest integer less than or equal to an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::floor`](../../std/primitive.f32.html#method.floor)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn floorf32(_x: f32) -> f32;
|
||||
pub unsafe fn floorf32(x: f32) -> f32;
|
||||
/// Returns the largest integer less than or equal to an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::floor`](../../std/primitive.f64.html#method.floor)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn floorf64(_x: f64) -> f64;
|
||||
pub unsafe fn floorf64(x: f64) -> f64;
|
||||
/// Returns the largest integer less than or equal to an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::floor`](../../std/primitive.f128.html#method.floor)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn floorf128(_x: f128) -> f128;
|
||||
pub unsafe fn floorf128(x: f128) -> f128;
|
||||
|
||||
/// Returns the smallest integer greater than or equal to an `f16`.
|
||||
///
|
||||
@@ -2097,28 +2090,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::ceil`](../../std/primitive.f16.html#method.ceil)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn ceilf16(_x: f16) -> f16;
|
||||
pub unsafe fn ceilf16(x: f16) -> f16;
|
||||
/// Returns the smallest integer greater than or equal to an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::ceil`](../../std/primitive.f32.html#method.ceil)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn ceilf32(_x: f32) -> f32;
|
||||
pub unsafe fn ceilf32(x: f32) -> f32;
|
||||
/// Returns the smallest integer greater than or equal to an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::ceil`](../../std/primitive.f64.html#method.ceil)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn ceilf64(_x: f64) -> f64;
|
||||
pub unsafe fn ceilf64(x: f64) -> f64;
|
||||
/// Returns the smallest integer greater than or equal to an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::ceil`](../../std/primitive.f128.html#method.ceil)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn ceilf128(_x: f128) -> f128;
|
||||
pub unsafe fn ceilf128(x: f128) -> f128;
|
||||
|
||||
/// Returns the integer part of an `f16`.
|
||||
///
|
||||
@@ -2126,28 +2119,28 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
/// [`f16::trunc`](../../std/primitive.f16.html#method.trunc)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn truncf16(_x: f16) -> f16;
|
||||
pub unsafe fn truncf16(x: f16) -> f16;
|
||||
/// Returns the integer part of an `f32`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::trunc`](../../std/primitive.f32.html#method.trunc)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn truncf32(_x: f32) -> f32;
|
||||
pub unsafe fn truncf32(x: f32) -> f32;
|
||||
/// Returns the integer part of an `f64`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::trunc`](../../std/primitive.f64.html#method.trunc)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn truncf64(_x: f64) -> f64;
|
||||
pub unsafe fn truncf64(x: f64) -> f64;
|
||||
/// Returns the integer part of an `f128`.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::trunc`](../../std/primitive.f128.html#method.trunc)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn truncf128(_x: f128) -> f128;
|
||||
pub unsafe fn truncf128(x: f128) -> f128;
|
||||
|
||||
/// Returns the nearest integer to an `f16`. Rounds half-way cases to the number with an even
|
||||
/// least significant digit.
|
||||
@@ -2157,14 +2150,14 @@ pub fn select_unpredictable<T>(b: bool, true_val: T, false_val: T) -> T {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[cfg(not(bootstrap))]
|
||||
pub fn round_ties_even_f16(_x: f16) -> f16;
|
||||
pub fn round_ties_even_f16(x: f16) -> f16;
|
||||
|
||||
/// To be removed on next bootstrap bump.
|
||||
#[cfg(bootstrap)]
|
||||
pub fn round_ties_even_f16(x: f16) -> f16 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn rintf16(_x: f16) -> f16;
|
||||
unsafe fn rintf16(x: f16) -> f16;
|
||||
|
||||
// SAFETY: this intrinsic isn't actually unsafe
|
||||
unsafe { rintf16(x) }
|
||||
@@ -2178,14 +2171,14 @@ pub fn round_ties_even_f16(x: f16) -> f16 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[cfg(not(bootstrap))]
|
||||
pub fn round_ties_even_f32(_x: f32) -> f32;
|
||||
pub fn round_ties_even_f32(x: f32) -> f32;
|
||||
|
||||
/// To be removed on next bootstrap bump.
|
||||
#[cfg(bootstrap)]
|
||||
pub fn round_ties_even_f32(x: f32) -> f32 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn rintf32(_x: f32) -> f32;
|
||||
unsafe fn rintf32(x: f32) -> f32;
|
||||
|
||||
// SAFETY: this intrinsic isn't actually unsafe
|
||||
unsafe { rintf32(x) }
|
||||
@@ -2205,14 +2198,14 @@ pub unsafe fn rintf32(x: f32) -> f32 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[cfg(not(bootstrap))]
|
||||
pub fn round_ties_even_f64(_x: f64) -> f64;
|
||||
pub fn round_ties_even_f64(x: f64) -> f64;
|
||||
|
||||
/// To be removed on next bootstrap bump.
|
||||
#[cfg(bootstrap)]
|
||||
pub fn round_ties_even_f64(x: f64) -> f64 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn rintf64(_x: f64) -> f64;
|
||||
unsafe fn rintf64(x: f64) -> f64;
|
||||
|
||||
// SAFETY: this intrinsic isn't actually unsafe
|
||||
unsafe { rintf64(x) }
|
||||
@@ -2232,14 +2225,14 @@ pub unsafe fn rintf64(x: f64) -> f64 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
#[cfg(not(bootstrap))]
|
||||
pub fn round_ties_even_f128(_x: f128) -> f128;
|
||||
pub fn round_ties_even_f128(x: f128) -> f128;
|
||||
|
||||
/// To be removed on next bootstrap bump.
|
||||
#[cfg(bootstrap)]
|
||||
pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
unsafe fn rintf128(_x: f128) -> f128;
|
||||
unsafe fn rintf128(x: f128) -> f128;
|
||||
|
||||
// SAFETY: this intrinsic isn't actually unsafe
|
||||
unsafe { rintf128(x) }
|
||||
@@ -2251,28 +2244,28 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// [`f16::round`](../../std/primitive.f16.html#method.round)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn roundf16(_x: f16) -> f16;
|
||||
pub unsafe fn roundf16(x: f16) -> f16;
|
||||
/// Returns the nearest integer to an `f32`. Rounds half-way cases away from zero.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f32::round`](../../std/primitive.f32.html#method.round)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn roundf32(_x: f32) -> f32;
|
||||
pub unsafe fn roundf32(x: f32) -> f32;
|
||||
/// Returns the nearest integer to an `f64`. Rounds half-way cases away from zero.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f64::round`](../../std/primitive.f64.html#method.round)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn roundf64(_x: f64) -> f64;
|
||||
pub unsafe fn roundf64(x: f64) -> f64;
|
||||
/// Returns the nearest integer to an `f128`. Rounds half-way cases away from zero.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
/// [`f128::round`](../../std/primitive.f128.html#method.round)
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn roundf128(_x: f128) -> f128;
|
||||
pub unsafe fn roundf128(x: f128) -> f128;
|
||||
|
||||
/// Float addition that allows optimizations based on algebraic rules.
|
||||
/// May assume inputs are finite.
|
||||
@@ -2280,7 +2273,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fadd_fast<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub unsafe fn fadd_fast<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float subtraction that allows optimizations based on algebraic rules.
|
||||
/// May assume inputs are finite.
|
||||
@@ -2288,7 +2281,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fsub_fast<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub unsafe fn fsub_fast<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float multiplication that allows optimizations based on algebraic rules.
|
||||
/// May assume inputs are finite.
|
||||
@@ -2296,7 +2289,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fmul_fast<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub unsafe fn fmul_fast<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float division that allows optimizations based on algebraic rules.
|
||||
/// May assume inputs are finite.
|
||||
@@ -2304,7 +2297,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn fdiv_fast<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub unsafe fn fdiv_fast<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float remainder that allows optimizations based on algebraic rules.
|
||||
/// May assume inputs are finite.
|
||||
@@ -2312,7 +2305,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn frem_fast<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub unsafe fn frem_fast<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Converts with LLVM’s fptoui/fptosi, which may return undef for values out of range
|
||||
/// (<https://github.com/rust-lang/rust/issues/10184>)
|
||||
@@ -2320,42 +2313,42 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
/// Stabilized as [`f32::to_int_unchecked`] and [`f64::to_int_unchecked`].
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn float_to_int_unchecked<Float: Copy, Int: Copy>(_value: Float) -> Int;
|
||||
pub unsafe fn float_to_int_unchecked<Float: Copy, Int: Copy>(value: Float) -> Int;
|
||||
|
||||
/// Float addition that allows optimizations based on algebraic rules.
|
||||
///
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn fadd_algebraic<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub fn fadd_algebraic<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float subtraction that allows optimizations based on algebraic rules.
|
||||
///
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn fsub_algebraic<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub fn fsub_algebraic<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float multiplication that allows optimizations based on algebraic rules.
|
||||
///
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn fmul_algebraic<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub fn fmul_algebraic<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float division that allows optimizations based on algebraic rules.
|
||||
///
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn fdiv_algebraic<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub fn fdiv_algebraic<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Float remainder that allows optimizations based on algebraic rules.
|
||||
///
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub fn frem_algebraic<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub fn frem_algebraic<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Returns the number of bits set in an integer type `T`
|
||||
///
|
||||
@@ -2370,7 +2363,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn ctpop<T: Copy>(_x: T) -> u32;
|
||||
pub const fn ctpop<T: Copy>(x: T) -> u32;
|
||||
|
||||
/// Returns the number of leading unset bits (zeroes) in an integer type `T`.
|
||||
///
|
||||
@@ -2411,7 +2404,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn ctlz<T: Copy>(_x: T) -> u32;
|
||||
pub const fn ctlz<T: Copy>(x: T) -> u32;
|
||||
|
||||
/// Like `ctlz`, but extra-unsafe as it returns `undef` when
|
||||
/// given an `x` with value `0`.
|
||||
@@ -2433,7 +2426,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn ctlz_nonzero<T: Copy>(_x: T) -> u32;
|
||||
pub const unsafe fn ctlz_nonzero<T: Copy>(x: T) -> u32;
|
||||
|
||||
/// Returns the number of trailing unset bits (zeroes) in an integer type `T`.
|
||||
///
|
||||
@@ -2474,7 +2467,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn cttz<T: Copy>(_x: T) -> u32;
|
||||
pub const fn cttz<T: Copy>(x: T) -> u32;
|
||||
|
||||
/// Like `cttz`, but extra-unsafe as it returns `undef` when
|
||||
/// given an `x` with value `0`.
|
||||
@@ -2496,7 +2489,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn cttz_nonzero<T: Copy>(_x: T) -> u32;
|
||||
pub const unsafe fn cttz_nonzero<T: Copy>(x: T) -> u32;
|
||||
|
||||
/// Reverses the bytes in an integer type `T`.
|
||||
///
|
||||
@@ -2511,7 +2504,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn bswap<T: Copy>(_x: T) -> T;
|
||||
pub const fn bswap<T: Copy>(x: T) -> T;
|
||||
|
||||
/// Reverses the bits in an integer type `T`.
|
||||
///
|
||||
@@ -2526,7 +2519,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn bitreverse<T: Copy>(_x: T) -> T;
|
||||
pub const fn bitreverse<T: Copy>(x: T) -> T;
|
||||
|
||||
/// Does a three-way comparison between the two integer arguments.
|
||||
///
|
||||
@@ -2536,7 +2529,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
///
|
||||
/// The stabilized version of this intrinsic is [`Ord::cmp`].
|
||||
#[rustc_intrinsic]
|
||||
pub const fn three_way_compare<T: Copy>(_lhs: T, _rhss: T) -> crate::cmp::Ordering;
|
||||
pub const fn three_way_compare<T: Copy>(lhs: T, rhss: T) -> crate::cmp::Ordering;
|
||||
|
||||
/// Combine two values which have no bits in common.
|
||||
///
|
||||
@@ -2571,7 +2564,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn add_with_overflow<T: Copy>(_x: T, _y: T) -> (T, bool);
|
||||
pub const fn add_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
|
||||
|
||||
/// Performs checked integer subtraction
|
||||
///
|
||||
@@ -2586,7 +2579,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn sub_with_overflow<T: Copy>(_x: T, _y: T) -> (T, bool);
|
||||
pub const fn sub_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
|
||||
|
||||
/// Performs checked integer multiplication
|
||||
///
|
||||
@@ -2601,7 +2594,7 @@ pub fn round_ties_even_f128(x: f128) -> f128 {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn mul_with_overflow<T: Copy>(_x: T, _y: T) -> (T, bool);
|
||||
pub const fn mul_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
|
||||
|
||||
/// Performs full-width multiplication and addition with a carry:
|
||||
/// `multiplier * multiplicand + addend + carry`.
|
||||
@@ -2637,7 +2630,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
/// This intrinsic does not have a stable counterpart.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn exact_div<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn exact_div<T: Copy>(x: T, y: T) -> T;
|
||||
|
||||
/// Performs an unchecked division, resulting in undefined behavior
|
||||
/// where `y == 0` or `x == T::MIN && y == -1`
|
||||
@@ -2648,7 +2641,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_div<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn unchecked_div<T: Copy>(x: T, y: T) -> T;
|
||||
/// Returns the remainder of an unchecked division, resulting in
|
||||
/// undefined behavior when `y == 0` or `x == T::MIN && y == -1`
|
||||
///
|
||||
@@ -2658,7 +2651,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_rem<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn unchecked_rem<T: Copy>(x: T, y: T) -> T;
|
||||
|
||||
/// Performs an unchecked left shift, resulting in undefined behavior when
|
||||
/// `y < 0` or `y >= N`, where N is the width of T in bits.
|
||||
@@ -2669,7 +2662,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_shl<T: Copy, U: Copy>(_x: T, _y: U) -> T;
|
||||
pub const unsafe fn unchecked_shl<T: Copy, U: Copy>(x: T, y: U) -> T;
|
||||
/// Performs an unchecked right shift, resulting in undefined behavior when
|
||||
/// `y < 0` or `y >= N`, where N is the width of T in bits.
|
||||
///
|
||||
@@ -2679,7 +2672,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_shr<T: Copy, U: Copy>(_x: T, _y: U) -> T;
|
||||
pub const unsafe fn unchecked_shr<T: Copy, U: Copy>(x: T, y: U) -> T;
|
||||
|
||||
/// Returns the result of an unchecked addition, resulting in
|
||||
/// undefined behavior when `x + y > T::MAX` or `x + y < T::MIN`.
|
||||
@@ -2689,7 +2682,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_add<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn unchecked_add<T: Copy>(x: T, y: T) -> T;
|
||||
|
||||
/// Returns the result of an unchecked subtraction, resulting in
|
||||
/// undefined behavior when `x - y > T::MAX` or `x - y < T::MIN`.
|
||||
@@ -2699,7 +2692,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_sub<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn unchecked_sub<T: Copy>(x: T, y: T) -> T;
|
||||
|
||||
/// Returns the result of an unchecked multiplication, resulting in
|
||||
/// undefined behavior when `x * y > T::MAX` or `x * y < T::MIN`.
|
||||
@@ -2709,7 +2702,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn unchecked_mul<T: Copy>(_x: T, _y: T) -> T;
|
||||
pub const unsafe fn unchecked_mul<T: Copy>(x: T, y: T) -> T;
|
||||
|
||||
/// Performs rotate left.
|
||||
///
|
||||
@@ -2724,7 +2717,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn rotate_left<T: Copy>(_x: T, _shift: u32) -> T;
|
||||
pub const fn rotate_left<T: Copy>(x: T, shift: u32) -> T;
|
||||
|
||||
/// Performs rotate right.
|
||||
///
|
||||
@@ -2739,7 +2732,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn rotate_right<T: Copy>(_x: T, _shift: u32) -> T;
|
||||
pub const fn rotate_right<T: Copy>(x: T, shift: u32) -> T;
|
||||
|
||||
/// Returns (a + b) mod 2<sup>N</sup>, where N is the width of T in bits.
|
||||
///
|
||||
@@ -2754,7 +2747,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn wrapping_add<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub const fn wrapping_add<T: Copy>(a: T, b: T) -> T;
|
||||
/// Returns (a - b) mod 2<sup>N</sup>, where N is the width of T in bits.
|
||||
///
|
||||
/// Note that, unlike most intrinsics, this is safe to call;
|
||||
@@ -2768,7 +2761,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn wrapping_sub<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub const fn wrapping_sub<T: Copy>(a: T, b: T) -> T;
|
||||
/// Returns (a * b) mod 2<sup>N</sup>, where N is the width of T in bits.
|
||||
///
|
||||
/// Note that, unlike most intrinsics, this is safe to call;
|
||||
@@ -2782,7 +2775,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn wrapping_mul<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub const fn wrapping_mul<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// Computes `a + b`, saturating at numeric bounds.
|
||||
///
|
||||
@@ -2797,7 +2790,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn saturating_add<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub const fn saturating_add<T: Copy>(a: T, b: T) -> T;
|
||||
/// Computes `a - b`, saturating at numeric bounds.
|
||||
///
|
||||
/// Note that, unlike most intrinsics, this is safe to call;
|
||||
@@ -2811,7 +2804,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn saturating_sub<T: Copy>(_a: T, _b: T) -> T;
|
||||
pub const fn saturating_sub<T: Copy>(a: T, b: T) -> T;
|
||||
|
||||
/// This is an implementation detail of [`crate::ptr::read`] and should
|
||||
/// not be used anywhere else. See its comments for why this exists.
|
||||
@@ -2822,7 +2815,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn read_via_copy<T>(_ptr: *const T) -> T;
|
||||
pub const unsafe fn read_via_copy<T>(ptr: *const T) -> T;
|
||||
|
||||
/// This is an implementation detail of [`crate::ptr::write`] and should
|
||||
/// not be used anywhere else. See its comments for why this exists.
|
||||
@@ -2833,7 +2826,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn write_via_move<T>(_ptr: *mut T, _value: T);
|
||||
pub const unsafe fn write_via_move<T>(ptr: *mut T, value: T);
|
||||
|
||||
/// Returns the value of the discriminant for the variant in 'v';
|
||||
/// if `T` has no discriminant, returns `0`.
|
||||
@@ -2847,7 +2840,7 @@ pub const fn carrying_mul_add<T: ~const fallback::CarryingMulAdd<Unsigned = U>,
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn discriminant_value<T>(_v: &T) -> <T as DiscriminantKind>::Discriminant;
|
||||
pub const fn discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
|
||||
|
||||
/// Rust's "try catch" construct for unwinding. Invokes the function pointer `try_fn` with the
|
||||
/// data pointer `data`, and calls `catch_fn` if unwinding occurs while `try_fn` runs.
|
||||
@@ -2881,19 +2874,19 @@ pub unsafe fn catch_unwind(
|
||||
/// in ways that are not allowed for regular writes).
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn nontemporal_store<T>(_ptr: *mut T, _val: T);
|
||||
pub unsafe fn nontemporal_store<T>(ptr: *mut T, val: T);
|
||||
|
||||
/// See documentation of `<*const T>::offset_from` for details.
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn ptr_offset_from<T>(_ptr: *const T, _base: *const T) -> isize;
|
||||
pub const unsafe fn ptr_offset_from<T>(ptr: *const T, base: *const T) -> isize;
|
||||
|
||||
/// See documentation of `<*const T>::sub_ptr` for details.
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
pub const unsafe fn ptr_offset_from_unsigned<T>(_ptr: *const T, _base: *const T) -> usize;
|
||||
pub const unsafe fn ptr_offset_from_unsigned<T>(ptr: *const T, base: *const T) -> usize;
|
||||
|
||||
/// See documentation of `<*const T>::guaranteed_eq` for details.
|
||||
/// Returns `2` if the result is unknown.
|
||||
@@ -2933,7 +2926,7 @@ pub const fn ptr_guaranteed_cmp<T>(ptr: *const T, other: *const T) -> u8 {
|
||||
/// which is UB if any of their inputs are `undef`.)
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn raw_eq<T>(_a: &T, _b: &T) -> bool;
|
||||
pub const unsafe fn raw_eq<T>(a: &T, b: &T) -> bool;
|
||||
|
||||
/// Lexicographically compare `[left, left + bytes)` and `[right, right + bytes)`
|
||||
/// as unsigned bytes, returning negative if `left` is less, zero if all the
|
||||
@@ -2951,7 +2944,7 @@ pub const fn ptr_guaranteed_cmp<T>(ptr: *const T, other: *const T) -> u8 {
|
||||
/// [valid]: crate::ptr#safety
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn compare_bytes(_left: *const u8, _right: *const u8, _bytes: usize) -> i32;
|
||||
pub const unsafe fn compare_bytes(left: *const u8, right: *const u8, bytes: usize) -> i32;
|
||||
|
||||
/// See documentation of [`std::hint::black_box`] for details.
|
||||
///
|
||||
@@ -2959,7 +2952,7 @@ pub const fn ptr_guaranteed_cmp<T>(ptr: *const T, other: *const T) -> u8 {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
pub const fn black_box<T>(_dummy: T) -> T;
|
||||
pub const fn black_box<T>(dummy: T) -> T;
|
||||
|
||||
/// Selects which function to call depending on the context.
|
||||
///
|
||||
@@ -3318,7 +3311,7 @@ pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, con
|
||||
#[rustc_nounwind]
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn vtable_size(_ptr: *const ()) -> usize;
|
||||
pub unsafe fn vtable_size(ptr: *const ()) -> usize;
|
||||
|
||||
/// The intrinsic will return the alignment stored in that vtable.
|
||||
///
|
||||
@@ -3328,7 +3321,7 @@ pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, con
|
||||
#[rustc_nounwind]
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn vtable_align(_ptr: *const ()) -> usize;
|
||||
pub unsafe fn vtable_align(ptr: *const ()) -> usize;
|
||||
|
||||
/// The size of a type in bytes.
|
||||
///
|
||||
@@ -3395,7 +3388,7 @@ pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, con
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
pub const unsafe fn size_of_val<T: ?Sized>(_ptr: *const T) -> usize;
|
||||
pub const unsafe fn size_of_val<T: ?Sized>(ptr: *const T) -> usize;
|
||||
|
||||
/// The required alignment of the referenced value.
|
||||
///
|
||||
@@ -3408,7 +3401,7 @@ pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, con
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
pub const unsafe fn min_align_of_val<T: ?Sized>(_ptr: *const T) -> usize;
|
||||
pub const unsafe fn min_align_of_val<T: ?Sized>(ptr: *const T) -> usize;
|
||||
|
||||
/// Gets a static string slice containing the name of a type.
|
||||
///
|
||||
@@ -3447,7 +3440,7 @@ pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, con
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn aggregate_raw_ptr<P: AggregateRawPtr<D, Metadata = M>, D, M>(_data: D, _meta: M) -> P;
|
||||
pub const fn aggregate_raw_ptr<P: AggregateRawPtr<D, Metadata = M>, D, M>(data: D, meta: M) -> P;
|
||||
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
pub trait AggregateRawPtr<D> {
|
||||
@@ -3467,7 +3460,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[unstable(feature = "core_intrinsics", issue = "none")]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn ptr_metadata<P: ptr::Pointee<Metadata = M> + ?Sized, M>(_ptr: *const P) -> M;
|
||||
pub const fn ptr_metadata<P: ptr::Pointee<Metadata = M> + ?Sized, M>(ptr: *const P) -> M;
|
||||
|
||||
// Some functions are defined here because they accidentally got made
|
||||
// available in this module on stable. See <https://github.com/rust-lang/rust/issues/15702>.
|
||||
@@ -3569,7 +3562,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
const unsafe fn copy_nonoverlapping<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
|
||||
|
||||
ub_checks::assert_unsafe_precondition!(
|
||||
check_language_ub,
|
||||
@@ -3670,7 +3663,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
const unsafe fn copy<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
const unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize);
|
||||
|
||||
// SAFETY: the safety contract for `copy` must be upheld by the caller.
|
||||
unsafe {
|
||||
@@ -3750,7 +3743,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
const unsafe fn write_bytes<T>(_dst: *mut T, _val: u8, _count: usize);
|
||||
const unsafe fn write_bytes<T>(dst: *mut T, val: u8, count: usize);
|
||||
|
||||
// SAFETY: the safety contract for `write_bytes` must be upheld by the caller.
|
||||
unsafe {
|
||||
@@ -3778,7 +3771,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f16::min`]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn minnumf16(_x: f16, _y: f16) -> f16;
|
||||
pub const fn minnumf16(x: f16, y: f16) -> f16;
|
||||
|
||||
/// Returns the minimum of two `f32` values.
|
||||
///
|
||||
@@ -3792,7 +3785,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn minnumf32(_x: f32, _y: f32) -> f32;
|
||||
pub const fn minnumf32(x: f32, y: f32) -> f32;
|
||||
|
||||
/// Returns the minimum of two `f64` values.
|
||||
///
|
||||
@@ -3806,7 +3799,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn minnumf64(_x: f64, _y: f64) -> f64;
|
||||
pub const fn minnumf64(x: f64, y: f64) -> f64;
|
||||
|
||||
/// Returns the minimum of two `f128` values.
|
||||
///
|
||||
@@ -3819,7 +3812,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f128::min`]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn minnumf128(_x: f128, _y: f128) -> f128;
|
||||
pub const fn minnumf128(x: f128, y: f128) -> f128;
|
||||
|
||||
/// Returns the maximum of two `f16` values.
|
||||
///
|
||||
@@ -3832,7 +3825,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f16::max`]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn maxnumf16(_x: f16, _y: f16) -> f16;
|
||||
pub const fn maxnumf16(x: f16, y: f16) -> f16;
|
||||
|
||||
/// Returns the maximum of two `f32` values.
|
||||
///
|
||||
@@ -3846,7 +3839,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn maxnumf32(_x: f32, _y: f32) -> f32;
|
||||
pub const fn maxnumf32(x: f32, y: f32) -> f32;
|
||||
|
||||
/// Returns the maximum of two `f64` values.
|
||||
///
|
||||
@@ -3860,7 +3853,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn maxnumf64(_x: f64, _y: f64) -> f64;
|
||||
pub const fn maxnumf64(x: f64, y: f64) -> f64;
|
||||
|
||||
/// Returns the maximum of two `f128` values.
|
||||
///
|
||||
@@ -3873,7 +3866,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f128::max`]
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn maxnumf128(_x: f128, _y: f128) -> f128;
|
||||
pub const fn maxnumf128(x: f128, y: f128) -> f128;
|
||||
|
||||
/// Returns the absolute value of an `f16`.
|
||||
///
|
||||
@@ -3881,7 +3874,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f16::abs`](../../std/primitive.f16.html#method.abs)
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn fabsf16(_x: f16) -> f16;
|
||||
pub const unsafe fn fabsf16(x: f16) -> f16;
|
||||
|
||||
/// Returns the absolute value of an `f32`.
|
||||
///
|
||||
@@ -3890,7 +3883,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn fabsf32(_x: f32) -> f32;
|
||||
pub const unsafe fn fabsf32(x: f32) -> f32;
|
||||
|
||||
/// Returns the absolute value of an `f64`.
|
||||
///
|
||||
@@ -3899,7 +3892,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn fabsf64(_x: f64) -> f64;
|
||||
pub const unsafe fn fabsf64(x: f64) -> f64;
|
||||
|
||||
/// Returns the absolute value of an `f128`.
|
||||
///
|
||||
@@ -3907,7 +3900,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f128::abs`](../../std/primitive.f128.html#method.abs)
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn fabsf128(_x: f128) -> f128;
|
||||
pub const unsafe fn fabsf128(x: f128) -> f128;
|
||||
|
||||
/// Copies the sign from `y` to `x` for `f16` values.
|
||||
///
|
||||
@@ -3915,7 +3908,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f16::copysign`](../../std/primitive.f16.html#method.copysign)
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn copysignf16(_x: f16, _y: f16) -> f16;
|
||||
pub const unsafe fn copysignf16(x: f16, y: f16) -> f16;
|
||||
|
||||
/// Copies the sign from `y` to `x` for `f32` values.
|
||||
///
|
||||
@@ -3924,7 +3917,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn copysignf32(_x: f32, _y: f32) -> f32;
|
||||
pub const unsafe fn copysignf32(x: f32, y: f32) -> f32;
|
||||
/// Copies the sign from `y` to `x` for `f64` values.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is
|
||||
@@ -3932,7 +3925,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic_const_stable_indirect]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn copysignf64(_x: f64, _y: f64) -> f64;
|
||||
pub const unsafe fn copysignf64(x: f64, y: f64) -> f64;
|
||||
|
||||
/// Copies the sign from `y` to `x` for `f128` values.
|
||||
///
|
||||
@@ -3940,7 +3933,7 @@ impl<P: ?Sized, T: ptr::Thin> AggregateRawPtr<*mut T> for *mut P {
|
||||
/// [`f128::copysign`](../../std/primitive.f128.html#method.copysign)
|
||||
#[rustc_nounwind]
|
||||
#[rustc_intrinsic]
|
||||
pub const unsafe fn copysignf128(_x: f128, _y: f128) -> f128;
|
||||
pub const unsafe fn copysignf128(x: f128, y: f128) -> f128;
|
||||
|
||||
/// Inform Miri that a given pointer definitely has a certain alignment.
|
||||
#[cfg(miri)]
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/// `idx` must be in-bounds of the vector.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub const unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T;
|
||||
pub const unsafe fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T;
|
||||
|
||||
/// Extracts an element from a vector.
|
||||
///
|
||||
@@ -22,28 +22,28 @@
|
||||
/// `idx` must be in-bounds of the vector.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub const unsafe fn simd_extract<T, U>(_x: T, _idx: u32) -> U;
|
||||
pub const unsafe fn simd_extract<T, U>(x: T, idx: u32) -> U;
|
||||
|
||||
/// Adds two simd vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers or floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_add<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_add<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Subtracts `rhs` from `lhs` elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers or floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_sub<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_sub<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// Multiplies two simd vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers or floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_mul<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_mul<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Divides `lhs` by `rhs` elementwise.
|
||||
///
|
||||
@@ -54,7 +54,7 @@
|
||||
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_div<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_div<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// Returns remainder of two vectors elementwise.
|
||||
///
|
||||
@@ -65,7 +65,7 @@
|
||||
/// Additionally for signed integers, `<int>::MIN / -1` is undefined behavior.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_rem<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_rem<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// Shifts vector left elementwise, with UB on overflow.
|
||||
///
|
||||
@@ -78,7 +78,7 @@
|
||||
/// Each element of `rhs` must be less than `<int>::BITS`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shl<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_shl<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// Shifts vector right elementwise, with UB on overflow.
|
||||
///
|
||||
@@ -91,28 +91,28 @@
|
||||
/// Each element of `rhs` must be less than `<int>::BITS`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shr<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_shr<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// "Ands" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_and<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_and<T>(x: T, y: T) -> T;
|
||||
|
||||
/// "Ors" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_or<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_or<T>(x: T, y: T) -> T;
|
||||
|
||||
/// "Exclusive ors" vectors elementwise.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_xor<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_xor<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Numerically casts a vector, elementwise.
|
||||
///
|
||||
@@ -133,7 +133,7 @@
|
||||
/// * Be representable in the return type, after truncating off its fractional part
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cast<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_cast<T, U>(x: T) -> U;
|
||||
|
||||
/// Numerically casts a vector, elementwise.
|
||||
///
|
||||
@@ -147,7 +147,7 @@
|
||||
/// Otherwise, truncates or extends the value, maintaining the sign for signed integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_as<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_as<T, U>(x: T) -> U;
|
||||
|
||||
/// Negates a vector elementwise.
|
||||
///
|
||||
@@ -156,14 +156,14 @@
|
||||
/// Rust panics for `-<int>::Min` due to overflow, but it is not UB with this intrinsic.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_neg<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_neg<T>(x: T) -> T;
|
||||
|
||||
/// Returns absolute value of a vector, elementwise.
|
||||
///
|
||||
/// `T` must be a vector of floating-point primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fabs<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_fabs<T>(x: T) -> T;
|
||||
|
||||
/// Returns the minimum of two vectors, elementwise.
|
||||
///
|
||||
@@ -172,7 +172,7 @@
|
||||
/// Follows IEEE-754 `minNum` semantics.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fmin<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_fmin<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Returns the maximum of two vectors, elementwise.
|
||||
///
|
||||
@@ -181,7 +181,7 @@
|
||||
/// Follows IEEE-754 `maxNum` semantics.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fmax<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_fmax<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Tests elementwise equality of two vectors.
|
||||
///
|
||||
@@ -192,7 +192,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_eq<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_eq<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Tests elementwise inequality equality of two vectors.
|
||||
///
|
||||
@@ -203,7 +203,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ne<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_ne<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Tests if `x` is less than `y`, elementwise.
|
||||
///
|
||||
@@ -214,7 +214,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_lt<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_lt<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Tests if `x` is less than or equal to `y`, elementwise.
|
||||
///
|
||||
@@ -225,7 +225,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_le<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_le<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Tests if `x` is greater than `y`, elementwise.
|
||||
///
|
||||
@@ -236,7 +236,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_gt<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_gt<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Tests if `x` is greater than or equal to `y`, elementwise.
|
||||
///
|
||||
@@ -247,7 +247,7 @@
|
||||
/// Returns `0` for false and `!0` for true.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ge<T, U>(_x: T, _y: T) -> U;
|
||||
pub unsafe fn simd_ge<T, U>(x: T, y: T) -> U;
|
||||
|
||||
/// Shuffles two vectors by const indices.
|
||||
///
|
||||
@@ -263,7 +263,7 @@
|
||||
/// of `xy`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_shuffle<T, U, V>(_x: T, _y: T, _idx: U) -> V;
|
||||
pub unsafe fn simd_shuffle<T, U, V>(x: T, y: T, idx: U) -> V;
|
||||
|
||||
/// Reads a vector of pointers.
|
||||
///
|
||||
@@ -284,7 +284,7 @@
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_gather<T, U, V>(_val: T, _ptr: U, _mask: V) -> T;
|
||||
pub unsafe fn simd_gather<T, U, V>(val: T, ptr: U, mask: V) -> T;
|
||||
|
||||
/// Writes to a vector of pointers.
|
||||
///
|
||||
@@ -308,7 +308,7 @@
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_scatter<T, U, V>(_val: T, _ptr: U, _mask: V);
|
||||
pub unsafe fn simd_scatter<T, U, V>(val: T, ptr: U, mask: V);
|
||||
|
||||
/// Reads a vector of pointers.
|
||||
///
|
||||
@@ -331,7 +331,7 @@
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_masked_load<V, U, T>(_mask: V, _ptr: U, _val: T) -> T;
|
||||
pub unsafe fn simd_masked_load<V, U, T>(mask: V, ptr: U, val: T) -> T;
|
||||
|
||||
/// Writes to a vector of pointers.
|
||||
///
|
||||
@@ -353,14 +353,14 @@
|
||||
/// `mask` must only contain `0` or `!0` values.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_masked_store<V, U, T>(_mask: V, _ptr: U, _val: T);
|
||||
pub unsafe fn simd_masked_store<V, U, T>(mask: V, ptr: U, val: T);
|
||||
|
||||
/// Adds two simd vectors elementwise, with saturation.
|
||||
///
|
||||
/// `T` must be a vector of integer primitive types.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_saturating_add<T>(_x: T, _y: T) -> T;
|
||||
pub unsafe fn simd_saturating_add<T>(x: T, y: T) -> T;
|
||||
|
||||
/// Subtracts two simd vectors elementwise, with saturation.
|
||||
///
|
||||
@@ -369,7 +369,7 @@
|
||||
/// Subtract `rhs` from `lhs`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_saturating_sub<T>(_lhs: T, _rhs: T) -> T;
|
||||
pub unsafe fn simd_saturating_sub<T>(lhs: T, rhs: T) -> T;
|
||||
|
||||
/// Adds elements within a vector from left to right.
|
||||
///
|
||||
@@ -380,7 +380,7 @@
|
||||
/// Starting with the value `y`, add the elements of `x` and accumulate.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_add_ordered<T, U>(_x: T, _y: U) -> U;
|
||||
pub unsafe fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U;
|
||||
|
||||
/// Adds elements within a vector in arbitrary order. May also be re-associated with
|
||||
/// unordered additions on the inputs/outputs.
|
||||
@@ -390,7 +390,7 @@
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_add_unordered<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_add_unordered<T, U>(x: T) -> U;
|
||||
|
||||
/// Multiplies elements within a vector from left to right.
|
||||
///
|
||||
@@ -401,7 +401,7 @@
|
||||
/// Starting with the value `y`, multiply the elements of `x` and accumulate.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_mul_ordered<T, U>(_x: T, _y: U) -> U;
|
||||
pub unsafe fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U;
|
||||
|
||||
/// Multiplies elements within a vector in arbitrary order. May also be re-associated with
|
||||
/// unordered additions on the inputs/outputs.
|
||||
@@ -411,7 +411,7 @@
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_mul_unordered<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
|
||||
|
||||
/// Checks if all mask values are true.
|
||||
///
|
||||
@@ -421,7 +421,7 @@
|
||||
/// `x` must contain only `0` or `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_all<T>(_x: T) -> bool;
|
||||
pub unsafe fn simd_reduce_all<T>(x: T) -> bool;
|
||||
|
||||
/// Checks if any mask value is true.
|
||||
///
|
||||
@@ -431,7 +431,7 @@
|
||||
/// `x` must contain only `0` or `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_any<T>(_x: T) -> bool;
|
||||
pub unsafe fn simd_reduce_any<T>(x: T) -> bool;
|
||||
|
||||
/// Returns the maximum element of a vector.
|
||||
///
|
||||
@@ -442,7 +442,7 @@
|
||||
/// For floating-point values, uses IEEE-754 `maxNum`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_max<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_max<T, U>(x: T) -> U;
|
||||
|
||||
/// Returns the minimum element of a vector.
|
||||
///
|
||||
@@ -453,7 +453,7 @@
|
||||
/// For floating-point values, uses IEEE-754 `minNum`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_min<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_min<T, U>(x: T) -> U;
|
||||
|
||||
/// Logical "ands" all elements together.
|
||||
///
|
||||
@@ -462,7 +462,7 @@
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_and<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_and<T, U>(x: T) -> U;
|
||||
|
||||
/// Logical "ors" all elements together.
|
||||
///
|
||||
@@ -471,7 +471,7 @@
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_or<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_or<T, U>(x: T) -> U;
|
||||
|
||||
/// Logical "exclusive ors" all elements together.
|
||||
///
|
||||
@@ -480,7 +480,7 @@
|
||||
/// `U` must be the element type of `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_reduce_xor<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_reduce_xor<T, U>(x: T) -> U;
|
||||
|
||||
/// Truncates an integer vector to a bitmask.
|
||||
///
|
||||
@@ -517,7 +517,7 @@
|
||||
/// `x` must contain only `0` and `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bitmask<T, U>(_x: T) -> U;
|
||||
pub unsafe fn simd_bitmask<T, U>(x: T) -> U;
|
||||
|
||||
/// Selects elements from a mask.
|
||||
///
|
||||
@@ -533,7 +533,7 @@
|
||||
/// `mask` must only contain `0` and `!0`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_select<M, T>(_mask: M, _if_true: T, _if_false: T) -> T;
|
||||
pub unsafe fn simd_select<M, T>(mask: M, if_true: T, if_false: T) -> T;
|
||||
|
||||
/// Selects elements from a bitmask.
|
||||
///
|
||||
@@ -551,7 +551,7 @@
|
||||
/// Padding bits must be all zero.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_select_bitmask<M, T>(_m: M, _yes: T, _no: T) -> T;
|
||||
pub unsafe fn simd_select_bitmask<M, T>(m: M, yes: T, no: T) -> T;
|
||||
|
||||
/// Calculates the offset from a pointer vector elementwise, potentially
|
||||
/// wrapping.
|
||||
@@ -563,14 +563,14 @@
|
||||
/// Operates as if by `<ptr>::wrapping_offset`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_arith_offset<T, U>(_ptr: T, _offset: U) -> T;
|
||||
pub unsafe fn simd_arith_offset<T, U>(ptr: T, offset: U) -> T;
|
||||
|
||||
/// Casts a vector of pointers.
|
||||
///
|
||||
/// `T` and `U` must be vectors of pointers with the same number of elements.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cast_ptr<T, U>(_ptr: T) -> U;
|
||||
pub unsafe fn simd_cast_ptr<T, U>(ptr: T) -> U;
|
||||
|
||||
/// Exposes a vector of pointers as a vector of addresses.
|
||||
///
|
||||
@@ -579,7 +579,7 @@
|
||||
/// `U` must be a vector of `usize` with the same length as `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_expose_provenance<T, U>(_ptr: T) -> U;
|
||||
pub unsafe fn simd_expose_provenance<T, U>(ptr: T) -> U;
|
||||
|
||||
/// Creates a vector of pointers from a vector of addresses.
|
||||
///
|
||||
@@ -588,56 +588,56 @@
|
||||
/// `U` must be a vector of pointers, with the same length as `T`.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_with_exposed_provenance<T, U>(_addr: T) -> U;
|
||||
pub unsafe fn simd_with_exposed_provenance<T, U>(addr: T) -> U;
|
||||
|
||||
/// Swaps bytes of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bswap<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_bswap<T>(x: T) -> T;
|
||||
|
||||
/// Reverses bits of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_bitreverse<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_bitreverse<T>(x: T) -> T;
|
||||
|
||||
/// Counts the leading zeros of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ctlz<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_ctlz<T>(x: T) -> T;
|
||||
|
||||
/// Counts the number of ones in each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ctpop<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_ctpop<T>(x: T) -> T;
|
||||
|
||||
/// Counts the trailing zeros of each element.
|
||||
///
|
||||
/// `T` must be a vector of integers.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_cttz<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_cttz<T>(x: T) -> T;
|
||||
|
||||
/// Rounds up each element to the next highest integer-valued float.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_ceil<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_ceil<T>(x: T) -> T;
|
||||
|
||||
/// Rounds down each element to the next lowest integer-valued float.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_floor<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_floor<T>(x: T) -> T;
|
||||
|
||||
/// Rounds each element to the closest integer-valued float.
|
||||
/// Ties are resolved by rounding away from 0.
|
||||
@@ -645,7 +645,7 @@
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_round<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_round<T>(x: T) -> T;
|
||||
|
||||
/// Returns the integer part of each element as an integer-valued float.
|
||||
/// In other words, non-integer values are truncated towards zero.
|
||||
@@ -653,21 +653,21 @@
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_trunc<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_trunc<T>(x: T) -> T;
|
||||
|
||||
/// Takes the square root of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fsqrt<T>(_x: T) -> T;
|
||||
pub unsafe fn simd_fsqrt<T>(x: T) -> T;
|
||||
|
||||
/// Computes `(x*y) + z` for each element, but without any intermediate rounding.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fma<T>(_x: T, _y: T, _z: T) -> T;
|
||||
pub unsafe fn simd_fma<T>(x: T, y: T, z: T) -> T;
|
||||
|
||||
/// Computes `(x*y) + z` for each element, non-deterministically executing either
|
||||
/// a fused multiply-add or two operations with rounding of the intermediate result.
|
||||
@@ -682,53 +682,53 @@
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_relaxed_fma<T>(_x: T, _y: T, _z: T) -> T;
|
||||
pub unsafe fn simd_relaxed_fma<T>(x: T, y: T, z: T) -> T;
|
||||
|
||||
// Computes the sine of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fsin<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_fsin<T>(a: T) -> T;
|
||||
|
||||
// Computes the cosine of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fcos<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_fcos<T>(a: T) -> T;
|
||||
|
||||
// Computes the exponential function of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fexp<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_fexp<T>(a: T) -> T;
|
||||
|
||||
// Computes 2 raised to the power of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_fexp2<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_fexp2<T>(a: T) -> T;
|
||||
|
||||
// Computes the base 10 logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog10<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_flog10<T>(a: T) -> T;
|
||||
|
||||
// Computes the base 2 logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog2<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_flog2<T>(a: T) -> T;
|
||||
|
||||
// Computes the natural logarithm of each element.
|
||||
///
|
||||
/// `T` must be a vector of floats.
|
||||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn simd_flog<T>(_a: T) -> T;
|
||||
pub unsafe fn simd_flog<T>(a: T) -> T;
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
use crate::ffi::OsString;
|
||||
use crate::fmt;
|
||||
use crate::hash::{Hash, Hasher};
|
||||
use crate::hash::Hash;
|
||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, SeekFrom};
|
||||
use crate::path::{Path, PathBuf};
|
||||
use crate::sys::time::SystemTime;
|
||||
use crate::sys::unsupported;
|
||||
|
||||
#[expect(dead_code)]
|
||||
const FILE_PERMISSIONS_MASK: u64 = r_efi::protocols::file::READ_ONLY;
|
||||
|
||||
pub struct File(!);
|
||||
|
||||
pub struct FileAttr(!);
|
||||
#[derive(Clone)]
|
||||
pub struct FileAttr {
|
||||
attr: u64,
|
||||
size: u64,
|
||||
}
|
||||
|
||||
pub struct ReadDir(!);
|
||||
|
||||
@@ -20,42 +27,40 @@ pub struct OpenOptions {}
|
||||
#[derive(Copy, Clone, Debug, Default)]
|
||||
pub struct FileTimes {}
|
||||
|
||||
pub struct FilePermissions(!);
|
||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||
// Bool indicates if file is readonly
|
||||
pub struct FilePermissions(bool);
|
||||
|
||||
pub struct FileType(!);
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
|
||||
// Bool indicates if directory
|
||||
pub struct FileType(bool);
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct DirBuilder {}
|
||||
|
||||
impl FileAttr {
|
||||
pub fn size(&self) -> u64 {
|
||||
self.0
|
||||
self.size
|
||||
}
|
||||
|
||||
pub fn perm(&self) -> FilePermissions {
|
||||
self.0
|
||||
FilePermissions::from_attr(self.attr)
|
||||
}
|
||||
|
||||
pub fn file_type(&self) -> FileType {
|
||||
self.0
|
||||
FileType::from_attr(self.attr)
|
||||
}
|
||||
|
||||
pub fn modified(&self) -> io::Result<SystemTime> {
|
||||
self.0
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn accessed(&self) -> io::Result<SystemTime> {
|
||||
self.0
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn created(&self) -> io::Result<SystemTime> {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl Clone for FileAttr {
|
||||
fn clone(&self) -> FileAttr {
|
||||
self.0
|
||||
unsupported()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,28 +69,17 @@ pub fn readonly(&self) -> bool {
|
||||
self.0
|
||||
}
|
||||
|
||||
pub fn set_readonly(&mut self, _readonly: bool) {
|
||||
self.0
|
||||
pub fn set_readonly(&mut self, readonly: bool) {
|
||||
self.0 = readonly
|
||||
}
|
||||
}
|
||||
|
||||
impl Clone for FilePermissions {
|
||||
fn clone(&self) -> FilePermissions {
|
||||
self.0
|
||||
const fn from_attr(attr: u64) -> Self {
|
||||
Self(attr & r_efi::protocols::file::READ_ONLY != 0)
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for FilePermissions {
|
||||
fn eq(&self, _other: &FilePermissions) -> bool {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for FilePermissions {}
|
||||
|
||||
impl fmt::Debug for FilePermissions {
|
||||
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
self.0
|
||||
#[expect(dead_code)]
|
||||
const fn to_attr(&self) -> u64 {
|
||||
if self.0 { r_efi::protocols::file::READ_ONLY } else { 0 }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,39 +94,16 @@ pub fn is_dir(&self) -> bool {
|
||||
}
|
||||
|
||||
pub fn is_file(&self) -> bool {
|
||||
self.0
|
||||
!self.is_dir()
|
||||
}
|
||||
|
||||
// Symlinks are not supported in UEFI
|
||||
pub fn is_symlink(&self) -> bool {
|
||||
self.0
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl Clone for FileType {
|
||||
fn clone(&self) -> FileType {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl Copy for FileType {}
|
||||
|
||||
impl PartialEq for FileType {
|
||||
fn eq(&self, _other: &FileType) -> bool {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl Eq for FileType {}
|
||||
|
||||
impl Hash for FileType {
|
||||
fn hash<H: Hasher>(&self, _h: &mut H) {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for FileType {
|
||||
fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
self.0
|
||||
const fn from_attr(attr: u64) -> Self {
|
||||
Self(attr & r_efi::protocols::file::DIRECTORY != 0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,8 +274,8 @@ pub fn rename(_old: &Path, _new: &Path) -> io::Result<()> {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn set_perm(_p: &Path, perm: FilePermissions) -> io::Result<()> {
|
||||
match perm.0 {}
|
||||
pub fn set_perm(_p: &Path, _perm: FilePermissions) -> io::Result<()> {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
pub fn rmdir(_p: &Path) -> io::Result<()> {
|
||||
|
||||
@@ -194,11 +194,7 @@ fn run(self, builder: &Builder<'_>) {
|
||||
trace!(?compiler_to_use);
|
||||
|
||||
if compiler_to_use != compiler {
|
||||
trace!(
|
||||
?compiler_to_use,
|
||||
?compiler,
|
||||
"compiler != compiler_to_use, handling cross-compile scenario"
|
||||
);
|
||||
trace!(?compiler_to_use, ?compiler, "compiler != compiler_to_use, uplifting library");
|
||||
|
||||
builder.ensure(Std::new(compiler_to_use, target));
|
||||
let msg = if compiler_to_use.host == target {
|
||||
|
||||
@@ -1045,8 +1045,11 @@ fn cargo(
|
||||
// so this line allows the use of custom libcs.
|
||||
cargo.env("LIBC_CHECK_CFG", "1");
|
||||
|
||||
let mut lint_flags = Vec::new();
|
||||
|
||||
// Lints for all in-tree code: compiler, rustdoc, cranelift, gcc,
|
||||
// clippy, rustfmt, rust-analyzer, etc.
|
||||
if source_type == SourceType::InTree {
|
||||
let mut lint_flags = Vec::new();
|
||||
// When extending this list, add the new lints to the RUSTFLAGS of the
|
||||
// build_bootstrap function of src/bootstrap/bootstrap.py as well as
|
||||
// some code doesn't go through this `rustc` wrapper.
|
||||
@@ -1058,28 +1061,33 @@ fn cargo(
|
||||
rustdocflags.arg("-Dwarnings");
|
||||
}
|
||||
|
||||
// This does not use RUSTFLAGS due to caching issues with Cargo.
|
||||
// Clippy is treated as an "in tree" tool, but shares the same
|
||||
// cache as other "submodule" tools. With these options set in
|
||||
// RUSTFLAGS, that causes *every* shared dependency to be rebuilt.
|
||||
// By injecting this into the rustc wrapper, this circumvents
|
||||
// Cargo's fingerprint detection. This is fine because lint flags
|
||||
// are always ignored in dependencies. Eventually this should be
|
||||
// fixed via better support from Cargo.
|
||||
cargo.env("RUSTC_LINT_FLAGS", lint_flags.join(" "));
|
||||
|
||||
rustdocflags.arg("-Wrustdoc::invalid_codeblock_attributes");
|
||||
}
|
||||
|
||||
// Lints just for `compiler/` crates.
|
||||
if mode == Mode::Rustc {
|
||||
rustflags.arg("-Wrustc::internal");
|
||||
rustflags.arg("-Drustc::symbol_intern_string_literal");
|
||||
lint_flags.push("-Wrustc::internal");
|
||||
lint_flags.push("-Drustc::symbol_intern_string_literal");
|
||||
// FIXME(edition_2024): Change this to `-Wrust_2024_idioms` when all
|
||||
// of the individual lints are satisfied.
|
||||
rustflags.arg("-Wkeyword_idents_2024");
|
||||
rustflags.arg("-Wunsafe_op_in_unsafe_fn");
|
||||
lint_flags.push("-Wkeyword_idents_2024");
|
||||
lint_flags.push("-Wunreachable_pub");
|
||||
lint_flags.push("-Wunsafe_op_in_unsafe_fn");
|
||||
}
|
||||
|
||||
// This does not use RUSTFLAGS for two reasons.
|
||||
// - Due to caching issues with Cargo. Clippy is treated as an "in
|
||||
// tree" tool, but shares the same cache as other "submodule" tools.
|
||||
// With these options set in RUSTFLAGS, that causes *every* shared
|
||||
// dependency to be rebuilt. By injecting this into the rustc
|
||||
// wrapper, this circumvents Cargo's fingerprint detection. This is
|
||||
// fine because lint flags are always ignored in dependencies.
|
||||
// Eventually this should be fixed via better support from Cargo.
|
||||
// - RUSTFLAGS is ignored for proc macro crates that are being built on
|
||||
// the host (because `--target` is given). But we want the lint flags
|
||||
// to be applied to proc macro crates.
|
||||
cargo.env("RUSTC_LINT_FLAGS", lint_flags.join(" "));
|
||||
|
||||
if self.config.rust_frame_pointers {
|
||||
rustflags.arg("-Cforce-frame-pointers=true");
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
// Directly call intrinsic to avoid debug assertions in libstd
|
||||
#[rustc_intrinsic]
|
||||
unsafe fn copy_nonoverlapping<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
|
||||
|
||||
fn main() {
|
||||
let mut data = [0u8; 16];
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
// Directly call intrinsic to avoid debug assertions in libstd
|
||||
#[rustc_intrinsic]
|
||||
unsafe fn copy_nonoverlapping<T>(_src: *const T, _dst: *mut T, _count: usize);
|
||||
unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
|
||||
|
||||
fn main() {
|
||||
let mut data = [0u16; 8];
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
mod rusti {
|
||||
#[rustc_intrinsic]
|
||||
pub unsafe fn ctlz_nonzero<T>(_x: T) -> u32;
|
||||
pub unsafe fn ctlz_nonzero<T>(x: T) -> u32;
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user