diff options
| author | bors <bors@rust-lang.org> | 2014-09-23 14:30:40 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-23 14:30:40 +0000 |
| commit | d80cd3d9bc46c326b67fe48497c9ae7b322179ba (patch) | |
| tree | 314bf4a82ed0e632d631c8c44e7e3cb9f1d502de /src/libsyntax/parse/parser.rs | |
| parent | 2f9669c7489cc383bc6616c5f9ed217ae37e3d56 (diff) | |
| parent | 5376b1c79870c80d0081540c72ae060d3ed5d1f5 (diff) | |
| download | rust-d80cd3d9bc46c326b67fe48497c9ae7b322179ba.tar.gz rust-d80cd3d9bc46c326b67fe48497c9ae7b322179ba.zip | |
auto merge of #17028 : pcwalton/rust/higher-rank-trait-lifetimes, r=pnkfelix
They will ICE during typechecking if used, because they depend on trait reform. This is part of unboxed closures. r? @nikomatsakis
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 1ff6c3f9418..cbc710821f9 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -34,7 +34,8 @@ use ast::{FnOnceUnboxedClosureKind}; use ast::{ForeignItem, ForeignItemStatic, ForeignItemFn, ForeignMod}; use ast::{Ident, NormalFn, Inherited, ImplItem, Item, Item_, ItemStatic}; use ast::{ItemEnum, ItemFn, ItemForeignMod, ItemImpl}; -use ast::{ItemMac, ItemMod, ItemStruct, ItemTrait, ItemTy, Lit, Lit_}; +use ast::{ItemMac, ItemMod, ItemStruct, ItemTrait, ItemTy}; +use ast::{LifetimeDef, Lit, Lit_}; use ast::{LitBool, LitChar, LitByte, LitBinary}; use ast::{LitNil, LitStr, LitInt, Local, LocalLet}; use ast::{MutImmutable, MutMutable, Mac_, MacInvocTT, Matcher, MatchNonterminal}; @@ -3791,8 +3792,21 @@ impl<'a> Parser<'a> { { let mut result = vec!(); loop { + let lifetime_defs = if self.eat(&token::LT) { + let lifetime_defs = self.parse_lifetime_defs(); + self.expect_gt(); + lifetime_defs + } else { + Vec::new() + }; match self.token { token::LIFETIME(lifetime) => { + if lifetime_defs.len() > 0 { + let span = self.last_span; + self.span_err(span, "lifetime declarations are not \ + allowed here") + } + result.push(RegionTyParamBound(ast::Lifetime { id: ast::DUMMY_NODE_ID, span: self.span, @@ -3818,12 +3832,14 @@ impl<'a> Parser<'a> { cf: return_style, variadic: false, }), + lifetimes: lifetime_defs, ref_id: ast::DUMMY_NODE_ID, }))); } else { result.push(TraitTyParamBound(ast::TraitRef { path: path, ref_id: ast::DUMMY_NODE_ID, + lifetimes: lifetime_defs, })) } } @@ -3852,6 +3868,7 @@ impl<'a> Parser<'a> { ast::TraitRef { path: path, ref_id: ast::DUMMY_NODE_ID, + lifetimes: Vec::new(), } } @@ -4482,8 +4499,11 @@ impl<'a> Parser<'a> { // New-style trait. Reinterpret the type as a trait. let opt_trait_ref = match ty.node { TyPath(ref path, None, node_id) => { - Some(TraitRef { path: (*path).clone(), - ref_id: node_id }) + Some(TraitRef { + path: (*path).clone(), + ref_id: node_id, + lifetimes: Vec::new(), + }) } TyPath(_, Some(_), _) => { self.span_err(ty.span, |
