about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorKevin Butler <haqkrs@gmail.com>2014-05-23 20:51:21 +0100
committerKevin Butler <haqkrs@gmail.com>2014-05-23 20:51:21 +0100
commitda663ccf9f9bcc737d63ee48515689bd2b40ef3d (patch)
tree29a89758503a72cd6bf53aa372acd9a180ad5c04 /src/libsyntax
parentad775be8b48f82d19356942a4fc6fcadc56d3e7e (diff)
downloadrust-da663ccf9f9bcc737d63ee48515689bd2b40ef3d.tar.gz
rust-da663ccf9f9bcc737d63ee48515689bd2b40ef3d.zip
Improve error message for lifetimes after type params.
Closes #14303.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/parse/parser.rs14
1 files changed, 13 insertions, 1 deletions
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 @@ 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<Arg> , bool) {
         let sp = self.span;