about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorleonardo.yvens <leoyvens@gmail.com>2017-10-12 19:00:30 -0300
committerleonardo.yvens <leoyvens@gmail.com>2017-11-03 16:13:21 -0200
commitacf50ee236abae0ad416360eda2a3afa8873d2a0 (patch)
treec7f27bbc25abda902bba285a40c1214c70debf8a /src/libsyntax
parent37dfc0c5982029ea0793699eead1d8ec4c5cef73 (diff)
downloadrust-acf50ee236abae0ad416360eda2a3afa8873d2a0.tar.gz
rust-acf50ee236abae0ad416360eda2a3afa8873d2a0.zip
Add tests for `auto trait`, fix parsing bug
Now we can do the well formedness checks in the parser, yay!
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/feature_gate.rs2
-rw-r--r--src/libsyntax/parse/parser.rs62
2 files changed, 32 insertions, 32 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 9aee2441a9d..e354d56f5af 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -1394,7 +1394,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
                                    i.span,
                                    "auto traits are experimental and possibly buggy");
             }
-            
+
             ast::ItemKind::MacroDef(ast::MacroDef { legacy: false, .. }) => {
                 let msg = "`macro` is experimental";
                 gate_feature_post!(&self, decl_macro, i.span, msg);
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index c94fcf461c7..1376102568b 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -6014,6 +6014,37 @@ impl<'a> Parser<'a> {
                                     maybe_append(attrs, extra_attrs));
             return Ok(Some(item));
         }
+        if self.eat_keyword(keywords::Auto) {
+            self.expect_keyword(keywords::Trait)?;
+            // AUTO TRAIT ITEM
+            let (ident,
+                 item_,
+                 extra_attrs) = self.parse_item_auto_trait(ast::Unsafety::Normal)?;
+            let prev_span = self.prev_span;
+            let item = self.mk_item(lo.to(prev_span),
+                                    ident,
+                                    item_,
+                                    visibility,
+                                    maybe_append(attrs, extra_attrs));
+            return Ok(Some(item));
+        }
+        if self.check_keyword(keywords::Unsafe) &&
+            self.look_ahead(1, |t| t.is_keyword(keywords::Auto)) {
+            self.expect_keyword(keywords::Unsafe)?;
+            self.expect_keyword(keywords::Auto)?;
+            self.expect_keyword(keywords::Trait)?;
+            // UNSAFE AUTO TRAIT ITEM
+            let (ident,
+                 item_,
+                 extra_attrs) = self.parse_item_auto_trait(ast::Unsafety::Unsafe)?;
+            let prev_span = self.prev_span;
+            let item = self.mk_item(lo.to(prev_span),
+                                    ident,
+                                    item_,
+                                    visibility,
+                                    maybe_append(attrs, extra_attrs));
+            return Ok(Some(item));
+        }
         if (self.check_keyword(keywords::Unsafe) &&
             self.look_ahead(1, |t| t.is_keyword(keywords::Impl))) ||
            (self.check_keyword(keywords::Default) &&
@@ -6138,37 +6169,6 @@ impl<'a> Parser<'a> {
                                     maybe_append(attrs, extra_attrs));
             return Ok(Some(item));
         }
-        if self.eat_keyword(keywords::Auto) {
-            self.expect_keyword(keywords::Trait)?;
-            // AUTO TRAIT ITEM
-            let (ident,
-                 item_,
-                 extra_attrs) = self.parse_item_auto_trait(ast::Unsafety::Normal)?;
-            let prev_span = self.prev_span;
-            let item = self.mk_item(lo.to(prev_span),
-                                    ident,
-                                    item_,
-                                    visibility,
-                                    maybe_append(attrs, extra_attrs));
-            return Ok(Some(item));
-        }
-        if self.check_keyword(keywords::Unsafe) &&
-            self.look_ahead(1, |t| t.is_keyword(keywords::Auto)) {
-            self.expect_keyword(keywords::Unsafe)?;
-            self.expect_keyword(keywords::Auto)?;
-            self.expect_keyword(keywords::Trait)?;
-            // UNSAFE AUTO TRAIT ITEM
-            let (ident,
-                 item_,
-                 extra_attrs) = self.parse_item_auto_trait(ast::Unsafety::Unsafe)?;
-            let prev_span = self.prev_span;
-            let item = self.mk_item(lo.to(prev_span),
-                                    ident,
-                                    item_,
-                                    visibility,
-                                    maybe_append(attrs, extra_attrs));
-            return Ok(Some(item));
-        }
         if self.eat_keyword(keywords::Struct) {
             // STRUCT ITEM
             let (ident, item_, extra_attrs) = self.parse_item_struct()?;