diff options
| author | Kivooeo <Kivooeo123@gmail.com> | 2025-07-01 00:43:31 +0500 | 
|---|---|---|
| committer | Kivooeo <Kivooeo123@gmail.com> | 2025-07-05 01:25:48 +0500 | 
| commit | 62ada473281d86e9a7e19d2fe375171874f83cab (patch) | |
| tree | 6ccf6ea307ad104848352ff83a9d46c7f6c712d6 /tests/ui/layout/null-pointer-optimization.rs | |
| parent | 9ad98f78d4485f6f7f9615c1961bb75b281bfceb (diff) | |
| download | rust-62ada473281d86e9a7e19d2fe375171874f83cab.tar.gz rust-62ada473281d86e9a7e19d2fe375171874f83cab.zip | |
cleaned up some tests
Diffstat (limited to 'tests/ui/layout/null-pointer-optimization.rs')
| -rw-r--r-- | tests/ui/layout/null-pointer-optimization.rs | 44 | 
1 files changed, 24 insertions, 20 deletions
| diff --git a/tests/ui/layout/null-pointer-optimization.rs b/tests/ui/layout/null-pointer-optimization.rs index 1b73164c9fc..5e77c8d22ab 100644 --- a/tests/ui/layout/null-pointer-optimization.rs +++ b/tests/ui/layout/null-pointer-optimization.rs @@ -1,27 +1,34 @@ -//@ run-pass +//! null pointer optimization with iota-reduction for enums. +//! +//! Iota-reduction is a rule from the Calculus of (Co-)Inductive Constructions: +//! "a destructor applied to an object built from a constructor behaves as expected". +//! See <https://coq.inria.fr/doc/language/core/conversion.html#iota-reduction>. +//! +//! This test verifies that null pointer optimization works correctly for both +//! Option<T> and custom enums, accounting for pointers and regions. -// Iota-reduction is a rule in the Calculus of (Co-)Inductive Constructions, -// which "says that a destructor applied to an object built from a constructor -// behaves as expected". -- https://coq.inria.fr/doc/language/core/conversion.html#iota-reduction -// -// It's a little more complicated here, because of pointers and regions and -// trying to get assert failure messages that at least identify which case -// failed. +//@ run-pass #![allow(unpredictable_function_pointer_comparisons)] -enum E<T> { Thing(isize, T), #[allow(dead_code)] Nothing((), ((), ()), [i8; 0]) } +enum E<T> { + Thing(isize, T), + #[allow(dead_code)] + Nothing((), ((), ()), [i8; 0]), +} + impl<T> E<T> { fn is_none(&self) -> bool { match *self { E::Thing(..) => false, - E::Nothing(..) => true + E::Nothing(..) => true, } } + fn get_ref(&self) -> (isize, &T) { match *self { - E::Nothing(..) => panic!("E::get_ref(Nothing::<{}>)", stringify!(T)), - E::Thing(x, ref y) => (x, y) + E::Nothing(..) => panic!("E::get_ref(Nothing::<{}>)", stringify!(T)), + E::Thing(x, ref y) => (x, y), } } } @@ -36,7 +43,7 @@ macro_rules! check_option { let s_ = Some::<$T>(e); let $v = s_.as_ref().unwrap(); $chk - }} + }}; } macro_rules! check_fancy { @@ -48,11 +55,10 @@ macro_rules! check_fancy { let e = $e; let t_ = E::Thing::<$T>(23, e); match t_.get_ref() { - (23, $v) => { $chk } - _ => panic!("Thing::<{}>(23, {}).get_ref() != (23, _)", - stringify!($T), stringify!($e)) + (23, $v) => $chk, + _ => panic!("Thing::<{}>(23, {}).get_ref() != (23, _)", stringify!($T), stringify!($e)), } - }} + }}; } macro_rules! check_type { @@ -67,7 +73,5 @@ pub fn main() { check_type!(Box::new(18), Box<isize>); check_type!("foo".to_string(), String); check_type!(vec![20, 22], Vec<isize>); - check_type!(main, fn(), |pthing| { - assert_eq!(main as fn(), *pthing as fn()) - }); + check_type!(main, fn(), |pthing| assert_eq!(main as fn(), *pthing as fn())); } | 
