2019-09-13 10:08:01 -05:00
|
|
|
// run-pass
|
|
|
|
|
|
|
|
// The actual regression test from #63479. (Including this because my
|
|
|
|
// first draft at fn-ptr-is-structurally-matchable.rs failed to actually
|
|
|
|
// cover the case this hit; I've since expanded it accordingly, but the
|
|
|
|
// experience left me wary of leaving this regression test out.)
|
|
|
|
|
2020-09-20 10:11:00 -05:00
|
|
|
#![warn(pointer_structural_match)]
|
|
|
|
|
2019-09-13 10:08:01 -05:00
|
|
|
#[derive(Eq)]
|
|
|
|
struct A {
|
|
|
|
a: i64
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PartialEq for A {
|
|
|
|
#[inline]
|
|
|
|
fn eq(&self, other: &Self) -> bool {
|
|
|
|
self.a.eq(&other.a)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type Fn = fn(&[A]);
|
|
|
|
|
|
|
|
fn my_fn(_args: &[A]) {
|
|
|
|
println!("hello world");
|
|
|
|
}
|
|
|
|
|
|
|
|
const TEST: Fn = my_fn;
|
2023-10-20 01:35:36 -05:00
|
|
|
const TEST2: (Fn, u8) = (TEST, 0);
|
2019-09-13 10:08:01 -05:00
|
|
|
|
|
|
|
struct B(Fn);
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let s = B(my_fn);
|
|
|
|
match s {
|
|
|
|
B(TEST) => println!("matched"),
|
2023-10-20 01:35:36 -05:00
|
|
|
//~^ WARN behave unpredictably
|
2020-09-20 10:11:00 -05:00
|
|
|
//~| WARN this was previously accepted by the compiler but is being phased out
|
2019-09-13 10:08:01 -05:00
|
|
|
_ => panic!("didn't match")
|
|
|
|
};
|
2023-10-20 01:35:36 -05:00
|
|
|
match (s.0, 0) {
|
|
|
|
TEST2 => println!("matched"),
|
|
|
|
//~^ WARN behave unpredictably
|
|
|
|
//~| WARN this was previously accepted by the compiler but is being phased out
|
|
|
|
_ => panic!("didn't match")
|
|
|
|
}
|
2019-09-13 10:08:01 -05:00
|
|
|
}
|