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
* 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.
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
} 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);
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,
(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");
--- /dev/null
+// 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 <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.
+
+fn main() {
+ let _a: *const int = 3 as *const int;
+ let _a: *mut int = 3 as *mut int;
+}