Skip to content

Trait resolver hangs when evaluating cyclic requirement with lifetimes #96340

Open
@Noratrieb

Description

@Noratrieb

I tried this code:
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=122bc8148cdc1e27553e68ca7c6d6253

use std::marker::PhantomData;

// a fancy trait
pub trait CoolTrait {}

// implement that trait for all reference to someone implementing the trait
impl<'a, D: CoolTrait> CoolTrait for &'a D {}

// a type with a lifetime
pub struct Parent<'a> {
    // We need a lifetime. otherwise, if we remove it, we get:
    // error[E0275]: overflow evaluating the requirement `A: CoolTrait`
    _boo: PhantomData<&'a ()>,
}

// two more types with a lifetime
pub struct A<'a> {
    _boo: PhantomData<&'a ()>,
}

pub struct B<'a> {
    _boo: PhantomData<&'a ()>,
}

// implement CoolTrait only when the two types themselves implement it
impl<'a> CoolTrait for Parent<'a>
where
    A<'a>: CoolTrait,
    B<'a>: CoolTrait,
{
}

// implement CoolTrait for the two types only when the Parent also implements it
// oh no! a cycle!
impl<'a> CoolTrait for A<'a> where Parent<'a>: CoolTrait {}
impl<'a> CoolTrait for B<'a> where Parent<'a>: CoolTrait {}

// now test whether CoolTrait is implemented for
pub fn foo(parent: Parent<'_>) {
    requires_parent_fulfill_cool_trait(parent);
}

pub fn requires_parent_fulfill_cool_trait(_: impl CoolTrait) {}

I expected to see this happen: Code does not compile and error out because of the cyclic requirement

Instead, this happened: rustc hangs

rustc --version --verbose:

rustc 1.62.0-nightly (3f391b845 2022-04-15)
binary: rustc
commit-hash: 3f391b84552f210adec7893b50c5da74f9362ae4
commit-date: 2022-04-15
host: x86_64-unknown-linux-gnu
release: 1.62.0-nightly
LLVM version: 14.0.0

I also tried running the same code with -Zchalk, it ICEs

Backtrace

<p>
error: internal compiler error: no errors encountered even though `delay_span_bug` issued

