@@ -352,6 +352,20 @@ pub impl Parser {
352
352
self . token_is_keyword ( & ~"fn ", tok)
353
353
}
354
354
355
+ fn token_is_lifetime ( & self , tok : & token:: Token ) -> bool {
356
+ match * tok {
357
+ token:: LIFETIME ( * ) => true ,
358
+ _ => false ,
359
+ }
360
+ }
361
+
362
+ fn get_lifetime ( & self , tok : & token:: Token ) -> ast:: ident {
363
+ match * tok {
364
+ token:: LIFETIME ( ref ident) => copy * ident,
365
+ _ => self . bug ( ~"not a lifetime") ,
366
+ }
367
+ }
368
+
355
369
// parse a ty_bare_fun type:
356
370
fn parse_ty_bare_fn ( & self ) -> ty_
357
371
{
@@ -1204,8 +1218,14 @@ pub impl Parser {
1204
1218
expr_do_body) ;
1205
1219
} else if self . eat_keyword ( & ~"while ") {
1206
1220
return self.parse_while_expr();
1221
+ } else if self.token_is_lifetime(&*self.token) {
1222
+ let lifetime = self.get_lifetime(&*self.token);
1223
+ self.bump();
1224
+ self.expect(&token::COLON);
1225
+ self.expect_keyword(&~" loop") ;
1226
+ return self . parse_loop_expr ( Some ( lifetime) ) ;
1207
1227
} else if self . eat_keyword ( & ~"loop ") {
1208
- return self . parse_loop_expr ( ) ;
1228
+ return self . parse_loop_expr ( None ) ;
1209
1229
} else if self . eat_keyword ( & ~"match ") {
1210
1230
return self.parse_match_expr();
1211
1231
} else if self.eat_keyword(&~" unsafe") {
@@ -1263,8 +1283,10 @@ pub impl Parser {
1263
1283
ex = expr_ret(Some(e));
1264
1284
} else { ex = expr_ret(None); }
1265
1285
} else if self.eat_keyword(&~"break" ) {
1266
- if is_ident( & * self . token ) {
1267
- ex = expr_break ( Some ( self . parse_ident ( ) ) ) ;
1286
+ if self . token_is_lifetime ( & * self . token ) {
1287
+ let lifetime = self . get_lifetime ( & * self . token ) ;
1288
+ self . bump ( ) ;
1289
+ ex = expr_break ( Some ( lifetime) ) ;
1268
1290
} else {
1269
1291
ex = expr_break ( None ) ;
1270
1292
}
@@ -1961,37 +1983,32 @@ pub impl Parser {
1961
1983
return self . mk_expr ( lo, hi, expr_while ( cond, body) ) ;
1962
1984
}
1963
1985
1964
- fn parse_loop_expr ( & self ) -> @expr {
1986
+ fn parse_loop_expr ( & self , opt_ident : Option < ast :: ident > ) -> @expr {
1965
1987
// loop headers look like 'loop {' or 'loop unsafe {'
1966
1988
let is_loop_header =
1967
1989
* self . token == token:: LBRACE
1968
1990
|| ( is_ident ( & * self . token )
1969
1991
&& self . look_ahead ( 1 ) == token:: LBRACE ) ;
1970
- // labeled loop headers look like 'loop foo: {'
1971
- let is_labeled_loop_header =
1972
- is_ident ( & * self . token )
1973
- && !self . is_any_keyword ( & copy * self . token )
1974
- && self . look_ahead ( 1 ) == token:: COLON ;
1975
1992
1976
- if is_loop_header || is_labeled_loop_header {
1993
+ if is_loop_header {
1977
1994
// This is a loop body
1978
- let opt_ident;
1979
- if is_labeled_loop_header {
1980
- opt_ident = Some ( self . parse_ident ( ) ) ;
1981
- self . expect ( & token:: COLON ) ;
1982
- } else {
1983
- opt_ident = None ;
1984
- }
1985
-
1986
1995
let lo = self . last_span . lo ;
1987
1996
let body = self . parse_block_no_value ( ) ;
1988
1997
let hi = body. span . hi ;
1989
1998
return self . mk_expr ( lo, hi, expr_loop ( body, opt_ident) ) ;
1990
1999
} else {
1991
2000
// This is a 'continue' expression
2001
+ if opt_ident. is_some ( ) {
2002
+ self . span_err ( * self . last_span ,
2003
+ ~"a label may not be used with a `loop ` \
2004
+ expression") ;
2005
+ }
2006
+
1992
2007
let lo = self . span . lo ;
1993
- let ex = if is_ident ( & * self . token ) {
1994
- expr_again ( Some ( self . parse_ident ( ) ) )
2008
+ let ex = if self . token_is_lifetime ( & * self . token ) {
2009
+ let lifetime = self . get_lifetime ( & * self . token ) ;
2010
+ self . bump ( ) ;
2011
+ expr_again ( Some ( lifetime) )
1995
2012
} else {
1996
2013
expr_again ( None )
1997
2014
} ;
0 commit comments