diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-07 05:48:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-07 05:48:48 +0000 |
commit | ef24de24a82fe681581cc130f342363c47c0969a (patch) | |
tree | 0d494f7e1a38b95c92426f58fe6eaa877303a86c /tests/ui/generator/discriminant.rs | |
parent | Releasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff) | |
download | rustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip |
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/generator/discriminant.rs')
-rw-r--r-- | tests/ui/generator/discriminant.rs | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/tests/ui/generator/discriminant.rs b/tests/ui/generator/discriminant.rs deleted file mode 100644 index 195e77022..000000000 --- a/tests/ui/generator/discriminant.rs +++ /dev/null @@ -1,137 +0,0 @@ -//! Tests that generator discriminant sizes and ranges are chosen optimally and that they are -//! reflected in the output of `mem::discriminant`. - -// run-pass - -#![feature(generators, generator_trait, core_intrinsics, discriminant_kind)] - -use std::intrinsics::discriminant_value; -use std::marker::{Unpin, DiscriminantKind}; -use std::mem::size_of_val; -use std::{cmp, ops::*}; - -macro_rules! yield25 { - ($e:expr) => { - yield $e; - yield $e; - yield $e; - yield $e; - yield $e; - - yield $e; - yield $e; - yield $e; - yield $e; - yield $e; - - yield $e; - yield $e; - yield $e; - yield $e; - yield $e; - - yield $e; - yield $e; - yield $e; - yield $e; - yield $e; - - yield $e; - yield $e; - yield $e; - yield $e; - yield $e; - }; -} - -/// Yields 250 times. -macro_rules! yield250 { - () => { - yield250!(()) - }; - - ($e:expr) => { - yield25!($e); - yield25!($e); - yield25!($e); - yield25!($e); - yield25!($e); - - yield25!($e); - yield25!($e); - yield25!($e); - yield25!($e); - yield25!($e); - }; -} - -fn cycle( - gen: impl Generator<()> + Unpin + DiscriminantKind<Discriminant = u32>, - expected_max_discr: u32 -) { - let mut gen = Box::pin(gen); - let mut max_discr = 0; - loop { - max_discr = cmp::max(max_discr, discriminant_value(gen.as_mut().get_mut())); - match gen.as_mut().resume(()) { - GeneratorState::Yielded(_) => {} - GeneratorState::Complete(_) => { - assert_eq!(max_discr, expected_max_discr); - return; - } - } - } -} - -fn main() { - // Has only one invalid discr. value. - let gen_u8_tiny_niche = || { - || { - // 3 reserved variants - - yield250!(); // 253 variants - - yield; // 254 - yield; // 255 - } - }; - - // Uses all values in the u8 discriminant. - let gen_u8_full = || { - || { - // 3 reserved variants - - yield250!(); // 253 variants - - yield; // 254 - yield; // 255 - yield; // 256 - } - }; - - // Barely needs a u16 discriminant. - let gen_u16 = || { - || { - // 3 reserved variants - - yield250!(); // 253 variants - - yield; // 254 - yield; // 255 - yield; // 256 - yield; // 257 - } - }; - - assert_eq!(size_of_val(&gen_u8_tiny_niche()), 1); - assert_eq!(size_of_val(&Some(gen_u8_tiny_niche())), 1); // uses niche - assert_eq!(size_of_val(&Some(Some(gen_u8_tiny_niche()))), 2); // cannot use niche anymore - assert_eq!(size_of_val(&gen_u8_full()), 1); - assert_eq!(size_of_val(&Some(gen_u8_full())), 2); // cannot use niche - assert_eq!(size_of_val(&gen_u16()), 2); - assert_eq!(size_of_val(&Some(gen_u16())), 2); // uses niche - - cycle(gen_u8_tiny_niche(), 254); - cycle(gen_u8_full(), 255); - cycle(gen_u16(), 256); -} |