Skip to content

Commit

Permalink
Unconditionally show update nightly hint on ICE
Browse files Browse the repository at this point in the history
  • Loading branch information
jieyouxu committed Apr 8, 2024
1 parent ab3dba9 commit ec2a36b
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 46 deletions.
5 changes: 1 addition & 4 deletions compiler/rustc_driver_impl/messages.ftl
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
driver_impl_ice = the compiler unexpectedly panicked. this is a bug.
driver_impl_ice_bug_report = we would appreciate a bug report: {$bug_report_url}
driver_impl_ice_bug_report_internal_feature = using internal features is not supported and expected to cause internal compiler errors when used incorrectly
driver_impl_ice_bug_report_outdated =
it seems that this compiler `{$version}` is outdated, a newer nightly should have been released in the meantime
.update = please consider running `rustup update nightly` to update the nightly channel and check if this problem still persists
.url = if the problem still persists, we would appreciate a bug report: {$bug_report_url}
driver_impl_ice_bug_report_update_note = if you are using a nightly compiler, please make sure that you have updated to the latest nightly
driver_impl_ice_exclude_cargo_defaults = some of the compiler flags provided by cargo are hidden
driver_impl_ice_flags = compiler flags: {$flags}
Expand Down
36 changes: 5 additions & 31 deletions compiler/rustc_driver_impl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ use std::str;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, OnceLock};
use std::time::{Instant, SystemTime};
use time::{Date, OffsetDateTime, Time};
use time::OffsetDateTime;

#[allow(unused_macros)]
macro do_not_use_print($($t:tt)*) {
Expand Down Expand Up @@ -1385,9 +1385,6 @@ pub fn install_ice_hook(
using_internal_features
}

const DATE_FORMAT: &[time::format_description::FormatItem<'static>] =
&time::macros::format_description!("[year]-[month]-[day]");

/// Prints the ICE message, including query stack, but without backtrace.
///
/// The message will point the user at `bug_report_url` to report the ICE.
Expand Down Expand Up @@ -1416,34 +1413,11 @@ fn report_ice(
dcx.emit_err(session_diagnostics::Ice);
}

use time::ext::NumericalDuration;

// Try to hint user to update nightly if applicable when reporting an ICE.
// Attempt to calculate when current version was released, and add 12 hours
// as buffer. If the current version's release timestamp is older than
// the system's current time + 24 hours + 12 hours buffer if we're on
// nightly.
if let Some("nightly") = option_env!("CFG_RELEASE_CHANNEL")
&& let Some(version) = option_env!("CFG_VERSION")
&& let Some(ver_date_str) = option_env!("CFG_VER_DATE")
&& let Ok(ver_date) = Date::parse(&ver_date_str, DATE_FORMAT)
&& let ver_datetime = OffsetDateTime::new_utc(ver_date, Time::MIDNIGHT)
&& let system_datetime = OffsetDateTime::from(SystemTime::now())
&& system_datetime.checked_sub(36.hours()).is_some_and(|d| d > ver_datetime)
&& !using_internal_features.load(std::sync::atomic::Ordering::Relaxed)
{
dcx.emit_note(session_diagnostics::IceBugReportOutdated {
version,
bug_report_url,
note_update: (),
note_url: (),
});
if using_internal_features.load(std::sync::atomic::Ordering::Relaxed) {
dcx.emit_note(session_diagnostics::IceBugReportInternalFeature);
} else {
if using_internal_features.load(std::sync::atomic::Ordering::Relaxed) {
dcx.emit_note(session_diagnostics::IceBugReportInternalFeature);
} else {
dcx.emit_note(session_diagnostics::IceBugReport { bug_report_url });
}
dcx.emit_note(session_diagnostics::IceBugReport { bug_report_url });
dcx.emit_note(session_diagnostics::UpdateNightlyNote);
}

let version = util::version_str!().unwrap_or("unknown_version");
Expand Down
15 changes: 4 additions & 11 deletions compiler/rustc_driver_impl/src/session_diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,12 @@ pub(crate) struct IceBugReport<'a> {
}

#[derive(Diagnostic)]
#[diag(driver_impl_ice_bug_report_internal_feature)]
pub(crate) struct IceBugReportInternalFeature;
#[diag(driver_impl_ice_bug_report_update_note)]
pub(crate) struct UpdateNightlyNote;

#[derive(Diagnostic)]
#[diag(driver_impl_ice_bug_report_outdated)]
pub(crate) struct IceBugReportOutdated<'a> {
pub version: &'a str,
pub bug_report_url: &'a str,
#[note(driver_impl_update)]
pub note_update: (),
#[note(driver_impl_url)]
pub note_url: (),
}
#[diag(driver_impl_ice_bug_report_internal_feature)]
pub(crate) struct IceBugReportInternalFeature;

#[derive(Diagnostic)]
#[diag(driver_impl_ice_version)]
Expand Down
2 changes: 2 additions & 0 deletions tests/rustdoc-ui/ice-bug-report-url.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-rustdoc&template=ice.md

note: if you are using a nightly compiler, please make sure that you have updated to the latest nightly

note: rustc {version} running on {platform}

query stack during panic:
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/consts/const-eval/const-eval-query-stack.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ error: internal compiler error[E0080]: evaluation of constant value failed
LL | const X: i32 = 1 / 0;
| ^^^^^ attempt to divide `1_i32` by zero

note: if you are using a nightly compiler, please make sure that you have updated to the latest nightly

query stack during panic:
#0 [eval_to_allocation_raw] const-evaluating + checking `X`
#1 [eval_to_const_value_raw] simplifying constant for the type system `X`
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/impl-trait/equality-in-canonical-query.clone.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ LL | same_output(foo, rpit);
LL | same_output(foo, rpit);
| ^^^^^^^^^^^^^^^^^^^^^^

note: if you are using a nightly compiler, please make sure that you have updated to the latest nightly

query stack during panic:
end of query stack
2 changes: 2 additions & 0 deletions tests/ui/panics/default-backtrace-ice.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ error: the compiler unexpectedly panicked. this is a bug.





query stack during panic:
#0 [resolver_for_lowering_raw] getting the resolver for lowering
end of query stack
2 changes: 2 additions & 0 deletions tests/ui/track-diagnostics/track.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: if you are using a nightly compiler, please make sure that you have updated to the latest nightly

note: rustc $VERSION running on $TARGET

note: compiler flags: ... -Z ui-testing ... -Z track-diagnostics
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ LL | query(get_rpit);
LL | query(get_rpit);
| ^^^^^^^^^^^^^^^

note: if you are using a nightly compiler, please make sure that you have updated to the latest nightly

query stack during panic:
end of query stack

0 comments on commit ec2a36b

Please sign in to comment.