Do not lower generic lifetime params when AST resolution emitted an error.

This commit is contained in:
Camille GILLOT 2022-05-27 11:29:18 +02:00
parent a265c49b25
commit c75409d5e4
4 changed files with 18 additions and 24 deletions

View File

@ -1917,9 +1917,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
fn lower_generic_param(&mut self, param: &GenericParam) -> hir::GenericParam<'hir> {
let (name, kind) = match param.kind {
GenericParamKind::Lifetime => {
let param_name = if param.ident.name == kw::StaticLifetime
|| param.ident.name == kw::UnderscoreLifetime
{
// AST resolution emitted an error on those parameters, so we lower them using
// `ParamName::Error`.
let param_name =
if let Some(LifetimeRes::Error) = self.resolver.get_lifetime_res(param.id) {
ParamName::Error
} else {
let ident = self.lower_ident(param.ident);
@ -1949,10 +1950,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
)
}
};
let name = match name {
hir::ParamName::Plain(ident) => hir::ParamName::Plain(self.lower_ident(ident)),
name => name,
};
let hir_id = self.lower_node_id(param.id);
self.lower_attrs(hir_id, &param.attrs);

View File

@ -1939,6 +1939,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
param.ident,
orig_is_param,
);
// Record lifetime res, so lowering knows there is something fishy.
self.record_lifetime_res(param.id, LifetimeRes::Error);
continue;
}
Entry::Vacant(entry) => {
entry.insert(true);
@ -1966,6 +1969,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
)
.span_label(param.ident.span, "`'_` is a reserved lifetime name")
.emit();
// Record lifetime res, so lowering knows there is something fishy.
self.record_lifetime_res(param.id, LifetimeRes::Error);
continue;
}
@ -1979,6 +1984,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
)
.span_label(param.ident.span, "'static is a reserved lifetime name")
.emit();
// Record lifetime res, so lowering knows there is something fishy.
self.record_lifetime_res(param.id, LifetimeRes::Error);
continue;
}

View File

@ -1,6 +1,5 @@
struct Foo<'a, 'a> {
//~^ ERROR lifetime name `'a` declared twice
//~| ERROR parameter `'a` is never used [E0392]
x: &'a isize,
}

View File

@ -6,15 +6,6 @@ LL | struct Foo<'a, 'a> {
| |
| first declared here
error[E0392]: parameter `'a` is never used
--> $DIR/regions-name-duplicated.rs:1:12
|
LL | struct Foo<'a, 'a> {
| ^^ unused parameter
|
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
error: aborting due to previous error
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0263, E0392.
For more information about an error, try `rustc --explain E0263`.
For more information about this error, try `rustc --explain E0263`.