diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index c5433a2b7524..552d0bdddc54 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1171,10 +1171,20 @@ mod pushdown { let ty_param_substs_and_ty res_t = demand::full(scx, pat.span, expected, tt, tps, NO_AUTODEREF); - // TODO: push down type from "expected". - write::ty_fixup(scx, ann.id, - ty::ann_to_ty_param_substs_opt_and_ty - (scx.fcx.ccx.tcx.node_types, ann)); + auto ty_params_subst = ty::ann_to_ty_param_substs_opt_and_ty + (scx.fcx.ccx.tcx.node_types, ann); + + auto ty_params_opt; + alt (ty_params_subst._0) { + case (none[vec[ty::t]]) { + ty_params_opt = none[vec[ty::t]]; + } + case (some[vec[ty::t]](?tps)) { + ty_params_opt = some[vec[ty::t]](tag_tps); + } + } + + write::ty_fixup(scx, ann.id, tup(ty_params_opt, tt)); } } } diff --git a/src/test/run-pass/alt-pattern-no-type-params.rs b/src/test/run-pass/alt-pattern-no-type-params.rs new file mode 100644 index 000000000000..1836b2b75fec --- /dev/null +++ b/src/test/run-pass/alt-pattern-no-type-params.rs @@ -0,0 +1,15 @@ +// xfail-stage0 + +tag maybe[T] { + nothing; + just(T); +} + +fn foo(maybe[int] x) { + alt (x) { + case (nothing) {log_err "A";} + case (just(?a)) {log_err "B";} + } +} + +fn main() {}