From 223d0917447b561269d102f957dc845572701b57 Mon Sep 17 00:00:00 2001 From: Sunjay Varma Date: Sun, 19 Nov 2017 00:18:43 -0500 Subject: [PATCH] Parsing where clauses correctly and documenting the grammar being parsed --- src/libsyntax/parse/parser.rs | 10 ++++++++-- .../generic-associated-types-where.rs | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 077e547e052..5a20c7f40e6 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4443,6 +4443,8 @@ impl<'a> Parser<'a> { }) } + /// Parses the following grammar: + /// TraitItemAssocTy = Ident ["<"...">"] [":" [TyParamBounds]] ["where" ...] ["=" Ty] fn parse_trait_item_assoc_ty(&mut self, preceding_attrs: Vec) -> PResult<'a, (ast::Generics, TyParam)> { let span = self.span; @@ -4455,13 +4457,13 @@ impl<'a> Parser<'a> { } else { Vec::new() }; + generics.where_clause = self.parse_where_clause()?; let default = if self.eat(&token::Eq) { Some(self.parse_ty()?) } else { None }; - generics.where_clause = self.parse_where_clause()?; Ok((generics, TyParam { attrs: preceding_attrs.into(), @@ -5014,14 +5016,18 @@ impl<'a> Parser<'a> { let vis = self.parse_visibility(false)?; let defaultness = self.parse_defaultness()?; let (name, node, generics) = if self.eat_keyword(keywords::Type) { + // This parses the grammar: + // ImplItemAssocTy = Ident ["<"...">"] ["where" ...] "=" Ty ";" let name = self.parse_ident()?; let mut generics = self.parse_generics()?; + generics.where_clause = self.parse_where_clause()?; self.expect(&token::Eq)?; let typ = self.parse_ty()?; - generics.where_clause = self.parse_where_clause()?; self.expect(&token::Semi)?; (name, ast::ImplItemKind::Type(typ), generics) } else if self.is_const_item() { + // This parses the grammar: + // ImplItemConst = "const" Ident ":" Ty "=" Expr ";" self.expect_keyword(keywords::Const)?; let name = self.parse_ident()?; self.expect(&token::Colon)?; diff --git a/src/test/run-pass/rfc1598-generic-associated-types/generic-associated-types-where.rs b/src/test/run-pass/rfc1598-generic-associated-types/generic-associated-types-where.rs index 269e5dc26fc..cad8a96b8f0 100644 --- a/src/test/run-pass/rfc1598-generic-associated-types/generic-associated-types-where.rs +++ b/src/test/run-pass/rfc1598-generic-associated-types/generic-associated-types-where.rs @@ -18,7 +18,7 @@ use std::fmt::{Display, Debug}; trait Foo { type Assoc where Self: Sized; type Assoc2 where T: Display; - type WithDefault = Iterator where T: Debug; + type WithDefault where T: Debug = Iterator; } struct Bar;