about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorleonardo.yvens <leoyvens@gmail.com>2017-12-04 16:26:20 -0200
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-01-13 18:49:28 +0300
commit4e3953bbdd58892844a1bd2b7f4a2336a8acea5e (patch)
treebf871e2973f81a8d7672992d015a560cbb627d2a /src/libsyntax/parse
parent9ccd3ac178c05169e04fb33530f7923f77d680af (diff)
downloadrust-4e3953bbdd58892844a1bd2b7f4a2336a8acea5e.tar.gz
rust-4e3953bbdd58892844a1bd2b7f4a2336a8acea5e.zip
Parse `auto trait` inside fns.
Also refactored parsing auto traits.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index b2d66386582..884e7d1f6ad 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -4084,14 +4084,14 @@ impl<'a> Parser<'a> {
         self.token.is_keyword(keywords::Extern) && self.look_ahead(1, |t| t != &token::ModSep)
     }
 
-    fn eat_auto_trait(&mut self) -> bool {
-        if self.token.is_keyword(keywords::Auto)
-            && self.look_ahead(1, |t| t.is_keyword(keywords::Trait))
-        {
-            self.eat_keyword(keywords::Auto) && self.eat_keyword(keywords::Trait)
-        } else {
-            false
-        }
+    fn is_auto_trait_item(&mut self) -> bool {
+        // auto trait
+        (self.token.is_keyword(keywords::Auto)
+            && self.look_ahead(1, |t| t.is_keyword(keywords::Trait)))
+        || // unsafe auto trait
+        (self.token.is_keyword(keywords::Unsafe) &&
+         self.look_ahead(1, |t| t.is_keyword(keywords::Auto)) &&
+         self.look_ahead(2, |t| t.is_keyword(keywords::Trait)))
     }
 
     fn is_defaultness(&self) -> bool {
@@ -4194,7 +4194,8 @@ impl<'a> Parser<'a> {
                 node: StmtKind::Item(macro_def),
                 span: lo.to(self.prev_span),
             }
-        // Starts like a simple path, but not a union item or item with `crate` visibility.
+        // Starts like a simple path, being careful to avoid contextual keywords
+        // such as a union items, item with `crate` visibility or auto trait items.
         // Our goal here is to parse an arbitrary path `a::b::c` but not something that starts
         // like a path (1 token), but it fact not a path.
         // `union::b::c` - path, `union U { ... }` - not a path.
@@ -4204,7 +4205,8 @@ impl<'a> Parser<'a> {
                   !self.token.is_qpath_start() &&
                   !self.is_union_item() &&
                   !self.is_crate_vis() &&
-                  !self.is_extern_non_path() {
+                  !self.is_extern_non_path() &&
+                  !self.is_auto_trait_item() {
             let pth = self.parse_path(PathStyle::Expr)?;
 
             if !self.eat(&token::Not) {
@@ -6368,7 +6370,8 @@ impl<'a> Parser<'a> {
             let is_auto = if self.eat_keyword(keywords::Trait) {
                 IsAuto::No
             } else {
-                self.eat_auto_trait();
+                self.eat_keyword(keywords::Auto);
+                self.eat_keyword(keywords::Trait);
                 IsAuto::Yes
             };
             let (ident, item_, extra_attrs) =
@@ -6482,7 +6485,8 @@ impl<'a> Parser<'a> {
             let is_auto = if self.eat_keyword(keywords::Trait) {
                 IsAuto::No
             } else {
-                self.eat_auto_trait();
+                self.eat_keyword(keywords::Auto);
+                self.eat_keyword(keywords::Trait);
                 IsAuto::Yes
             };
             // TRAIT ITEM