Skip to content

Commit 7da6fd1

Browse files
committed
Lower extra lifetimes before normal generic params.
1 parent 313dff1 commit 7da6fd1

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -856,25 +856,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
856856
/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
857857
/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
858858
/// parameters will be successful.
859-
#[instrument(level = "debug", skip(self))]
859+
#[instrument(level = "debug", skip(self), ret)]
860860
#[inline]
861861
fn lower_lifetime_binder(
862862
&mut self,
863863
binder: NodeId,
864864
generic_params: &[GenericParam],
865865
) -> &'hir [hir::GenericParam<'hir>] {
866-
let mut generic_params: Vec<_> = self
867-
.lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder)
868-
.collect();
866+
// Start by creating params for extra lifetimes params, as this creates the definitions
867+
// that may be referred to by the AST inside `generic_params`.
869868
let extra_lifetimes = self.resolver.extra_lifetime_params(binder);
870869
debug!(?extra_lifetimes);
871-
generic_params.extend(extra_lifetimes.into_iter().filter_map(|(ident, node_id, res)| {
872-
self.lifetime_res_to_generic_param(ident, node_id, res, hir::GenericParamSource::Binder)
873-
}));
874-
let generic_params = self.arena.alloc_from_iter(generic_params);
875-
debug!(?generic_params);
876-
877-
generic_params
870+
let extra_lifetimes: Vec<_> = extra_lifetimes
871+
.into_iter()
872+
.filter_map(|(ident, node_id, res)| {
873+
self.lifetime_res_to_generic_param(
874+
ident,
875+
node_id,
876+
res,
877+
hir::GenericParamSource::Binder,
878+
)
879+
})
880+
.collect();
881+
let arena = self.arena;
882+
let explicit_generic_params =
883+
self.lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder);
884+
arena.alloc_from_iter(explicit_generic_params.chain(extra_lifetimes.into_iter()))
878885
}
879886

880887
fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
error[E0412]: cannot find type `c` in this scope
2+
--> $DIR/elided-lifetime-in-const-param-type.rs:8:27
3+
|
4+
LL | type A = dyn for<const B: c(&())> D;
5+
| ^ not found in this scope
6+
7+
error[E0658]: only lifetime parameters can be used in this context
8+
--> $DIR/elided-lifetime-in-const-param-type.rs:8:24
9+
|
10+
LL | type A = dyn for<const B: c(&())> D;
11+
| ^
12+
|
13+
= note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
14+
= help: add `#![feature(non_lifetime_binders)]` to the crate attributes to enable
15+
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
16+
17+
error: aborting due to 2 previous errors
18+
19+
Some errors have detailed explanations: E0412, E0658.
20+
For more information about an error, try `rustc --explain E0412`.

0 commit comments

Comments
 (0)