Auto merge of #143157 - matthiaskrgr:rollup-90rtm3a, r=matthiaskrgr

Rollup of 9 pull requests

Successful merges:

 - rust-lang/rust#123476 (std::net: adding `unix_socket_exclbind` feature for solaris/illumos.)
 - rust-lang/rust#142708 (Do not include NUL-terminator in computed length)
 - rust-lang/rust#142963 (Skip unnecessary components in x64 try builds)
 - rust-lang/rust#142987 (rustdoc: show attributes on enum variants)
 - rust-lang/rust#143031 (Add windows-gnullvm hosts to the manifest)
 - rust-lang/rust#143082 (update internal `send_signal` comment)
 - rust-lang/rust#143110 (Use tidy to sort `sym::*` items)
 - rust-lang/rust#143111 (BTreeSet: remove duplicated code by reusing `from_sorted_iter`)
 - rust-lang/rust#143114 (Minor Documentation Improvements)

r? `@ghost`
`@rustbot` modify labels: rollup

try-job: dist-i586-gnu-i586-i686-musl
This commit is contained in:
bors
2025-06-28 22:13:42 +00:00
24 changed files with 277 additions and 128 deletions

View File

@@ -21,13 +21,14 @@ fn alloc_caller_location<'tcx>(
assert!(!filename.as_str().as_bytes().contains(&0)); assert!(!filename.as_str().as_bytes().contains(&0));
let loc_details = ecx.tcx.sess.opts.unstable_opts.location_detail; let loc_details = ecx.tcx.sess.opts.unstable_opts.location_detail;
let file_wide_ptr = { let filename = {
let filename = if loc_details.file { filename.as_str() } else { "<redacted>" }; let filename = if loc_details.file { filename.as_str() } else { "<redacted>" };
let filename_with_nul = filename.to_owned() + "\0"; let filename_with_nul = filename.to_owned() + "\0";
// This can fail if rustc runs out of memory right here. Trying to emit an error would be // This can fail if rustc runs out of memory right here. Trying to emit an error would be
// pointless, since that would require allocating more memory than these short strings. // pointless, since that would require allocating more memory than these short strings.
let file_ptr = ecx.allocate_bytes_dedup(filename_with_nul.as_bytes()).unwrap(); let file_ptr = ecx.allocate_bytes_dedup(filename_with_nul.as_bytes()).unwrap();
Immediate::new_slice(file_ptr.into(), filename_with_nul.len().try_into().unwrap(), ecx) let file_len = u64::try_from(filename.len()).unwrap();
Immediate::new_slice(file_ptr.into(), file_len, ecx)
}; };
let line = if loc_details.line { Scalar::from_u32(line) } else { Scalar::from_u32(0) }; let line = if loc_details.line { Scalar::from_u32(line) } else { Scalar::from_u32(0) };
let col = if loc_details.column { Scalar::from_u32(col) } else { Scalar::from_u32(0) }; let col = if loc_details.column { Scalar::from_u32(col) } else { Scalar::from_u32(0) };
@@ -41,11 +42,8 @@ fn alloc_caller_location<'tcx>(
let location = ecx.allocate(loc_layout, MemoryKind::CallerLocation).unwrap(); let location = ecx.allocate(loc_layout, MemoryKind::CallerLocation).unwrap();
// Initialize fields. // Initialize fields.
ecx.write_immediate( ecx.write_immediate(filename, &ecx.project_field(&location, FieldIdx::from_u32(0)).unwrap())
file_wide_ptr, .expect("writing to memory we just allocated cannot fail");
&ecx.project_field(&location, FieldIdx::from_u32(0)).unwrap(),
)
.expect("writing to memory we just allocated cannot fail");
ecx.write_scalar(line, &ecx.project_field(&location, FieldIdx::from_u32(1)).unwrap()) ecx.write_scalar(line, &ecx.project_field(&location, FieldIdx::from_u32(1)).unwrap())
.expect("writing to memory we just allocated cannot fail"); .expect("writing to memory we just allocated cannot fail");
ecx.write_scalar(col, &ecx.project_field(&location, FieldIdx::from_u32(2)).unwrap()) ecx.write_scalar(col, &ecx.project_field(&location, FieldIdx::from_u32(2)).unwrap())

View File

