Implement original version of RFC#1245

This commit is contained in:
John Hodge 2015-10-03 23:42:22 +08:00
parent 0369304feb
commit 4c88bf2885
3 changed files with 63 additions and 3 deletions

View file

@ -4380,11 +4380,11 @@ pub fn is_const_item(&mut self) -> bool {
/// - `extern fn`
/// - etc
pub fn parse_fn_front_matter(&mut self) -> PResult<(ast::Constness, ast::Unsafety, abi::Abi)> {
let unsafety = try!(self.parse_unsafety());
let is_const_fn = try!(self.eat_keyword(keywords::Const));
let (constness, unsafety, abi) = if is_const_fn {
(Constness::Const, Unsafety::Normal, abi::Rust)
(Constness::Const, unsafety, abi::Rust)
} else {
let unsafety = try!(self.parse_unsafety());
let abi = if try!(self.eat_keyword(keywords::Extern)) {
try!(self.parse_opt_abi()).unwrap_or(abi::C)
} else {
@ -5399,9 +5399,14 @@ fn parse_item_(&mut self, attrs: Vec<Attribute>,
} else {
abi::Rust
};
let constness = if abi == abi::Rust && try!(self.eat_keyword(keywords::Const) ){
Constness::Const
} else {
Constness::NotConst
};
try!(self.expect_keyword(keywords::Fn));
let (ident, item_, extra_attrs) =
try!(self.parse_item_fn(Unsafety::Unsafe, Constness::NotConst, abi));
try!(self.parse_item_fn(Unsafety::Unsafe, constness, abi));
let last_span = self.last_span;
let item = self.mk_item(lo,
last_span.hi,

View file

@ -0,0 +1,24 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// A quick test of 'unsafe const fn' functionality
#![feature(const_fn)]
unsafe const fn dummy(v: u32) -> u32 {
!v
}
const VAL: u32 = dummy(0xFFFF); //~ ERROR E0133
fn main() {
assert_eq!(VAL, 0xFFFF0000);
}

View file

@ -0,0 +1,31 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// A quick test of 'unsafe const fn' functionality
#![feature(const_fn)]
unsafe const fn dummy(v: u32) -> u32 {
!v
}
struct Type;
impl Type {
unsafe const fn new() -> Type {
Type
}
}
const VAL: u32 = unsafe { dummy(0xFFFF) };
const TYPE_INST: Type = unsafe { Type::new() };
fn main() {
assert_eq!(VAL, 0xFFFF0000);
}