rust/tests/ui/associated-types/defaults-in-other-trait-ite...

62 lines
1.7 KiB
Rust

#![feature(associated_type_defaults)]
// Associated type defaults may not be assumed inside the trait defining them.
// ie. they only resolve to `<Self as Tr>::A`, not the actual type `()`
trait Tr {
type A = (); //~ NOTE associated type defaults can't be assumed inside the trait defining them
fn f(p: Self::A) {
let () = p;
//~^ ERROR mismatched types
//~| NOTE expected associated type, found `()`
//~| NOTE expected associated type `<Self as Tr>::A`
//~| NOTE this expression has type `<Self as Tr>::A`
}
}
// An impl that doesn't override the type *can* assume the default.
impl Tr for () {
fn f(p: Self::A) {
let () = p;
}
}
impl Tr for u8 {
type A = ();
fn f(p: Self::A) {
let () = p;
}
}
trait AssocConst {
type Ty = u8; //~ NOTE associated type defaults can't be assumed inside the trait defining them
// Assoc. consts also cannot assume that default types hold
const C: Self::Ty = 0u8;
//~^ ERROR mismatched types
//~| NOTE expected associated type, found `u8`
//~| NOTE expected associated type `<Self as AssocConst>::Ty`
}
// An impl can, however
impl AssocConst for () {
const C: Self::Ty = 0u8;
}
pub trait Trait {
type Res = isize; //~ NOTE associated type defaults can't be assumed inside the trait defining them
fn infer_me_correctly() -> Self::Res {
//~^ NOTE expected `<Self as Trait>::Res` because of return type
// {integer} == isize
2
//~^ ERROR mismatched types
//~| NOTE expected associated type, found integer
//~| NOTE expected associated type `<Self as Trait>::Res`
}
}
fn main() {}