@@ -4380,19 +4380,21 @@ impl<'a> Parser<'a> {
4380
4380
/// true if we are looking at `const ID`, false for things like `const fn` etc
4381
4381
pub fn is_const_item ( & mut self ) -> bool {
4382
4382
self . token . is_keyword ( keywords:: Const ) &&
4383
- !self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Fn ) )
4383
+ !self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Fn ) ) &&
4384
+ !self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Unsafe ) )
4384
4385
}
4385
4386
4386
4387
/// parses all the "front matter" for a `fn` declaration, up to
4387
4388
/// and including the `fn` keyword:
4388
4389
///
4389
4390
/// - `const fn`
4390
4391
/// - `unsafe fn`
4392
+ /// - `const unsafe fn`
4391
4393
/// - `extern fn`
4392
4394
/// - etc
4393
4395
pub fn parse_fn_front_matter ( & mut self ) -> PResult < ( ast:: Constness , ast:: Unsafety , abi:: Abi ) > {
4394
- let unsafety = try!( self . parse_unsafety ( ) ) ;
4395
4396
let is_const_fn = try!( self . eat_keyword ( keywords:: Const ) ) ;
4397
+ let unsafety = try!( self . parse_unsafety ( ) ) ;
4396
4398
let ( constness, unsafety, abi) = if is_const_fn {
4397
4399
( Constness :: Const , unsafety, abi:: Rust )
4398
4400
} else {
@@ -5300,11 +5302,18 @@ impl<'a> Parser<'a> {
5300
5302
return Ok ( Some ( item) ) ;
5301
5303
}
5302
5304
if try!( self . eat_keyword ( keywords:: Const ) ) {
5303
- if self . check_keyword ( keywords:: Fn ) {
5305
+ if self . check_keyword ( keywords:: Fn )
5306
+ || ( self . check_keyword ( keywords:: Unsafe )
5307
+ && self . look_ahead ( 1 , |t| t. is_keyword ( keywords:: Fn ) ) ) {
5304
5308
// CONST FUNCTION ITEM
5309
+ let unsafety = if try!( self . eat_keyword ( keywords:: Unsafe ) ) {
5310
+ Unsafety :: Unsafe
5311
+ } else {
5312
+ Unsafety :: Normal
5313
+ } ;
5305
5314
try!( self . bump ( ) ) ;
5306
5315
let ( ident, item_, extra_attrs) =
5307
- try!( self . parse_item_fn ( Unsafety :: Normal , Constness :: Const , abi:: Rust ) ) ;
5316
+ try!( self . parse_item_fn ( unsafety , Constness :: Const , abi:: Rust ) ) ;
5308
5317
let last_span = self . last_span ;
5309
5318
let item = self . mk_item ( lo,
5310
5319
last_span. hi ,
@@ -5387,14 +5396,9 @@ impl<'a> Parser<'a> {
5387
5396
} else {
5388
5397
abi:: Rust
5389
5398
} ;
5390
- let constness = if abi == abi:: Rust && try!( self . eat_keyword ( keywords:: Const ) ) {
5391
- Constness :: Const
5392
- } else {
5393
- Constness :: NotConst
5394
- } ;
5395
5399
try!( self . expect_keyword ( keywords:: Fn ) ) ;
5396
5400
let ( ident, item_, extra_attrs) =
5397
- try!( self . parse_item_fn ( Unsafety :: Unsafe , constness , abi) ) ;
5401
+ try!( self . parse_item_fn ( Unsafety :: Unsafe , Constness :: NotConst , abi) ) ;
5398
5402
let last_span = self . last_span ;
5399
5403
let item = self . mk_item ( lo,
5400
5404
last_span. hi ,
0 commit comments