rust-spec 0.5.2

Classification of types in accordance with the Rust specification
Documentation
#![allow(dead_code)]

use rust_spec::{RustSpec, drop::{CustomDrop, NoDrop, AutoDrop}};
use static_assertions::assert_impl_all;

#[derive(RustSpec)]
#[rust_spec(custom_drop)]
struct Generic<T: RustSpec>(T);

impl<T: RustSpec> Drop for Generic<T> {
    fn drop(&mut self) {}
}

#[derive(RustSpec)]
#[rust_spec(custom_drop)]
#[repr(transparent)]
struct Transparent(u8);

impl Drop for Transparent {
    fn drop(&mut self) {}
}

#[derive(RustSpec)]
#[rust_spec(custom_drop)]
#[repr(C)]
enum DataEnum {
    Value(u8),
}

impl Drop for DataEnum {
    fn drop(&mut self) {}
}

#[derive(RustSpec)]
#[rust_spec(custom_drop)]
#[repr(u8)]
enum FieldlessEnum {
    Value,
}

impl Drop for FieldlessEnum {
    fn drop(&mut self) {}
}

#[derive(RustSpec)]
#[rust_spec(custom_drop)]
union ValueUnion {
    value: u8,
}

impl Drop for ValueUnion {
    fn drop(&mut self) {}
}

fn main() {
    assert_impl_all!(Generic<u8>: RustSpec<Drop = CustomDrop<NoDrop>>);
    assert_impl_all!(Generic<Transparent>: RustSpec<Drop = CustomDrop<AutoDrop>>);
    assert_impl_all!(Transparent: RustSpec<Drop = CustomDrop<NoDrop>>);
    assert_impl_all!(DataEnum: RustSpec<Drop = CustomDrop<NoDrop>>);
    assert_impl_all!(FieldlessEnum: RustSpec<Drop = CustomDrop<NoDrop>>);
    assert_impl_all!(ValueUnion: RustSpec<Drop = CustomDrop<NoDrop>>);
}