114 lines
3.2 KiB
Rust
114 lines
3.2 KiB
Rust
|
// This file tests the exhaustiveness algorithm on opaque constants. Most of the examples give
|
||
|
// unnecessary warnings because const_to_pat.rs converts a constant pattern to a wildcard when the
|
||
|
// constant is not allowed as a pattern. This is an edge case so we may not care to fix it.
|
||
|
// See also https://github.com/rust-lang/rust/issues/78057
|
||
|
|
||
|
#![deny(unreachable_patterns)]
|
||
|
|
||
|
#[derive(PartialEq)]
|
||
|
struct Foo(i32);
|
||
|
impl Eq for Foo {}
|
||
|
const FOO: Foo = Foo(42);
|
||
|
const FOO_REF: &Foo = &Foo(42);
|
||
|
const FOO_REF_REF: &&Foo = &&Foo(42);
|
||
|
|
||
|
#[derive(PartialEq)]
|
||
|
struct Bar;
|
||
|
impl Eq for Bar {}
|
||
|
const BAR: Bar = Bar;
|
||
|
|
||
|
#[derive(PartialEq)]
|
||
|
enum Baz {
|
||
|
Baz1,
|
||
|
Baz2
|
||
|
}
|
||
|
impl Eq for Baz {}
|
||
|
const BAZ: Baz = Baz::Baz1;
|
||
|
|
||
|
type Quux = fn(usize, usize) -> usize;
|
||
|
fn quux(a: usize, b: usize) -> usize { a + b }
|
||
|
const QUUX: Quux = quux;
|
||
|
|
||
|
fn main() {
|
||
|
match FOO {
|
||
|
FOO => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
_ => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match FOO_REF {
|
||
|
FOO_REF => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
Foo(_) => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
// FIXME: this causes an ICE (https://github.com/rust-lang/rust/issues/78071)
|
||
|
//match FOO_REF_REF {
|
||
|
// FOO_REF_REF => {}
|
||
|
// Foo(_) => {}
|
||
|
//}
|
||
|
|
||
|
match BAR {
|
||
|
Bar => {}
|
||
|
BAR => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
//~| ERROR unreachable pattern
|
||
|
_ => {}
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match BAR {
|
||
|
BAR => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
Bar => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
_ => {}
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match BAR {
|
||
|
BAR => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
BAR => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
//~| ERROR unreachable pattern
|
||
|
_ => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match BAZ {
|
||
|
BAZ => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
Baz::Baz1 => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
_ => {}
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match BAZ {
|
||
|
Baz::Baz1 => {}
|
||
|
BAZ => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
_ => {}
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match BAZ {
|
||
|
BAZ => {}
|
||
|
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
|
||
|
Baz::Baz2 => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
_ => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
}
|
||
|
|
||
|
match QUUX {
|
||
|
QUUX => {}
|
||
|
QUUX => {} // should not be emitting unreachable warning
|
||
|
//~^ ERROR unreachable pattern
|
||
|
_ => {}
|
||
|
}
|
||
|
}
|