Skip to content

Rollup of 9 pull requests #137231

New issue

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

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

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Feb 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
ca28827
Make ub_check message clear that it's not an assert
kornelski Feb 8, 2025
f6485ff
tests: Also gate `f16::erfc()` doctest with `reliable_f16_math` cfg
Feb 17, 2025
a0a8e02
Install more signal stack trace handlers
Urgau Feb 16, 2025
59e9eb9
cg_clif: use exclusively ABI alignment
workingjubilee Feb 12, 2025
9fc7590
Enforce T: Hash for Interned<...>
Mark-Simulacrum Feb 18, 2025
d2f1597
Remove std::os::wasi::fs::FileExt::tell
thaliaarchi Feb 18, 2025
fa53181
cg_clif: Tweak formatting of global comments
workingjubilee Feb 18, 2025
f910684
don't ICE for alias-relate goals with error term
lcnr Feb 18, 2025
a72402a
add last std diagnostic items for clippy
cyrgani Feb 18, 2025
768a5bd
Remove scrutinee_hir_id from ExprKind::Match
bjorn3 Feb 18, 2025
d7fe4c0
Rollup merge of #136750 - kornelski:ub-bug, r=saethlin
Urgau Feb 18, 2025
1391f75
Rollup merge of #137151 - Urgau:register-more-signals, r=workingjubilee
Urgau Feb 18, 2025
14fb84a
Rollup merge of #137167 - martn3:reliable_f16_math-f16-erfc, r=tgross35
Urgau Feb 18, 2025
626fcdf
Rollup merge of #137195 - workingjubilee:remove-pref-align-from-cg-cl…
Urgau Feb 18, 2025
5b00e0b
Rollup merge of #137202 - Mark-Simulacrum:interned-is-hash, r=saethlin
Urgau Feb 18, 2025
73e5abd
Rollup merge of #137205 - thaliaarchi:remove-wasi-fileext-tell, r=ale…
Urgau Feb 18, 2025
61f0432
Rollup merge of #137211 - lcnr:alias-relate-accept-error, r=compiler-…
Urgau Feb 18, 2025
b7c2da2
Rollup merge of #137214 - cyrgani:clippy_diagnostic_items, r=compiler…
Urgau Feb 18, 2025
3ebe11b
Rollup merge of #137221 - bjorn3:remove_unused_field, r=compiler-errors
Urgau Feb 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions compiler/rustc_codegen_cranelift/src/abi/comments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ pub(super) fn add_locals_header_comment(fx: &mut FunctionCx<'_, '_, '_>) {
if fx.clif_comments.enabled() {
fx.add_global_comment(String::new());
fx.add_global_comment(
"kind local ty size align (abi,pref)".to_string(),
"kind local ty size align (abi)".to_string(),
);
}
}
Expand All @@ -84,14 +84,13 @@ pub(super) fn add_local_place_comments<'tcx>(
let (kind, extra) = place.debug_comment();

fx.add_global_comment(format!(
"{:<5} {:5} {:30} {:4}b {}, {}{}{}",
"{:<5} {:5} {:30} {:4}b {}{}{}",
kind,
format!("{:?}", local),
format!("{:?}", ty),
size.bytes(),
align.abi.bytes(),
align.pref.bytes(),
if extra.is_empty() { "" } else { " " },
if extra.is_empty() { "" } else { " " },
extra,
));
}
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_cranelift/src/constant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ fn data_id_for_static(
.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty))
.unwrap()
.align
.pref
.abi
.bytes();

let linkage = if import_linkage == rustc_middle::mir::mono::Linkage::ExternalWeak
Expand Down
5 changes: 4 additions & 1 deletion compiler/rustc_data_structures/src/intern.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,10 @@ impl<'a, T: Ord> Ord for Interned<'a, T> {
}
}

impl<'a, T> Hash for Interned<'a, T> {
impl<'a, T> Hash for Interned<'a, T>
where
T: Hash,
{
#[inline]
fn hash<H: Hasher>(&self, s: &mut H) {
// Pointer hashing is sufficient, due to the uniqueness constraint.
Expand Down
50 changes: 39 additions & 11 deletions compiler/rustc_driver_impl/src/signal_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ use std::{fmt, mem, ptr, slice};

use rustc_interface::util::{DEFAULT_STACK_SIZE, STACK_SIZE};

/// Signals that represent that we have a bug, and our prompt termination has
/// been ordered.
#[rustfmt::skip]
const KILL_SIGNALS: [(libc::c_int, &str); 3] = [
(libc::SIGILL, "SIGILL"),
(libc::SIGBUS, "SIGBUS"),
(libc::SIGSEGV, "SIGSEGV")
];

unsafe extern "C" {
fn backtrace_symbols_fd(buffer: *const *mut libc::c_void, size: libc::c_int, fd: libc::c_int);
}
Expand Down Expand Up @@ -39,8 +48,19 @@ macro raw_errln($tokens:tt) {
/// # Safety
///
/// Caller must ensure that this function is not re-entered.
unsafe extern "C" fn print_stack_trace(_: libc::c_int) {
unsafe extern "C" fn print_stack_trace(signum: libc::c_int) {
const MAX_FRAMES: usize = 256;

let signame = {
let mut signame = "<unknown>";
for sig in KILL_SIGNALS {
if sig.0 == signum {
signame = sig.1;
}
}
signame
};

let stack = unsafe {
// Reserve data segment so we don't have to malloc in a signal handler, which might fail
// in incredibly undesirable and unexpected ways due to e.g. the allocator deadlocking
Expand All @@ -54,7 +74,8 @@ unsafe extern "C" fn print_stack_trace(_: libc::c_int) {
};

// Just a stack trace is cryptic. Explain what we're doing.
raw_errln!("error: rustc interrupted by SIGSEGV, printing backtrace\n");
raw_errln!("error: rustc interrupted by {signame}, printing backtrace\n");

let mut written = 1;
let mut consumed = 0;
// Begin elaborating return addrs into symbols and writing them directly to stderr
Expand Down Expand Up @@ -94,7 +115,7 @@ unsafe extern "C" fn print_stack_trace(_: libc::c_int) {
written += rem.len() + 1;

let random_depth = || 8 * 16; // chosen by random diceroll (2d20)
if cyclic || stack.len() > random_depth() {
if (cyclic || stack.len() > random_depth()) && signum == libc::SIGSEGV {
// technically speculation, but assert it with confidence anyway.
// rustc only arrived in this signal handler because bad things happened
// and this message is for explaining it's not the programmer's fault
Expand All @@ -106,17 +127,22 @@ unsafe extern "C" fn print_stack_trace(_: libc::c_int) {
written += 1;
}
raw_errln!("note: we would appreciate a report at https://github.com/rust-lang/rust");
// get the current stack size WITHOUT blocking and double it
let new_size = STACK_SIZE.get().copied().unwrap_or(DEFAULT_STACK_SIZE) * 2;
raw_errln!("help: you can increase rustc's stack size by setting RUST_MIN_STACK={new_size}");
written += 2;
written += 1;
if signum == libc::SIGSEGV {
// get the current stack size WITHOUT blocking and double it
let new_size = STACK_SIZE.get().copied().unwrap_or(DEFAULT_STACK_SIZE) * 2;
raw_errln!(
"help: you can increase rustc's stack size by setting RUST_MIN_STACK={new_size}"
);
written += 1;
}
if written > 24 {
// We probably just scrolled the earlier "we got SIGSEGV" message off the terminal
raw_errln!("note: backtrace dumped due to SIGSEGV! resuming signal");
// We probably just scrolled the earlier "interrupted by {signame}" message off the terminal
raw_errln!("note: backtrace dumped due to {signame}! resuming signal");
};
}

/// When SIGSEGV is delivered to the process, print a stack trace and then exit.
/// When one of the KILL signals is delivered to the process, print a stack trace and then exit.
pub(super) fn install() {
unsafe {
let alt_stack_size: usize = min_sigstack_size() + 64 * 1024;
Expand All @@ -129,7 +155,9 @@ pub(super) fn install() {
sa.sa_sigaction = print_stack_trace as libc::sighandler_t;
sa.sa_flags = libc::SA_NODEFER | libc::SA_RESETHAND | libc::SA_ONSTACK;
libc::sigemptyset(&mut sa.sa_mask);
libc::sigaction(libc::SIGSEGV, &sa, ptr::null_mut());
for (signum, _signame) in KILL_SIGNALS {
libc::sigaction(signum, &sa, ptr::null_mut());
}
}
}

Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_middle/src/thir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,6 @@ pub enum ExprKind<'tcx> {
/// A `match` expression.
Match {
scrutinee: ExprId,
scrutinee_hir_id: HirId,
arms: Box<[ArmId]>,
match_source: MatchSource,
},
Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_mir_build/src/thir/cx/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,6 @@ impl<'tcx> ThirBuildCx<'tcx> {
},
hir::ExprKind::Match(discr, arms, match_source) => ExprKind::Match {
scrutinee: self.mirror_expr(discr),
scrutinee_hir_id: discr.hir_id,
arms: arms.iter().map(|a| self.convert_arm(a)).collect(),
match_source,
},
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_mir_build/src/thir/pattern/check_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ impl<'p, 'tcx> Visitor<'p, 'tcx> for MatchVisitor<'p, 'tcx> {
}
return;
}
ExprKind::Match { scrutinee, scrutinee_hir_id: _, box ref arms, match_source } => {
ExprKind::Match { scrutinee, box ref arms, match_source } => {
self.check_match(scrutinee, arms, match_source, ex.span);
}
ExprKind::Let { box ref pat, expr } => {
Expand Down
12 changes: 11 additions & 1 deletion compiler/rustc_next_trait_solver/src/solve/alias_relate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,17 @@ where
) -> QueryResult<I> {
let cx = self.cx();
let Goal { param_env, predicate: (lhs, rhs, direction) } = goal;
debug_assert!(lhs.to_alias_term().is_some() || rhs.to_alias_term().is_some());

// Check that the alias-relate goal is reasonable. Writeback for
// `coroutine_stalled_predicates` can replace alias terms with
// `{type error}` if the alias still contains infer vars, so we also
// accept alias-relate goals where one of the terms is an error.
debug_assert!(
lhs.to_alias_term().is_some()
|| rhs.to_alias_term().is_some()
|| lhs.is_error()
|| rhs.is_error()
);

// Structurally normalize the lhs.
let lhs = if let Some(alias) = lhs.to_alias_term() {
Expand Down
13 changes: 13 additions & 0 deletions compiler/rustc_resolve/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,19 @@ pub(crate) struct ImportData<'ra> {
/// so we can use referential equality to compare them.
pub(crate) type Import<'ra> = Interned<'ra, ImportData<'ra>>;

// Allows us to use Interned without actually enforcing (via Hash/PartialEq/...) uniqueness of the
// contained data.
// FIXME: We may wish to actually have at least debug-level assertions that Interned's guarantees
// are upheld.
impl std::hash::Hash for ImportData<'_> {
fn hash<H>(&self, _: &mut H)
where
H: std::hash::Hasher,
{
unreachable!()
}
}

impl<'ra> ImportData<'ra> {
pub(crate) fn is_glob(&self) -> bool {
matches!(self.kind, ImportKind::Glob { .. })
Expand Down
26 changes: 26 additions & 0 deletions compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,19 @@ struct ModuleData<'ra> {
#[rustc_pass_by_value]
struct Module<'ra>(Interned<'ra, ModuleData<'ra>>);

// Allows us to use Interned without actually enforcing (via Hash/PartialEq/...) uniqueness of the
// contained data.
// FIXME: We may wish to actually have at least debug-level assertions that Interned's guarantees
// are upheld.
impl std::hash::Hash for ModuleData<'_> {
fn hash<H>(&self, _: &mut H)
where
H: std::hash::Hasher,
{
unreachable!()
}
}

impl<'ra> ModuleData<'ra> {
fn new(
parent: Option<Module<'ra>>,
Expand Down Expand Up @@ -739,6 +752,19 @@ struct NameBindingData<'ra> {
/// so we can use referential equality to compare them.
type NameBinding<'ra> = Interned<'ra, NameBindingData<'ra>>;

// Allows us to use Interned without actually enforcing (via Hash/PartialEq/...) uniqueness of the
// contained data.
// FIXME: We may wish to actually have at least debug-level assertions that Interned's guarantees
// are upheld.
impl std::hash::Hash for NameBindingData<'_> {
fn hash<H>(&self, _: &mut H)
where
H: std::hash::Hasher,
{
unreachable!()
}
}

trait ToNameBinding<'ra> {
fn to_name_binding(self, arenas: &'ra ResolverArenas<'ra>) -> NameBinding<'ra>;
}
Expand Down
7 changes: 7 additions & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ symbols! {
Capture,
Cell,
Center,
Child,
Cleanup,
Clone,
CoercePointee,
Expand Down Expand Up @@ -336,6 +337,7 @@ symbols! {
SliceIter,
Some,
SpanCtxt,
Stdin,
String,
StructuralPartialEq,
SubdiagMessage,
Expand Down Expand Up @@ -599,6 +601,9 @@ symbols! {
cfi,
cfi_encoding,
char,
char_is_ascii,
child_id,
child_kill,
client,
clippy,
clobber_abi,
Expand Down Expand Up @@ -1468,6 +1473,7 @@ symbols! {
panic_2015,
panic_2021,
panic_abort,
panic_any,
panic_bounds_check,
panic_cannot_unwind,
panic_const_add_overflow,
Expand Down Expand Up @@ -1573,6 +1579,7 @@ symbols! {
proc_macro_mod,
proc_macro_non_items,
proc_macro_path_invoc,
process_abort,
process_exit,
profiler_builtins,
profiler_runtime,
Expand Down
15 changes: 15 additions & 0 deletions compiler/rustc_type_ir/src/inherent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ pub trait Ty<I: Interner<Ty = Self>>:
matches!(self.kind(), ty::Infer(ty::TyVar(_)))
}

fn is_ty_error(self) -> bool {
matches!(self.kind(), ty::Error(_))
}

fn is_floating_point(self) -> bool {
matches!(self.kind(), ty::Float(_) | ty::Infer(ty::FloatVar(_)))
}
Expand Down Expand Up @@ -284,6 +288,10 @@ pub trait Const<I: Interner<Const = Self>>:
fn is_ct_var(self) -> bool {
matches!(self.kind(), ty::ConstKind::Infer(ty::InferConst::Var(_)))
}

fn is_ct_error(self) -> bool {
matches!(self.kind(), ty::ConstKind::Error(_))
}
}

pub trait ValueConst<I: Interner<ValueConst = Self>>: Copy + Debug + Hash + Eq {
Expand Down Expand Up @@ -370,6 +378,13 @@ pub trait Term<I: Interner<Term = Self>>:
}
}

fn is_error(self) -> bool {
match self.kind() {
ty::TermKind::Ty(ty) => ty.is_ty_error(),
ty::TermKind::Const(ct) => ct.is_ct_error(),
}
}

fn to_alias_term(self) -> Option<ty::AliasTerm<I>> {
match self.kind() {
ty::TermKind::Ty(ty) => match ty.kind() {
Expand Down
1 change: 1 addition & 0 deletions library/core/src/char/methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,7 @@ impl char {
#[must_use]
#[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
#[rustc_const_stable(feature = "const_char_is_ascii", since = "1.32.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "char_is_ascii")]
#[inline]
pub const fn is_ascii(&self) -> bool {
*self as u32 <= 0x7F
Expand Down
6 changes: 3 additions & 3 deletions library/core/src/ub_checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ macro_rules! assert_unsafe_precondition {
#[rustc_nounwind]
const fn precondition_check($($name:$ty),*) {
if !$e {
::core::panicking::panic_nounwind(
concat!("unsafe precondition(s) violated: ", $message)
);
::core::panicking::panic_nounwind(concat!("unsafe precondition(s) violated: ", $message,
"\n\nThis indicates a bug in the program. \
This Undefined Behavior check is optional, and cannot be relied on for safety."));
}
}

Expand Down
2 changes: 2 additions & 0 deletions library/std/src/f16.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1321,12 +1321,14 @@ impl f16 {
/// ```
/// #![feature(f16)]
/// #![feature(float_erf)]
/// # #[cfg(reliable_f16_math)] {
/// let x: f16 = 0.123;
///
/// let one = x.erf() + x.erfc();
/// let abs_difference = (one - 1.0).abs();
///
/// assert!(abs_difference <= f16::EPSILON);
/// # }
/// ```
#[rustc_allow_incoherent_impl]
#[must_use = "method returns a new number and does not mutate the original value"]
Expand Down
1 change: 1 addition & 0 deletions library/std/src/io/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ fn handle_ebadf_lazy<T>(r: io::Result<T>, default: impl FnOnce() -> T) -> io::Re
/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "Stdin")]
pub struct Stdin {
inner: &'static Mutex<BufReader<StdinRaw>>,
}
Expand Down
11 changes: 0 additions & 11 deletions library/std/src/os/wasi/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,6 @@ pub trait FileExt {
Ok(())
}

/// Returns the current position within the file.
///
/// This corresponds to the `fd_tell` syscall and is similar to
/// `seek` where you offset 0 bytes from the current position.
#[doc(alias = "fd_tell")]
fn tell(&self) -> io::Result<u64>;

/// Adjusts the flags associated with this file.
///
/// This corresponds to the `fd_fdstat_set_flags` syscall.
Expand Down Expand Up @@ -240,10 +233,6 @@ impl FileExt for fs::File {
self.as_inner().as_inner().pwrite(bufs, offset)
}

fn tell(&self) -> io::Result<u64> {
self.as_inner().as_inner().tell()
}

fn fdstat_set_flags(&self, flags: u16) -> io::Result<()> {
self.as_inner().as_inner().set_flags(flags)
}
Expand Down
Loading
Loading