eb2d4cb541
When we extract coverage spans from MIR, we try to "un-expand" them back to spans that are inside the function's body span. In cases where that doesn't succeed, the current code just swaps in the entire body span instead. But that tends to result in coverage spans that are completely unrelated to the control flow of the affected code, so it's better to just discard those spans.
55 lines
1.6 KiB
Plaintext
55 lines
1.6 KiB
Plaintext
LL| |// compile-flags: -Zinline-mir
|
|
LL| |
|
|
LL| |use std::fmt::Display;
|
|
LL| |
|
|
LL| 1|fn main() {
|
|
LL| 1| permutations(&['a', 'b', 'c']);
|
|
LL| 1|}
|
|
LL| |
|
|
LL| |#[inline(always)]
|
|
LL| 1|fn permutations<T: Copy + Display>(xs: &[T]) {
|
|
LL| 1| let mut ys = xs.to_owned();
|
|
LL| 1| permutate(&mut ys, 0);
|
|
LL| 1|}
|
|
LL| |
|
|
LL| 16|fn permutate<T: Copy + Display>(xs: &mut [T], k: usize) {
|
|
LL| 16| let n = length(xs);
|
|
LL| 16| if k == n {
|
|
LL| 6| display(xs);
|
|
LL| 10| } else if k < n {
|
|
LL| 15| for i in k..n {
|
|
^10
|
|
LL| 15| swap(xs, i, k);
|
|
LL| 15| permutate(xs, k + 1);
|
|
LL| 15| swap(xs, i, k);
|
|
LL| 15| }
|
|
LL| 0| } else {
|
|
LL| 0| error();
|
|
LL| 0| }
|
|
LL| 16|}
|
|
LL| |
|
|
LL| 16|fn length<T>(xs: &[T]) -> usize {
|
|
LL| 16| xs.len()
|
|
LL| 16|}
|
|
LL| |
|
|
LL| |#[inline]
|
|
LL| 30|fn swap<T: Copy>(xs: &mut [T], i: usize, j: usize) {
|
|
LL| 30| let t = xs[i];
|
|
LL| 30| xs[i] = xs[j];
|
|
LL| 30| xs[j] = t;
|
|
LL| 30|}
|
|
LL| |
|
|
LL| 6|fn display<T: Display>(xs: &[T]) {
|
|
LL| 24| for x in xs {
|
|
^18
|
|
LL| 18| print!("{}", x);
|
|
LL| 18| }
|
|
LL| 6| println!();
|
|
LL| 6|}
|
|
LL| |
|
|
LL| |#[inline(always)]
|
|
LL| 0|fn error() {
|
|
LL| 0| panic!("error");
|
|
LL| |}
|
|
|