rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.87k stars 12.77k forks source link

internal compiler error using rustc 1.0.0-beta #24352

Closed haskelladdict closed 9 years ago

haskelladdict commented 9 years ago

The simplified code below results in an ICE using the following rust version

rustc 1.0.0-beta (9854143cb 2015-04-02) (built 2015-04-02) binary: rustc commit-hash: 9854143cba679834bc4ef932858cd5303f015a0e commit-date: 2015-04-02 build-date: 2015-04-02 host: x86_64-apple-darwin release: 1.0.0-beta

---- CODE resulting in ICE -------

use std::f64;
use std::fs::File;
use std::io::{BufRead, BufReader};

#[derive(Default)]
struct Output {
  count: i64,
  min: f64,
  max: f64,
  var: f64,
  qk: f64,  // helper variables for
  mk: f64,  // variance calculation
}

fn main() {
  let file = File::open("data_random_small.txt");
  let buf = BufReader::new(file.unwrap());
  let out = compute_statistics(buf);
}

// compute_statistics computes basic statistics for the content of the
// provided BufReader
fn compute_statistics(buf: BufReader<File>) -> Output {
  let mut out = Output { count: 0, min: f64::MAX, max: -f64::MAX, var: 0.0,
    qk: 0.0, mk: 0.0};
  for line_r in buf.lines() {
    let line = line_r.unwrap();
    let n_r = line.to_string().parse::<f64>();
    let n = n_r.unwrap();

    // update variance
    let k: f64 = out.count as f64;
    out.qk += (k - 1.0) * (n - out.mk) * (n - out.mk) / k;
    out.mk += (n - out.mk) / k;

    out.count += 1;
  }
  let k: f64 = out.count as f64;
  out.var = out.qk / (k-1);
  out
}

The issue appears to be the second to last line. The compiler should reject (k-1). Changing this to

out.var = out.qk / (k-1.0);

results in proper compilation. Also, removing the previous scope of the for loop works and the compiler then properly complains about the (k-1) bit. Below is the backtrace:

----- BACKTRACE ----

error: internal compiler error: Impl DefId { krate: 2, node: 39365 } was matchable against Obligation(predicate=Binder(TraitPredicate(core::ops::Sub<_>)),depth=1) but now is not
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: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Box<Any>', /Users/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-mac/build/src/libsyntax/diagnostic.rs:190

stack backtrace:
   1:        0x107943f77 - sys::backtrace::write::h799ab135045ca9ca1LC
   2:        0x107971e4d - panicking::on_panic::h9502e488a92fc8bcHAI
   3:        0x1078962de - rt::unwind::begin_unwind_inner::hf0537788ee16eadbiiI
   4:        0x1070755ae - rt::unwind::begin_unwind::h447731439410619827
   5:        0x107075df9 - diagnostic::Handler::bug::hb6bac6e14e70580aZsB
   6:        0x104b9c3be - middle::traits::select::SelectionContext<'cx, 'tcx>::rematch_impl::h00902254f92fe252QxT
   7:        0x104b9bd08 - middle::infer::InferCtxt<'a, 'tcx>::commit_if_ok::h14474907185931287891
   8:        0x104b7ce94 - middle::traits::select::SelectionContext<'cx, 'tcx>::confirm_candidate::h3f1d070f70ab815cMPS
   9:        0x104b509c6 - middle::traits::select::SelectionContext<'cx, 'tcx>::select::hc528f249f6251cb8OQQ
  10:        0x104b6098a - middle::traits::project::project_type::h7ca468ea33bc79f1AwP
  11:        0x104b5e367 - middle::traits::project::opt_normalize_projection_type::h766518f8b1310230cpP
  12:        0x104b57d86 - middle::traits::project::poly_project_and_unify_type::closure.83535
  13:        0x104b55bc0 - middle::traits::project::poly_project_and_unify_type::h44012951a95c13e5l5O
  14:        0x104b4d206 - middle::traits::fulfill::FulfillmentContext<'tcx>::select::h7d8cf023413c2180uHO
  15:        0x104b4c848 - middle::traits::fulfill::FulfillmentContext<'tcx>::select_where_possible::h0397a49aa695a23cIGO
  16:        0x103efa433 - check::vtable::select_fcx_obligations_where_possible::h99330aa4e9f6a658d4b
  17:        0x103f3448d - check::FnCtxt<'a, 'tcx>::resolve_type_vars_if_possible::h7c8e59ec20a8f3b2qYo
  18:        0x103fb0a3e - check::op::check_binop::h7e7f29a781258fb2u5m
  19:        0x10400878d - check::check_expr_with_unifier::h13696137427352880546
  20:        0x103ff552c - check::check_expr_with_unifier::h7970691808293538245
  21:        0x103fb0a33 - check::op::check_binop::h7e7f29a781258fb2u5m
  22:        0x103ff43c3 - check::check_expr_with_unifier::h7970691808293538245
  23:        0x10400fab9 - check::check_expr_with_unifier::h6698900367440735538
  24:        0x103fbe705 - check::check_block_with_expected::h60bff5b1f9d55793fps
  25:        0x103f9ae05 - check::check_fn::h410d0ffafb47f675l1n
  26:        0x103fb932e - check::check_bare_fn::h05c77be534ada2cfUQn
  27:        0x103fb2ee2 - check::check_item::h9d89bedf29e4fe82F9n
  28:        0x10408f676 - check_crate::closure.36302
  29:        0x104089ae7 - check_crate::h09aa7856a322fd44bwC
  30:        0x103da9355 - driver::phase_3_run_analysis_passes::h1af60e7c926ca39dgGa
  31:        0x103d8da85 - driver::compile_input::h27cf4320fd56e5cbQba
  32:        0x103e4ba15 - run_compiler::h93c68a2a3c26052bV4b
  33:        0x103e491e2 - boxed::F.FnBox<A>::call_box::h4498816167135712709
  34:        0x103e486d7 - rt::unwind::try::try_fn::h2387014819904265058
  35:        0x1079fbea8 - rust_try_inner
  36:        0x1079fbe95 - rust_try
  37:        0x103e489ca - boxed::F.FnBox<A>::call_box::h4850138824497903476
  38:        0x10795b37d - sys::thread::create::thread_start::h42d6d904fce5365aihH
  39:     0x7fff82bc6267 - _pthread_body
  40:     0x7fff82bc61e4 - _pthread_start
arielb1 commented 9 years ago

Minified:

fn main() { 
    1.0f64 - 1.0;
    1.0f64 - 1;
}

Seems like the trait cache is broken.

arielb1 commented 9 years ago

Well it's not just the trait-cache:

DEBUG:rustc::middle::traits::select: CACHE MISS: cache_fresh_trait_pred=Binder(TraitPredicate(<f64 as Sub<FreshIntTy(0)>>)), candidate=ImplCandidate(DefId { krate: 0, node: 18 }:f64.Sub)

How can <f64 as Sub<FreshIntTy(0)>> ~ f64.Sub<f64>?

arielb1 commented 9 years ago

The problem here is that freshen turns both IntVid and FloatVid into FreshIntTy, but there is no subtyping relationship between them.