| //@ check-pass | |
| //@ compile-flags: -Znext-solver | |
| #![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 Foo { | |
| fn huh() -> impl [const] PartialEq + [const] Destruct + Copy; | |
| } | |
| const impl 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 T {} | |
| struct S; | |
| const impl 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<Item: [const] T> { | |
| Some(S) | |
| } | |
| const fn apit_assoc_bound(_: impl IntoIterator<Item: [const] T> + [const] Destruct) {} | |
| fn main() {} |