From da663ccf9f9bcc737d63ee48515689bd2b40ef3d Mon Sep 17 00:00:00 2001 From: Kevin Butler Date: Fri, 23 May 2014 20:51:21 +0100 Subject: [PATCH] Improve error message for lifetimes after type params. Closes #14303. --- src/libsyntax/parse/parser.rs | 14 +++++++++++++- src/test/compile-fail/issue-14303-enum.rs | 14 ++++++++++++++ src/test/compile-fail/issue-14303-fn-def.rs | 12 ++++++++++++ src/test/compile-fail/issue-14303-fncall.rs | 16 ++++++++++++++++ src/test/compile-fail/issue-14303-impl.rs | 14 ++++++++++++++ src/test/compile-fail/issue-14303-path.rs | 12 ++++++++++++ src/test/compile-fail/issue-14303-struct.rs | 14 ++++++++++++++ src/test/compile-fail/issue-14303-trait.rs | 12 ++++++++++++ 8 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/issue-14303-enum.rs create mode 100644 src/test/compile-fail/issue-14303-fn-def.rs create mode 100644 src/test/compile-fail/issue-14303-fncall.rs create mode 100644 src/test/compile-fail/issue-14303-impl.rs create mode 100644 src/test/compile-fail/issue-14303-path.rs create mode 100644 src/test/compile-fail/issue-14303-struct.rs create mode 100644 src/test/compile-fail/issue-14303-trait.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c117b5b0128..ae104707284 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3425,6 +3425,7 @@ pub fn parse_generics(&mut self) -> ast::Generics { let lifetimes = self.parse_lifetimes(); let mut seen_default = false; let ty_params = self.parse_seq_to_gt(Some(token::COMMA), |p| { + p.forbid_lifetime(); let ty_param = p.parse_ty_param(); if ty_param.default.is_some() { seen_default = true; @@ -3444,10 +3445,21 @@ fn parse_generic_values_after_lt(&mut self) -> (Vec, Vec> ) let lifetimes = self.parse_lifetimes(); let result = self.parse_seq_to_gt( Some(token::COMMA), - |p| p.parse_ty(false)); + |p| { + p.forbid_lifetime(); + p.parse_ty(false) + } + ); (lifetimes, result.into_vec()) } + fn forbid_lifetime(&mut self) { + if Parser::token_is_lifetime(&self.token) { + self.span_fatal(self.span, "lifetime parameters must be declared \ + prior to type parameters"); + } + } + fn parse_fn_args(&mut self, named_args: bool, allow_variadic: bool) -> (Vec , bool) { let sp = self.span; diff --git a/src/test/compile-fail/issue-14303-enum.rs b/src/test/compile-fail/issue-14303-enum.rs new file mode 100644 index 00000000000..a26b7fdc425 --- /dev/null +++ b/src/test/compile-fail/issue-14303-enum.rs @@ -0,0 +1,14 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +enum X<'a, T, 'b> { +//~^ ERROR lifetime parameters must be declared prior to type parameters + A(&'a T) +} diff --git a/src/test/compile-fail/issue-14303-fn-def.rs b/src/test/compile-fail/issue-14303-fn-def.rs new file mode 100644 index 00000000000..aaf95410b8e --- /dev/null +++ b/src/test/compile-fail/issue-14303-fn-def.rs @@ -0,0 +1,12 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn foo<'a, T, 'b>(x: &'a T) {} +//~^ ERROR lifetime parameters must be declared prior to type parameters diff --git a/src/test/compile-fail/issue-14303-fncall.rs b/src/test/compile-fail/issue-14303-fncall.rs new file mode 100644 index 00000000000..3a5c8bbc546 --- /dev/null +++ b/src/test/compile-fail/issue-14303-fncall.rs @@ -0,0 +1,16 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + range(0, 4) + .map(|x| x * 2) + .collect::>() + //~^ ERROR lifetime parameters must be declared prior to type parameters +} diff --git a/src/test/compile-fail/issue-14303-impl.rs b/src/test/compile-fail/issue-14303-impl.rs new file mode 100644 index 00000000000..46d0219da81 --- /dev/null +++ b/src/test/compile-fail/issue-14303-impl.rs @@ -0,0 +1,14 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct X { x: int } + +impl<'a, T, 'b> X {} +//~^ ERROR lifetime parameters must be declared prior to type parameters diff --git a/src/test/compile-fail/issue-14303-path.rs b/src/test/compile-fail/issue-14303-path.rs new file mode 100644 index 00000000000..30cc41c3588 --- /dev/null +++ b/src/test/compile-fail/issue-14303-path.rs @@ -0,0 +1,12 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {} +//~^ ERROR lifetime parameters must be declared prior to type parameters diff --git a/src/test/compile-fail/issue-14303-struct.rs b/src/test/compile-fail/issue-14303-struct.rs new file mode 100644 index 00000000000..6edd808d847 --- /dev/null +++ b/src/test/compile-fail/issue-14303-struct.rs @@ -0,0 +1,14 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct X<'a, T, 'b> { +//~^ ERROR lifetime parameters must be declared prior to type parameters + x: &'a T +} diff --git a/src/test/compile-fail/issue-14303-trait.rs b/src/test/compile-fail/issue-14303-trait.rs new file mode 100644 index 00000000000..753acdd75fe --- /dev/null +++ b/src/test/compile-fail/issue-14303-trait.rs @@ -0,0 +1,12 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait Foo<'a, T, 'b> {} +//~^ ERROR lifetime parameters must be declared prior to type parameters -- 2.44.0