diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2018-11-10 03:39:42 +0100 |
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2018-11-10 03:39:42 +0100 |
| commit | 5e7b7f2ae6f29e66c99b6c38d7041fb71e8a36fd (patch) | |
| tree | 5ac6ed81913d24e8fdba9a039bf1c4ac5a56c978 /src | |
| parent | 36a50c29f6c5c386fba6ab685818755ac55152e5 (diff) | |
| download | rust-5e7b7f2ae6f29e66c99b6c38d7041fb71e8a36fd.tar.gz rust-5e7b7f2ae6f29e66c99b6c38d7041fb71e8a36fd.zip | |
make PhantomData #[structural_match].
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/lib.rs | 1 | ||||
| -rw-r--r-- | src/libcore/marker.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/rfc1445/phantom-data-is-structurally-matchable.rs | 53 |
3 files changed, 55 insertions, 0 deletions
diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 1bbc7892c6b..b55ec67b0cc 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -129,6 +129,7 @@ #![feature(const_transmute)] #![feature(reverse_bits)] #![feature(non_exhaustive)] +#![feature(structural_match)] #[prelude_import] #[allow(unused)] diff --git a/src/libcore/marker.rs b/src/libcore/marker.rs index 662a8ddd968..3bcdfabbb24 100644 --- a/src/libcore/marker.rs +++ b/src/libcore/marker.rs @@ -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>; diff --git a/src/test/ui/rfc1445/phantom-data-is-structurally-matchable.rs b/src/test/ui/rfc1445/phantom-data-is-structurally-matchable.rs new file mode 100644 index 00000000000..af025b9bbbf --- /dev/null +++ b/src/test/ui/rfc1445/phantom-data-is-structurally-matchable.rs @@ -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); +} |
