// run-pass // This file checks that `PhantomData` is considered structurally matchable. use std::marker::PhantomData; fn main() { let mut count = 0; // A type which is not structurally matchable: struct NotSM; // And one that is: #[derive(PartialEq, Eq)] struct SM; // Check that SM is structural-match: const CSM: SM = SM; match SM { CSM => count += 1, }; // Check that PhantomData is structural-match even if T is not. const CPD1: PhantomData = PhantomData; match PhantomData { CPD1 => count += 1, }; // Check that PhantomData is structural-match when T is. const CPD2: PhantomData = PhantomData; match PhantomData { CPD2 => count += 1, }; // Check that a type which has a PhantomData is structural-match. #[derive(PartialEq, Eq, Default)] struct Foo { alpha: PhantomData, beta: PhantomData, } const CFOO: Foo = Foo { alpha: PhantomData, beta: PhantomData, }; match Foo::default() { CFOO => count += 1, }; // Final count must be 4 now if all assert_eq!(count, 4); }