Add type parameters when checking wildcard patterns

For some reason, wildcard patterns were never getting type parameter
substitutions attached. This would cause an assertion failure when
checking a wildcard pattern that matches against a tag with
polymorphic type (not sure why this didn't come up before). Fixed it.
(The diff and test case may be easier to understand than this note
:P)

Closes #1503.
This commit is contained in:
Tim Chevalier 2012-01-12 16:23:24 -08:00
parent 8818f42b19
commit 565ea068ca
2 changed files with 21 additions and 1 deletions

View File

@ -1264,7 +1264,18 @@ fn valid_range_bounds(from: @ast::expr, to: @ast::expr) -> bool {
fn check_pat(fcx: @fn_ctxt, map: ast_util::pat_id_map, pat: @ast::pat,
expected: ty::t) {
alt pat.node {
ast::pat_wild. { write::ty_only_fixup(fcx, pat.id, expected); }
ast::pat_wild. {
alt structure_of(fcx, pat.span, expected) {
ty::ty_tag(_, expected_tps) {
let path_tpt = {substs: some(expected_tps),
ty: expected};
write::ty_fixup(fcx, pat.id, path_tpt);
}
_ {
write::ty_only_fixup(fcx, pat.id, expected);
}
}
}
ast::pat_lit(lt) {
check_expr_with(fcx, lt, expected);
write::ty_only_fixup(fcx, pat.id, expr_ty(fcx.ccx.tcx, lt));

View File

@ -0,0 +1,9 @@
// error-pattern:squirrelcupcake
fn cmp() -> int {
alt(option::some('a'), option::none::<char>) {
(option::some(_), _) { fail "squirrelcupcake"; }
(_, option::some(_)) { fail; }
}
}
fn main() { log(error, cmp()); }