Skip to content

Specialization does not find the default impl #38516

@dtolnay

Description

@dtolnay
#![feature(specialization)]

struct JsonSerializer;
struct CborSerializer;

fn main() {
    0i32.serialize(&mut CborSerializer);
}

trait Serialize<S: Serializer> {
    fn serialize(&self, _: &mut S);
}

trait Serializer {}
impl Serializer for JsonSerializer {}
impl Serializer for CborSerializer {}

impl<S: Serializer> Serialize<S> for i32 {
    default fn serialize(&self, _: &mut S) {
        println!("default");
    }
}

impl Serialize<JsonSerializer> for i32 {
    fn serialize(&self, _: &mut JsonSerializer) {
        println!("specialized");
    }
}

Expected:

Compiles and prints out "default". This is the behavior if you comment out the impl Serialize<JsonSerializer> for i32.

Actual:

rustc 1.15.0-nightly (71c06a56a 2016-12-18)
error[E0308]: mismatched types
 --> <anon>:7:20
  |
7 |     0i32.serialize(&mut CborSerializer);
  |                    ^^^^^^^^^^^^^^^^^^^ expected struct `JsonSerializer`, found struct `CborSerializer`
  |
  = note: expected type `&mut JsonSerializer`
  = note:    found type `&mut CborSerializer`

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-specializationArea: Trait impl specializationC-bugCategory: This is a bug.F-specialization`#![feature(specialization)]`

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions