From 565ea068ca6deb50c5866475508c538dc7e3acee Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Thu, 12 Jan 2012 16:23:24 -0800 Subject: [PATCH] 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. --- src/comp/middle/typeck.rs | 13 ++++++++++++- src/test/run-fail/alt-wildcards.rs | 9 +++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/run-fail/alt-wildcards.rs diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 0ecff4260fbc..e3718933caad 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -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)); diff --git a/src/test/run-fail/alt-wildcards.rs b/src/test/run-fail/alt-wildcards.rs new file mode 100644 index 000000000000..4d89679e70ee --- /dev/null +++ b/src/test/run-fail/alt-wildcards.rs @@ -0,0 +1,9 @@ +// error-pattern:squirrelcupcake +fn cmp() -> int { + alt(option::some('a'), option::none::) { + (option::some(_), _) { fail "squirrelcupcake"; } + (_, option::some(_)) { fail; } + } +} + +fn main() { log(error, cmp()); }