#![cfg(test)]
macro_rules! assert_impls {
($name:ident [$($input:tt)*] => $($($segment:ident)::*),*) => {
mod $name {
#[derive_aliases::derive($($input)*)]
pub struct A(());
}
#[allow(warnings, reason = "only for type check")]
fn $name<A: $($($segment)::* +)* Sized>() {
$name::<$name::A>();
}
};
}
pub mod derive_alias {
mod foo {
derive_aliases::define! {
#![export_derive_aliases]
Eq = ::core::cmp::Eq, ::core::cmp::PartialEq;
AndMore = ::std::hash::Hash, ..Ord, ::core::clone::Clone, ::core::marker::Copy, ::core::default::Default;
}
}
mod bar {
derive_aliases::define! {
Ord = ::core::cmp::PartialOrd, ::core::cmp::Ord, ..Eq;
Everything = ::std::hash::Hash, ..Ord, ..Eq, ::core::marker::Copy, ::core::clone::Clone, ::core::default::Default;
}
}
pub(crate) use bar::{Everything, Ord};
pub use foo::*;
}
assert_impls!(a [Clone] => Clone);
assert_impls!(b [..Eq] => Eq, PartialEq);
assert_impls!(c [..AndMore] => PartialOrd, Ord, PartialEq, Eq, Copy, Clone, Default, std::hash::Hash);
assert_impls!(d [..Ord] => PartialOrd, Ord, PartialEq, Eq);
assert_impls!(e [..Everything] => std::hash::Hash, PartialOrd, Ord, Eq, PartialEq, Copy, Clone, Default);
assert_impls!(f [..Eq, Clone] => Eq, PartialEq, Clone);
assert_impls!(g [Clone, ..Eq] => Eq, PartialEq, Clone);
assert_impls!(h [Clone, ..Eq, Copy] => Eq, PartialEq, Clone, Copy);
assert_impls!(i [..Eq, Clone, Copy] => Eq, PartialEq, Clone, Copy);
assert_impls!(j [Clone, Copy, ..Eq] => Eq, PartialEq, Clone, Copy);
assert_impls!(m [..Eq, ..Eq] => Eq, PartialEq);
#[test]
fn ui() {
let harness = trybuild::TestCases::new();
harness.compile_fail("tests/ui/*.rs");
}