diff options
| author | Nadrieril <nadrieril+git@gmail.com> | 2024-03-04 16:57:32 +0100 | 
|---|---|---|
| committer | Nadrieril <nadrieril+git@gmail.com> | 2024-03-19 02:22:43 +0100 | 
| commit | d697dd44d18fbab9a28032d7b1ceba829600637e (patch) | |
| tree | 3560434a07e45c05009a936f97048d533d349b4b /compiler/rustc_pattern_analysis/tests/intersection.rs | |
| parent | e4487ad391503fa109506c40aeba377fda0d97dd (diff) | |
| download | rust-d697dd44d18fbab9a28032d7b1ceba829600637e.tar.gz rust-d697dd44d18fbab9a28032d7b1ceba829600637e.zip | |
Add a crate-custom test harness
Diffstat (limited to 'compiler/rustc_pattern_analysis/tests/intersection.rs')
| -rw-r--r-- | compiler/rustc_pattern_analysis/tests/intersection.rs | 69 | 
1 files changed, 69 insertions, 0 deletions
| diff --git a/compiler/rustc_pattern_analysis/tests/intersection.rs b/compiler/rustc_pattern_analysis/tests/intersection.rs new file mode 100644 index 00000000000..4d8a21506d7 --- /dev/null +++ b/compiler/rustc_pattern_analysis/tests/intersection.rs @@ -0,0 +1,69 @@ +//! Test the computation of arm intersections. +use common::*; +use rustc_pattern_analysis::{pat::DeconstructedPat, usefulness::PlaceValidity, MatchArm}; + +#[macro_use] +mod common; + +/// Analyze a match made of these patterns and returns the computed arm intersections. +fn check(patterns: Vec<DeconstructedPat<Cx>>) -> Vec<Vec<usize>> { + let ty = *patterns[0].ty(); + let arms: Vec<_> = + patterns.iter().map(|pat| MatchArm { pat, has_guard: false, arm_data: () }).collect(); + let report = + compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, None).unwrap(); + report.arm_intersections.into_iter().map(|bitset| bitset.iter().collect()).collect() +} + +#[track_caller] +fn assert_intersects(patterns: Vec<DeconstructedPat<Cx>>, intersects: &[&[usize]]) { + let computed_intersects = check(patterns); + assert_eq!(computed_intersects, intersects); +} + +#[test] +fn test_int_ranges() { + let ty = Ty::U8; + assert_intersects( + pats!(ty; + 0..=100, + 100.., + ), + &[&[], &[0]], + ); + assert_intersects( + pats!(ty; + 0..=101, + 100.., + ), + &[&[], &[0]], + ); + assert_intersects( + pats!(ty; + 0..100, + 100.., + ), + &[&[], &[]], + ); +} + +#[test] +fn test_nested() { + let ty = Ty::Tuple(&[Ty::Bool; 2]); + assert_intersects( + pats!(ty; + (true, true), + (true, _), + (_, true), + ), + &[&[], &[0], &[0, 1]], + ); + // Here we shortcut because `(true, true)` is irrelevant, so we fail to detect the intersection. + assert_intersects( + pats!(ty; + (true, _), + (_, true), + ), + &[&[], &[]], + ); +} | 