@@ -190,17 +190,6 @@ fn symbols_with_errors(input: TokenStream) -> (TokenStream, Vec<syn::Error>) {
let mut symbols_stream = quote! {}; let mut symbols_stream = quote! {};
let mut prefill_stream = quote! {}; let mut prefill_stream = quote! {};
let mut entries = Entries::with_capacity(input.keywords.len() + input.symbols.len() + 10); let mut entries = Entries::with_capacity(input.keywords.len() + input.symbols.len() + 10);
let mut prev_key: Option<(Span, String)> = None;
let mut check_order = |span: Span, s: &str, errors: &mut Errors| {
if let Some((prev_span, ref prev_str)) = prev_key {
if s < prev_str {
errors.error(span, format!("Symbol `{s}` must precede `{prev_str}`"));
errors.error(prev_span, format!("location of previous symbol `{prev_str}`"));
}
}
prev_key = Some((span, s.to_string()));
};
// Generate the listed keywords. // Generate the listed keywords.
for keyword in input.keywords.iter() { for keyword in input.keywords.iter() {
@@ -219,7 +208,6 @@ fn symbols_with_errors(input: TokenStream) -> (TokenStream, Vec<syn::Error>) {
// Generate the listed symbols. // Generate the listed symbols.
for symbol in input.symbols.iter() { for symbol in input.symbols.iter() {
let name = &symbol.name; let name = &symbol.name;
check_order(symbol.name.span(), &name.to_string(), &mut errors);
let value = match &symbol.value { let value = match &symbol.value {
Value::SameAsName => name.to_string(), Value::SameAsName => name.to_string(),

View File

@@ -84,18 +84,3 @@ fn check_dup_symbol_and_keyword() {
}; };
test_symbols_macro(input, &["Symbol `splat` is duplicated", "location of previous definition"]); test_symbols_macro(input, &["Symbol `splat` is duplicated", "location of previous definition"]);
} }
#[test]
fn check_symbol_order() {
let input = quote! {
Keywords {}
Symbols {
zebra,
aardvark,
}
};
test_symbols_macro(
input,
&["Symbol `aardvark` must precede `zebra`", "location of previous symbol `zebra`"],
);
}

View File

@@ -150,14 +150,10 @@ symbols! {
// As well as the symbols listed, there are symbols for the strings // As well as the symbols listed, there are symbols for the strings
// "0", "1", ..., "9", which are accessible via `sym::integer`. // "0", "1", ..., "9", which are accessible via `sym::integer`.
// //
// The proc macro will abort if symbols are not in alphabetical order (as
// defined by `impl Ord for str`) or if any symbols are duplicated. Vim
// users can sort the list by selecting it and executing the command
// `:'<,'>!LC_ALL=C sort`.
//
// There is currently no checking that all symbols are used; that would be // There is currently no checking that all symbols are used; that would be
// nice to have. // nice to have.
Symbols { Symbols {
// tidy-alphabetical-start
Abi, Abi,
AcqRel, AcqRel,
Acquire, Acquire,
@@ -175,18 +171,18 @@ symbols! {
AsyncGenPending, AsyncGenPending,
AsyncGenReady, AsyncGenReady,
AtomicBool, AtomicBool,
AtomicI128, AtomicI8,
AtomicI16, AtomicI16,
AtomicI32, AtomicI32,
AtomicI64, AtomicI64,
AtomicI8, AtomicI128,
AtomicIsize, AtomicIsize,
AtomicPtr, AtomicPtr,
AtomicU128, AtomicU8,
AtomicU16, AtomicU16,
AtomicU32, AtomicU32,
AtomicU64, AtomicU64,
AtomicU8, AtomicU128,
AtomicUsize, AtomicUsize,
BTreeEntry, BTreeEntry,
BTreeMap, BTreeMap,
@@ -607,10 +603,10 @@ symbols! {
catch_unwind, catch_unwind,
cause, cause,
cdylib, cdylib,
ceilf128,
ceilf16, ceilf16,
ceilf32, ceilf32,
ceilf64, ceilf64,
ceilf128,
cfg, cfg,
cfg_accessible, cfg_accessible,
cfg_attr, cfg_attr,
@@ -747,10 +743,10 @@ symbols! {
copy, copy,
copy_closures, copy_closures,
copy_nonoverlapping, copy_nonoverlapping,
copysignf128,
copysignf16, copysignf16,
copysignf32, copysignf32,
copysignf64, copysignf64,
copysignf128,
core, core,
core_panic, core_panic,
core_panic_2015_macro, core_panic_2015_macro,
@@ -763,10 +759,10 @@ symbols! {
coroutine_state, coroutine_state,
coroutine_yield, coroutine_yield,
coroutines, coroutines,
cosf128,
cosf16, cosf16,
cosf32, cosf32,
cosf64, cosf64,
cosf128,
count, count,
coverage, coverage,
coverage_attribute, coverage_attribute,
@@ -874,8 +870,8 @@ symbols! {
dotdot_in_tuple_patterns, dotdot_in_tuple_patterns,
dotdoteq_in_patterns, dotdoteq_in_patterns,
dreg, dreg,
dreg_low16,
dreg_low8, dreg_low8,
dreg_low16,
drop, drop,
drop_in_place, drop_in_place,
drop_types_in_const, drop_types_in_const,
@@ -928,16 +924,16 @@ symbols! {
exhaustive_integer_patterns, exhaustive_integer_patterns,
exhaustive_patterns, exhaustive_patterns,
existential_type, existential_type,
exp2f128,
exp2f16, exp2f16,
exp2f32, exp2f32,
exp2f64, exp2f64,
exp2f128,
expect, expect,
expected, expected,
expf128,
expf16, expf16,
expf32, expf32,
expf64, expf64,
expf128,
explicit_extern_abis, explicit_extern_abis,
explicit_generic_args_with_impl_trait, explicit_generic_args_with_impl_trait,
explicit_tail_calls, explicit_tail_calls,
@@ -958,9 +954,6 @@ symbols! {
external, external,
external_doc, external_doc,
f, f,
f128,
f128_epsilon,
f128_nan,
f16, f16,
f16_epsilon, f16_epsilon,
f16_nan, f16_nan,
@@ -999,10 +992,13 @@ symbols! {
f64_legacy_const_neg_infinity, f64_legacy_const_neg_infinity,
f64_legacy_const_radix, f64_legacy_const_radix,
f64_nan, f64_nan,
fabsf128, f128,
f128_epsilon,
f128_nan,
fabsf16, fabsf16,
fabsf32, fabsf32,
fabsf64, fabsf64,
fabsf128,
fadd_algebraic, fadd_algebraic,
fadd_fast, fadd_fast,
fake_variadic, fake_variadic,
@@ -1024,22 +1020,22 @@ symbols! {
flags, flags,
float, float,
float_to_int_unchecked, float_to_int_unchecked,
floorf128,
floorf16, floorf16,
floorf32, floorf32,
floorf64, floorf64,
fmaf128, floorf128,
fmaf16, fmaf16,
fmaf32, fmaf32,
fmaf64, fmaf64,
fmaf128,
fmt, fmt,
fmt_debug, fmt_debug,
fmul_algebraic, fmul_algebraic,
fmul_fast, fmul_fast,
fmuladdf128,
fmuladdf16, fmuladdf16,
fmuladdf32, fmuladdf32,
fmuladdf64, fmuladdf64,
fmuladdf128,
fn_align, fn_align,
fn_body, fn_body,
fn_delegation, fn_delegation,
@@ -1140,13 +1136,12 @@ symbols! {
html_root_url, html_root_url,
hwaddress, hwaddress,
i, i,
i128, i8,
i128_legacy_const_max, i8_legacy_const_max,
i128_legacy_const_min, i8_legacy_const_min,
i128_legacy_fn_max_value, i8_legacy_fn_max_value,
i128_legacy_fn_min_value, i8_legacy_fn_min_value,
i128_legacy_mod, i8_legacy_mod,
i128_type,
i16, i16,
i16_legacy_const_max, i16_legacy_const_max,
i16_legacy_const_min, i16_legacy_const_min,
@@ -1165,12 +1160,13 @@ symbols! {
i64_legacy_fn_max_value, i64_legacy_fn_max_value,
i64_legacy_fn_min_value, i64_legacy_fn_min_value,
i64_legacy_mod, i64_legacy_mod,
i8, i128,
i8_legacy_const_max, i128_legacy_const_max,
i8_legacy_const_min, i128_legacy_const_min,
i8_legacy_fn_max_value, i128_legacy_fn_max_value,
i8_legacy_fn_min_value, i128_legacy_fn_min_value,
i8_legacy_mod, i128_legacy_mod,
i128_type,
ident, ident,
if_let, if_let,
if_let_guard, if_let_guard,
@@ -1292,19 +1288,19 @@ symbols! {
loaded_from_disk, loaded_from_disk,
local, local,
local_inner_macros, local_inner_macros,
log10f128,
log10f16,
log10f32,
log10f64,
log2f128,
log2f16, log2f16,
log2f32, log2f32,
log2f64, log2f64,
log2f128,
log10f16,
log10f32,
log10f64,
log10f128,
log_syntax, log_syntax,
logf128,
logf16, logf16,
logf32, logf32,
logf64, logf64,
logf128,
loongarch_target_feature, loongarch_target_feature,
loop_break_value, loop_break_value,
loop_match, loop_match,
@@ -1334,14 +1330,14 @@ symbols! {
match_beginning_vert, match_beginning_vert,
match_default_bindings, match_default_bindings,
matches_macro, matches_macro,
maximumf128,
maximumf16, maximumf16,
maximumf32, maximumf32,
maximumf64, maximumf64,
maxnumf128, maximumf128,
maxnumf16, maxnumf16,
maxnumf32, maxnumf32,
maxnumf64, maxnumf64,
maxnumf128,
may_dangle, may_dangle,
may_unwind, may_unwind,
maybe_uninit, maybe_uninit,
@@ -1372,14 +1368,14 @@ symbols! {
min_generic_const_args, min_generic_const_args,
min_specialization, min_specialization,
min_type_alias_impl_trait, min_type_alias_impl_trait,
minimumf128,
minimumf16, minimumf16,
minimumf32, minimumf32,
minimumf64, minimumf64,
minnumf128, minimumf128,
minnumf16, minnumf16,
minnumf32, minnumf32,
minnumf64, minnumf64,
minnumf128,
mips_target_feature, mips_target_feature,
mir_assume, mir_assume,
mir_basic_block, mir_basic_block,
@@ -1634,14 +1630,14 @@ symbols! {
post_dash_lto: "post-lto", post_dash_lto: "post-lto",
postfix_match, postfix_match,
powerpc_target_feature, powerpc_target_feature,
powf128,
powf16, powf16,
powf32, powf32,
powf64, powf64,
powif128, powf128,
powif16, powif16,
powif32, powif32,
powif64, powif64,
powif128,
pre_dash_lto: "pre-lto", pre_dash_lto: "pre-lto",
precise_capturing, precise_capturing,
precise_capturing_in_traits, precise_capturing_in_traits,
@@ -1786,14 +1782,14 @@ symbols! {
ropi_rwpi: "ropi-rwpi", ropi_rwpi: "ropi-rwpi",
rotate_left, rotate_left,
rotate_right, rotate_right,
round_ties_even_f128,
round_ties_even_f16, round_ties_even_f16,
round_ties_even_f32, round_ties_even_f32,
round_ties_even_f64, round_ties_even_f64,
roundf128, round_ties_even_f128,
roundf16, roundf16,
roundf32, roundf32,
roundf64, roundf64,
roundf128,
rt, rt,
rtm_target_feature, rtm_target_feature,
rust, rust,
@@ -1973,8 +1969,8 @@ symbols! {
simd_fexp2, simd_fexp2,
simd_ffi, simd_ffi,
simd_flog, simd_flog,
simd_flog10,
simd_flog2, simd_flog2,
simd_flog10,
simd_floor, simd_floor,
simd_fma, simd_fma,
simd_fmax, simd_fmax,
@@ -2022,10 +2018,10 @@ symbols! {
simd_with_exposed_provenance, simd_with_exposed_provenance,
simd_xor, simd_xor,
since, since,
sinf128,
sinf16, sinf16,
sinf32, sinf32,
sinf64, sinf64,
sinf128,
size, size,
size_of, size_of,
size_of_val, size_of_val,
@@ -2047,10 +2043,10 @@ symbols! {
specialization, specialization,
speed, speed,
spotlight, spotlight,
sqrtf128,
sqrtf16, sqrtf16,
sqrtf32, sqrtf32,
sqrtf64, sqrtf64,
sqrtf128,
sreg, sreg,
sreg_low16, sreg_low16,
sse, sse,
@@ -2128,10 +2124,10 @@ symbols! {
target_has_atomic, target_has_atomic,
target_has_atomic_equal_alignment, target_has_atomic_equal_alignment,
target_has_atomic_load_store, target_has_atomic_load_store,
target_has_reliable_f128,
target_has_reliable_f128_math,
target_has_reliable_f16, target_has_reliable_f16,
target_has_reliable_f16_math, target_has_reliable_f16_math,
target_has_reliable_f128,
target_has_reliable_f128_math,
target_os, target_os,
target_pointer_width, target_pointer_width,
target_thread_local, target_thread_local,
@@ -2174,10 +2170,10 @@ symbols! {
transparent_enums, transparent_enums,
transparent_unions, transparent_unions,
trivial_bounds, trivial_bounds,
truncf128,
truncf16, truncf16,
truncf32, truncf32,
truncf64, truncf64,
truncf128,
try_blocks, try_blocks,
try_capture, try_capture,
try_from, try_from,
@@ -2206,12 +2202,12 @@ symbols! {
type_name, type_name,
type_privacy_lints, type_privacy_lints,
typed_swap_nonoverlapping, typed_swap_nonoverlapping,
u128, u8,
u128_legacy_const_max, u8_legacy_const_max,
u128_legacy_const_min, u8_legacy_const_min,
u128_legacy_fn_max_value, u8_legacy_fn_max_value,
u128_legacy_fn_min_value, u8_legacy_fn_min_value,
u128_legacy_mod, u8_legacy_mod,
u16, u16,
u16_legacy_const_max, u16_legacy_const_max,
u16_legacy_const_min, u16_legacy_const_min,
@@ -2230,12 +2226,12 @@ symbols! {
u64_legacy_fn_max_value, u64_legacy_fn_max_value,
u64_legacy_fn_min_value, u64_legacy_fn_min_value,
u64_legacy_mod, u64_legacy_mod,
u8, u128,
u8_legacy_const_max, u128_legacy_const_max,
u8_legacy_const_min, u128_legacy_const_min,
u8_legacy_fn_max_value, u128_legacy_fn_max_value,
u8_legacy_fn_min_value, u128_legacy_fn_min_value,
u8_legacy_mod, u128_legacy_mod,
ub_checks, ub_checks,
unaligned_volatile_load, unaligned_volatile_load,
unaligned_volatile_store, unaligned_volatile_store,
@@ -2388,6 +2384,7 @@ symbols! {
zfh, zfh,
zfhmin, zfhmin,
zmm_reg, zmm_reg,
// tidy-alphabetical-end
} }
} }

View File

@@ -1517,9 +1517,7 @@ impl<T: Ord, const N: usize> From<[T; N]> for BTreeSet<T> {
// use stable sort to preserve the insertion order. // use stable sort to preserve the insertion order.
arr.sort(); arr.sort();
let iter = IntoIterator::into_iter(arr).map(|k| (k, SetValZST::default())); BTreeSet::from_sorted_iter(IntoIterator::into_iter(arr), Global)
let map = BTreeMap::bulk_build_from_sorted_iter(iter, Global);
BTreeSet { map }
} }
} }

View File

@@ -1,5 +1,7 @@
use crate::ffi::CStr; use crate::ffi::CStr;
use crate::fmt; use crate::fmt;
use crate::marker::PhantomData;
use crate::ptr::NonNull;
/// A struct containing information about the location of a panic. /// A struct containing information about the location of a panic.
/// ///
@@ -33,14 +35,13 @@ use crate::fmt;
#[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)] #[derive(Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
pub struct Location<'a> { pub struct Location<'a> {
// Note: this filename will have exactly one nul byte at its end, but otherwise // A raw pointer is used rather than a reference because the pointer is valid for one more byte
// it must never contain interior nul bytes. This is relied on for the conversion // than the length stored in this pointer; the additional byte is the NUL-terminator used by
// to `CStr` below. // `Location::file_with_nul`.
// filename: NonNull<str>,
// The prefix of the string without the trailing nul byte will be a regular UTF8 `str`.
file_bytes_with_nul: &'a [u8],
line: u32, line: u32,
col: u32, col: u32,
_filename: PhantomData<&'a str>,
} }
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
@@ -143,10 +144,8 @@ impl<'a> Location<'a> {
#[stable(feature = "panic_hooks", since = "1.10.0")] #[stable(feature = "panic_hooks", since = "1.10.0")]
#[rustc_const_stable(feature = "const_location_fields", since = "1.79.0")] #[rustc_const_stable(feature = "const_location_fields", since = "1.79.0")]
pub const fn file(&self) -> &str { pub const fn file(&self) -> &str {
let str_len = self.file_bytes_with_nul.len() - 1; // SAFETY: The filename is valid.
// SAFETY: `file_bytes_with_nul` without the trailing nul byte is guaranteed to be unsafe { self.filename.as_ref() }
// valid UTF8.
unsafe { crate::str::from_raw_parts(self.file_bytes_with_nul.as_ptr(), str_len) }
} }
/// Returns the name of the source file as a nul-terminated `CStr`. /// Returns the name of the source file as a nul-terminated `CStr`.
@@ -157,9 +156,17 @@ impl<'a> Location<'a> {
#[unstable(feature = "file_with_nul", issue = "141727")] #[unstable(feature = "file_with_nul", issue = "141727")]
#[inline] #[inline]
pub const fn file_with_nul(&self) -> &CStr { pub const fn file_with_nul(&self) -> &CStr {
// SAFETY: `file_bytes_with_nul` is guaranteed to have a trailing nul byte and no let filename = self.filename.as_ptr();
// interior nul bytes.
unsafe { CStr::from_bytes_with_nul_unchecked(self.file_bytes_with_nul) } // SAFETY: The filename is valid for `filename_len+1` bytes, so this addition can't
// overflow.
let cstr_len = unsafe { crate::mem::size_of_val_raw(filename).unchecked_add(1) };
// SAFETY: The filename is valid for `filename_len+1` bytes.
let slice = unsafe { crate::slice::from_raw_parts(filename.cast(), cstr_len) };
// SAFETY: The filename is guaranteed to have a trailing nul byte and no interior nul bytes.
unsafe { CStr::from_bytes_with_nul_unchecked(slice) }
} }
/// Returns the line number from which the panic originated. /// Returns the line number from which the panic originated.
@@ -220,3 +227,8 @@ impl fmt::Display for Location<'_> {
write!(formatter, "{}:{}:{}", self.file(), self.line, self.col) write!(formatter, "{}:{}:{}", self.file(), self.line, self.col)
} }
} }
#[stable(feature = "panic_hooks", since = "1.10.0")]
unsafe impl Send for Location<'_> {}
#[stable(feature = "panic_hooks", since = "1.10.0")]
unsafe impl Sync for Location<'_> {}

View File

@@ -3,4 +3,5 @@
#![stable(feature = "raw_ext", since = "1.1.0")] #![stable(feature = "raw_ext", since = "1.1.0")]
pub mod fs; pub mod fs;
pub mod net;
pub mod raw; pub mod raw;

View File

@@ -0,0 +1,50 @@
//! illumos-specific networking functionality.
#![unstable(feature = "unix_socket_exclbind", issue = "123481")]
use crate::io;
use crate::os::unix::net;
use crate::sealed::Sealed;
use crate::sys_common::AsInner;
/// illumos-specific functionality for `AF_UNIX` sockets [`UnixDatagram`]
/// and [`UnixStream`].
///
/// [`UnixDatagram`]: net::UnixDatagram
/// [`UnixStream`]: net::UnixStream
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
pub trait UnixSocketExt: Sealed {
/// Enables exclusive binding on the socket.
///
/// If true and if the socket had been set with `SO_REUSEADDR`,
/// it neutralises its effect.
/// See [`man 3 tcp`](https://docs.oracle.com/cd/E88353_01/html/E37843/setsockopt-3c.html)
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
fn so_exclbind(&self, excl: bool) -> io::Result<()>;
/// Get the bind exclusivity bind state of the socket.
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
fn exclbind(&self) -> io::Result<bool>;
}
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
impl UnixSocketExt for net::UnixDatagram {
fn exclbind(&self) -> io::Result<bool> {
self.as_inner().exclbind()
}
fn so_exclbind(&self, excl: bool) -> io::Result<()> {
self.as_inner().set_exclbind(excl)
}
}
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
impl UnixSocketExt for net::UnixStream {
fn exclbind(&self) -> io::Result<bool> {
self.as_inner().exclbind()
}
fn so_exclbind(&self, excl: bool) -> io::Result<()> {
self.as_inner().set_exclbind(excl)
}
}

View File

@@ -3,4 +3,5 @@
#![stable(feature = "raw_ext", since = "1.1.0")] #![stable(feature = "raw_ext", since = "1.1.0")]
pub mod fs; pub mod fs;
pub mod net;
pub mod raw; pub mod raw;

View File

@@ -0,0 +1,50 @@
//! solaris-specific networking functionality.
#![unstable(feature = "unix_socket_exclbind", issue = "123481")]
use crate::io;
use crate::os::unix::net;
use crate::sealed::Sealed;
use crate::sys_common::AsInner;
/// solaris-specific functionality for `AF_UNIX` sockets [`UnixDatagram`]
/// and [`UnixStream`].
///
/// [`UnixDatagram`]: net::UnixDatagram
/// [`UnixStream`]: net::UnixStream
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
pub trait UnixSocketExt: Sealed {
/// Enables exclusive binding on the socket.
///
/// If true and if the socket had been set with `SO_REUSEADDR`,
/// it neutralises its effect.
/// See [`man 3 tcp`](https://docs.oracle.com/cd/E88353_01/html/E37843/setsockopt-3c.html)
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
fn so_exclbind(&self, excl: bool) -> io::Result<()>;
/// Get the bind exclusivity bind state of the socket.
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
fn exclbind(&self) -> io::Result<bool>;
}
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
impl UnixSocketExt for net::UnixDatagram {
fn exclbind(&self) -> io::Result<bool> {
self.as_inner().exclbind()
}
fn so_exclbind(&self, excl: bool) -> io::Result<()> {
self.as_inner().set_exclbind(excl)
}
}
#[unstable(feature = "unix_socket_exclbind", issue = "123481")]
impl UnixSocketExt for net::UnixStream {
fn exclbind(&self) -> io::Result<bool> {
self.as_inner().exclbind()
}
fn so_exclbind(&self, excl: bool) -> io::Result<()> {
self.as_inner().set_exclbind(excl)
}
}

View File

@@ -522,6 +522,21 @@ impl Socket {
Ok(name) Ok(name)
} }
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
pub fn set_exclbind(&self, excl: bool) -> io::Result<()> {
// not yet on libc crate
const SO_EXCLBIND: i32 = 0x1015;
setsockopt(self, libc::SOL_SOCKET, SO_EXCLBIND, excl)
}
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
pub fn exclbind(&self) -> io::Result<bool> {
// not yet on libc crate
const SO_EXCLBIND: i32 = 0x1015;
let raw: c_int = getsockopt(self, libc::SOL_SOCKET, SO_EXCLBIND)?;
Ok(raw != 0)
}
#[cfg(any(target_os = "android", target_os = "linux",))] #[cfg(any(target_os = "android", target_os = "linux",))]
pub fn set_passcred(&self, passcred: bool) -> io::Result<()> { pub fn set_passcred(&self, passcred: bool) -> io::Result<()> {
setsockopt(self, libc::SOL_SOCKET, libc::SO_PASSCRED, passcred as libc::c_int) setsockopt(self, libc::SOL_SOCKET, libc::SO_PASSCRED, passcred as libc::c_int)

View File

@@ -968,8 +968,8 @@ impl Process {
} }
pub(crate) fn send_signal(&self, signal: i32) -> io::Result<()> { pub(crate) fn send_signal(&self, signal: i32) -> io::Result<()> {
// If we've already waited on this process then the pid can be recycled // If we've already waited on this process then the pid can be recycled and
// and used for another process, and we probably shouldn't be signaling // used for another process, and we probably shouldn't be sending signals to
// random processes, so return Ok because the process has exited already. // random processes, so return Ok because the process has exited already.
if self.status.is_some() { if self.status.is_some() {
return Ok(()); return Ok(());

View File

@@ -151,8 +151,8 @@ impl Process {
} }
pub fn send_signal(&self, signal: i32) -> io::Result<()> { pub fn send_signal(&self, signal: i32) -> io::Result<()> {
// If we've already waited on this process then the pid can be recycled // If we've already waited on this process then the pid can be recycled and
// and used for another process, and we probably shouldn't be killing // used for another process, and we probably shouldn't be sending signals to
// random processes, so return Ok because the process has exited already. // random processes, so return Ok because the process has exited already.
if self.status.is_some() { if self.status.is_some() {
Ok(()) Ok(())

View File

@@ -10,4 +10,7 @@ python3 ../x.py build --set rust.debug=true opt-dist
build-manifest bootstrap build-manifest bootstrap
# Use GCC for building GCC, as it seems to behave badly when built with Clang # Use GCC for building GCC, as it seems to behave badly when built with Clang
CC=/rustroot/bin/cc CXX=/rustroot/bin/c++ python3 ../x.py dist gcc # Only build GCC on full builds, not try builds
if [ "${DIST_TRY_BUILD:-0}" == "0" ]; then
CC=/rustroot/bin/cc CXX=/rustroot/bin/c++ python3 ../x.py dist gcc
fi

View File

@@ -1703,6 +1703,7 @@ fn render_enum_fields(
if v.is_stripped() { if v.is_stripped() {
continue; continue;
} }
write!(w, "{}", render_attributes_in_pre(v, TAB, cx))?;
w.write_str(TAB)?; w.write_str(TAB)?;
match v.kind { match v.kind {
clean::VariantItem(ref var) => match var.kind { clean::VariantItem(ref var) => match var.kind {

View File

@@ -14,6 +14,7 @@ use crate::versions::{PkgType, Versions};
static HOSTS: &[&str] = &[ static HOSTS: &[&str] = &[
"aarch64-apple-darwin", "aarch64-apple-darwin",
"aarch64-pc-windows-gnullvm",
"aarch64-pc-windows-msvc", "aarch64-pc-windows-msvc",
"aarch64-unknown-linux-gnu", "aarch64-unknown-linux-gnu",
"aarch64-unknown-linux-musl", "aarch64-unknown-linux-musl",
@@ -44,6 +45,7 @@ static HOSTS: &[&str] = &[
"x86_64-apple-darwin", "x86_64-apple-darwin",
"x86_64-pc-solaris", "x86_64-pc-solaris",
"x86_64-pc-windows-gnu", "x86_64-pc-windows-gnu",
"x86_64-pc-windows-gnullvm",
"x86_64-pc-windows-msvc", "x86_64-pc-windows-msvc",
"x86_64-unknown-freebsd", "x86_64-unknown-freebsd",
"x86_64-unknown-illumos", "x86_64-unknown-illumos",
@@ -470,7 +472,7 @@ impl Builder {
} }
// so is rust-mingw if it's available for the target // so is rust-mingw if it's available for the target
PkgType::RustMingw => { PkgType::RustMingw => {
if host.contains("pc-windows-gnu") { if host.ends_with("pc-windows-gnu") {
components.push(host_component(pkg)); components.push(host_component(pkg));
} }
} }

View File

@@ -592,7 +592,7 @@ Definite bugs found:
* [Occasional memory leak in `std::mpsc` channels](https://github.com/rust-lang/rust/issues/121582) (original code in [crossbeam](https://github.com/crossbeam-rs/crossbeam/pull/1084)) * [Occasional memory leak in `std::mpsc` channels](https://github.com/rust-lang/rust/issues/121582) (original code in [crossbeam](https://github.com/crossbeam-rs/crossbeam/pull/1084))
* [Weak-memory-induced memory leak in Windows thread-local storage](https://github.com/rust-lang/rust/pull/124281) * [Weak-memory-induced memory leak in Windows thread-local storage](https://github.com/rust-lang/rust/pull/124281)
* [A bug in the new `RwLock::downgrade` implementation](https://rust-lang.zulipchat.com/#narrow/channel/269128-miri/topic/Miri.20error.20library.20test) (caught by Miri before it landed in the Rust repo) * [A bug in the new `RwLock::downgrade` implementation](https://rust-lang.zulipchat.com/#narrow/channel/269128-miri/topic/Miri.20error.20library.20test) (caught by Miri before it landed in the Rust repo)
* [Mockall reading unintialized memory when mocking `std::io::Read::read`, even if all expectations are satisfied](https://github.com/asomers/mockall/issues/647) (caught by Miri running Tokio's test suite) * [Mockall reading uninitialized memory when mocking `std::io::Read::read`, even if all expectations are satisfied](https://github.com/asomers/mockall/issues/647) (caught by Miri running Tokio's test suite)
* [`ReentrantLock` not correctly dealing with reuse of addresses for TLS storage of different threads](https://github.com/rust-lang/rust/pull/141248) * [`ReentrantLock` not correctly dealing with reuse of addresses for TLS storage of different threads](https://github.com/rust-lang/rust/pull/141248)
Violations of [Stacked Borrows] found that are likely bugs (but Stacked Borrows is currently just an experiment): Violations of [Stacked Borrows] found that are likely bugs (but Stacked Borrows is currently just an experiment):

View File

@@ -6,7 +6,7 @@ fn direct_raw(x: *const (i32, i32)) -> *const i32 {
// Ensure that if a raw pointer is created via an intermediate // Ensure that if a raw pointer is created via an intermediate
// reference, we catch that. (Just in case someone decides to // reference, we catch that. (Just in case someone decides to
// desugar this differenly or so.) // desugar this differently or so.)
fn via_ref(x: *const (i32, i32)) -> *const i32 { fn via_ref(x: *const (i32, i32)) -> *const i32 {
unsafe { &(*x).0 as *const i32 } //~ERROR: dangling pointer unsafe { &(*x).0 as *const i32 } //~ERROR: dangling pointer
} }

View File

@@ -122,7 +122,12 @@ impl Bootstrap {
let metrics_path = env.build_root().join("build").join("metrics.json"); let metrics_path = env.build_root().join("build").join("metrics.json");
let args = dist_args.iter().map(|arg| arg.as_str()).collect::<Vec<_>>(); let args = dist_args.iter().map(|arg| arg.as_str()).collect::<Vec<_>>();
let cmd = cmd(&args).env("RUST_BACKTRACE", "full"); let cmd = cmd(&args).env("RUST_BACKTRACE", "full");
let cmd = add_shared_x_flags(env, cmd); let mut cmd = add_shared_x_flags(env, cmd);
if env.is_fast_try_build() {
// We set build.extended=false for fast try builds, but we still need Cargo
cmd = cmd.arg("cargo");
}
Self { cmd, metrics_path } Self { cmd, metrics_path }
} }
@@ -189,5 +194,18 @@ impl Bootstrap {
} }
fn add_shared_x_flags(env: &Environment, cmd: CmdBuilder) -> CmdBuilder { fn add_shared_x_flags(env: &Environment, cmd: CmdBuilder) -> CmdBuilder {
if env.is_fast_try_build() { cmd.arg("--set").arg("rust.deny-warnings=false") } else { cmd } if env.is_fast_try_build() {
// Skip things that cannot be skipped through `x ... --skip`
cmd.arg("--set")
.arg("rust.llvm-bitcode-linker=false")
// Skip wasm-component-ld. This also skips cargo, which we need to re-enable for dist
.arg("--set")
.arg("build.extended=false")
.arg("--set")
.arg("rust.codegen-backends=['llvm']")
.arg("--set")
.arg("rust.deny-warnings=false")
} else {
cmd
}
} }

View File

@@ -407,13 +407,18 @@ fn main() -> anyhow::Result<()> {
for target in [ for target in [
"rust-docs", "rust-docs",
"rustc-docs", "rustc-docs",
"rustc-dev",
"rust-dev",
"rust-docs-json", "rust-docs-json",
"rust-analyzer", "rust-analyzer",
"rustc-src", "rustc-src",
"extended",
"clippy", "clippy",
"miri", "miri",
"rustfmt", "rustfmt",
"gcc", "gcc",
"generate-copyright",
"bootstrap",
] { ] {
build_args.extend(["--skip".to_string(), target.to_string()]); build_args.extend(["--skip".to_string(), target.to_string()]);
} }

View File

@@ -118,7 +118,7 @@ pub fn finish_all(tests: &[TestInfo], total_elapsed: Duration, cfg: &Config) ->
match result { match result {
Ok(FinishedAll) => (), Ok(FinishedAll) => (),
Err(EarlyExit::Timeout) => { Err(EarlyExit::Timeout) => {
println!(" exited early; exceded {:?} timeout", cfg.timeout) println!(" exited early; exceeded {:?} timeout", cfg.timeout)
} }
Err(EarlyExit::MaxFailures) => { Err(EarlyExit::MaxFailures) => {
println!(" exited early; exceeded {:?} max failures", cfg.max_failures) println!(" exited early; exceeded {:?} max failures", cfg.max_failures)

View File

@@ -0,0 +1,17 @@
// regression test for https://github.com/rust-lang/rust/issues/142599
#![crate_name = "foo"]
//@ snapshot type-code 'foo/enum.Type.html' '//pre[@class="rust item-decl"]/code'
pub enum Type {
#[non_exhaustive]
// attribute that should not be shown
#[warn(unsafe_code)]
Variant,
}
// we would love to use the `following-sibling::` axis
// (along with an `h2[@id="aliased-type"]` query),
// but unfortunately python doesn't implement that.
//@ snapshot type-alias-code 'foo/type.TypeAlias.html' '//pre[@class="rust item-decl"][2]/code'
pub type TypeAlias = Type;

View File

@@ -0,0 +1,4 @@
<code>pub enum TypeAlias {
#[non_exhaustive]
Variant,
}</code>

View File

@@ -0,0 +1,4 @@
<code>pub enum Type {
#[non_exhaustive]
Variant,
}</code>