| //@ 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<T> is structural-match even if T is not. |
| const CPD1: PhantomData<NotSM> = PhantomData; |
| match PhantomData { |
| CPD1 => count += 1, |
| }; |
| |
| // Check that PhantomData<T> is structural-match when T is. |
| const CPD2: PhantomData<SM> = 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<NotSM>, |
| beta: PhantomData<SM>, |
| } |
| |
| 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); |
| } |