Skip to content
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

Internal Compiler Error when building an async closure that calls methods on a referenced variable and a cloned referenced variable in a specific order #123697

Closed
BigBadE opened this issue Apr 9, 2024 · 2 comments · Fixed by #123701
Assignees
Labels
C-bug Category: This is a bug. F-async_closure `#![feature(async_closure)]` F-async_fn_traits `#![feature(async_fn_traits)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@BigBadE
Copy link

BigBadE commented Apr 9, 2024

Code

This bug only happens when calling a method on two different referenced variables inside an async closure. For some reason, this bug will not happen if the lines are flipped (calling it on test first then temp). It also will not happen if test isn't cloned outside the closure first.

This will error:

#![feature(async_closure, async_fn_traits)]

fn main() {}

pub fn test(test: &u64, temp: &u64) {
    let test = test.clone();
    async || {
        temp.abs_diff(12);
        test.clone();
    };
}

This will not:

pub fn test(test: &u64, temp: &u64) {
    async || {
        temp.abs_diff(12);
        test.clone();
    };
}

Neither will:

pub fn test(test: &u64, temp: &u64) {
    let test = test.clone();
    async || {
        test.clone();
        temp.abs_diff(12);
    };
}

Nor will:

pub fn test(test: &u64, temp: &u64) {
    let temp = temp.clone();
    async || {
        test.clone();
        temp.abs_diff(12);
    };
}

But if both the order is flipped and the line order is flipped it will crash (variable name changed to make sure shadowing wasn't the issue):

pub fn test(test: &u64, temp: &u64) {
    let other = test.clone();
    async || {
        temp.clone();
        other.abs_diff(12);
    };
}

This setup for the bug was found entirely through trial and error. The original issue was found in a nightly build of a project I'm working on (https://github.com/BigBadE/Raven-Language/actions/runs/8608806965/job/23628381189).

Meta

This bug was introduced in the latest version of nightly (2024-04-08). It was not present in 2024-04-07.

rustc 1.79.0-nightly (ab5bda1 2024-04-08)
binary: rustc
commit-hash: ab5bda1
commit-date: 2024-04-08
host: x86_64-pc-windows-msvc
release: 1.79.0-nightly
LLVM version: 18.1.3

Error output

$ cargo build
   Compiling testing v0.1.0 (D:\RustProjects\testing)
thread 'rustc' panicked at compiler\rustc_mir_transform\src\coroutine\by_move_body.rs:159:17:
assertion failed: child_capture.place.projections.len() >=
    parent_capture.place.projections.len()
stack backtrace:
   0:     0x7ff8165537fa - std::backtrace_rs::backtrace::dbghelp64::trace
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:99
   1:     0x7ff8165537fa - std::backtrace_rs::backtrace::trace_unsynchronized
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
   2:     0x7ff8165537fa - std::sys_common::backtrace::_print_fmt
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\sys_common\backtrace.rs:68
   3:     0x7ff8165537fa - std::sys_common::backtrace::_print::impl$0::fmt
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\sys_common\backtrace.rs:44
   4:     0x7ff8165845e9 - core::fmt::rt::Argument::fmt
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\core\src\fmt\rt.rs:142
   5:     0x7ff8165845e9 - core::fmt::write
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\core\src\fmt\mod.rs:1153
   6:     0x7ff816549fd1 - std::io::Write::write_fmt<std::sys::pal::windows::stdio::Stderr>
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\io\mod.rs:1843
   7:     0x7ff8165535e6 - std::sys_common::backtrace::print
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\sys_common\backtrace.rs:34
   8:     0x7ff8165567f8 - std::panicking::default_hook::closure$1
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\panicking.rs:271
   9:     0x7ff81655643a - std::panicking::default_hook
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\panicking.rs:291
  10:     0x7fffd42bb030 - __longjmp_internal
  11:     0x7ff816556e3c - alloc::boxed::impl$50::call
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\alloc\src\boxed.rs:2032
  12:     0x7ff816556e3c - std::panicking::rust_panic_with_hook
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\panicking.rs:792
  13:     0x7ff816556c8b - std::panicking::begin_panic_handler::closure$0
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\panicking.rs:649
  14:     0x7ff81655410f - std::sys_common::backtrace::__rust_end_short_backtrace<std::panicking::begin_panic_handler::closure_env$0,never$>
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\sys_common\backtrace.rs:171
  15:     0x7ff816556978 - std::panicking::begin_panic_handler
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\panicking.rs:645
  16:     0x7ff8165acae7 - core::panicking::panic_fmt
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\core\src\panicking.rs:72
  17:     0x7ff8165acbc0 - core::panicking::panic
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\core\src\panicking.rs:141
  18:     0x7fffd323ecd2 - <rustc_mir_transform[b373b9de80ff07e8]::coroutine::by_move_body::ByMoveBody as rustc_middle[84b64d630b2bee13]::mir::MirPass>::run_pass
  19:     0x7fffd322fa9c - <rustc_mir_transform[b373b9de80ff07e8]::simplify::SimplifyCfg as rustc_middle[84b64d630b2bee13]::mir::MirPass>::run_pass
  20:     0x7fffd32c0c9d - rustc_mir_transform[b373b9de80ff07e8]::mir_built
  21:     0x7fffd392193a - rustc_query_impl[33a1b4098950561d]::plumbing::query_key_hash_verify_all
  22:     0x7fffd3875c1a - rustc_traits[a53074f1b4e9ea87]::type_op::type_op_prove_predicate
  23:     0x7fffd2b22cfe - rustc_query_impl[33a1b4098950561d]::query_system
  24:     0x7fffd29ca496 - rustc_ty_utils[c3d756d018202afc]::ty::adt_sized_constraint
  25:     0x7fffd35d220a - <rustc_mir_build[4c126c57b954b35a]::check_unsafety::UnsafetyVisitor as rustc_middle[84b64d630b2bee13]::thir::visit::Visitor>::visit_expr
  26:     0x7fffd29ca58e - rustc_ty_utils[c3d756d018202afc]::ty::adt_sized_constraint
  27:     0x7fffd35d220a - <rustc_mir_build[4c126c57b954b35a]::check_unsafety::UnsafetyVisitor as rustc_middle[84b64d630b2bee13]::thir::visit::Visitor>::visit_expr
  28:     0x7fffd35d1563 - <rustc_mir_build[4c126c57b954b35a]::check_unsafety::UnsafetyVisitor as rustc_middle[84b64d630b2bee13]::thir::visit::Visitor>::visit_block
  29:     0x7fffd35d329d - <rustc_mir_build[4c126c57b954b35a]::check_unsafety::UnsafetyVisitor as rustc_middle[84b64d630b2bee13]::thir::visit::Visitor>::visit_expr
  30:     0x7fffd35d220a - <rustc_mir_build[4c126c57b954b35a]::check_unsafety::UnsafetyVisitor as rustc_middle[84b64d630b2bee13]::thir::visit::Visitor>::visit_expr
  31:     0x7fffd35d3f90 - rustc_mir_build[4c126c57b954b35a]::check_unsafety::check_unsafety
  32:     0x7fffd39205ca - rustc_query_impl[33a1b4098950561d]::plumbing::query_key_hash_verify_all
  33:     0x7fffd386aa5a - rustc_traits[a53074f1b4e9ea87]::type_op::type_op_prove_predicate
  34:     0x7fffd39292ab - rustc_query_impl[33a1b4098950561d]::plumbing::query_key_hash_verify_all
  35:     0x7fffd2ef45a4 - <rustc_interface[f65115e9a3f8b78a]::passes::LintStoreExpandImpl as rustc_expand[90c53b689c18a18c]::base::LintStoreExpand>::pre_expansion_lint
  36:     0x7fffd2b1a86a - <dyn std[edc18776cd067f9d]::io::Write as nu_ansi_term[730eb3389a53a735]::write::AnyWrite>::write_str
  37:     0x7fffd2a3a6c9 - rustc_traits[a53074f1b4e9ea87]::type_op::type_op_normalize_clause
  38:     0x7fffd2b1fe13 - rustc_query_impl[33a1b4098950561d]::query_system
  39:     0x7fffcfef2fd9 - __ImageBase
  40:     0x7fffcfef0337 - __ImageBase
  41:     0x7fffcfef8a89 - __ImageBase
  42:     0x7ff8165678ed - alloc::boxed::impl$48::call_once
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\alloc\src\boxed.rs:2018
  43:     0x7ff8165678ed - alloc::boxed::impl$48::call_once
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\alloc\src\boxed.rs:2018
  44:     0x7ff8165678ed - std::sys::pal::windows::thread::impl$0::new::thread_start
                               at /rustc/ab5bda1aa70f707014e2e691e43bc37a8819252a/library\std\src\sys\pal\windows\thread.rs:53
  45:     0x7ff85a297344 - BaseThreadInitThunk
  46:     0x7ff85b4c26b1 - RtlUserThreadStart

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

note: it seems that this compiler `1.79.0-nightly (ab5bda1aa 2024-04-08)` is outdated, a newer nightly should have been released in the meantime
  |
  = note: please consider running `rustup update nightly` to update the nightly channel and check if this problem still persists
  = note: if the problem still persists, 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: please attach the file at `...` to your bug report

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
#0 [mir_built] building MIR for `test::{closure#0}::{closure#0}`
#1 [check_unsafety] unsafety-checking `test`
#2 [analysis] running analysis passes on this crate
end of query stack
error: could not compile `testing` (bin "testing")```

ICE txt file:
[rustc-ice-2024-04-09T21_28_12-2316.txt](https://github.com/rust-lang/rust/files/14924081/rustc-ice-2024-04-09T21_28_12-2316.txt)
@BigBadE BigBadE added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 9, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Apr 9, 2024
@compiler-errors compiler-errors self-assigned this Apr 9, 2024
@fmease fmease added F-async_closure `#![feature(async_closure)]` F-async_fn_traits `#![feature(async_fn_traits)]` and removed needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels Apr 9, 2024
@compiler-errors
Copy link
Member

thank you for producing these examples; they're very helpful. i will have a fix out tomorrow, sorry for the inconvenience and hope it doesn't discourage you from testing async closures more.

@BigBadE
Copy link
Author

BigBadE commented Apr 9, 2024

Wow, that was quick! Thanks, I'll make sure to report any more I come across, I plan on implementing more async closures into the project with my next big refactor because of how helpful they are.

@bors bors closed this as completed in 1002c65 Apr 10, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Apr 10, 2024
Rollup merge of rust-lang#123701 - compiler-errors:only-assert-after-checking, r=WaffleLapkin

Only assert for child/parent projection compatibility AFTER checking that theyre coming from the same place

This assertion doesn't make sense until we check that these captures are actually equivalent.

Fixes rust-lang#123697

<sub>Some days I wonder how I even write code that works...</sub>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. F-async_closure `#![feature(async_closure)]` F-async_fn_traits `#![feature(async_fn_traits)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
4 participants