Skip to content

Commit

Permalink
make PhantomData #[structural_match].
Browse files Browse the repository at this point in the history
  • Loading branch information
Centril committed Nov 10, 2018
1 parent 36a50c2 commit 5e7b7f2
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/libcore/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
#![feature(const_transmute)]
#![feature(reverse_bits)]
#![feature(non_exhaustive)]
#![feature(structural_match)]

#[prelude_import]
#[allow(unused)]
Expand Down
1 change: 1 addition & 0 deletions src/libcore/marker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>;

Expand Down
53 changes: 53 additions & 0 deletions src/test/ui/rfc1445/phantom-data-is-structurally-matchable.rs
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 5e7b7f2

Please sign in to comment.