Skip to content

Commit

Permalink
Rollup merge of rust-lang#55837 - Centril:spökdata-skall-vara-struktu…
Browse files Browse the repository at this point in the history
…rellt-matchbar, r=eddyb

Make PhantomData #[structural_match]

fixes rust-lang#55028

This makes `PhantomData<T>` structurally matchable, irrespective of whether `T` is, per the discussion on this week's language team meeting (the general consensus was that this was a bug-fix).

All types containing `PhantomData<T>` and which used `#[derive(PartialEq, Eq)]` and were previously not `#[structural_match]` only because of `PhantomData<T>` will now be `#[structural_match]`.

r? @nikomatsakis
  • Loading branch information
kennytm committed Nov 13, 2018
2 parents 98bc7d6 + 5e7b7f2 commit f73df10
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 @@ -128,6 +128,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 f73df10

Please sign in to comment.