Skip to content

Commit fc4b541

Browse files
committed
Continue parsing after lifetime in incorrect location
1 parent 5c67ba6 commit fc4b541

File tree

6 files changed

+55
-7
lines changed

6 files changed

+55
-7
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5329,8 +5329,12 @@ impl<'a> Parser<'a> {
53295329
// Parse lifetime argument.
53305330
args.push(GenericArg::Lifetime(self.expect_lifetime()));
53315331
if seen_type || seen_binding {
5332-
self.span_err(self.prev_span,
5333-
"lifetime parameters must be declared prior to type parameters");
5332+
self.struct_span_err(
5333+
self.prev_span,
5334+
"lifetime parameters must be declared prior to type parameters"
5335+
)
5336+
.span_label(self.prev_span, "must be declared prior to type parameters")
5337+
.emit();
53345338
}
53355339
} else if self.check_ident() && self.look_ahead(1, |t| t == &token::Eq) {
53365340
// Parse associated type binding.

src/test/ui/parser/issue-14303-fncall.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ fn main() {
33
.map(|x| x * 2)
44
.collect::<Vec<'a, usize, 'b>>()
55
//~^ ERROR lifetime parameters must be declared prior to type parameters
6+
//~| ERRROR use of undeclared lifetime name
7+
//~| ERRROR use of undeclared lifetime name
68
}

src/test/ui/parser/issue-14303-fncall.stderr

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,20 @@ error: lifetime parameters must be declared prior to type parameters
22
--> $DIR/issue-14303-fncall.rs:4:31
33
|
44
LL | .collect::<Vec<'a, usize, 'b>>()
5-
| ^^
5+
| ^^ must be declared prior to type parameters
66

7-
error: aborting due to previous error
7+
error[E0261]: use of undeclared lifetime name `'a`
8+
--> $DIR/issue-14303-fncall.rs:4:20
9+
|
10+
LL | .collect::<Vec<'a, usize, 'b>>()
11+
| ^^ undeclared lifetime
12+
13+
error[E0261]: use of undeclared lifetime name `'b`
14+
--> $DIR/issue-14303-fncall.rs:4:31
15+
|
16+
LL | .collect::<Vec<'a, usize, 'b>>()
17+
| ^^ undeclared lifetime
18+
19+
error: aborting due to 3 previous errors
820

21+
For more information about this error, try `rustc --explain E0261`.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
22
//~^ ERROR lifetime parameters must be declared prior to type parameters
3+
//~| ERROR failed to resolve: use of undeclared type or module `mymodule`
4+
//~| ERROR use of undeclared lifetime name `'b`
5+
//~| ERROR use of undeclared lifetime name `'c`
36

47
fn main() {}

src/test/ui/parser/issue-14303-path.stderr

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,33 @@ error: lifetime parameters must be declared prior to type parameters
22
--> $DIR/issue-14303-path.rs:1:37
33
|
44
LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
5-
| ^^
5+
| ^^ must be declared prior to type parameters
66

7-
error: aborting due to previous error
7+
error: lifetime parameters must be declared prior to type parameters
8+
--> $DIR/issue-14303-path.rs:1:41
9+
|
10+
LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
11+
| ^^ must be declared prior to type parameters
12+
13+
error[E0433]: failed to resolve: use of undeclared type or module `mymodule`
14+
--> $DIR/issue-14303-path.rs:1:18
15+
|
16+
LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
17+
| ^^^^^^^^ use of undeclared type or module `mymodule`
18+
19+
error[E0261]: use of undeclared lifetime name `'b`
20+
--> $DIR/issue-14303-path.rs:1:37
21+
|
22+
LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
23+
| ^^ undeclared lifetime
24+
25+
error[E0261]: use of undeclared lifetime name `'c`
26+
--> $DIR/issue-14303-path.rs:1:41
27+
|
28+
LL | fn bar<'a, T>(x: mymodule::X<'a, T, 'b, 'c>) {}
29+
| ^^ undeclared lifetime
30+
31+
error: aborting due to 5 previous errors
832

33+
Some errors occurred: E0261, E0433.
34+
For more information about an error, try `rustc --explain E0261`.

src/test/ui/traits/trait-object-vs-lifetime.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: lifetime parameters must be declared prior to type parameters
22
--> $DIR/trait-object-vs-lifetime.rs:16:25
33
|
44
LL | let _: S<'static +, 'static>;
5-
| ^^^^^^^
5+
| ^^^^^^^ must be declared prior to type parameters
66

77
error[E0224]: at least one non-builtin trait is required for an object type
88
--> $DIR/trait-object-vs-lifetime.rs:11:23

0 commit comments

Comments
 (0)