//@ compile-flags: -Znext-solver //@ known-bug: #110395 // Broken until we have `const PartialEq` impl in stdlib #![allow(incomplete_features)] #![feature(const_trait_impl, const_cmp, const_destruct)] use std::marker::Destruct; const fn cmp(a: &impl ~const PartialEq) -> bool { a == a } const fn wrap( x: impl ~const PartialEq + ~const Destruct, ) -> impl ~const PartialEq + ~const Destruct { x } #[const_trait] trait Foo { fn huh() -> impl ~const PartialEq + ~const Destruct + Copy; } impl const Foo for () { fn huh() -> impl ~const PartialEq + ~const Destruct + Copy { 123 } } const _: () = { assert!(cmp(&0xDEADBEEFu32)); assert!(cmp(&())); assert!(wrap(123) == wrap(123)); assert!(wrap(123) != wrap(456)); let x = <() as Foo>::huh(); assert!(x == x); }; #[const_trait] trait T {} struct S; impl const T for S {} const fn rpit() -> impl ~const T { S } const fn apit(_: impl ~const T + ~const Destruct) {} const fn rpit_assoc_bound() -> impl IntoIterator { Some(S) } const fn apit_assoc_bound(_: impl IntoIterator + ~const Destruct) {} fn main() {}