Closed
Description
Playground link (compiles): https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=70ffd01d215fbd49e02bc06970779e2b
Error in rust-analyzer:
expected &HandleScope<'static, u32>, found &CallbackScope<'static, {unknown}>"
This was working previously and seems to have broken recently. It appears that a compilation of:
- Lifetime generics
- Generics with defaults, and
- Multiple Deref paths
contribute to a spurious E0308
error that appears in rust-analyzer
but not in rust itself, nor any other tools that compile Rust.
This code was reduced from errors appearing in rusty_v8
:
use std::{marker::PhantomData, ops::Deref};
#[derive(Default)]
pub struct HandleScope<'s, C = u32> { _p: Option<&'s PhantomData<C>> }
#[derive(Default)]
pub struct CallbackScope<'s, C = u32> {
_p: Option<&'s PhantomData<C>>
}
impl <'s> CallbackScope<'s> {
pub fn new() -> CallbackScope<'s> {
Self::default()
}
}
impl <'s> Deref for CallbackScope<'s> {
type Target = HandleScope<'s>;
fn deref(&self) -> &Self::Target {
unsafe { std::mem::transmute(self) }
}
}
impl <'s> Deref for CallbackScope<'s, ()> {
type Target = HandleScope<'s, ()>;
fn deref(&self) -> &Self::Target {
unsafe { std::mem::transmute(self) }
}
}
fn y(_: &HandleScope) {}
#[test]
pub fn test_deref() {
let scope = &CallbackScope::new();
y(scope);
// "expected &HandleScope<'static, u32>, found &CallbackScope<'static, {unknown}>"
}