diff options
| author | leonardo.yvens <leoyvens@gmail.com> | 2017-10-12 19:00:30 -0300 |
|---|---|---|
| committer | leonardo.yvens <leoyvens@gmail.com> | 2017-11-03 16:13:21 -0200 |
| commit | acf50ee236abae0ad416360eda2a3afa8873d2a0 (patch) | |
| tree | c7f27bbc25abda902bba285a40c1214c70debf8a /src/libsyntax | |
| parent | 37dfc0c5982029ea0793699eead1d8ec4c5cef73 (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 62 |
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()?; |
