Rollup merge of #107580 - lenko-d:default_value_for_a_lifetime_generic_parameter_produces_confusing_diagnostic, r=compiler-errors
Recover from lifetimes with default lifetimes in generic args Fixes [#107492](https://github.com/rust-lang/rust/issues/107492)
This commit is contained in:
commit
8ddbfadda0
5 changed files with 41 additions and 1 deletions
|
@ -475,6 +475,9 @@ parse_unexpected_token_after_struct_name_found_other = expected `where`, `{"{"}`
|
||||||
parse_unexpected_self_in_generic_parameters = unexpected keyword `Self` in generic parameters
|
parse_unexpected_self_in_generic_parameters = unexpected keyword `Self` in generic parameters
|
||||||
.note = you cannot use `Self` as a generic parameter because it is reserved for associated items
|
.note = you cannot use `Self` as a generic parameter because it is reserved for associated items
|
||||||
|
|
||||||
|
parse_unexpected_default_value_for_lifetime_in_generic_parameters = unexpected default lifetime parameter
|
||||||
|
.label = lifetime parameters cannot have default values
|
||||||
|
|
||||||
parse_multiple_where_clauses = cannot define duplicate `where` clauses on an item
|
parse_multiple_where_clauses = cannot define duplicate `where` clauses on an item
|
||||||
.label = previous `where` clause starts here
|
.label = previous `where` clause starts here
|
||||||
.suggestion = consider joining the two `where` clauses into one
|
.suggestion = consider joining the two `where` clauses into one
|
||||||
|
|
|
@ -1601,6 +1601,14 @@ pub(crate) struct UnexpectedSelfInGenericParameters {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parse_unexpected_default_value_for_lifetime_in_generic_parameters)]
|
||||||
|
pub(crate) struct UnexpectedDefaultValueForLifetimeInGenericParameters {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parse_multiple_where_clauses)]
|
#[diag(parse_multiple_where_clauses)]
|
||||||
pub(crate) struct MultipleWhereClauses {
|
pub(crate) struct MultipleWhereClauses {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::errors::{
|
use crate::errors::{
|
||||||
MultipleWhereClauses, UnexpectedSelfInGenericParameters, WhereClauseBeforeTupleStructBody,
|
MultipleWhereClauses, UnexpectedDefaultValueForLifetimeInGenericParameters,
|
||||||
|
UnexpectedSelfInGenericParameters, WhereClauseBeforeTupleStructBody,
|
||||||
WhereClauseBeforeTupleStructBodySugg,
|
WhereClauseBeforeTupleStructBodySugg,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -145,6 +146,20 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
(None, Vec::new())
|
(None, Vec::new())
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if this.check_noexpect(&token::Eq)
|
||||||
|
&& this.look_ahead(1, |t| t.is_lifetime())
|
||||||
|
{
|
||||||
|
let lo = this.token.span;
|
||||||
|
// Parse `= 'lifetime`.
|
||||||
|
this.bump(); // `=`
|
||||||
|
this.bump(); // `'lifetime`
|
||||||
|
let span = lo.to(this.prev_token.span);
|
||||||
|
this.sess.emit_err(
|
||||||
|
UnexpectedDefaultValueForLifetimeInGenericParameters { span },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Some(ast::GenericParam {
|
Some(ast::GenericParam {
|
||||||
ident: lifetime.ident,
|
ident: lifetime.ident,
|
||||||
id: lifetime.id,
|
id: lifetime.id,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
pub struct DefaultLifetime<'a, 'b = 'static> {
|
||||||
|
//~^ ERROR unexpected default lifetime parameter
|
||||||
|
_marker: std::marker::PhantomData<&'a &'b ()>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main(){}
|
|
@ -0,0 +1,8 @@
|
||||||
|
error: unexpected default lifetime parameter
|
||||||
|
--> $DIR/issue-107492-default-value-for-lifetime.rs:1:35
|
||||||
|
|
|
||||||
|
LL | pub struct DefaultLifetime<'a, 'b = 'static> {
|
||||||
|
| ^^^^^^^^^ lifetime parameters cannot have default values
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue