Skip to content

Method resolution bug in presence of default trait implementations #23519

Closed
@petrochenkov

Description

@petrochenkov

The next program

#![feature(core)]
#![feature(optin_builtin_traits)]

// A trait implemented for non-references
trait NonRef: std::marker::MarkerTrait {}
impl NonRef for .. {}
impl<'a, T> !NonRef for &'a T {}
// impl NonRef for i32 {}
// impl<T> NonRef for S<T> {}

// A trait similar to PartialEq
trait PartialQe<R> {
    fn qe(&self, right: &R);
}

// Blanket impl for qe(Ref, Ref)
impl<'l, 'r, L, R> PartialQe<&'r R> for &'l L where L: PartialQe<R>
{
    fn qe(&self, right: &&'r R) {
        println!("Blanket impl: Ref, Ref");
        PartialQe::qe(*self, *right);
    }
}
// Blanket impl for qe(Ref, NonRef)
impl<'l, L, R: NonRef> PartialQe<R> for &'l L where L: PartialQe<R>
{
    fn qe(&self, right: &R) {
        println!("Blanket impl: Ref, NonRef");
        PartialQe::qe(*self, right);
    }
}

struct S<T>(T);

// Concrete impl for qe(S(a), S(b))
impl<L, R> PartialQe<S<R>> for S<L> where L: PartialQe<R> {
    fn qe(&self, right: &S<R>) {
        println!("Concrete impl for S: NonRef, NonRef");
        PartialQe::qe(&self.0, &right.0);
    }
}
// Concrete impl for qe(i32, i32)
impl PartialQe<i32> for i32 {
    fn qe(&self, _right: &i32) { println!("Concrete impl for i32: NonRef, NonRef") }
}

fn main() {
    let z = 0i32;
    PartialQe::qe(&&S(&z), &S(&z));
}

is supposed to compile and print

Blanket impl: Ref, NonRef
Concrete impl for S: NonRef, NonRef
Blanket impl: Ref, Ref
Concrete impl for i32: NonRef, NonRef

but it doesn't compile with an error

<anon>:42:5: 42:18 error: the trait `NonRef` is not implemented for the type `&i32` [E0277]

If I switch the comments in lines

impl NonRef for .. {}
impl<'a, T> !NonRef for &'a T {}
// impl NonRef for i32 {}
// impl<T> NonRef for S<T> {}

then everything works as expected.

cc @flaper87 @nikomatsakis

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-resolveArea: Name/path resolution done by `rustc_resolve` specifically

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions