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

ICE: Complex control flow is forbidden in a const context #69615

Closed
DutchGhost opened this issue Mar 1, 2020 · 3 comments · Fixed by #69642
Closed

ICE: Complex control flow is forbidden in a const context #69615

DutchGhost opened this issue Mar 1, 2020 · 3 comments · Fixed by #69642
Assignees
Labels
C-bug Category: This is a bug. F-const_trait_impl `#![feature(const_trait_impl)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@DutchGhost
Copy link
Contributor

DutchGhost commented Mar 1, 2020

I tried this code:

#![feature(const_trait_impl, const_fn)]

pub trait MyTrait {
    fn method(&self);
}

impl const MyTrait for std::convert::Infallible {
    #[inline(always)]
    fn method(&self) {
        match *self {}
    }
}

I expected to see this happen: Report an error in compilation which tells me that I need #![feature(const_if_match)]. If that feature is enabled, this ICE DOESNT happen.

Instead, this happened: This ICE

Meta

rustc --version --verbose:

1.43.0-nightly (d3c79346a 2020-02-29)
Backtrace

warning: the feature `const_trait_impl` is incomplete and may cause the compiler to crash
 --> src/lib.rs:1:12
  |
1 | #![feature(const_trait_impl, const_fn)]
  |            ^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(incomplete_features)]` on by default

error: internal compiler error: complex control flow is forbidden in a const context
  --> src/lib.rs:9:5
   |
9  | /     fn method(&self) {
10 | |         match *self {}
11 | |     }
   | |_____^

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:355:17
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/gh.neting.cc-1ecc6299db9ec823/backtrace-0.3.44/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/gh.neting.cc-1ecc6299db9ec823/backtrace-0.3.44/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1053
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1428
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:204
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:224
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:474
  12: std::panicking::begin_panic
  13: <rustc_errors::HandlerInner as core::ops::drop::Drop>::drop
  14: core::ptr::drop_in_place
  15: <alloc::rc::Rc<T> as core::ops::drop::Drop>::drop
  16: core::ptr::drop_in_place
  17: rustc_interface::interface::run_compiler_in_existing_thread_pool
  18: syntax::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: internal compiler error: unexpected panic

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

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.43.0-nightly (d3c79346a 2020-02-29) running on x86_64-unknown-linux-gnu

note: compiler flags: -C codegen-units=1 -C debuginfo=2 --crate-type lib

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

query stack during panic:
end of query stack
error: could not compile `playground`.

@DutchGhost DutchGhost added the C-bug Category: This is a bug. label Mar 1, 2020
@jonas-schievink jonas-schievink added F-const_trait_impl `#![feature(const_trait_impl)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Mar 1, 2020
@ecstatic-morse ecstatic-morse self-assigned this Mar 1, 2020
@DutchGhost
Copy link
Contributor Author

Edit:

This code ICE's as well, notice how this does have the const_if_match feature enabled.

#![feature(const_trait_impl, const_fn, const_if_match)]

pub trait MyTrait {
    fn method(&self);
}

impl const MyTrait for std::convert::Infallible {
    #[inline(always)]
    fn method(&self) {
        while let Some(_) = Option::<()>::None {}
    }
}

ecstatic-morse added a commit to ecstatic-morse/rust that referenced this issue Apr 9, 2020
@bors bors closed this as completed in a12d42b Apr 17, 2020
@ldm0
Copy link
Contributor

ldm0 commented May 7, 2020

Edit:

This code ICE's as well, notice how this does have the const_if_match feature enabled.

#![feature(const_trait_impl, const_fn, const_if_match)]

pub trait MyTrait {
    fn method(&self);
}

impl const MyTrait for std::convert::Infallible {
    #[inline(always)]
    fn method(&self) {
        while let Some(_) = Option::<()>::None {}
    }
}

@DutchGhost This additional code not ICEs anymore.

@DutchGhost
Copy link
Contributor Author

Edit:
This code ICE's as well, notice how this does have the const_if_match feature enabled.

#![feature(const_trait_impl, const_fn, const_if_match)]

pub trait MyTrait {
    fn method(&self);
}

impl const MyTrait for std::convert::Infallible {
    #[inline(always)]
    fn method(&self) {
        while let Some(_) = Option::<()>::None {}
    }
}

@DutchGhost This additional code not ICEs anymore.

The issue has been fixed in #69642

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-const_trait_impl `#![feature(const_trait_impl)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants