Skip to content

Commit f9b8c49

Browse files
committed
Switch to 'const unsafe fn' ordering (#29107)
1 parent bbb5f8e commit f9b8c49

File tree

6 files changed

+21
-16
lines changed

6 files changed

+21
-16
lines changed

src/libcore/nonzero.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ macro_rules! nonzero_new {
5555
/// Creates an instance of NonZero with the provided value.
5656
/// You must indeed ensure that the value is actually "non-zero".
5757
#[inline(always)]
58-
pub unsafe const fn new(inner: T) -> NonZero<T> {
58+
pub const unsafe fn new(inner: T) -> NonZero<T> {
5959
NonZero(inner)
6060
}
6161
)

src/libcore/ptr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ macro_rules! unique_new {
511511
macro_rules! unique_new {
512512
() => (
513513
/// Creates a new `Unique`.
514-
pub unsafe const fn new(ptr: *mut T) -> Unique<T> {
514+
pub const unsafe fn new(ptr: *mut T) -> Unique<T> {
515515
Unique { pointer: NonZero::new(ptr), _marker: PhantomData }
516516
}
517517
)

src/libsyntax/parse/parser.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4382,19 +4382,21 @@ impl<'a> Parser<'a> {
43824382
/// true if we are looking at `const ID`, false for things like `const fn` etc
43834383
pub fn is_const_item(&mut self) -> bool {
43844384
self.token.is_keyword(keywords::Const) &&
4385-
!self.look_ahead(1, |t| t.is_keyword(keywords::Fn))
4385+
!self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) &&
4386+
!self.look_ahead(1, |t| t.is_keyword(keywords::Unsafe))
43864387
}
43874388

43884389
/// parses all the "front matter" for a `fn` declaration, up to
43894390
/// and including the `fn` keyword:
43904391
///
43914392
/// - `const fn`
43924393
/// - `unsafe fn`
4394+
/// - `const unsafe fn`
43934395
/// - `extern fn`
43944396
/// - etc
43954397
pub fn parse_fn_front_matter(&mut self) -> PResult<(ast::Constness, ast::Unsafety, abi::Abi)> {
4396-
let unsafety = try!(self.parse_unsafety());
43974398
let is_const_fn = try!(self.eat_keyword(keywords::Const));
4399+
let unsafety = try!(self.parse_unsafety());
43984400
let (constness, unsafety, abi) = if is_const_fn {
43994401
(Constness::Const, unsafety, abi::Rust)
44004402
} else {
@@ -5304,11 +5306,18 @@ impl<'a> Parser<'a> {
53045306
return Ok(Some(item));
53055307
}
53065308
if try!(self.eat_keyword(keywords::Const) ){
5307-
if self.check_keyword(keywords::Fn) {
5309+
if self.check_keyword(keywords::Fn)
5310+
|| (self.check_keyword(keywords::Unsafe)
5311+
&& self.look_ahead(1, |t| t.is_keyword(keywords::Fn))) {
53085312
// CONST FUNCTION ITEM
5313+
let unsafety = if try!(self.eat_keyword(keywords::Unsafe) ){
5314+
Unsafety::Unsafe
5315+
} else {
5316+
Unsafety::Normal
5317+
};
53095318
try!(self.bump());
53105319
let (ident, item_, extra_attrs) =
5311-
try!(self.parse_item_fn(Unsafety::Normal, Constness::Const, abi::Rust));
5320+
try!(self.parse_item_fn(unsafety, Constness::Const, abi::Rust));
53125321
let last_span = self.last_span;
53135322
let item = self.mk_item(lo,
53145323
last_span.hi,
@@ -5391,14 +5400,9 @@ impl<'a> Parser<'a> {
53915400
} else {
53925401
abi::Rust
53935402
};
5394-
let constness = if abi == abi::Rust && try!(self.eat_keyword(keywords::Const) ){
5395-
Constness::Const
5396-
} else {
5397-
Constness::NotConst
5398-
};
53995403
try!(self.expect_keyword(keywords::Fn));
54005404
let (ident, item_, extra_attrs) =
5401-
try!(self.parse_item_fn(Unsafety::Unsafe, constness, abi));
5405+
try!(self.parse_item_fn(Unsafety::Unsafe, Constness::NotConst, abi));
54025406
let last_span = self.last_span;
54035407
let item = self.mk_item(lo,
54045408
last_span.hi,

src/libsyntax/print/pprust.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3071,13 +3071,14 @@ impl<'a> State<'a> {
30713071
abi: abi::Abi,
30723072
vis: ast::Visibility) -> io::Result<()> {
30733073
try!(word(&mut self.s, &visibility_qualified(vis, "")));
3074-
try!(self.print_unsafety(unsafety));
30753074

30763075
match constness {
30773076
ast::Constness::NotConst => {}
30783077
ast::Constness::Const => try!(self.word_nbsp("const"))
30793078
}
30803079

3080+
try!(self.print_unsafety(unsafety));
3081+
30813082
if abi != abi::Rust {
30823083
try!(self.word_nbsp("extern"));
30833084
try!(self.word_nbsp(&abi.to_string()));

src/test/compile-fail/unsafe-const-fn.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#![feature(const_fn)]
1414

15-
unsafe const fn dummy(v: u32) -> u32 {
15+
const unsafe fn dummy(v: u32) -> u32 {
1616
!v
1717
}
1818

src/test/run-pass/unsafe-const-fn.rs renamed to src/test/run-pass/const-unsafe-fn.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212

1313
#![feature(const_fn)]
1414

15-
unsafe const fn dummy(v: u32) -> u32 {
15+
const unsafe fn dummy(v: u32) -> u32 {
1616
!v
1717
}
1818

1919
struct Type;
2020
impl Type {
21-
unsafe const fn new() -> Type {
21+
const unsafe fn new() -> Type {
2222
Type
2323
}
2424
}

0 commit comments

Comments
 (0)