Skip to content

Commit

Permalink
const-in-pattern: test that the PartialEq impl does not need to be const
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Jan 3, 2025
1 parent c528b8c commit d8e53a6
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions tests/ui/traits/const-traits/pattern-custom-partial-eq
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//! Ensure that a `const fn` can match on constants of a type that is `PartialEq`
//! but not `const PartialEq`.
#![feature(const_trait_impl)]

#[derive(Eq, PartialEq)]
pub struct Y(u8);
pub const GREEN: Y = Y(4);
pub const fn is_green(x: Y) -> bool {
match x { GREEN => true, _ => false }
}

struct CustomEq;

impl Eq for CustomEq {}
impl PartialEq for CustomEq {
fn eq(&self, _: &Self) -> bool {
false
}
}

#[derive(PartialEq, Eq)]
#[allow(unused)]
enum Foo {
Bar,
Baz,
Qux(CustomEq),
}

const BAR_BAZ: Foo = if 42 == 42 {
Foo::Bar
} else {
Foo::Qux(CustomEq) // dead arm
};

const EMPTY: &[CustomEq] = &[];

const fn test() {
// BAR_BAZ itself is fine but the enum has other variants
// that are non-structural. Still, this should be accepted.
match Foo::Qux(CustomEq) {
BAR_BAZ => panic!(),
_ => {}
}

// Similarly, an empty slice of a type that is non-structural
// is accepted.
match &[CustomEq] as &[CustomEq] {
EMPTY => panic!(),
_ => {},
}
}

fn main() {}

0 comments on commit d8e53a6

Please sign in to comment.