@@ -373,10 +373,22 @@ class parser {
373
373
}
374
374
} else if self . token == token:: AT {
375
375
self . bump ( ) ;
376
- ty_box ( self . parse_mt ( ) )
376
+ // HACK: turn @[...] into a []/@
377
+ alt self. parse_mt ( ) {
378
+ { ty : t @ @{ node : ty_vec ( _) , _} , mutbl: m_imm} {
379
+ ty_vstore ( t, vstore_box)
380
+ }
381
+ mt { ty_box( mt) }
382
+ }
377
383
} else if self . token == token:: TILDE {
378
384
self. bump ( ) ;
379
- ty_uniq ( self . parse_mt ( ) )
385
+ // HACK: turn ~[...] into a []/~
386
+ alt self. parse_mt ( ) {
387
+ { ty : t @ @{ node : ty_vec ( _) , _} , mutbl: m_imm} {
388
+ ty_vstore ( t, vstore_uniq)
389
+ }
390
+ mt { ty_uniq( mt) }
391
+ }
380
392
} else if self . token == token:: BINOP ( token:: STAR ) {
381
393
self . bump ( ) ;
382
394
ty_ptr ( self . parse_mt ( ) )
@@ -406,8 +418,13 @@ class parser {
406
418
} else if self . token == token:: BINOP ( token:: AND ) {
407
419
self . bump ( ) ;
408
420
let region = self . parse_region_dot ( ) ;
409
- let mt = self . parse_mt ( ) ;
410
- ty_rptr ( region, mt)
421
+ // HACK: turn &a.[...] into a []/&a
422
+ alt self. parse_mt ( ) {
423
+ { ty : t @ @{ node : ty_vec ( _) , _} , mutbl: m_imm} {
424
+ ty_vstore ( t, vstore_slice ( region) )
425
+ }
426
+ mt { ty_rptr( region, mt) }
427
+ }
411
428
} else if self . eat_keyword ( "pure" ) {
412
429
self . parse_ty_fn ( ast:: pure_fn)
413
430
} else if self . eat_keyword ( "unsafe" ) {
@@ -1188,7 +1205,13 @@ class parser {
1188
1205
let m = self . parse_mutability( ) ;
1189
1206
let e = self . to_expr( self . parse_prefix_expr( ) ) ;
1190
1207
hi = e. span. hi;
1191
- ex = expr_addr_of( m, e) ;
1208
+ // HACK: turn &[...] into [...]/&
1209
+ ex = alt e. node {
1210
+ expr_vec( * ) if m == m_imm {
1211
+ expr_vstore( e, vstore_slice( self . region_from_name( none) ) )
1212
+ }
1213
+ _ { expr_addr_of( m, e) }
1214
+ } ;
1192
1215
}
1193
1216
_ { ret self . parse_dot_or_call_expr( ) ; }
1194
1217
}
@@ -1198,14 +1221,22 @@ class parser {
1198
1221
let m = self . parse_mutability( ) ;
1199
1222
let e = self . to_expr( self . parse_prefix_expr( ) ) ;
1200
1223
hi = e. span. hi;
1201
- ex = expr_unary( box( m) , e) ;
1224
+ // HACK: turn @[...] into [...]/@
1225
+ ex = alt e. node {
1226
+ expr_vec( * ) if m == m_imm { expr_vstore( e, vstore_box) }
1227
+ _ { expr_unary( box( m) , e) }
1228
+ } ;
1202
1229
}
1203
1230
token:: TILDE {
1204
1231
self . bump( ) ;
1205
1232
let m = self . parse_mutability( ) ;
1206
1233
let e = self . to_expr( self . parse_prefix_expr( ) ) ;
1207
1234
hi = e. span. hi;
1208
- ex = expr_unary( uniq( m) , e) ;
1235
+ // HACK: turn ~[...] into [...]/~
1236
+ ex = alt e. node {
1237
+ expr_vec( * ) if m == m_imm { expr_vstore( e, vstore_uniq) }
1238
+ _ { expr_unary( uniq( m) , e) }
1239
+ } ;
1209
1240
}
1210
1241
_ { ret self . parse_dot_or_call_expr( ) ; }
1211
1242
}
0 commit comments