Skip to content

Regression: multiple deref implementations cause E0308 #17075

Closed
@mmastrac

Description

@mmastrac

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}>"
}

Metadata

Metadata

Assignees

Labels

A-tytype system / type inference / traits / method resolutionC-bugCategory: bug

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions