mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 06:11:35 +00:00
fix: Wrong BoundVar index when lowering impl trait parameter of parent generics
This commit is contained in:
parent
07659783fd
commit
d7431ecdfa
2 changed files with 50 additions and 18 deletions
|
@ -377,26 +377,25 @@ impl<'a> TyLoweringContext<'a> {
|
|||
// Count the number of `impl Trait` things that appear within our bounds.
|
||||
// Since t hose have been emitted as implicit type args already.
|
||||
counter.set(idx + count_impl_traits(type_ref) as u16);
|
||||
let (
|
||||
_parent_params,
|
||||
self_param,
|
||||
type_params,
|
||||
const_params,
|
||||
_impl_trait_params,
|
||||
lifetime_params,
|
||||
) = self
|
||||
let kind = self
|
||||
.generics()
|
||||
.expect("variable impl trait lowering must be in a generic def")
|
||||
.provenance_split();
|
||||
TyKind::BoundVar(BoundVar::new(
|
||||
self.in_binders,
|
||||
idx as usize
|
||||
+ self_param as usize
|
||||
+ type_params
|
||||
+ const_params
|
||||
+ lifetime_params,
|
||||
))
|
||||
.intern(Interner)
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(i, (id, data))| match (id, data) {
|
||||
(
|
||||
GenericParamId::TypeParamId(_),
|
||||
GenericParamDataRef::TypeParamData(data),
|
||||
) if data.provenance == TypeParamProvenance::ArgumentImplTrait => {
|
||||
Some(i)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
.nth(idx as usize)
|
||||
.map_or(TyKind::Error, |id| {
|
||||
TyKind::BoundVar(BoundVar { debruijn: self.in_binders, index: id })
|
||||
});
|
||||
kind.intern(Interner)
|
||||
}
|
||||
ImplTraitLoweringState::Disallowed => {
|
||||
// FIXME: report error
|
||||
|
|
|
@ -2162,3 +2162,36 @@ fn main() {
|
|||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn issue_17711() {
|
||||
check_infer(
|
||||
r#"
|
||||
//- minicore: deref
|
||||
use core::ops::Deref;
|
||||
|
||||
struct Struct<'a, T>(&'a T);
|
||||
|
||||
trait Trait {}
|
||||
|
||||
impl<'a, T: Deref<Target = impl Trait>> Struct<'a, T> {
|
||||
fn foo(&self) -> &Self { self }
|
||||
|
||||
fn bar(&self) {
|
||||
let _ = self.foo();
|
||||
}
|
||||
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
137..141 'self': &'? Struct<'a, T>
|
||||
152..160 '{ self }': &'? Struct<'a, T>
|
||||
154..158 'self': &'? Struct<'a, T>
|
||||
174..178 'self': &'? Struct<'a, T>
|
||||
180..215 '{ ... }': ()
|
||||
194..195 '_': &'? Struct<'?, T>
|
||||
198..202 'self': &'? Struct<'a, T>
|
||||
198..208 'self.foo()': &'? Struct<'?, T>
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue