Specialization does not find the default impl

16a1969
Opened by David Tolnay at 2024-04-19 14:16:48
#![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`
  1. #![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`
    

    David Tolnay at 2019-10-28 15:28:20

  2. triage: no change

    Maayan Hanin at 2022-10-17 18:55:54