@@ -4380,19 +4380,21 @@ impl<'a> Parser<'a> {
43804380 /// true if we are looking at `const ID`, false for things like `const fn` etc
43814381 pub fn is_const_item ( & mut self ) -> bool {
43824382 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 ) )
43844385 }
43854386
43864387 /// parses all the "front matter" for a `fn` declaration, up to
43874388 /// and including the `fn` keyword:
43884389 ///
43894390 /// - `const fn`
43904391 /// - `unsafe fn`
4392+ /// - `const unsafe fn`
43914393 /// - `extern fn`
43924394 /// - etc
43934395 pub fn parse_fn_front_matter ( & mut self ) -> PResult < ( ast:: Constness , ast:: Unsafety , abi:: Abi ) > {
4394- let unsafety = try!( self . parse_unsafety ( ) ) ;
43954396 let is_const_fn = try!( self . eat_keyword ( keywords:: Const ) ) ;
4397+ let unsafety = try!( self . parse_unsafety ( ) ) ;
43964398 let ( constness, unsafety, abi) = if is_const_fn {
43974399 ( Constness :: Const , unsafety, abi:: Rust )
43984400 } else {
@@ -5300,11 +5302,18 @@ impl<'a> Parser<'a> {
53005302 return Ok ( Some ( item) ) ;
53015303 }
53025304 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 ) ) ) {
53045308 // CONST FUNCTION ITEM
5309+ let unsafety = if try!( self . eat_keyword ( keywords:: Unsafe ) ) {
5310+ Unsafety :: Unsafe
5311+ } else {
5312+ Unsafety :: Normal
5313+ } ;
53055314 try!( self . bump ( ) ) ;
53065315 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 ) ) ;
53085317 let last_span = self . last_span ;
53095318 let item = self . mk_item ( lo,
53105319 last_span. hi ,
@@ -5387,14 +5396,9 @@ impl<'a> Parser<'a> {
53875396 } else {
53885397 abi:: Rust
53895398 } ;
5390- let constness = if abi == abi:: Rust && try!( self . eat_keyword ( keywords:: Const ) ) {
5391- Constness :: Const
5392- } else {
5393- Constness :: NotConst
5394- } ;
53955399 try!( self . expect_keyword ( keywords:: Fn ) ) ;
53965400 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) ) ;
53985402 let last_span = self . last_span ;
53995403 let item = self . mk_item ( lo,
54005404 last_span. hi ,
0 commit comments