@@ -86,11 +86,11 @@ fn generalize_ty(@crate_ctxt cx, @ty.t t) -> @ty.t {
86
86
fn substitute_ty_params ( & @crate_ctxt ccx ,
87
87
@ty. t typ ,
88
88
vec[ ast. def_id] ty_params ,
89
- vec[ @ast . ty ] supplied,
89
+ vec[ @ty . t ] supplied,
90
90
& span sp) -> @ty. t {
91
91
state obj ty_substituter ( @crate_ctxt ccx,
92
92
vec[ ast. def_id ] ty_params,
93
- vec[ @ast . ty ] supplied) {
93
+ vec[ @ty . t ] supplied) {
94
94
fn fold_simple_ty ( @ty. t typ ) -> @ty. t {
95
95
alt ( typ. struct ) {
96
96
case ( ty. ty_param ( ?pid) ) {
@@ -108,15 +108,15 @@ fn substitute_ty_params(&@crate_ctxt ccx,
108
108
}
109
109
110
110
// Substitute it in.
111
- ret ast_ty_to_ty_crate ( ccx , supplied. ( i) ) ;
111
+ ret supplied. ( i) ;
112
112
}
113
113
case ( _) { ret typ; }
114
114
}
115
115
}
116
116
}
117
117
118
118
auto ty_param_len = _vec. len [ ast. def_id ] ( ty_params) ;
119
- auto supplied_len = _vec. len [ @ast . ty ] ( supplied) ;
119
+ auto supplied_len = _vec. len [ @ty . t ] ( supplied) ;
120
120
if ( ty_param_len != supplied_len) {
121
121
ccx. sess . span_err ( sp, "expected " + _uint. to_str ( ty_param_len, 10 u) +
122
122
" type parameter(s) but found " +
@@ -1564,19 +1564,33 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
1564
1564
}
1565
1565
1566
1566
// Substitute type parameters if the user provided some.
1567
- if ( _vec. len[ @ast. ty] ( pth. node. types) > 0 u) {
1567
+ auto ty_substs_opt;
1568
+ auto ty_substs_len = _vec. len[ @ast. ty] ( pth. node. types) ;
1569
+ if ( ty_substs_len > 0 u) {
1570
+ let vec[ @ty. t] ty_substs = vec( ) ;
1571
+ auto i = 0 u;
1572
+ while ( i < ty_substs_len) {
1573
+ ty_substs += vec( ast_ty_to_ty_crate( fcx. ccx,
1574
+ pth. node. types. ( i) ) ) ;
1575
+ i += 1 u;
1576
+ }
1577
+ ty_substs_opt = some[ vec[ @ty. t] ] ( ty_substs) ;
1578
+
1568
1579
alt ( ty_params) {
1569
1580
case ( none[ vec[ ast. def_id] ] ) {
1570
1581
fcx. ccx. sess. span_err( expr. span, "this kind of " +
1571
1582
"item may not take type " +
1572
1583
"parameters") ;
1584
+ fail;
1573
1585
}
1574
1586
case ( some[ vec[ ast. def_id] ] ( ?tps) ) {
1575
- t = substitute_ty_params( fcx. ccx, t, tps,
1576
- pth . node . types , expr. span) ;
1587
+ t = substitute_ty_params( fcx. ccx, t, tps, ty_substs ,
1588
+ expr. span) ;
1577
1589
}
1578
1590
}
1579
1591
} else {
1592
+ ty_substs_opt = none[ vec[ @ty. t] ] ;
1593
+
1580
1594
alt ( ty_params) {
1581
1595
case ( none[ vec[ ast. def_id] ] ) { /* nothing */ }
1582
1596
case ( some[ vec[ ast. def_id] ] ( _) ) {
@@ -1587,7 +1601,7 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
1587
1601
}
1588
1602
}
1589
1603
1590
- auto ann = ast. ann_type( t, none [ vec [ @ty . t ] ] ) ;
1604
+ auto ann = ast. ann_type( t, ty_substs_opt ) ;
1591
1605
ret @fold. respan[ ast. expr_] ( expr. span,
1592
1606
ast. expr_path( pth, defopt, ann) ) ;
1593
1607
}
0 commit comments