error: internal compiler error: broken MIR in DefId(0:33 ~ dilaria[17cd]::foo) (NoSolution): could not prove Binder(TraitPredicate(<Parent<'_> as CoolTrait>, polarity:Positive), [])
  |
  = note: delayed at compiler/rustc_borrowck/src/type_check/canonical.rs:149:13

thread 'rustc' panicked at 'Box<dyn Any>', compiler/rustc_errors/src/lib.rs:1383:13
stack backtrace:
   0:     0x7f2db8b0f84d - std::backtrace_rs::backtrace::libunwind::trace::hce19c90b92bd73af
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x7f2db8b0f84d - std::backtrace_rs::backtrace::trace_unsynchronized::h37e11f7a70fe2e93
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7f2db8b0f84d - std::sys_common::backtrace::_print_fmt::h9a82c368c968b662
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x7f2db8b0f84d - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h5ba9b1105ba53bd0
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x7f2db8b6af3c - core::fmt::write::ha50f92e7d26c8f8e
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/core/src/fmt/mod.rs:1194:17
   5:     0x7f2db8b00fa1 - std::io::Write::write_fmt::h396eef3c560a16a9
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/io/mod.rs:1655:15
   6:     0x7f2db8b12565 - std::sys_common::backtrace::_print::h35ed08d4d805d2b3
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x7f2db8b12565 - std::sys_common::backtrace::print::h50e1ed5ca96892de
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x7f2db8b12565 - std::panicking::default_hook::{{closure}}::hc7e9cf4fa3684a1d
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/panicking.rs:295:22
   9:     0x7f2db8b121d9 - std::panicking::default_hook::h536ad2c4f0ac6e2e
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/panicking.rs:314:9
  10:     0x7f2db92b44f1 - rustc_driver[eab24f0126444cb8]::DEFAULT_HOOK::{closure#0}::{closure#0}
  11:     0x7f2db8b12d36 - std::panicking::rust_panic_with_hook::hb5f6d16b6f55acfb
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/panicking.rs:702:17
  12:     0x7f2dba3e7cf1 - std[4370f669910bc83b]::panicking::begin_panic::<rustc_errors[192e17d657890bb]::ExplicitBug>::{closure#0}
  13:     0x7f2dba3e65e6 - std[4370f669910bc83b]::sys_common::backtrace::__rust_end_short_backtrace::<std[4370f669910bc83b]::panicking::begin_panic<rustc_errors[192e17d657890bb]::ExplicitBug>::{closure#0}, !>
  14:     0x7f2dba3ff79f - std[4370f669910bc83b]::panicking::begin_panic::<rustc_errors[192e17d657890bb]::ExplicitBug>
  15:     0x7f2dba402716 - std[4370f669910bc83b]::panic::panic_any::<rustc_errors[192e17d657890bb]::ExplicitBug>
  16:     0x7f2dbbb9a587 - <rustc_errors[192e17d657890bb]::HandlerInner as core[4ac2a939107caa31]::ops::drop::Drop>::drop
  17:     0x7f2dbb2b06c8 - core[4ac2a939107caa31]::ptr::drop_in_place::<rustc_session[2ead2415dc439e52]::parse::ParseSess>
  18:     0x7f2dbb2b33a3 - <alloc[a10ef91e5af977a4]::rc::Rc<rustc_session[2ead2415dc439e52]::session::Session> as core[4ac2a939107caa31]::ops::drop::Drop>::drop
  19:     0x7f2dbb2dd65d - core[4ac2a939107caa31]::ptr::drop_in_place::<rustc_interface[9315513aeaeb57a1]::interface::Compiler>
  20:     0x7f2dbb2dcf54 - rustc_span[97e6a00764b526c]::with_source_map::<core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>, rustc_interface[9315513aeaeb57a1]::interface::create_compiler_and_run<core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>, rustc_driver[eab24f0126444cb8]::run_compiler::{closure#1}>::{closure#1}>
  21:     0x7f2dbb2b4dd7 - <scoped_tls[3ac5dbd4828c14b8]::ScopedKey<rustc_span[97e6a00764b526c]::SessionGlobals>>::set::<rustc_interface[9315513aeaeb57a1]::interface::run_compiler<core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>, rustc_driver[eab24f0126444cb8]::run_compiler::{closure#1}>::{closure#0}, core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>>
  22:     0x7f2dbb2ca19f - std[4370f669910bc83b]::sys_common::backtrace::__rust_begin_short_backtrace::<rustc_interface[9315513aeaeb57a1]::util::run_in_thread_pool_with_globals<rustc_interface[9315513aeaeb57a1]::interface::run_compiler<core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>, rustc_driver[eab24f0126444cb8]::run_compiler::{closure#1}>::{closure#0}, core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>>::{closure#0}, core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>>
  23:     0x7f2dbb2ca2e9 - <<std[4370f669910bc83b]::thread::Builder>::spawn_unchecked_<rustc_interface[9315513aeaeb57a1]::util::run_in_thread_pool_with_globals<rustc_interface[9315513aeaeb57a1]::interface::run_compiler<core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>, rustc_driver[eab24f0126444cb8]::run_compiler::{closure#1}>::{closure#0}, core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>>::{closure#0}, core[4ac2a939107caa31]::result::Result<(), rustc_errors[192e17d657890bb]::ErrorGuaranteed>>::{closure#1} as core[4ac2a939107caa31]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  24:     0x7f2db8b1cbe3 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hfd8bbde0a7b593d1
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/alloc/src/boxed.rs:1866:9
  25:     0x7f2db8b1cbe3 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h74803de8f8876a22
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/alloc/src/boxed.rs:1866:9
  26:     0x7f2db8b1cbe3 - std::sys::unix::thread::Thread::new::thread_start::h2d9430691b39c114
                               at /rustc/3f391b84552f210adec7893b50c5da74f9362ae4/library/std/src/sys/unix/thread.rs:108:17
  27:     0x7f2db8a3d609 - start_thread
                               at /build/glibc-sMfBJT/glibc-2.31/nptl/pthread_create.c:477:8
  28:     0x7f2db8956163 - clone
  29:                0x0 - <unknown>

note: 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-compiler&template=ice.md

note: rustc 1.62.0-nightly (3f391b845 2022-04-15) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type lib -C embed-bitcode=no -C debuginfo=2 -C linker=clang -C incremental -Z chalk

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
warning: `dilaria` (lib) generated 3 warnings
error: could not compile `dilaria`; 3 warnings emitted

Removing the lifetimes fixes the issue, and compilation fails with a trait resolution overflow. The lifetimes seem to be confusing the overflow checker.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-lifetimesArea: Lifetimes / regionsA-trait-systemArea: Trait systemC-bugCategory: This is a bug.I-hangIssue: The compiler never terminates, due to infinite loops, deadlock, livelock, etc.P-mediumMedium priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions