Skip to content

Commit c75409d

Browse files
committed
Do not lower generic lifetime params when AST resolution emitted an error.
1 parent a265c49 commit c75409d

File tree

4 files changed

+18
-24
lines changed

4 files changed

+18
-24
lines changed

compiler/rustc_ast_lowering/src/lib.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -1917,14 +1917,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19171917
fn lower_generic_param(&mut self, param: &GenericParam) -> hir::GenericParam<'hir> {
19181918
let (name, kind) = match param.kind {
19191919
GenericParamKind::Lifetime => {
1920-
let param_name = if param.ident.name == kw::StaticLifetime
1921-
|| param.ident.name == kw::UnderscoreLifetime
1922-
{
1923-
ParamName::Error
1924-
} else {
1925-
let ident = self.lower_ident(param.ident);
1926-
ParamName::Plain(ident)
1927-
};
1920+
// AST resolution emitted an error on those parameters, so we lower them using
1921+
// `ParamName::Error`.
1922+
let param_name =
1923+
if let Some(LifetimeRes::Error) = self.resolver.get_lifetime_res(param.id) {
1924+
ParamName::Error
1925+
} else {
1926+
let ident = self.lower_ident(param.ident);
1927+
ParamName::Plain(ident)
1928+
};
19281929
let kind =
19291930
hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
19301931

@@ -1949,10 +1950,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19491950
)
19501951
}
19511952
};
1952-
let name = match name {
1953-
hir::ParamName::Plain(ident) => hir::ParamName::Plain(self.lower_ident(ident)),
1954-
name => name,
1955-
};
19561953

19571954
let hir_id = self.lower_node_id(param.id);
19581955
self.lower_attrs(hir_id, &param.attrs);

compiler/rustc_resolve/src/late.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1939,6 +1939,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
19391939
param.ident,
19401940
orig_is_param,
19411941
);
1942+
// Record lifetime res, so lowering knows there is something fishy.
1943+
self.record_lifetime_res(param.id, LifetimeRes::Error);
1944+
continue;
19421945
}
19431946
Entry::Vacant(entry) => {
19441947
entry.insert(true);
@@ -1966,6 +1969,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
19661969
)
19671970
.span_label(param.ident.span, "`'_` is a reserved lifetime name")
19681971
.emit();
1972+
// Record lifetime res, so lowering knows there is something fishy.
1973+
self.record_lifetime_res(param.id, LifetimeRes::Error);
19691974
continue;
19701975
}
19711976

@@ -1979,6 +1984,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
19791984
)
19801985
.span_label(param.ident.span, "'static is a reserved lifetime name")
19811986
.emit();
1987+
// Record lifetime res, so lowering knows there is something fishy.
1988+
self.record_lifetime_res(param.id, LifetimeRes::Error);
19821989
continue;
19831990
}
19841991

src/test/ui/regions/regions-name-duplicated.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
struct Foo<'a, 'a> {
22
//~^ ERROR lifetime name `'a` declared twice
3-
//~| ERROR parameter `'a` is never used [E0392]
43
x: &'a isize,
54
}
65

src/test/ui/regions/regions-name-duplicated.stderr

+2-11
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,6 @@ LL | struct Foo<'a, 'a> {
66
| |
77
| first declared here
88

9-
error[E0392]: parameter `'a` is never used
10-
--> $DIR/regions-name-duplicated.rs:1:12
11-
|
12-
LL | struct Foo<'a, 'a> {
13-
| ^^ unused parameter
14-
|
15-
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
16-
17-
error: aborting due to 2 previous errors
9+
error: aborting due to previous error
1810

19-
Some errors have detailed explanations: E0263, E0392.
20-
For more information about an error, try `rustc --explain E0263`.
11+
For more information about this error, try `rustc --explain E0263`.

0 commit comments

Comments
 (0)