diff --git a/src/doc/rust.md b/src/doc/rust.md index 8f47e81ba5c8e..4d78ec8b001b5 100644 --- a/src/doc/rust.md +++ b/src/doc/rust.md @@ -160,7 +160,7 @@ block_comment_body : [block_comment | character] * ; line_comment : "//" non_eol * ; ~~~~ -Comments in Rust code follow the general C++ style of line and block-comment forms. +Comments in Rust code follow the general C++ style of line and block-comment forms. Nested block comments are supported. Line comments beginning with exactly _three_ slashes (`///`), and block @@ -3468,10 +3468,11 @@ There are four varieties of pointer in Rust: * Raw pointers (`*`) : Raw pointers are pointers without safety or liveness guarantees. - Raw pointers are written `*content`, - for example `*int` means a raw pointer to an integer. - Copying or dropping a raw pointer has no effect on the lifecycle of any other value. - Dereferencing a raw pointer or converting it to any other pointer type is an [`unsafe` operation](#unsafe-functions). + Raw pointers are written as `*const T` or `*mut T`, + for example `*const int` means a raw pointer to an integer. + Copying or dropping a raw pointer has no effect on the lifecycle of any + other value. Dereferencing a raw pointer or converting it to any other + pointer type is an [`unsafe` operation](#unsafe-functions). Raw pointers are generally discouraged in Rust code; they exist to support interoperability with foreign code, and writing performance-critical or low-level functions. diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim index 77348335eb346..3696f1adc918b 100644 --- a/src/etc/vim/syntax/rust.vim +++ b/src/etc/vim/syntax/rust.vim @@ -30,8 +30,7 @@ syn keyword rustKeyword unsafe virtual while syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty " FIXME: Scoped impl's name is also fallen in this category syn keyword rustKeyword mod trait struct enum type nextgroup=rustIdentifier skipwhite skipempty -syn keyword rustStorage mut ref static -syn keyword rustObsoleteStorage const +syn keyword rustStorage mut ref static const syn keyword rustInvalidBareKeyword crate diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 8b50a6270bca5..f7bed002140b9 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1352,7 +1352,7 @@ impl<'a> Parser<'a> { } else if self.token == token::BINOP(token::STAR) { // STAR POINTER (bare pointer?) self.bump(); - TyPtr(self.parse_mt()) + TyPtr(self.parse_ptr()) } else if self.token == token::LBRACKET { // VECTOR self.expect(&token::LBRACKET); @@ -1429,6 +1429,19 @@ impl<'a> Parser<'a> { return TyRptr(opt_lifetime, mt); } + pub fn parse_ptr(&mut self) -> MutTy { + let mutbl = if self.eat_keyword(keywords::Mut) { + MutMutable + } else if self.eat_keyword(keywords::Const) { + MutImmutable + } else { + // NOTE: after a stage0 snap this should turn into a span_err. + MutImmutable + }; + let t = self.parse_ty(true); + MutTy { ty: t, mutbl: mutbl } + } + pub fn is_named_argument(&mut self) -> bool { let offset = match self.token { token::BINOP(token::AND) => 1, diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index a4a022708d95e..960c9984a8e5b 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -486,11 +486,11 @@ declare_special_idents_and_keywords! { (40, Continue, "continue"); (41, Proc, "proc"); (42, Box, "box"); + (43, Const, "const"); 'reserved: - (43, Alignof, "alignof"); - (44, Be, "be"); - (45, Const, "const"); + (44, Alignof, "alignof"); + (45, Be, "be"); (46, Offsetof, "offsetof"); (47, Priv, "priv"); (48, Pure, "pure"); diff --git a/src/test/run-pass/new-unsafe-pointers.rs b/src/test/run-pass/new-unsafe-pointers.rs new file mode 100644 index 0000000000000..96ccb1a37a2a0 --- /dev/null +++ b/src/test/run-pass/new-unsafe-pointers.rs @@ -0,0 +1,14 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let _a: *const int = 3 as *const int; + let _a: *mut int = 3 as *mut int; +}