@@ -148,8 +148,9 @@ fn ty_to_str(&@t typ) -> str {
148
148
fn mt_to_str ( & mt m) -> str {
149
149
auto mstr;
150
150
alt ( m. mut ) {
151
- case ( ast. mut ) { mstr = "mutable " ; }
152
- case ( ast. imm ) { mstr = "" ; }
151
+ case ( ast. mut ) { mstr = "mutable " ; }
152
+ case ( ast. imm ) { mstr = "" ; }
153
+ case ( ast. maybe_mut ) { mstr = "mutable? " ; }
153
154
}
154
155
155
156
ret mstr + ty_to_str ( m. ty ) ;
@@ -858,6 +859,21 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
858
859
ret ures_err( terr_mismatch, expected, actual) ;
859
860
}
860
861
862
+ // Unifies two mutability flags.
863
+ fn unify_mut( ast. mutability expected, ast. mutability actual)
864
+ -> option. t[ ast. mutability] {
865
+ if ( expected == actual) {
866
+ ret some[ ast. mutability] ( expected) ;
867
+ }
868
+ if ( expected == ast. maybe_mut) {
869
+ ret some[ ast. mutability] ( actual) ;
870
+ }
871
+ if ( actual == ast. maybe_mut) {
872
+ ret some[ ast. mutability] ( expected) ;
873
+ }
874
+ ret none[ ast. mutability] ;
875
+ }
876
+
861
877
tag fn_common_res {
862
878
fn_common_res_err( unify_result) ;
863
879
fn_common_res_ok( vec[ arg] , @t) ;
@@ -1158,9 +1174,13 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1158
1174
case ( ty. ty_box( ?expected_mt) ) {
1159
1175
alt ( actual. struct ) {
1160
1176
case ( ty. ty_box( ?actual_mt) ) {
1161
- if ( expected_mt. mut != actual_mt. mut ) {
1162
- ret ures_err( terr_box_mutability, expected,
1163
- actual) ;
1177
+ auto mut ;
1178
+ alt ( unify_mut( expected_mt. mut , actual_mt. mut ) ) {
1179
+ case ( none[ ast. mutability] ) {
1180
+ ret ures_err( terr_box_mutability, expected,
1181
+ actual) ;
1182
+ }
1183
+ case ( some[ ast. mutability] ( ?m) ) { mut = m; }
1164
1184
}
1165
1185
1166
1186
auto result = unify_step( bindings,
@@ -1169,8 +1189,7 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1169
1189
handler) ;
1170
1190
alt ( result) {
1171
1191
case ( ures_ok( ?result_sub) ) {
1172
- auto mt = rec( ty=result_sub,
1173
- mut =expected_mt. mut ) ;
1192
+ auto mt = rec( ty=result_sub, mut =mut ) ;
1174
1193
ret ures_ok( plain_ty( ty. ty_box( mt) ) ) ;
1175
1194
}
1176
1195
case ( _) {
@@ -1188,9 +1207,13 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1188
1207
case ( ty. ty_vec( ?expected_mt) ) {
1189
1208
alt ( actual. struct ) {
1190
1209
case ( ty. ty_vec( ?actual_mt) ) {
1191
- if ( expected_mt. mut != actual_mt. mut ) {
1192
- ret ures_err( terr_vec_mutability, expected,
1193
- actual) ;
1210
+ auto mut ;
1211
+ alt ( unify_mut( expected_mt. mut , actual_mt. mut ) ) {
1212
+ case ( none[ ast. mutability] ) {
1213
+ ret ures_err( terr_vec_mutability, expected,
1214
+ actual) ;
1215
+ }
1216
+ case ( some[ ast. mutability] ( ?m) ) { mut = m; }
1194
1217
}
1195
1218
1196
1219
auto result = unify_step( bindings,
@@ -1199,8 +1222,7 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1199
1222
handler) ;
1200
1223
alt ( result) {
1201
1224
case ( ures_ok( ?result_sub) ) {
1202
- auto mt = rec( ty=result_sub,
1203
- mut =expected_mt. mut ) ;
1225
+ auto mt = rec( ty=result_sub, mut =mut ) ;
1204
1226
ret ures_ok( plain_ty( ty. ty_vec( mt) ) ) ;
1205
1227
}
1206
1228
case ( _) {
@@ -1279,9 +1301,15 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1279
1301
while ( i < expected_len) {
1280
1302
auto expected_elem = expected_elems. ( i) ;
1281
1303
auto actual_elem = actual_elems. ( i) ;
1282
- if ( expected_elem. mut != actual_elem. mut ) {
1283
- auto err = terr_tuple_mutability;
1284
- ret ures_err( err, expected, actual) ;
1304
+
1305
+ auto mut ;
1306
+ alt ( unify_mut( expected_elem. mut ,
1307
+ actual_elem. mut ) ) {
1308
+ case ( none[ ast. mutability] ) {
1309
+ auto err = terr_tuple_mutability;
1310
+ ret ures_err( err, expected, actual) ;
1311
+ }
1312
+ case ( some[ ast. mutability] ( ?m) ) { mut = m; }
1285
1313
}
1286
1314
1287
1315
auto result = unify_step( bindings,
@@ -1290,8 +1318,7 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1290
1318
handler) ;
1291
1319
alt ( result) {
1292
1320
case ( ures_ok( ?rty) ) {
1293
- auto mt = rec( ty=rty,
1294
- mut =expected_elem. mut ) ;
1321
+ auto mt = rec( ty=rty, mut =mut ) ;
1295
1322
result_elems += vec( mt) ;
1296
1323
}
1297
1324
case ( _) {
@@ -1329,10 +1356,15 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1329
1356
while ( i < expected_len) {
1330
1357
auto expected_field = expected_fields. ( i) ;
1331
1358
auto actual_field = actual_fields. ( i) ;
1332
- if ( expected_field. mt. mut
1333
- != actual_field. mt. mut ) {
1334
- auto err = terr_record_mutability;
1335
- ret ures_err( err, expected, actual) ;
1359
+
1360
+ auto mut ;
1361
+ alt ( unify_mut( expected_field. mt. mut ,
1362
+ actual_field. mt. mut ) ) {
1363
+ case ( none[ ast. mutability] ) {
1364
+ ret ures_err( terr_record_mutability,
1365
+ expected, actual) ;
1366
+ }
1367
+ case ( some[ ast. mutability] ( ?m) ) { mut = m; }
1336
1368
}
1337
1369
1338
1370
if ( !_str. eq( expected_field. ident,
@@ -1349,8 +1381,7 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1349
1381
handler) ;
1350
1382
alt ( result) {
1351
1383
case ( ures_ok( ?rty) ) {
1352
- auto mt = rec( ty=rty,
1353
- mut =expected_field. mt. mut ) ;
1384
+ auto mt = rec( ty=rty, mut =mut ) ;
1354
1385
_vec. push[ field]
1355
1386
( result_fields,
1356
1387
rec( mt=mt with expected_field) ) ;
@@ -1490,6 +1521,12 @@ fn type_err_to_str(&ty.type_err err) -> str {
1490
1521
case ( terr_mismatch) {
1491
1522
ret "types differ";
1492
1523
}
1524
+ case ( terr_box_mutability) {
1525
+ ret "boxed values differ in mutability";
1526
+ }
1527
+ case ( terr_vec_mutability) {
1528
+ ret "vectors differ in mutability";
1529
+ }
1493
1530
case ( terr_tuple_size( ?e_sz, ?a_sz) ) {
1494
1531
ret "expected a tuple with " + _uint. to_str( e_sz, 10 u) +
1495
1532
" elements but found one with " + _uint. to_str( a_sz, 10 u) +
0 commit comments