diff options
| author | bors <bors@rust-lang.org> | 2022-09-10 09:50:21 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-10 09:50:21 +0000 |
| commit | 5197c96c49fc3b7de3ce9a31f7cc62d2cbd1f70c (patch) | |
| tree | f0dbcfb3f47bd0bf298f4804f50cd954dc781c5a /src | |
| parent | db9d86b58dff2a19d84d5e557641dfbb4cbb3a8d (diff) | |
| parent | f632dbe46fb0041c786450f7a3c37a1a5b7208a9 (diff) | |
| download | rust-5197c96c49fc3b7de3ce9a31f7cc62d2cbd1f70c.tar.gz rust-5197c96c49fc3b7de3ce9a31f7cc62d2cbd1f70c.zip | |
Auto merge of #101483 - oli-obk:guaranteed_opt, r=fee1-dead
The `<*const T>::guaranteed_*` methods now return an option for the unknown case cc https://github.com/rust-lang/rust/issues/53020#issuecomment-1236932443 I chose `0` for "not equal" and `1` for "equal" and left `2` for the unknown case so backends can just forward to raw pointer equality and it works ✨ r? `@fee1-dead` or `@lcnr` cc `@rust-lang/wg-const-eval`
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/consts/miri_unleashed/slice_eq.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/consts/ptr_comparisons.rs | 24 | ||||
| -rw-r--r-- | src/test/ui/consts/ptr_comparisons.stderr | 14 |
3 files changed, 19 insertions, 31 deletions
diff --git a/src/test/ui/consts/miri_unleashed/slice_eq.rs b/src/test/ui/consts/miri_unleashed/slice_eq.rs index fd843105daf..83e10bf1213 100644 --- a/src/test/ui/consts/miri_unleashed/slice_eq.rs +++ b/src/test/ui/consts/miri_unleashed/slice_eq.rs @@ -4,14 +4,10 @@ #![feature(const_raw_ptr_comparison)] const EMPTY_SLICE: &[i32] = &[]; -const EMPTY_EQ: bool = EMPTY_SLICE.as_ptr().guaranteed_eq(&[] as *const _); -const EMPTY_EQ2: bool = EMPTY_SLICE.as_ptr().guaranteed_ne(&[] as *const _); -const EMPTY_NE: bool = EMPTY_SLICE.as_ptr().guaranteed_ne(&[1] as *const _); -const EMPTY_NE2: bool = EMPTY_SLICE.as_ptr().guaranteed_eq(&[1] as *const _); +const EMPTY_EQ: Option<bool> = EMPTY_SLICE.as_ptr().guaranteed_eq(&[] as *const _); +const EMPTY_EQ2: Option<bool> = EMPTY_SLICE.as_ptr().guaranteed_eq(&[1] as *const _); fn main() { - assert!(!EMPTY_EQ); - assert!(!EMPTY_EQ2); - assert!(!EMPTY_NE); - assert!(!EMPTY_NE2); + assert!(EMPTY_EQ.is_none()); + assert!(EMPTY_EQ2.is_none()); } diff --git a/src/test/ui/consts/ptr_comparisons.rs b/src/test/ui/consts/ptr_comparisons.rs index 20233db09c9..0a3c2d4bedc 100644 --- a/src/test/ui/consts/ptr_comparisons.rs +++ b/src/test/ui/consts/ptr_comparisons.rs @@ -14,38 +14,30 @@ const FOO: &usize = &42; macro_rules! check { (eq, $a:expr, $b:expr) => { pub const _: () = - assert!(std::intrinsics::ptr_guaranteed_eq($a as *const u8, $b as *const u8)); + assert!(std::intrinsics::ptr_guaranteed_cmp($a as *const u8, $b as *const u8) == 1); }; (ne, $a:expr, $b:expr) => { pub const _: () = - assert!(std::intrinsics::ptr_guaranteed_ne($a as *const u8, $b as *const u8)); + assert!(std::intrinsics::ptr_guaranteed_cmp($a as *const u8, $b as *const u8) == 0); }; - (!eq, $a:expr, $b:expr) => { + (!, $a:expr, $b:expr) => { pub const _: () = - assert!(!std::intrinsics::ptr_guaranteed_eq($a as *const u8, $b as *const u8)); - }; - (!ne, $a:expr, $b:expr) => { - pub const _: () = - assert!(!std::intrinsics::ptr_guaranteed_ne($a as *const u8, $b as *const u8)); + assert!(std::intrinsics::ptr_guaranteed_cmp($a as *const u8, $b as *const u8) == 2); }; } check!(eq, 0, 0); check!(ne, 0, 1); -check!(!eq, 0, 1); -check!(!ne, 0, 0); check!(ne, FOO as *const _, 0); -check!(!eq, FOO as *const _, 0); +check!(ne, unsafe { (FOO as *const usize).offset(1) }, 0); +check!(ne, unsafe { (FOO as *const usize as *const u8).offset(3) }, 0); + // We want pointers to be equal to themselves, but aren't checking this yet because // there are some open questions (e.g. whether function pointers to the same function // compare equal, they don't necessarily at runtime). // The case tested here should work eventually, but does not work yet. -check!(!eq, FOO as *const _, FOO as *const _); -check!(ne, unsafe { (FOO as *const usize).offset(1) }, 0); -check!(!eq, unsafe { (FOO as *const usize).offset(1) }, 0); +check!(!, FOO as *const _, FOO as *const _); -check!(ne, unsafe { (FOO as *const usize as *const u8).offset(3) }, 0); -check!(!eq, unsafe { (FOO as *const usize as *const u8).offset(3) }, 0); /////////////////////////////////////////////////////////////////////////////// // If any of the below start compiling, make sure to add a `check` test for it. diff --git a/src/test/ui/consts/ptr_comparisons.stderr b/src/test/ui/consts/ptr_comparisons.stderr index 1d47f243f01..3de2aba5b05 100644 --- a/src/test/ui/consts/ptr_comparisons.stderr +++ b/src/test/ui/consts/ptr_comparisons.stderr @@ -7,19 +7,19 @@ LL | unsafe { intrinsics::offset(self, count) } | out-of-bounds pointer arithmetic: alloc3 has size $WORD, so pointer to $TWO_WORDS bytes starting at offset 0 is out-of-bounds | inside `ptr::const_ptr::<impl *const usize>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL | - ::: $DIR/ptr_comparisons.rs:58:34 + ::: $DIR/ptr_comparisons.rs:50:34 | LL | const _: *const usize = unsafe { (FOO as *const usize).offset(2) }; - | ------------------------------- inside `_` at $DIR/ptr_comparisons.rs:58:34 + | ------------------------------- inside `_` at $DIR/ptr_comparisons.rs:50:34 error[E0080]: evaluation of constant value failed - --> $DIR/ptr_comparisons.rs:61:33 + --> $DIR/ptr_comparisons.rs:53:33 | LL | unsafe { std::ptr::addr_of!((*(FOO as *const usize as *const [u8; 1000]))[999]) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: alloc3 has size $WORD, so pointer to 1000 bytes starting at offset 0 is out-of-bounds error: any use of this value will cause an error - --> $DIR/ptr_comparisons.rs:65:27 + --> $DIR/ptr_comparisons.rs:57:27 | LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 }; | -------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes @@ -31,7 +31,7 @@ LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + = help: the absolute address of a pointer is not known at compile-time, so such operations are not supported error: any use of this value will cause an error - --> $DIR/ptr_comparisons.rs:70:27 + --> $DIR/ptr_comparisons.rs:62:27 | LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 }; | -------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes @@ -46,7 +46,7 @@ error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0080`. Future incompatibility report: Future breakage diagnostic: error: any use of this value will cause an error - --> $DIR/ptr_comparisons.rs:65:27 + --> $DIR/ptr_comparisons.rs:57:27 | LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 }; | -------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes @@ -59,7 +59,7 @@ LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + Future breakage diagnostic: error: any use of this value will cause an error - --> $DIR/ptr_comparisons.rs:70:27 + --> $DIR/ptr_comparisons.rs:62:27 | LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 }; | -------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes |
