diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c117b5b012847..ae10470728476 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3425,6 +3425,7 @@ impl<'a> Parser<'a> { 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 @@ impl<'a> Parser<'a> { 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 0000000000000..a26b7fdc425f1 --- /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 0000000000000..aaf95410b8ed3 --- /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 0000000000000..3a5c8bbc5461f --- /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 0000000000000..46d0219da81a2 --- /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 0000000000000..30cc41c35880e --- /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 0000000000000..6edd808d84762 --- /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 0000000000000..753acdd75fe55 --- /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