From c7e3f88c93883ecbb27dcdfb7d8ec6e263b126b0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 30 May 2011 23:39:20 -0400 Subject: [PATCH] rustc: Pushdown type params for tag patterns. Closes #363 --- src/comp/middle/typeck.rs | 18 ++++++++++++++---- .../run-pass/alt-pattern-no-type-params.rs | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/test/run-pass/alt-pattern-no-type-params.rs 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() {}