1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
// FIXME(effects): Replace `Add` with `std::ops::Add` once the latter a `#[const_trait]` again.
#![feature(const_trait_impl, effects)]
#[const_trait]
trait Add<Rhs = Self> {
type Output;
fn add(self, other: Rhs) -> Self::Output;
}
impl const Add for i32 {
type Output = Self;
fn add(self, other: Self) -> Self::Output {
self + other
}
}
struct NonConstAdd(i32);
impl Add for NonConstAdd {
type Output = Self;
fn add(self, rhs: Self) -> Self {
NonConstAdd(self.0.add(rhs.0))
}
}
#[const_trait]
trait Foo {
type Bar: ~const Add;
}
impl const Foo for NonConstAdd {
type Bar = NonConstAdd; //~ ERROR the trait bound `NonConstAdd: ~const Add` is not satisfied
}
#[const_trait]
trait Baz {
type Qux: Add;
}
impl const Baz for NonConstAdd {
type Qux = NonConstAdd; // OK
}
fn main() {}
|