Skip to content

Commit

Permalink
Auto merge of #112708 - flip1995:clippy-freezing-pc-with-ice, r=oli-obk
Browse files Browse the repository at this point in the history
Avoid calling queries during query stack printing

This has the side effect, that when Clippy should ICE (during an EarlyPass?) it will fill up the RAM with 2 GB/s and then freezes my Laptop. This is blocking the Clippy sync and might give some people really bad experiences, so this should be merged ASAP.

r? `@cjgillot`
cc `@Zoxc`

I only commented this on [Zulip](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/.60try_print_query_stack.60.20has.20.60ImplicitCtx.60.20during.20.60EarlyPass.60/near/363926180). I should've left a comment on the PR as well. My bad.
  • Loading branch information
bors committed Jun 28, 2023
2 parents 08fd6f7 + 7c15779 commit 8882507
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 9 deletions.
7 changes: 6 additions & 1 deletion compiler/rustc_interface/src/interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,12 @@ pub fn try_print_query_stack(handler: &Handler, num_frames: Option<usize>) {
// state if it was responsible for triggering the panic.
let i = ty::tls::with_context_opt(|icx| {
if let Some(icx) = icx {
print_query_stack(QueryCtxt::new(icx.tcx), icx.query, handler, num_frames)
ty::print::with_no_queries!(print_query_stack(
QueryCtxt::new(icx.tcx),
icx.query,
handler,
num_frames
))
} else {
0
}
Expand Down
15 changes: 10 additions & 5 deletions compiler/rustc_middle/src/ty/print/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ macro_rules! define_helper {
$tl.with(|c| c.set(self.0))
}
}

pub fn $name() -> bool {
$tl.with(|c| c.get())
}
)+
}
}
Expand Down Expand Up @@ -676,7 +680,7 @@ pub trait PrettyPrinter<'tcx>:
p!(")")
}
ty::FnDef(def_id, substs) => {
if NO_QUERIES.with(|q| q.get()) {
if with_no_queries() {
p!(print_def_path(def_id, substs));
} else {
let sig = self.tcx().fn_sig(def_id).subst(self.tcx(), substs);
Expand Down Expand Up @@ -732,7 +736,7 @@ pub trait PrettyPrinter<'tcx>:
p!(print_def_path(def_id, &[]));
}
ty::Alias(ty::Projection | ty::Inherent | ty::Weak, ref data) => {
if !(self.should_print_verbose() || NO_QUERIES.with(|q| q.get()))
if !(self.should_print_verbose() || with_no_queries())
&& self.tcx().is_impl_trait_in_trait(data.def_id)
{
return self.pretty_print_opaque_impl_type(data.def_id, data.substs);
Expand Down Expand Up @@ -779,7 +783,7 @@ pub trait PrettyPrinter<'tcx>:
return Ok(self);
}
_ => {
if NO_QUERIES.with(|q| q.get()) {
if with_no_queries() {
p!(print_def_path(def_id, &[]));
return Ok(self);
} else {
Expand Down Expand Up @@ -1746,7 +1750,8 @@ impl DerefMut for FmtPrinter<'_, '_> {

impl<'a, 'tcx> FmtPrinter<'a, 'tcx> {
pub fn new(tcx: TyCtxt<'tcx>, ns: Namespace) -> Self {
Self::new_with_limit(tcx, ns, tcx.type_length_limit())
let limit = if with_no_queries() { Limit::new(1048576) } else { tcx.type_length_limit() };
Self::new_with_limit(tcx, ns, limit)
}

pub fn new_with_limit(tcx: TyCtxt<'tcx>, ns: Namespace, type_length_limit: Limit) -> Self {
Expand Down Expand Up @@ -2999,7 +3004,7 @@ fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, N
///
/// The implementation uses similar import discovery logic to that of 'use' suggestions.
///
/// See also [`DelayDm`](rustc_error_messages::DelayDm) and [`with_no_trimmed_paths`].
/// See also [`DelayDm`](rustc_error_messages::DelayDm) and [`with_no_trimmed_paths!`].
fn trimmed_def_paths(tcx: TyCtxt<'_>, (): ()) -> FxHashMap<DefId, Symbol> {
let mut map: FxHashMap<DefId, Symbol> = FxHashMap::default();

Expand Down
6 changes: 3 additions & 3 deletions compiler/rustc_query_impl/src/plumbing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use rustc_middle::query::on_disk_cache::AbsoluteBytePos;
use rustc_middle::query::on_disk_cache::{CacheDecoder, CacheEncoder, EncodedDepNodeIndex};
use rustc_middle::query::Key;
use rustc_middle::ty::tls::{self, ImplicitCtxt};
use rustc_middle::ty::{self, TyCtxt};
use rustc_middle::ty::{self, print::with_no_queries, TyCtxt};
use rustc_query_system::dep_graph::{DepNodeParams, HasDepContext};
use rustc_query_system::ich::StableHashingContext;
use rustc_query_system::query::{
Expand Down Expand Up @@ -312,15 +312,15 @@ pub(crate) fn create_query_frame<
);
let description =
if tcx.sess.verbose() { format!("{description} [{name:?}]") } else { description };
let span = if kind == dep_graph::DepKind::def_span {
let span = if kind == dep_graph::DepKind::def_span || with_no_queries() {
// The `def_span` query is used to calculate `default_span`,
// so exit to avoid infinite recursion.
None
} else {
Some(key.default_span(tcx))
};
let def_id = key.key_as_def_id();
let def_kind = if kind == dep_graph::DepKind::opt_def_kind {
let def_kind = if kind == dep_graph::DepKind::opt_def_kind || with_no_queries() {
// Try to avoid infinite recursion.
None
} else {
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/treat-err-as-bug/panic-causes-oom-112708.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// compile-flags: -Ztreat-err-as-bug
// dont-check-failure-status
// error-pattern: aborting due to `-Z treat-err-as-bug=1`
// dont-check-compiler-stderr
// rustc-env:RUST_BACKTRACE=0

fn main() {
#[deny(while_true)]
while true {}
}
32 changes: 32 additions & 0 deletions tests/ui/treat-err-as-bug/panic-causes-oom-112708.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error: denote infinite loops with `loop { ... }`
--> $DIR/panic-causes-oom-112708.rs:13:5
|
LL | while true {}
| ^^^^^^^^^^ help: use `loop`
|
note: the lint level is defined here
--> $DIR/panic-causes-oom-112708.rs:12:12
|
LL | #[deny(while_true)]
| ^^^^^^^^^^


query stack during panic:
#0 [early_lint_checks] perform lints prior to macro expansion
#1 [hir_crate] getting the crate HIR
end of query stack

error: the compiler unexpectedly panicked. this is a bug.

query stack during panic:
#0 [early_lint_checks] perform lints prior to macro expansion
#1 [hir_crate] getting the crate HIR
end of query stack

error: the compiler unexpectedly panicked. this is a bug.

query stack during panic:
#0 [early_lint_checks] perform lints prior to macro expansion
#1 [hir_crate] getting the crate HIR
end of query stack
thread caused non-unwinding panic. aborting.

0 comments on commit 8882507

Please sign in to comment.