Skip to content

MIR inlining doesn't work together with MIR validation #46086

Closed
@arielb1

Description

@arielb1

STR

tested on commit 1410d56 on x86_64-unknown-linux-gnu

// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

fn main() { main2::<()>(); }

fn main2<T>() {
    let c = |_x| {};
    c(&mut 1);
}
$ rustc validate-fail.rs -Z mir-emit-validate=1 -Z mir-opt-level=2

Expected result

Code compiles

Actual result

ICE - I think the problem is that Validate is restricted to taking a local as an argument, which we can't expand to a closure upvar.

error: internal compiler error: rust://src/librustc_mir/transform/inline.rs:715: Arg operand `1` is (_4.0: &mut i32), not local

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.23.0-dev running on x86_64-unknown-linux-gnu

note: run with `RUST_BACKTRACE=1` for a backtrace

thread 'rustc' panicked at 'Box<Any>', rust://src/librustc_errors/lib.rs:485:8
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
             at rust://src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at rust://src/libstd/sys_common/backtrace.rs:68
   2: std::panicking::default_hook::{{closure}}
             at rust://src/libstd/sys_common/backtrace.rs:57
             at rust://src/libstd/panicking.rs:381
   3: std::panicking::default_hook
             at rust://src/libstd/panicking.rs:391
   4: std::panicking::rust_panic_with_hook
             at rust://src/libstd/panicking.rs:577
   5: std::panicking::begin_panic
             at rust://src/libstd/panicking.rs:538
   6: rustc_errors::Handler::bug
             at rust://src/librustc_errors/lib.rs:485
   7: rustc::session::opt_span_bug_fmt::{{closure}}
             at rust://src/librustc/session/mod.rs:992
   8: rustc::session::opt_span_bug_fmt
             at rust://src/librustc/ty/context.rs:0
   9: rustc::session::bug_fmt
             at rust://src/librustc/session/mod.rs:972
  10: <rustc_mir::transform::inline::Integrator<'a, 'tcx> as rustc::mir::visit::MutVisitor<'tcx>>::visit_local
             at rust://src/librustc_mir/transform/inline.rs:715
  11: <rustc_mir::transform::inline::Integrator<'a, 'tcx> as rustc::mir::visit::MutVisitor<'tcx>>::visit_lvalue
             at rust://src/librustc/mir/visit.rs:0
  12: <rustc_mir::transform::inline::Integrator<'a, 'tcx> as rustc::mir::visit::MutVisitor<'tcx>>::visit_basic_block_data
             at rust://src/librustc/mir/visit.rs:361
             at rust://src/librustc/mir/visit.rs:105
             at rust://src/librustc/mir/visit.rs:320
             at rust://src/librustc_mir/transform/inline.rs:746
  13: rustc_mir::transform::inline::Inliner::run_pass
             at rust://src/librustc_mir/transform/inline.rs:486
             at rust://src/librustc_mir/transform/inline.rs:144
  14: <rustc_mir::transform::inline::Inline as rustc_mir::transform::MirPass>::run_pass
             at rust://src/librustc_mir/transform/inline.rs:55
  15: rustc_mir::transform::optimized_mir::{{closure}}::{{closure}}
             at rust://src/librustc_mir/transform/mod.rs:167
  16: rustc_mir::transform::optimized_mir::{{closure}}
             at rust://src/librustc_mir/transform/mod.rs:172
  17: rustc_mir::transform::optimized_mir
             at rust://src/librustc_mir/transform/mod.rs:226
  18: rustc::dep_graph::graph::DepGraph::with_task_impl
             at rust://src/librustc/ty/maps/plumbing.rs:370
             at rust://src/librustc/dep_graph/graph.rs:273
  19: rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::force
             at rust://src/librustc/dep_graph/graph.rs:189
             at rust://src/librustc/ty/maps/plumbing.rs:452
             at rust://src/librustc_errors/lib.rs:548
             at rust://src/librustc/ty/maps/plumbing.rs:445
             at rust://src/librustc/ty/maps/plumbing.rs:115
             at rust://src/librustc/ty/maps/plumbing.rs:444
  20: rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::try_get
             at rust://src/librustc/ty/maps/plumbing.rs:288
             at rust://src/librustc/ty/maps/plumbing.rs:486
  21: rustc_mir::transform::inline::Inliner::run_pass
             at rust://src/librustc_mir/transform/inline.rs:127
  22: <rustc_mir::transform::inline::Inline as rustc_mir::transform::MirPass>::run_pass
             at rust://src/librustc_mir/transform/inline.rs:55
  23: rustc_mir::transform::optimized_mir::{{closure}}::{{closure}}
             at rust://src/librustc_mir/transform/mod.rs:167
  24: rustc_mir::transform::optimized_mir::{{closure}}
             at rust://src/librustc_mir/transform/mod.rs:172
  25: rustc_mir::transform::optimized_mir
             at rust://src/librustc_mir/transform/mod.rs:226
  26: rustc::dep_graph::graph::DepGraph::with_task_impl
             at rust://src/librustc/ty/maps/plumbing.rs:370
             at rust://src/librustc/dep_graph/graph.rs:273
  27: rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::force
             at rust://src/librustc/dep_graph/graph.rs:189
             at rust://src/librustc/ty/maps/plumbing.rs:452
             at rust://src/librustc_errors/lib.rs:548
             at rust://src/librustc/ty/maps/plumbing.rs:445
             at rust://src/librustc/ty/maps/plumbing.rs:115
             at rust://src/librustc/ty/maps/plumbing.rs:444
  28: rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::try_get
             at rust://src/librustc/ty/maps/plumbing.rs:288
             at rust://src/librustc/ty/maps/plumbing.rs:486
  29: rustc::ty::maps::TyCtxtAt::optimized_mir
             at rust://src/librustc/ty/maps/plumbing.rs:525
  30: rustc::ty::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::instance_mir
             at rust://src/librustc/ty/maps/plumbing.rs:518
             at rust://src/librustc/ty/mod.rs:2288
  31: rustc_trans_utils::collector::collect_items_rec
             at rust://src/librustc_trans_utils/collector.rs:1057
             at rust://src/librustc_trans_utils/collector.rs:391
  32: rustc_trans_utils::collector::collect_crate_translation_items
             at rust://src/librustc_trans_utils/collector.rs:310
  33: rustc_trans::base::collect_and_partition_translation_items
             at rust://src/librustc_trans/base.rs:1147
             at rust://src/librustc/util/common.rs:120
             at rust://src/librustc_trans/base.rs:1146
  34: rustc::dep_graph::graph::DepGraph::with_task_impl
             at rust://src/librustc/ty/maps/plumbing.rs:370
             at rust://src/librustc/dep_graph/graph.rs:273
  35: rustc::ty::maps::<impl rustc::ty::maps::queries::collect_and_partition_translation_items<'tcx>>::force
             at rust://src/librustc/dep_graph/graph.rs:189
             at rust://src/librustc/ty/maps/plumbing.rs:452
             at rust://src/librustc_errors/lib.rs:548
             at rust://src/librustc/ty/maps/plumbing.rs:445
             at rust://src/librustc/ty/maps/plumbing.rs:115
             at rust://src/librustc/ty/maps/plumbing.rs:444
  36: rustc::ty::maps::<impl rustc::ty::maps::queries::collect_and_partition_translation_items<'tcx>>::try_get
             at rust://src/librustc/ty/maps/plumbing.rs:288
             at rust://src/librustc/ty/maps/plumbing.rs:486
  37: rustc::ty::maps::TyCtxtAt::collect_and_partition_translation_items
             at rust://src/librustc/ty/maps/plumbing.rs:525
  38: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::collect_and_partition_translation_items
             at rust://src/librustc/ty/maps/plumbing.rs:518
  39: rustc_trans::base::trans_crate
             at rust://src/librustc_trans/base.rs:885
  40: <rustc_trans::LlvmTransCrate as rustc_trans_utils::trans_crate::TransCrate>::trans_crate
             at rust://src/librustc_trans/lib.rs:183
  41: rustc_driver::driver::compile_input::{{closure}}
             at rust://src/librustc_driver/driver.rs:1106
             at rust://src/librustc/util/common.rs:120
             at rust://src/librustc_driver/driver.rs:1105
             at rust://src/librustc_driver/driver.rs:247
  42: rustc::ty::context::TyCtxt::create_and_enter
             at rust://src/librustc_driver/driver.rs:1089
             at rust://src/librustc/ty/context.rs:1522
             at rust://src/libstd/thread/local.rs:377
             at rust://src/libstd/thread/local.rs:288
             at rust://src/librustc/ty/context.rs:1519
             at rust://src/librustc/ty/context.rs:1506
             at rust://src/libstd/thread/local.rs:377
             at rust://src/libstd/thread/local.rs:288
             at rust://src/librustc/ty/context.rs:1503
             at rust://src/librustc/ty/context.rs:1138
  43: rustc_driver::driver::compile_input
             at rust://src/librustc_driver/driver.rs:1010
             at rust://src/librustc_driver/driver.rs:209
  44: rustc_driver::run_compiler
             at rust://src/librustc_driver/lib.rs:253

I suppose for now a solution could be to remove the offending Validate statements - I suppose MIRI always runs with MIR optimizations off. cc @RalfJung

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions