Crash in rustboot on bad type conversion in ret

5cf0425
Opened by Jeffrey Yasskin at 2010-07-19 18:53:57

Given:

fn mk_int() -> uint {
  let int i = 3;
  ret i;
}
fn main() {
}

Rustboot crashes with:

Fatal error: exception Assert_failure("boot/me/trans.ml", 2988, 6) Raised at file "boot/me/trans.ml", line 2989, characters 6-652 Called from file "boot/me/trans.ml", line 4442, characters 27-46 Called from file "boot/me/trans.ml", line 4055, characters 6-26 Re-raised at file "boot/me/trans.ml", line 4072, characters 11-104 Called from file "array.ml", line 117, characters 31-48 Called from file "boot/me/trans.ml", line 1974, characters 4-36 Called from file "boot/me/trans.ml", line 4604, characters 4-20 Called from file "boot/me/trans.ml", line 4999, characters 4-39 Called from file "boot/me/semant.ml", line 1435, characters 4-17 Called from file "boot/me/semant.ml", line 1561, characters 4-50 Called from file "boot/me/walk.ml", line 134, characters 4-9 Called from file "hashtbl.ml", line 145, characters 8-13 Called from file "hashtbl.ml", line 148, characters 4-19 Called from file "boot/me/walk.ml", line 135, characters 4-15 Called from file "array.ml", line 130, characters 31-51 Called from file "boot/driver/session.ml", line 60, characters 10-17 Called from file "boot/me/semant.ml", line 1861, characters 8-84 Called from file "boot/driver/main.ml", line 322, characters 9-26 Called from file "array.ml", line 117, characters 31-48 Called from file "boot/driver/main.ml", line 320, characters 4-366 Called from file "boot/driver/main.ml", line 404, characters 5-21

Changing the 'int' to 'uint' causes the correct "mismatched types" error (although the "expected" type isn't what I would have expected), and changing the 'uint' to 'int' makes the code compile fine, even if (say) an interface conversion is involved.

  1. Bug in the new typechecker, it should catch that. Trans trapping late like that is no fun.

    The residual behavior is what I'd expect though: changing int to uint makes it complain at the initialization point, yes? Because 3 is an int, not a uint. And changing uint to int makes it compile, because then everyone's dealing with ints everywhere and there's no error.

    What did you mean by interface conversion?

    Graydon Hoare at 2010-07-17 17:54:52

  2. I agree the residual behavior is right. I though it would "expect" uint (the function's return type) and find int, but instead it's the other way around. That's just a UI issue, though, nothing to do with correctness.

    By interface conversion, I meant something like type intfc = obj { fn foo(); }; obj impl() { fn foo() {} } fn bar() -> intfc { ret impl(); } where it needs to convert a concrete type to an interface type.

    Jeffrey Yasskin at 2010-07-17 18:25:38

  3. Missing semicolon in type.ml, plus test to catch regression. Closed by bacb8e6b7995e242145871c8228cae4dbda7b891.

    Graydon Hoare at 2010-07-19 18:53:57