Auto merge of #138480 - jhpratt:rollup-y3b8wu5, r=jhpratt
Rollup of 16 pull requests Successful merges: - #136001 (Overhaul examples for PermissionsExt) - #136230 (Reword incorrect documentation about SocketAddr having varying layout) - #136892 (Sync Fuchsia target spec with clang Fuchsia driver) - #136911 (Add documentation URL to selected jobs) - #137870 ( Improve HashMap docs for const and static initializers) - #138179 (Add `src/tools/x` to the main workspace) - #138389 (use `expect` instead of `allow`) - #138396 (Enable metrics and verbose tests in PR CI) - #138398 (atomic intrinsics: clarify which types are supported and (if applicable) what happens with provenance) - #138432 (fix: remove the check of lld not supporting `@response-file)` - #138434 (Visit `PatField` when collecting lint levels) - #138441 (update error message) - #138442 (EUV: fix place of deref pattern's interior's scrutinee) - #138457 (Remove usage of legacy scheme paths on RedoxOS) - #138461 (Remove an outdated line from a test comment) - #138466 (Remove myself from libs review) Failed merges: - #138452 (Remove `RUN_CHECK_WITH_PARALLEL_QUERIES`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
f7b4354283
49 changed files with 493 additions and 217 deletions
17
.github/workflows/ci.yml
vendored
17
.github/workflows/ci.yml
vendored
|
@ -68,6 +68,7 @@ jobs:
|
|||
timeout-minutes: 360
|
||||
env:
|
||||
CI_JOB_NAME: ${{ matrix.name }}
|
||||
CI_JOB_DOC_URL: ${{ matrix.doc_url }}
|
||||
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
|
||||
# commit of PR sha or commit sha. `GITHUB_SHA` is not accurate for PRs.
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
|
@ -190,8 +191,20 @@ jobs:
|
|||
CARGO_INCREMENTAL=0 CARGO_TARGET_DIR=../../../build/citool cargo build
|
||||
|
||||
- name: run the build
|
||||
# Redirect stderr to stdout to avoid reordering the two streams in the GHA logs.
|
||||
run: src/ci/scripts/run-build-from-ci.sh 2>&1
|
||||
run: |
|
||||
set +e
|
||||
# Redirect stderr to stdout to avoid reordering the two streams in the GHA logs.
|
||||
src/ci/scripts/run-build-from-ci.sh 2>&1
|
||||
STATUS=$?
|
||||
set -e
|
||||
|
||||
if [[ "$STATUS" -ne 0 && -n "$CI_JOB_DOC_URL" ]]; then
|
||||
echo "****************************************************************************"
|
||||
echo "To find more information about this job, visit the following URL:"
|
||||
echo "$CI_JOB_DOC_URL"
|
||||
echo "****************************************************************************"
|
||||
fi
|
||||
exit ${STATUS}
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ env.CACHES_AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets[format('AWS_SECRET_ACCESS_KEY_{0}', env.CACHES_AWS_ACCESS_KEY_ID)] }}
|
||||
|
|
|
@ -6438,6 +6438,10 @@ version = "0.5.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
|
||||
|
||||
[[package]]
|
||||
name = "x"
|
||||
version = "0.1.1"
|
||||
|
||||
[[package]]
|
||||
name = "xattr"
|
||||
version = "1.4.0"
|
||||
|
|
66
Cargo.toml
66
Cargo.toml
|
@ -1,50 +1,53 @@
|
|||
[workspace]
|
||||
resolver = "2"
|
||||
members = [
|
||||
# tidy-alphabetical-start
|
||||
"compiler/rustc",
|
||||
"src/build_helper",
|
||||
"src/etc/test-float-parse",
|
||||
"src/rustc-std-workspace/rustc-std-workspace-core",
|
||||
"src/rustc-std-workspace/rustc-std-workspace-alloc",
|
||||
"src/rustc-std-workspace/rustc-std-workspace-core",
|
||||
"src/rustc-std-workspace/rustc-std-workspace-std",
|
||||
"src/rustdoc-json-types",
|
||||
"src/tools/build-manifest",
|
||||
"src/tools/bump-stage0",
|
||||
"src/tools/cargotest",
|
||||
"src/tools/clippy",
|
||||
"src/tools/clippy/clippy_dev",
|
||||
"src/tools/collect-license-metadata",
|
||||
"src/tools/compiletest",
|
||||
"src/tools/run-make-support",
|
||||
"src/tools/linkchecker",
|
||||
"src/tools/lint-docs",
|
||||
"src/tools/miropt-test-tools",
|
||||
"src/tools/unstable-book-gen",
|
||||
"src/tools/tidy",
|
||||
"src/tools/tier-check",
|
||||
"src/tools/build-manifest",
|
||||
"src/tools/remote-test-client",
|
||||
"src/tools/remote-test-server",
|
||||
"src/tools/rust-installer",
|
||||
"src/tools/rustdoc",
|
||||
"src/tools/rustfmt",
|
||||
"src/tools/miri",
|
||||
"src/tools/miri/cargo-miri",
|
||||
"src/tools/rustdoc-themes",
|
||||
"src/tools/unicode-table-generator",
|
||||
"src/tools/coverage-dump",
|
||||
"src/tools/features-status-dump",
|
||||
"src/tools/generate-copyright",
|
||||
"src/tools/generate-windows-sys",
|
||||
"src/tools/html-checker",
|
||||
"src/tools/jsondocck",
|
||||
"src/tools/jsondoclint",
|
||||
"src/tools/llvm-bitcode-linker",
|
||||
"src/tools/html-checker",
|
||||
"src/tools/bump-stage0",
|
||||
"src/tools/replace-version-placeholder",
|
||||
"src/tools/linkchecker",
|
||||
"src/tools/lint-docs",
|
||||
"src/tools/lld-wrapper",
|
||||
"src/tools/collect-license-metadata",
|
||||
"src/tools/generate-copyright",
|
||||
"src/tools/suggest-tests",
|
||||
"src/tools/generate-windows-sys",
|
||||
"src/tools/rustdoc-gui-test",
|
||||
"src/tools/llvm-bitcode-linker",
|
||||
"src/tools/miri",
|
||||
"src/tools/miri/cargo-miri",
|
||||
"src/tools/miropt-test-tools",
|
||||
"src/tools/opt-dist",
|
||||
"src/tools/coverage-dump",
|
||||
"src/tools/remote-test-client",
|
||||
"src/tools/remote-test-server",
|
||||
"src/tools/replace-version-placeholder",
|
||||
"src/tools/run-make-support",
|
||||
"src/tools/rust-installer",
|
||||
"src/tools/rustdoc",
|
||||
"src/tools/rustdoc-gui-test",
|
||||
"src/tools/rustdoc-themes",
|
||||
"src/tools/rustfmt",
|
||||
"src/tools/suggest-tests",
|
||||
"src/tools/tidy",
|
||||
"src/tools/tier-check",
|
||||
"src/tools/unicode-table-generator",
|
||||
"src/tools/unstable-book-gen",
|
||||
"src/tools/wasm-component-ld",
|
||||
"src/tools/features-status-dump",
|
||||
"src/tools/x",
|
||||
# tidy-alphabetical-end
|
||||
]
|
||||
|
||||
exclude = [
|
||||
|
@ -55,11 +58,6 @@ exclude = [
|
|||
"tests/rustdoc-gui",
|
||||
# HACK(eddyb) This hardcodes the fact that our CI uses `/checkout/obj`.
|
||||
"obj",
|
||||
# The `x` binary is a thin wrapper that calls `x.py`, which initializes
|
||||
# submodules, before which workspace members cannot be invoked because
|
||||
# not all `Cargo.toml` files are available, so we exclude the `x` binary,
|
||||
# so it can be invoked before the current checkout is set up.
|
||||
"src/tools/x",
|
||||
]
|
||||
|
||||
[profile.release.package.rustc-rayon-core]
|
||||
|
|
|
@ -1031,7 +1031,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
|
|||
|
||||
let layout = src.layout();
|
||||
match layout.ty.kind() {
|
||||
ty::Uint(_) | ty::Int(_) | ty::RawPtr(..) => {}
|
||||
ty::Int(_) => {}
|
||||
_ => {
|
||||
report_atomic_type_validation_error(fx, intrinsic, source_info.span, layout.ty);
|
||||
return Ok(());
|
||||
|
@ -1052,7 +1052,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
|
|||
|
||||
let layout = src.layout();
|
||||
match layout.ty.kind() {
|
||||
ty::Uint(_) | ty::Int(_) | ty::RawPtr(..) => {}
|
||||
ty::Uint(_) => {}
|
||||
_ => {
|
||||
report_atomic_type_validation_error(fx, intrinsic, source_info.span, layout.ty);
|
||||
return Ok(());
|
||||
|
@ -1073,7 +1073,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
|
|||
|
||||
let layout = src.layout();
|
||||
match layout.ty.kind() {
|
||||
ty::Uint(_) | ty::Int(_) | ty::RawPtr(..) => {}
|
||||
ty::Int(_) => {}
|
||||
_ => {
|
||||
report_atomic_type_validation_error(fx, intrinsic, source_info.span, layout.ty);
|
||||
return Ok(());
|
||||
|
@ -1094,7 +1094,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
|
|||
|
||||
let layout = src.layout();
|
||||
match layout.ty.kind() {
|
||||
ty::Uint(_) | ty::Int(_) | ty::RawPtr(..) => {}
|
||||
ty::Uint(_) => {}
|
||||
_ => {
|
||||
report_atomic_type_validation_error(fx, intrinsic, source_info.span, layout.ty);
|
||||
return Ok(());
|
||||
|
|
|
@ -143,13 +143,6 @@ impl Command {
|
|||
return false;
|
||||
}
|
||||
|
||||
// Right now LLD doesn't support the `@` syntax of passing an argument
|
||||
// through files, so regardless of the platform we try to go to the OS
|
||||
// on this one.
|
||||
if let Program::Lld(..) = self.program {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Ok so on Windows to spawn a process is 32,768 characters in its
|
||||
// command line [1]. Unfortunately we don't actually have access to that
|
||||
// as it's calculated just before spawning. Instead we perform a
|
||||
|
|
|
@ -433,6 +433,40 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
}
|
||||
|
||||
// These are all AtomicRMW ops
|
||||
"max" | "min" => {
|
||||
let atom_op = if instruction == "max" {
|
||||
AtomicRmwBinOp::AtomicMax
|
||||
} else {
|
||||
AtomicRmwBinOp::AtomicMin
|
||||
};
|
||||
|
||||
let ty = fn_args.type_at(0);
|
||||
if matches!(ty.kind(), ty::Int(_)) {
|
||||
let ptr = args[0].immediate();
|
||||
let val = args[1].immediate();
|
||||
bx.atomic_rmw(atom_op, ptr, val, parse_ordering(bx, ordering))
|
||||
} else {
|
||||
invalid_monomorphization(ty);
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
"umax" | "umin" => {
|
||||
let atom_op = if instruction == "umax" {
|
||||
AtomicRmwBinOp::AtomicUMax
|
||||
} else {
|
||||
AtomicRmwBinOp::AtomicUMin
|
||||
};
|
||||
|
||||
let ty = fn_args.type_at(0);
|
||||
if matches!(ty.kind(), ty::Uint(_)) {
|
||||
let ptr = args[0].immediate();
|
||||
let val = args[1].immediate();
|
||||
bx.atomic_rmw(atom_op, ptr, val, parse_ordering(bx, ordering))
|
||||
} else {
|
||||
invalid_monomorphization(ty);
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
op => {
|
||||
let atom_op = match op {
|
||||
"xchg" => AtomicRmwBinOp::AtomicXchg,
|
||||
|
@ -442,10 +476,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
"nand" => AtomicRmwBinOp::AtomicNand,
|
||||
"or" => AtomicRmwBinOp::AtomicOr,
|
||||
"xor" => AtomicRmwBinOp::AtomicXor,
|
||||
"max" => AtomicRmwBinOp::AtomicMax,
|
||||
"min" => AtomicRmwBinOp::AtomicMin,
|
||||
"umax" => AtomicRmwBinOp::AtomicUMax,
|
||||
"umin" => AtomicRmwBinOp::AtomicUMin,
|
||||
_ => bx.sess().dcx().emit_fatal(errors::UnknownAtomicOperation),
|
||||
};
|
||||
|
||||
|
|
|
@ -1840,7 +1840,8 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
|
|||
let ty = self.pat_ty_adjusted(subpat)?;
|
||||
let ty = Ty::new_ref(self.cx.tcx(), re_erased, ty, mutability);
|
||||
// A deref pattern generates a temporary.
|
||||
let place = self.cat_rvalue(pat.hir_id, ty);
|
||||
let base = self.cat_rvalue(pat.hir_id, ty);
|
||||
let place = self.cat_deref(pat.hir_id, base)?;
|
||||
self.cat_pattern(place, subpat, op)?;
|
||||
}
|
||||
|
||||
|
|
|
@ -299,6 +299,11 @@ impl<'tcx> Visitor<'tcx> for LintLevelsBuilder<'_, LintLevelQueryMap<'tcx>> {
|
|||
intravisit::walk_expr(self, e);
|
||||
}
|
||||
|
||||
fn visit_pat_field(&mut self, f: &'tcx hir::PatField<'tcx>) -> Self::Result {
|
||||
self.add_id(f.hir_id);
|
||||
intravisit::walk_pat_field(self, f);
|
||||
}
|
||||
|
||||
fn visit_expr_field(&mut self, f: &'tcx hir::ExprField<'tcx>) {
|
||||
self.add_id(f.hir_id);
|
||||
intravisit::walk_expr_field(self, f);
|
||||
|
|
|
@ -7,7 +7,7 @@ pub(crate) fn opts() -> TargetOptions {
|
|||
// now. When using clang as the linker it will supply these options for us,
|
||||
// so we only list them for ld/lld.
|
||||
//
|
||||
// https://github.com/llvm/llvm-project/blob/db9322b2066c55254e7691efeab863f43bfcc084/clang/lib/Driver/ToolChains/Fuchsia.cpp#L31
|
||||
// https://github.com/llvm/llvm-project/blob/0419db6b95e246fe9dc90b5795beb77c393eb2ce/clang/lib/Driver/ToolChains/Fuchsia.cpp#L32
|
||||
let pre_link_args = TargetOptions::link_args(
|
||||
LinkerFlavor::Gnu(Cc::No, Lld::No),
|
||||
&[
|
||||
|
@ -18,9 +18,13 @@ pub(crate) fn opts() -> TargetOptions {
|
|||
"-z",
|
||||
"now",
|
||||
"-z",
|
||||
"start-stop-visibility=hidden",
|
||||
"-z",
|
||||
"rodynamic",
|
||||
"-z",
|
||||
"separate-loadable-segments",
|
||||
"-z",
|
||||
"rel",
|
||||
"--pack-dyn-relocs=relr",
|
||||
],
|
||||
);
|
||||
|
|
|
@ -1,6 +1,28 @@
|
|||
use crate::spec::{SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base};
|
||||
use crate::spec::{
|
||||
Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
|
||||
};
|
||||
|
||||
pub(crate) fn target() -> Target {
|
||||
let mut base = base::fuchsia::opts();
|
||||
base.cpu = "generic".into();
|
||||
base.features = "+v8a,+crc,+aes,+sha2,+neon".into();
|
||||
base.max_atomic_width = Some(128);
|
||||
base.stack_probes = StackProbeType::Inline;
|
||||
base.supported_sanitizers = SanitizerSet::ADDRESS
|
||||
| SanitizerSet::CFI
|
||||
| SanitizerSet::LEAK
|
||||
| SanitizerSet::SHADOWCALLSTACK;
|
||||
base.supports_xray = true;
|
||||
|
||||
base.add_pre_link_args(
|
||||
LinkerFlavor::Gnu(Cc::No, Lld::No),
|
||||
&[
|
||||
"--execute-only",
|
||||
// Enable the Cortex-A53 errata 843419 mitigation by default
|
||||
"--fix-cortex-a53-843419",
|
||||
],
|
||||
);
|
||||
|
||||
Target {
|
||||
llvm_target: "aarch64-unknown-fuchsia".into(),
|
||||
metadata: TargetMetadata {
|
||||
|
@ -12,14 +34,6 @@ pub(crate) fn target() -> Target {
|
|||
pointer_width: 64,
|
||||
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
|
||||
arch: "aarch64".into(),
|
||||
options: TargetOptions {
|
||||
features: "+v8a".into(),
|
||||
max_atomic_width: Some(128),
|
||||
stack_probes: StackProbeType::Inline,
|
||||
supported_sanitizers: SanitizerSet::ADDRESS
|
||||
| SanitizerSet::CFI
|
||||
| SanitizerSet::SHADOWCALLSTACK,
|
||||
..base::fuchsia::opts()
|
||||
},
|
||||
options: base,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,16 @@
|
|||
use crate::spec::{CodeModel, SanitizerSet, Target, TargetMetadata, TargetOptions, base};
|
||||
use crate::spec::{CodeModel, SanitizerSet, StackProbeType, Target, TargetMetadata, base};
|
||||
|
||||
pub(crate) fn target() -> Target {
|
||||
let mut base = base::fuchsia::opts();
|
||||
base.code_model = Some(CodeModel::Medium);
|
||||
base.cpu = "generic-rv64".into();
|
||||
base.features = "+m,+a,+f,+d,+c".into();
|
||||
base.llvm_abiname = "lp64d".into();
|
||||
base.max_atomic_width = Some(64);
|
||||
base.stack_probes = StackProbeType::Inline;
|
||||
base.supported_sanitizers = SanitizerSet::SHADOWCALLSTACK;
|
||||
base.supports_xray = true;
|
||||
|
||||
Target {
|
||||
llvm_target: "riscv64-unknown-fuchsia".into(),
|
||||
metadata: TargetMetadata {
|
||||
|
@ -12,14 +22,6 @@ pub(crate) fn target() -> Target {
|
|||
pointer_width: 64,
|
||||
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
|
||||
arch: "riscv64".into(),
|
||||
options: TargetOptions {
|
||||
code_model: Some(CodeModel::Medium),
|
||||
cpu: "generic-rv64".into(),
|
||||
features: "+m,+a,+f,+d,+c".into(),
|
||||
llvm_abiname: "lp64d".into(),
|
||||
max_atomic_width: Some(64),
|
||||
supported_sanitizers: SanitizerSet::SHADOWCALLSTACK,
|
||||
..base::fuchsia::opts()
|
||||
},
|
||||
options: base,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,10 @@ pub(crate) fn target() -> Target {
|
|||
let mut base = base::fuchsia::opts();
|
||||
base.cpu = "x86-64".into();
|
||||
base.plt_by_default = false;
|
||||
base.max_atomic_width = Some(64);
|
||||
// See https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0073_x86_64_platform_requirement,
|
||||
// which corresponds to x86-64-v2.
|
||||
base.features = "+cx16,+sahf,+popcnt,+sse3,+sse4.1,+sse4.2,+ssse3".into();
|
||||
base.max_atomic_width = Some(128);
|
||||
base.stack_probes = StackProbeType::Inline;
|
||||
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK;
|
||||
base.supports_xray = true;
|
||||
|
|
|
@ -90,6 +90,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
|||
// memory, which is not valid for either `&` or `&mut`.
|
||||
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -99,6 +100,7 @@ pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -108,6 +110,7 @@ pub unsafe fn atomic_cxchg_relaxed_relaxed<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -117,6 +120,7 @@ pub unsafe fn atomic_cxchg_relaxed_acquire<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -126,6 +130,7 @@ pub unsafe fn atomic_cxchg_relaxed_seqcst<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -135,6 +140,7 @@ pub unsafe fn atomic_cxchg_acquire_relaxed<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -144,6 +150,7 @@ pub unsafe fn atomic_cxchg_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -153,6 +160,7 @@ pub unsafe fn atomic_cxchg_acquire_seqcst<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -162,6 +170,7 @@ pub unsafe fn atomic_cxchg_release_relaxed<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -171,6 +180,7 @@ pub unsafe fn atomic_cxchg_release_acquire<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -180,6 +190,7 @@ pub unsafe fn atomic_cxchg_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -189,6 +200,7 @@ pub unsafe fn atomic_cxchg_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -198,6 +210,7 @@ pub unsafe fn atomic_cxchg_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -207,6 +220,7 @@ pub unsafe fn atomic_cxchg_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -216,6 +230,7 @@ pub unsafe fn atomic_cxchg_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange` method by passing
|
||||
|
@ -226,6 +241,7 @@ pub unsafe fn atomic_cxchg_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src: T)
|
|||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -239,6 +255,7 @@ pub unsafe fn atomic_cxchgweak_relaxed_relaxed<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -252,6 +269,7 @@ pub unsafe fn atomic_cxchgweak_relaxed_acquire<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -261,6 +279,7 @@ pub unsafe fn atomic_cxchgweak_relaxed_acquire<T: Copy>(
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -274,6 +293,7 @@ pub unsafe fn atomic_cxchgweak_acquire_relaxed<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -287,6 +307,7 @@ pub unsafe fn atomic_cxchgweak_acquire_acquire<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -296,6 +317,7 @@ pub unsafe fn atomic_cxchgweak_acquire_acquire<T: Copy>(
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -309,6 +331,7 @@ pub unsafe fn atomic_cxchgweak_release_relaxed<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -322,6 +345,7 @@ pub unsafe fn atomic_cxchgweak_release_acquire<T: Copy>(
|
|||
_src: T,
|
||||
) -> (T, bool);
|
||||
/// Stores a value if the current value is the same as the `old` value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -331,6 +355,7 @@ pub unsafe fn atomic_cxchgweak_release_acquire<T: Copy>(
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -340,6 +365,7 @@ pub unsafe fn atomic_cxchgweak_release_seqcst<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -349,6 +375,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -358,6 +385,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -367,6 +395,7 @@ pub unsafe fn atomic_cxchgweak_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -376,6 +405,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `compare_exchange_weak` method by passing
|
||||
|
@ -386,6 +416,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src:
|
|||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `load` method by passing
|
||||
|
@ -394,6 +425,7 @@ pub unsafe fn atomic_cxchgweak_seqcst_seqcst<T: Copy>(dst: *mut T, old: T, src:
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_seqcst<T: Copy>(src: *const T) -> T;
|
||||
/// Loads the current value of the pointer.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `load` method by passing
|
||||
|
@ -402,6 +434,7 @@ pub unsafe fn atomic_load_seqcst<T: Copy>(src: *const T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_load_acquire<T: Copy>(src: *const T) -> T;
|
||||
/// Loads the current value of the pointer.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `load` method by passing
|
||||
|
@ -417,6 +450,7 @@ pub unsafe fn atomic_load_relaxed<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `store` method by passing
|
||||
|
@ -425,6 +459,7 @@ pub unsafe fn atomic_load_unordered<T: Copy>(src: *const T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_seqcst<T: Copy>(dst: *mut T, val: T);
|
||||
/// Stores the value at the specified memory location.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `store` method by passing
|
||||
|
@ -433,6 +468,7 @@ pub unsafe fn atomic_store_seqcst<T: Copy>(dst: *mut T, val: T);
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_store_release<T: Copy>(dst: *mut T, val: T);
|
||||
/// Stores the value at the specified memory location.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `store` method by passing
|
||||
|
@ -448,6 +484,7 @@ pub unsafe fn atomic_store_relaxed<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `swap` method by passing
|
||||
|
@ -456,6 +493,7 @@ pub unsafe fn atomic_store_unordered<T: Copy>(dst: *mut T, val: T);
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `swap` method by passing
|
||||
|
@ -464,6 +502,7 @@ pub unsafe fn atomic_xchg_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `swap` method by passing
|
||||
|
@ -472,6 +511,7 @@ pub unsafe fn atomic_xchg_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `swap` method by passing
|
||||
|
@ -480,6 +520,7 @@ pub unsafe fn atomic_xchg_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `swap` method by passing
|
||||
|
@ -489,6 +530,9 @@ pub unsafe fn atomic_xchg_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_add` method by passing
|
||||
|
@ -497,6 +541,9 @@ pub unsafe fn atomic_xchg_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_add` method by passing
|
||||
|
@ -505,6 +552,9 @@ pub unsafe fn atomic_xadd_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_add` method by passing
|
||||
|
@ -513,6 +563,9 @@ pub unsafe fn atomic_xadd_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_add` method by passing
|
||||
|
@ -521,6 +574,9 @@ pub unsafe fn atomic_xadd_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xadd_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Adds to the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_add` method by passing
|
||||
|
@ -530,6 +586,9 @@ pub unsafe fn atomic_xadd_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_sub` method by passing
|
||||
|
@ -538,6 +597,9 @@ pub unsafe fn atomic_xadd_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_sub` method by passing
|
||||
|
@ -546,6 +608,9 @@ pub unsafe fn atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_sub` method by passing
|
||||
|
@ -554,6 +619,9 @@ pub unsafe fn atomic_xsub_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_sub` method by passing
|
||||
|
@ -562,6 +630,9 @@ pub unsafe fn atomic_xsub_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xsub_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Subtract from the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_sub` method by passing
|
||||
|
@ -571,6 +642,9 @@ pub unsafe fn atomic_xsub_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_and` method by passing
|
||||
|
@ -579,6 +653,9 @@ pub unsafe fn atomic_xsub_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_and` method by passing
|
||||
|
@ -587,6 +664,9 @@ pub unsafe fn atomic_and_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_and` method by passing
|
||||
|
@ -595,6 +675,9 @@ pub unsafe fn atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_and` method by passing
|
||||
|
@ -603,6 +686,9 @@ pub unsafe fn atomic_and_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_and_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise and with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_and` method by passing
|
||||
|
@ -612,6 +698,9 @@ pub unsafe fn atomic_and_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`AtomicBool`] type via the `fetch_nand` method by passing
|
||||
|
@ -620,6 +709,9 @@ pub unsafe fn atomic_and_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`AtomicBool`] type via the `fetch_nand` method by passing
|
||||
|
@ -628,6 +720,9 @@ pub unsafe fn atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`AtomicBool`] type via the `fetch_nand` method by passing
|
||||
|
@ -636,6 +731,9 @@ pub unsafe fn atomic_nand_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`AtomicBool`] type via the `fetch_nand` method by passing
|
||||
|
@ -644,6 +742,9 @@ pub unsafe fn atomic_nand_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_nand_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise nand with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`AtomicBool`] type via the `fetch_nand` method by passing
|
||||
|
@ -653,6 +754,9 @@ pub unsafe fn atomic_nand_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_or` method by passing
|
||||
|
@ -661,6 +765,9 @@ pub unsafe fn atomic_nand_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_or` method by passing
|
||||
|
@ -669,6 +776,9 @@ pub unsafe fn atomic_or_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_or` method by passing
|
||||
|
@ -677,6 +787,9 @@ pub unsafe fn atomic_or_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_or` method by passing
|
||||
|
@ -685,6 +798,9 @@ pub unsafe fn atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_or_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise or with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_or` method by passing
|
||||
|
@ -694,6 +810,9 @@ pub unsafe fn atomic_or_acqrel<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.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_xor` method by passing
|
||||
|
@ -702,6 +821,9 @@ pub unsafe fn atomic_or_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_xor` method by passing
|
||||
|
@ -710,6 +832,9 @@ pub unsafe fn atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_xor` method by passing
|
||||
|
@ -718,6 +843,9 @@ pub unsafe fn atomic_xor_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_xor` method by passing
|
||||
|
@ -726,6 +854,9 @@ pub unsafe fn atomic_xor_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_xor_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Bitwise xor with the current value, returning the previous value.
|
||||
/// `T` must be an integer or pointer type.
|
||||
/// If `T` is a pointer type, the provenance of `src` is ignored: both the return value and the new
|
||||
/// value stored at `*dst` will have the provenance of the old value stored there.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] types via the `fetch_xor` method by passing
|
||||
|
@ -735,6 +866,7 @@ pub unsafe fn atomic_xor_acqrel<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.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_max` method by passing
|
||||
|
@ -743,6 +875,7 @@ pub unsafe fn atomic_xor_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_max` method by passing
|
||||
|
@ -751,6 +884,7 @@ pub unsafe fn atomic_max_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_max` method by passing
|
||||
|
@ -759,6 +893,7 @@ pub unsafe fn atomic_max_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_max` method by passing
|
||||
|
@ -766,7 +901,8 @@ pub unsafe fn atomic_max_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_intrinsic]
|
||||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_max_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value.
|
||||
/// Maximum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_max` method by passing
|
||||
|
@ -776,6 +912,7 @@ pub unsafe fn atomic_max_acqrel<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.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_min` method by passing
|
||||
|
@ -784,6 +921,7 @@ pub unsafe fn atomic_max_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_min` method by passing
|
||||
|
@ -792,6 +930,7 @@ pub unsafe fn atomic_min_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_min` method by passing
|
||||
|
@ -800,6 +939,7 @@ pub unsafe fn atomic_min_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_min` method by passing
|
||||
|
@ -808,6 +948,7 @@ pub unsafe fn atomic_min_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_min_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using a signed comparison.
|
||||
/// `T` must be a signed integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] signed integer types via the `fetch_min` method by passing
|
||||
|
@ -817,6 +958,7 @@ pub unsafe fn atomic_min_acqrel<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.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_min` method by passing
|
||||
|
@ -825,6 +967,7 @@ pub unsafe fn atomic_min_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_min` method by passing
|
||||
|
@ -833,6 +976,7 @@ pub unsafe fn atomic_umin_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_min` method by passing
|
||||
|
@ -841,6 +985,7 @@ pub unsafe fn atomic_umin_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_min` method by passing
|
||||
|
@ -849,6 +994,7 @@ pub unsafe fn atomic_umin_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umin_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Minimum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_min` method by passing
|
||||
|
@ -858,6 +1004,7 @@ pub unsafe fn atomic_umin_acqrel<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.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_max` method by passing
|
||||
|
@ -866,6 +1013,7 @@ pub unsafe fn atomic_umin_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_max` method by passing
|
||||
|
@ -874,6 +1022,7 @@ pub unsafe fn atomic_umax_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_max` method by passing
|
||||
|
@ -882,6 +1031,7 @@ pub unsafe fn atomic_umax_acquire<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_release<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_max` method by passing
|
||||
|
@ -890,6 +1040,7 @@ pub unsafe fn atomic_umax_release<T: Copy>(dst: *mut T, src: T) -> T;
|
|||
#[rustc_nounwind]
|
||||
pub unsafe fn atomic_umax_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
|
||||
/// Maximum with the current value using an unsigned comparison.
|
||||
/// `T` must be an unsigned integer type.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is available on the
|
||||
/// [`atomic`] unsigned integer types via the `fetch_max` method by passing
|
||||
|
|
|
@ -8,11 +8,15 @@ use crate::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
|||
/// as possibly some version-dependent additional information. See [`SocketAddrV4`]'s and
|
||||
/// [`SocketAddrV6`]'s respective documentation for more details.
|
||||
///
|
||||
/// The size of a `SocketAddr` instance may vary depending on the target operating
|
||||
/// system.
|
||||
///
|
||||
/// [IP address]: IpAddr
|
||||
///
|
||||
/// # Portability
|
||||
///
|
||||
/// `SocketAddr` is intended to be a portable representation of socket addresses and is likely not
|
||||
/// the same as the internal socket address type used by the target operating system's API. Like all
|
||||
/// `repr(Rust)` structs, however, its exact layout remains undefined and should not be relied upon
|
||||
/// between builds.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
|
@ -42,13 +46,16 @@ pub enum SocketAddr {
|
|||
///
|
||||
/// See [`SocketAddr`] for a type encompassing both IPv4 and IPv6 socket addresses.
|
||||
///
|
||||
/// The size of a `SocketAddrV4` struct may vary depending on the target operating
|
||||
/// system. Do not assume that this type has the same memory layout as the underlying
|
||||
/// system representation.
|
||||
///
|
||||
/// [IETF RFC 793]: https://tools.ietf.org/html/rfc793
|
||||
/// [`IPv4` address]: Ipv4Addr
|
||||
///
|
||||
/// # Portability
|
||||
///
|
||||
/// `SocketAddrV4` is intended to be a portable representation of socket addresses and is likely not
|
||||
/// the same as the internal socket address type used by the target operating system's API. Like all
|
||||
/// `repr(Rust)` structs, however, its exact layout remains undefined and should not be relied upon
|
||||
/// between builds.
|
||||
///
|
||||
/// # Textual representation
|
||||
///
|
||||
/// `SocketAddrV4` provides a [`FromStr`](crate::str::FromStr) implementation.
|
||||
|
@ -84,13 +91,16 @@ pub struct SocketAddrV4 {
|
|||
///
|
||||
/// See [`SocketAddr`] for a type encompassing both IPv4 and IPv6 socket addresses.
|
||||
///
|
||||
/// The size of a `SocketAddrV6` struct may vary depending on the target operating
|
||||
/// system. Do not assume that this type has the same memory layout as the underlying
|
||||
/// system representation.
|
||||
///
|
||||
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
|
||||
/// [`IPv6` address]: Ipv6Addr
|
||||
///
|
||||
/// # Portability
|
||||
///
|
||||
/// `SocketAddrV6` is intended to be a portable representation of socket addresses and is likely not
|
||||
/// the same as the internal socket address type used by the target operating system's API. Like all
|
||||
/// `repr(Rust)` structs, however, its exact layout remains undefined and should not be relied upon
|
||||
/// between builds.
|
||||
///
|
||||
/// # Textual representation
|
||||
///
|
||||
/// `SocketAddrV6` provides a [`FromStr`](crate::str::FromStr) implementation,
|
||||
|
|
|
@ -208,20 +208,32 @@ use crate::ops::Index;
|
|||
/// # Usage in `const` and `static`
|
||||
///
|
||||
/// As explained above, `HashMap` is randomly seeded: each `HashMap` instance uses a different seed,
|
||||
/// which means that `HashMap::new` cannot be used in const context. To construct a `HashMap` in the
|
||||
/// initializer of a `const` or `static` item, you will have to use a different hasher that does not
|
||||
/// involve a random seed, as demonstrated in the following example. **A `HashMap` constructed this
|
||||
/// way is not resistant against HashDoS!**
|
||||
/// which means that `HashMap::new` normally cannot be used in a `const` or `static` initializer.
|
||||
///
|
||||
/// However, if you need to use a `HashMap` in a `const` or `static` initializer while retaining
|
||||
/// random seed generation, you can wrap the `HashMap` in [`LazyLock`].
|
||||
///
|
||||
/// Alternatively, you can construct a `HashMap` in a `const` or `static` initializer using a different
|
||||
/// hasher that does not rely on a random seed. **Be aware that a `HashMap` created this way is not
|
||||
/// resistant to HashDoS attacks!**
|
||||
///
|
||||
/// [`LazyLock`]: crate::sync::LazyLock
|
||||
/// ```rust
|
||||
/// use std::collections::HashMap;
|
||||
/// use std::hash::{BuildHasherDefault, DefaultHasher};
|
||||
/// use std::sync::Mutex;
|
||||
/// use std::sync::{LazyLock, Mutex};
|
||||
///
|
||||
/// const EMPTY_MAP: HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>> =
|
||||
/// // HashMaps with a fixed, non-random hasher
|
||||
/// const NONRANDOM_EMPTY_MAP: HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>> =
|
||||
/// HashMap::with_hasher(BuildHasherDefault::new());
|
||||
/// static MAP: Mutex<HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>>> =
|
||||
/// static NONRANDOM_MAP: Mutex<HashMap<String, Vec<i32>, BuildHasherDefault<DefaultHasher>>> =
|
||||
/// Mutex::new(HashMap::with_hasher(BuildHasherDefault::new()));
|
||||
///
|
||||
/// // HashMaps using LazyLock to retain random seeding
|
||||
/// const RANDOM_EMPTY_MAP: LazyLock<HashMap<String, Vec<i32>>> =
|
||||
/// LazyLock::new(HashMap::new);
|
||||
/// static RANDOM_MAP: LazyLock<Mutex<HashMap<String, Vec<i32>>>> =
|
||||
/// LazyLock::new(|| Mutex::new(HashMap::new()));
|
||||
/// ```
|
||||
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "HashMap")]
|
||||
|
|
|
@ -276,63 +276,89 @@ impl FileExt for fs::File {
|
|||
}
|
||||
|
||||
/// Unix-specific extensions to [`fs::Permissions`].
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::{File, Permissions};
|
||||
/// use std::io::{ErrorKind, Result as IoResult};
|
||||
/// use std::os::unix::fs::PermissionsExt;
|
||||
///
|
||||
/// fn main() -> IoResult<()> {
|
||||
/// let name = "test_file_for_permissions";
|
||||
///
|
||||
/// // make sure file does not exist
|
||||
/// let _ = std::fs::remove_file(name);
|
||||
/// assert_eq!(
|
||||
/// File::open(name).unwrap_err().kind(),
|
||||
/// ErrorKind::NotFound,
|
||||
/// "file already exists"
|
||||
/// );
|
||||
///
|
||||
/// // full read/write/execute mode bits for owner of file
|
||||
/// // that we want to add to existing mode bits
|
||||
/// let my_mode = 0o700;
|
||||
///
|
||||
/// // create new file with specified permissions
|
||||
/// {
|
||||
/// let file = File::create(name)?;
|
||||
/// let mut permissions = file.metadata()?.permissions();
|
||||
/// eprintln!("Current permissions: {:o}", permissions.mode());
|
||||
///
|
||||
/// // make sure new permissions are not already set
|
||||
/// assert!(
|
||||
/// permissions.mode() & my_mode != my_mode,
|
||||
/// "permissions already set"
|
||||
/// );
|
||||
///
|
||||
/// // either use `set_mode` to change an existing Permissions struct
|
||||
/// permissions.set_mode(permissions.mode() | my_mode);
|
||||
///
|
||||
/// // or use `from_mode` to construct a new Permissions struct
|
||||
/// permissions = Permissions::from_mode(permissions.mode() | my_mode);
|
||||
///
|
||||
/// // write new permissions to file
|
||||
/// file.set_permissions(permissions)?;
|
||||
/// }
|
||||
///
|
||||
/// let permissions = File::open(name)?.metadata()?.permissions();
|
||||
/// eprintln!("New permissions: {:o}", permissions.mode());
|
||||
///
|
||||
/// // assert new permissions were set
|
||||
/// assert_eq!(
|
||||
/// permissions.mode() & my_mode,
|
||||
/// my_mode,
|
||||
/// "new permissions not set"
|
||||
/// );
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::Permissions;
|
||||
/// use std::os::unix::fs::PermissionsExt;
|
||||
///
|
||||
/// // read/write for owner and read for others
|
||||
/// let my_mode = 0o644;
|
||||
/// let mut permissions = Permissions::from_mode(my_mode);
|
||||
/// assert_eq!(permissions.mode(), my_mode);
|
||||
///
|
||||
/// // read/write/execute for owner
|
||||
/// let other_mode = 0o700;
|
||||
/// permissions.set_mode(other_mode);
|
||||
/// assert_eq!(permissions.mode(), other_mode);
|
||||
/// ```
|
||||
#[stable(feature = "fs_ext", since = "1.1.0")]
|
||||
pub trait PermissionsExt {
|
||||
/// Returns the underlying raw `st_mode` bits that contain the standard
|
||||
/// Unix permissions for this file.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
/// use std::os::unix::fs::PermissionsExt;
|
||||
///
|
||||
/// fn main() -> std::io::Result<()> {
|
||||
/// let f = File::create("foo.txt")?;
|
||||
/// let metadata = f.metadata()?;
|
||||
/// let permissions = metadata.permissions();
|
||||
///
|
||||
/// println!("permissions: {:o}", permissions.mode());
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// ```
|
||||
/// Returns the mode permission bits
|
||||
#[stable(feature = "fs_ext", since = "1.1.0")]
|
||||
fn mode(&self) -> u32;
|
||||
|
||||
/// Sets the underlying raw bits for this set of permissions.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
/// use std::os::unix::fs::PermissionsExt;
|
||||
///
|
||||
/// fn main() -> std::io::Result<()> {
|
||||
/// let f = File::create("foo.txt")?;
|
||||
/// let metadata = f.metadata()?;
|
||||
/// let mut permissions = metadata.permissions();
|
||||
///
|
||||
/// permissions.set_mode(0o644); // Read/write for owner and read for others.
|
||||
/// assert_eq!(permissions.mode(), 0o644);
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// ```
|
||||
/// Sets the mode permission bits.
|
||||
#[stable(feature = "fs_ext", since = "1.1.0")]
|
||||
fn set_mode(&mut self, mode: u32);
|
||||
|
||||
/// Creates a new instance of `Permissions` from the given set of Unix
|
||||
/// permission bits.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::fs::Permissions;
|
||||
/// use std::os::unix::fs::PermissionsExt;
|
||||
///
|
||||
/// // Read/write for owner and read for others.
|
||||
/// let permissions = Permissions::from_mode(0o644);
|
||||
/// assert_eq!(permissions.mode(), 0o644);
|
||||
/// ```
|
||||
/// Creates a new instance from the given mode permission bits.
|
||||
#[stable(feature = "fs_ext", since = "1.1.0")]
|
||||
#[cfg_attr(not(test), rustc_diagnostic_item = "permissions_from_mode")]
|
||||
fn from_mode(mode: u32) -> Self;
|
||||
|
|
|
@ -294,11 +294,6 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
// Detect scheme on Redox
|
||||
pub(crate) fn has_redox_scheme(s: &[u8]) -> bool {
|
||||
cfg!(target_os = "redox") && s.contains(&b':')
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Cross-platform, iterator-independent parsing
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2834,8 +2829,7 @@ impl Path {
|
|||
Components {
|
||||
path: self.as_u8_slice(),
|
||||
prefix,
|
||||
has_physical_root: has_physical_root(self.as_u8_slice(), prefix)
|
||||
|| has_redox_scheme(self.as_u8_slice()),
|
||||
has_physical_root: has_physical_root(self.as_u8_slice(), prefix),
|
||||
front: State::Prefix,
|
||||
back: State::Body,
|
||||
}
|
||||
|
|
|
@ -484,7 +484,12 @@ pub fn current_exe() -> io::Result<PathBuf> {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "redox", target_os = "rtems"))]
|
||||
#[cfg(target_os = "redox")]
|
||||
pub fn current_exe() -> io::Result<PathBuf> {
|
||||
crate::fs::read_to_string("/scheme/sys/exe").map(PathBuf::from)
|
||||
}
|
||||
|
||||
#[cfg(target_os = "rtems")]
|
||||
pub fn current_exe() -> io::Result<PathBuf> {
|
||||
crate::fs::read_to_string("sys:exe").map(PathBuf::from)
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@ use crate::{fmt, io, ptr};
|
|||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_os = "fuchsia")] {
|
||||
// fuchsia doesn't have /dev/null
|
||||
} else if #[cfg(target_os = "redox")] {
|
||||
const DEV_NULL: &CStr = c"null:";
|
||||
} else if #[cfg(target_os = "vxworks")] {
|
||||
const DEV_NULL: &CStr = c"/null";
|
||||
} else {
|
||||
|
|
|
@ -62,10 +62,7 @@ pub(crate) fn absolute(path: &Path) -> io::Result<PathBuf> {
|
|||
}
|
||||
|
||||
pub(crate) fn is_absolute(path: &Path) -> bool {
|
||||
if cfg!(target_os = "redox") {
|
||||
// FIXME: Allow Redox prefixes
|
||||
path.has_root() || crate::path::has_redox_scheme(path.as_u8_slice())
|
||||
} else if cfg!(any(unix, target_os = "hermit", target_os = "wasi")) {
|
||||
if cfg!(any(unix, target_os = "hermit", target_os = "wasi")) {
|
||||
path.has_root()
|
||||
} else {
|
||||
path.has_root() && path.prefix().is_some()
|
||||
|
|
|
@ -67,7 +67,7 @@ impl Std {
|
|||
self
|
||||
}
|
||||
|
||||
#[allow(clippy::wrong_self_convention)]
|
||||
#[expect(clippy::wrong_self_convention)]
|
||||
pub fn is_for_mir_opt_tests(mut self, is_for_mir_opt_tests: bool) -> Self {
|
||||
self.is_for_mir_opt_tests = is_for_mir_opt_tests;
|
||||
self
|
||||
|
|
|
@ -582,10 +582,12 @@ Select which editor you would like to set up [default: None]: ";
|
|||
EditorKind::Emacs => &[
|
||||
"51068d4747a13732440d1a8b8f432603badb1864fa431d83d0fd4f8fa57039e0",
|
||||
"d29af4d949bbe2371eac928a3c31cf9496b1701aa1c45f11cd6c759865ad5c45",
|
||||
"b5dd299b93dca3ceeb9b335f929293cb3d4bf4977866fbe7ceeac2a8a9f99088",
|
||||
],
|
||||
EditorKind::Helix => &[
|
||||
"2d3069b8cf1b977e5d4023965eb6199597755e6c96c185ed5f2854f98b83d233",
|
||||
"6736d61409fbebba0933afd2e4c44ff2f97c1cb36cf0299a7f4a7819b8775040",
|
||||
"f252dcc30ca85a193a699581e5e929d5bd6c19d40d7a7ade5e257a9517a124a5",
|
||||
],
|
||||
EditorKind::Vim | EditorKind::VsCode => &[
|
||||
"ea67e259dedf60d4429b6c349a564ffcd1563cf41c920a856d1f5b16b4701ac8",
|
||||
|
@ -598,10 +600,12 @@ Select which editor you would like to set up [default: None]: ";
|
|||
"811fb3b063c739d261fd8590dd30242e117908f5a095d594fa04585daa18ec4d",
|
||||
"4eecb58a2168b252077369da446c30ed0e658301efe69691979d1ef0443928f4",
|
||||
"c394386e6133bbf29ffd32c8af0bb3d4aac354cba9ee051f29612aa9350f8f8d",
|
||||
"e53e9129ca5ee5dcbd6ec8b68c2d87376474eb154992deba3c6d9ab1703e0717",
|
||||
],
|
||||
EditorKind::Zed => &[
|
||||
"bbce727c269d1bd0c98afef4d612eb4ce27aea3c3a8968c5f10b31affbc40b6c",
|
||||
"a5380cf5dd9328731aecc5dfb240d16dac46ed272126b9728006151ef42f5909",
|
||||
],
|
||||
EditorKind::Zed => {
|
||||
&["bbce727c269d1bd0c98afef4d612eb4ce27aea3c3a8968c5f10b31affbc40b6c"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
//! Attempt to magically identify good tests to run
|
||||
|
||||
#![cfg_attr(feature = "build-metrics", allow(unused))]
|
||||
|
||||
use std::path::PathBuf;
|
||||
use std::str::FromStr;
|
||||
|
||||
|
|
|
@ -3377,7 +3377,7 @@ impl Step for CodegenCranelift {
|
|||
/*
|
||||
let mut prepare_cargo = build_cargo();
|
||||
prepare_cargo.arg("--").arg("prepare").arg("--download-dir").arg(&download_dir);
|
||||
#[allow(deprecated)]
|
||||
#[expect(deprecated)]
|
||||
builder.config.try_run(&mut prepare_cargo.into()).unwrap();
|
||||
*/
|
||||
|
||||
|
@ -3508,7 +3508,7 @@ impl Step for CodegenGCC {
|
|||
/*
|
||||
let mut prepare_cargo = build_cargo();
|
||||
prepare_cargo.arg("--").arg("prepare");
|
||||
#[allow(deprecated)]
|
||||
#[expect(deprecated)]
|
||||
builder.config.try_run(&mut prepare_cargo.into()).unwrap();
|
||||
*/
|
||||
|
||||
|
|
|
@ -209,7 +209,7 @@ impl Step for ToolBuild {
|
|||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)] // FIXME: reduce the number of args and remove this.
|
||||
#[expect(clippy::too_many_arguments)] // FIXME: reduce the number of args and remove this.
|
||||
pub fn prepare_tool_cargo(
|
||||
builder: &Builder<'_>,
|
||||
compiler: Compiler,
|
||||
|
@ -1024,7 +1024,7 @@ pub struct LibcxxVersionTool {
|
|||
pub target: TargetSelection,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[expect(dead_code)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum LibcxxVersion {
|
||||
Gnu(usize),
|
||||
|
|
|
@ -1285,7 +1285,6 @@ impl<'a> Builder<'a> {
|
|||
host: TargetSelection,
|
||||
target: TargetSelection,
|
||||
) -> Compiler {
|
||||
#![allow(clippy::let_and_return)]
|
||||
let mut resolved_compiler = if self.build.force_use_stage2(stage) {
|
||||
trace!(target: "COMPILER_FOR", ?stage, "force_use_stage2");
|
||||
self.compiler(2, self.config.build)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#[allow(clippy::module_inception)]
|
||||
#[expect(clippy::module_inception)]
|
||||
mod config;
|
||||
pub mod flags;
|
||||
#[cfg(test)]
|
||||
|
|
|
@ -19,7 +19,7 @@ static SHOULD_FIX_BINS_AND_DYLIBS: OnceLock<bool> = OnceLock::new();
|
|||
|
||||
/// `Config::try_run` wrapper for this module to avoid warnings on `try_run`, since we don't have access to a `builder` yet.
|
||||
fn try_run(config: &Config, cmd: &mut Command) -> Result<(), ()> {
|
||||
#[allow(deprecated)]
|
||||
#[expect(deprecated)]
|
||||
config.try_run(cmd)
|
||||
}
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ const LLD_FILE_NAMES: &[&str] = &["ld.lld", "ld64.lld", "lld-link", "wasm-ld"];
|
|||
|
||||
/// Extra `--check-cfg` to add when building the compiler or tools
|
||||
/// (Mode restriction, config name, config values (if any))
|
||||
#[allow(clippy::type_complexity)] // It's fine for hard-coded list and type is explained above.
|
||||
#[expect(clippy::type_complexity)] // It's fine for hard-coded list and type is explained above.
|
||||
const EXTRA_CHECK_CFGS: &[(Option<Mode>, &str, Option<&[&'static str]>)] = &[
|
||||
(None, "bootstrap", None),
|
||||
(Some(Mode::Rustc), "llvm_enzyme", None),
|
||||
|
|
|
@ -125,7 +125,7 @@ impl BootstrapCommand {
|
|||
Self { failure_behavior: BehaviorOnFailure::DelayFail, ..self }
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[expect(dead_code)]
|
||||
pub fn fail_fast(self) -> Self {
|
||||
Self { failure_behavior: BehaviorOnFailure::Exit, ..self }
|
||||
}
|
||||
|
@ -280,7 +280,7 @@ impl CommandOutput {
|
|||
!self.is_success()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[expect(dead_code)]
|
||||
pub fn status(&self) -> Option<ExitStatus> {
|
||||
match self.status {
|
||||
CommandStatus::Finished(status) => Some(status),
|
||||
|
@ -332,7 +332,6 @@ impl Default for CommandOutput {
|
|||
|
||||
/// Helper trait to format both Command and BootstrapCommand as a short execution line,
|
||||
/// without all the other details (e.g. environment variables).
|
||||
#[allow(unused)]
|
||||
pub trait FormatShortCmd {
|
||||
fn format_short_cmd(&self) -> String;
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ impl BuildMetrics {
|
|||
|
||||
// Consider all the stats gathered so far as the parent's.
|
||||
if !state.running_steps.is_empty() {
|
||||
self.collect_stats(&mut *state);
|
||||
self.collect_stats(&mut state);
|
||||
}
|
||||
|
||||
state.system_info.refresh_cpu_usage();
|
||||
|
@ -102,7 +102,7 @@ impl BuildMetrics {
|
|||
|
||||
let mut state = self.state.borrow_mut();
|
||||
|
||||
self.collect_stats(&mut *state);
|
||||
self.collect_stats(&mut state);
|
||||
|
||||
let step = state.running_steps.pop().unwrap();
|
||||
if state.running_steps.is_empty() {
|
||||
|
@ -224,6 +224,7 @@ impl BuildMetrics {
|
|||
t!(serde_json::to_writer(&mut file, &json));
|
||||
}
|
||||
|
||||
#[expect(clippy::only_used_in_recursion)]
|
||||
fn prepare_json_step(&self, step: StepMetrics) -> JsonNode {
|
||||
let mut children = Vec::new();
|
||||
children.extend(step.children.into_iter().map(|child| self.prepare_json_step(child)));
|
||||
|
|
|
@ -24,6 +24,8 @@ pub struct Job {
|
|||
/// Free additional disk space in the job, by removing unused packages.
|
||||
#[serde(default)]
|
||||
pub free_disk: Option<bool>,
|
||||
/// Documentation link to a resource that could help people debug this CI job.
|
||||
pub doc_url: Option<String>,
|
||||
}
|
||||
|
||||
impl Job {
|
||||
|
@ -103,6 +105,8 @@ struct GithubActionsJob {
|
|||
continue_on_error: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
free_disk: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
doc_url: Option<String>,
|
||||
}
|
||||
|
||||
/// Skip CI jobs that are not supposed to be executed on the given `channel`.
|
||||
|
@ -188,6 +192,7 @@ fn calculate_jobs(
|
|||
env,
|
||||
continue_on_error: job.continue_on_error,
|
||||
free_disk: job.free_disk,
|
||||
doc_url: job.doc_url,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
|
|
@ -40,7 +40,7 @@ try-job: dist-i686-msvc"#,
|
|||
fn pr_jobs() {
|
||||
let stdout = get_matrix("pull_request", "commit", "refs/heads/pr/1234");
|
||||
insta::assert_snapshot!(stdout, @r#"
|
||||
jobs=[{"name":"mingw-check","full_name":"PR - mingw-check","os":"ubuntu-24.04","env":{"PR_CI_JOB":1},"free_disk":true},{"name":"mingw-check-tidy","full_name":"PR - mingw-check-tidy","os":"ubuntu-24.04","env":{"PR_CI_JOB":1},"continue_on_error":true,"free_disk":true}]
|
||||
jobs=[{"name":"mingw-check","full_name":"PR - mingw-check","os":"ubuntu-24.04","env":{"PR_CI_JOB":1},"free_disk":true},{"name":"mingw-check-tidy","full_name":"PR - mingw-check-tidy","os":"ubuntu-24.04","env":{"PR_CI_JOB":1},"continue_on_error":true,"free_disk":true,"doc_url":"https://foo.bar"}]
|
||||
run_type=pr
|
||||
"#);
|
||||
}
|
||||
|
|
|
@ -75,6 +75,7 @@ pr:
|
|||
<<: *job-linux-4c
|
||||
- name: mingw-check-tidy
|
||||
continue_on_error: true
|
||||
doc_url: https://foo.bar
|
||||
<<: *job-linux-4c
|
||||
|
||||
# Jobs that run when you perform a try build (@bors try)
|
||||
|
|
|
@ -267,11 +267,13 @@ auto:
|
|||
# nightly features to compile, and this job would fail if
|
||||
# executed on beta and stable.
|
||||
only_on_channel: nightly
|
||||
doc_url: https://rustc-dev-guide.rust-lang.org/tests/fuchsia.html
|
||||
<<: *job-linux-8c
|
||||
|
||||
# Tests integration with Rust for Linux.
|
||||
# Builds stage 1 compiler and tries to compile a few RfL examples with it.
|
||||
- name: x86_64-rust-for-linux
|
||||
doc_url: https://rustc-dev-guide.rust-lang.org/tests/rust-for-linux.html
|
||||
<<: *job-linux-4c
|
||||
|
||||
- name: x86_64-gnu
|
||||
|
|
|
@ -6,6 +6,10 @@ if [ -n "$CI_JOB_NAME" ]; then
|
|||
echo "[CI_JOB_NAME=$CI_JOB_NAME]"
|
||||
fi
|
||||
|
||||
if [ -n "$CI_JOB_DOC_URL" ]; then
|
||||
echo "[CI_JOB_DOC_URL=$CI_JOB_DOC_URL]"
|
||||
fi
|
||||
|
||||
if [ "$NO_CHANGE_USER" = "" ]; then
|
||||
if [ "$LOCAL_USER_ID" != "" ]; then
|
||||
id -u user &>/dev/null || useradd --shell /bin/bash -u $LOCAL_USER_ID -o -c "" -m user
|
||||
|
@ -54,13 +58,8 @@ if [ "$FORCE_CI_RUSTC" == "" ]; then
|
|||
DISABLE_CI_RUSTC_IF_INCOMPATIBLE=1
|
||||
fi
|
||||
|
||||
if ! isCI || isCiBranch auto || isCiBranch beta || isCiBranch try || isCiBranch try-perf || \
|
||||
isCiBranch automation/bors/try; then
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set build.print-step-timings --enable-verbose-tests"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set build.metrics"
|
||||
HAS_METRICS=1
|
||||
fi
|
||||
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set build.print-step-timings --enable-verbose-tests"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --set build.metrics"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-verbose-configure"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-sccache"
|
||||
RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --disable-manage-submodules"
|
||||
|
@ -266,14 +265,10 @@ if [ "$RUN_CHECK_WITH_PARALLEL_QUERIES" != "" ]; then
|
|||
$SRC/configure --set change-id=99999999
|
||||
|
||||
# Save the build metrics before we wipe the directory
|
||||
if [ "$HAS_METRICS" = 1 ]; then
|
||||
mv build/metrics.json .
|
||||
fi
|
||||
mv build/metrics.json .
|
||||
rm -rf build
|
||||
if [ "$HAS_METRICS" = 1 ]; then
|
||||
mkdir build
|
||||
mv metrics.json build
|
||||
fi
|
||||
mkdir build
|
||||
mv metrics.json build
|
||||
|
||||
CARGO_INCREMENTAL=0 ../x check
|
||||
fi
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
"check"
|
||||
"--json-output"])
|
||||
:linkedProjects ["Cargo.toml"
|
||||
"src/tools/x/Cargo.toml"
|
||||
"src/bootstrap/Cargo.toml"
|
||||
"src/tools/rust-analyzer/Cargo.toml"
|
||||
"compiler/rustc_codegen_cranelift/Cargo.toml"
|
||||
|
|
|
@ -15,7 +15,6 @@ linkedProjects = [
|
|||
"library/Cargo.toml",
|
||||
"src/bootstrap/Cargo.toml",
|
||||
"src/tools/rust-analyzer/Cargo.toml",
|
||||
"src/tools/x/Cargo.toml",
|
||||
]
|
||||
|
||||
[language-server.rust-analyzer.config.check]
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
"rust-analyzer.linkedProjects": [
|
||||
"Cargo.toml",
|
||||
"library/Cargo.toml",
|
||||
"src/tools/x/Cargo.toml",
|
||||
"src/bootstrap/Cargo.toml",
|
||||
"src/tools/rust-analyzer/Cargo.toml",
|
||||
"compiler/rustc_codegen_cranelift/Cargo.toml",
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"linkedProjects": [
|
||||
"Cargo.toml",
|
||||
"library/Cargo.toml",
|
||||
"src/tools/x/Cargo.toml",
|
||||
"src/bootstrap/Cargo.toml",
|
||||
"src/tools/rust-analyzer/Cargo.toml",
|
||||
"compiler/rustc_codegen_cranelift/Cargo.toml",
|
||||
|
|
|
@ -65,7 +65,7 @@ impl TestCx<'_> {
|
|||
|
||||
// FIXME(#41968): Move this check to tidy?
|
||||
if !errors::load_errors(&self.testpaths.file, self.revision).is_empty() {
|
||||
self.fatal("compile-pass tests with expected warnings should be moved to ui/");
|
||||
self.fatal("build-pass tests with expected warnings should be moved to ui/");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,6 @@ pub(crate) const WORKSPACES: &[(&str, ExceptionList, Option<(&[&str], &[&str])>,
|
|||
("src/tools/rust-analyzer", EXCEPTIONS_RUST_ANALYZER, None, &[]),
|
||||
("src/tools/rustbook", EXCEPTIONS_RUSTBOOK, None, &["src/doc/book", "src/doc/reference"]),
|
||||
("src/tools/rustc-perf", EXCEPTIONS_RUSTC_PERF, None, &["src/tools/rustc-perf"]),
|
||||
("src/tools/x", &[], None, &[]),
|
||||
// tidy-alphabetical-end
|
||||
];
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ fn main() {
|
|||
FromStr::from_str(&env::args().nth(4).expect("need concurrency"))
|
||||
.expect("concurrency must be a number");
|
||||
|
||||
let root_manifest = root_path.join("Cargo.toml");
|
||||
let src_path = root_path.join("src");
|
||||
let tests_path = root_path.join("tests");
|
||||
let library_path = root_path.join("library");
|
||||
|
@ -137,6 +138,7 @@ fn main() {
|
|||
check!(edition, &compiler_path);
|
||||
check!(edition, &library_path);
|
||||
|
||||
check!(alphabetical, &root_manifest);
|
||||
check!(alphabetical, &src_path);
|
||||
check!(alphabetical, &tests_path);
|
||||
check!(alphabetical, &compiler_path);
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "x"
|
||||
version = "0.1.1"
|
|
@ -1,12 +0,0 @@
|
|||
//@ known-bug: rust-lang/rust#125059
|
||||
#![feature(deref_patterns)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
fn simple_vec(vec: Vec<u32>) -> u32 {
|
||||
(|| match Vec::<u32>::new() {
|
||||
deref!([]) => 100,
|
||||
_ => 2000,
|
||||
})()
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -2,7 +2,6 @@
|
|||
// work. Note that the metadata doesn't change when a DST is wrapped in a
|
||||
// structure, so these casts *are* fine.
|
||||
//
|
||||
// `unwrap` and `unwrap_nested` currently don't work due to a compiler limitation.
|
||||
//@ check-pass
|
||||
|
||||
trait A {}
|
||||
|
|
21
tests/ui/lint/unused/unused-field-in-pat-field.rs
Normal file
21
tests/ui/lint/unused/unused-field-in-pat-field.rs
Normal file
|
@ -0,0 +1,21 @@
|
|||
//@ check-pass
|
||||
|
||||
// Ensure we collect lint levels from pat fields in structs.
|
||||
|
||||
#![deny(unused_variables)]
|
||||
|
||||
pub struct Foo {
|
||||
bar: u32,
|
||||
baz: u32,
|
||||
}
|
||||
|
||||
pub fn test(foo: Foo) {
|
||||
let Foo {
|
||||
#[allow(unused_variables)]
|
||||
bar,
|
||||
#[allow(unused_variables)]
|
||||
baz,
|
||||
} = foo;
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,15 @@
|
|||
//@ check-pass
|
||||
//! Regression test for ICE in `rustc_hir_typeck::expr_use_visitor` on nesting a slice pattern
|
||||
//! inside a deref pattern inside a closure: rust-lang/rust#125059
|
||||
|
||||
#![feature(deref_patterns)]
|
||||
#![allow(incomplete_features, unused)]
|
||||
|
||||
fn simple_vec(vec: Vec<u32>) -> u32 {
|
||||
(|| match Vec::<u32>::new() {
|
||||
deref!([]) => 100,
|
||||
_ => 2000,
|
||||
})()
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1115,7 +1115,6 @@ compiler = [
|
|||
"@wesleywiser",
|
||||
]
|
||||
libs = [
|
||||
"@cuviper",
|
||||
"@Mark-Simulacrum",
|
||||
"@Amanieu",
|
||||
"@Noratrieb",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue