Skip to content

Commit 04475b9

Browse files
committed
Auto merge of #29274 - thepowersgang:issues-29107-const-unsafe-fn-order, r=nikomatsakis
This PR switches the implemented ordering from `unsafe const fn` (as was in the original RFC) to `const unsafe fn` (which is what the lang team decided on)
2 parents 2c42c98 + f9b8c49 commit 04475b9

File tree

6 files changed

+21
-16
lines changed

6 files changed

+21
-16
lines changed

src/libcore/nonzero.rs

+1-1
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

+1-1
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

+14-10
Original file line numberDiff line numberDiff line change
@@ -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,

src/libsyntax/print/pprust.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -3058,13 +3058,14 @@ impl<'a> State<'a> {
30583058
abi: abi::Abi,
30593059
vis: ast::Visibility) -> io::Result<()> {
30603060
try!(word(&mut self.s, &visibility_qualified(vis, "")));
3061-
try!(self.print_unsafety(unsafety));
30623061

30633062
match constness {
30643063
ast::Constness::NotConst => {}
30653064
ast::Constness::Const => try!(self.word_nbsp("const"))
30663065
}
30673066

3067+
try!(self.print_unsafety(unsafety));
3068+
30683069
if abi != abi::Rust {
30693070
try!(self.word_nbsp("extern"));
30703071
try!(self.word_nbsp(&abi.to_string()));

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

+1-1
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

+2-2
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)