make PhantomData #[structural_match].

This commit is contained in:
Mazdak Farrokhzad 2018-11-10 03:39:42 +01:00
parent 36a50c29f6
commit 5e7b7f2ae6
3 changed files with 55 additions and 0 deletions

View File

@ -129,6 +129,7 @@
#![feature(const_transmute)]
#![feature(reverse_bits)]
#![feature(non_exhaustive)]
#![feature(structural_match)]
#[prelude_import]
#[allow(unused)]

View File

@ -578,6 +578,7 @@ macro_rules! impls{
///
/// [drop check]: ../../nomicon/dropck.html
#[lang = "phantom_data"]
#[structural_match]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct PhantomData<T:?Sized>;

View File

@ -0,0 +1,53 @@
// 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);
}