From 90165b82fcd455deacfbecdc79953988342d5796 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 29 Jul 2018 13:41:43 +0200 Subject: [PATCH 1/3] Make sure #47772 does not regress --- .../codegen/slice-position-bounds-check.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/test/codegen/slice-position-bounds-check.rs diff --git a/src/test/codegen/slice-position-bounds-check.rs b/src/test/codegen/slice-position-bounds-check.rs new file mode 100644 index 0000000000000..bcbf7fd83cf00 --- /dev/null +++ b/src/test/codegen/slice-position-bounds-check.rs @@ -0,0 +1,34 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// no-system-llvm +// compile-flags: -O +#![crate_type = "lib"] + +fn search(arr: &mut [T], a: &T) -> Result { + match arr.iter().position(|x| x == a) { + Some(p) => { + Ok(p) + }, + None => Err(()), + } +} + +// CHECK-LABEL: @position_no_bounds_check +#[no_mangle] +pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool { + // This contains "call assume" so we cannot just rule out all calls + // CHECK-NOT: panic + if let Ok(p) = search(y, x) { + y[p] == *z + } else { + false + } +} From 50773991d3f8dee3cda032f6d1289277cdd9da25 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 29 Jul 2018 22:29:49 +0200 Subject: [PATCH 2/3] make sure that the no-panic test tests what it is supposed to test --- src/test/codegen/slice-position-bounds-check.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/codegen/slice-position-bounds-check.rs b/src/test/codegen/slice-position-bounds-check.rs index bcbf7fd83cf00..aae81ae84922b 100644 --- a/src/test/codegen/slice-position-bounds-check.rs +++ b/src/test/codegen/slice-position-bounds-check.rs @@ -32,3 +32,11 @@ pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool { false } } + +// just to make sure that panicking really emits "panic" somewhere in the IR +// CHECK-LABEL: @test_check +#[no_mangle] +pub fn test_check() { + // CHECK: panic + unreachable!() +} From fb7d8a12db2a561c7dcc2534714243793446c7c4 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 31 Jul 2018 10:35:27 +0200 Subject: [PATCH 3/3] hopefully make test pass on windows --- src/test/codegen/slice-position-bounds-check.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/codegen/slice-position-bounds-check.rs b/src/test/codegen/slice-position-bounds-check.rs index aae81ae84922b..a6c846d7dab51 100644 --- a/src/test/codegen/slice-position-bounds-check.rs +++ b/src/test/codegen/slice-position-bounds-check.rs @@ -9,7 +9,7 @@ // except according to those terms. // no-system-llvm -// compile-flags: -O +// compile-flags: -O -C panic=abort #![crate_type = "lib"] fn search(arr: &mut [T], a: &T) -> Result { @@ -25,7 +25,7 @@ fn search(arr: &mut [T], a: &T) -> Result { #[no_mangle] pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool { // This contains "call assume" so we cannot just rule out all calls - // CHECK-NOT: panic + // CHECK-NOT: panic_bounds_check if let Ok(p) = search(y, x) { y[p] == *z } else { @@ -33,10 +33,10 @@ pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool { } } -// just to make sure that panicking really emits "panic" somewhere in the IR +// just to make sure that panicking really emits "panic_bounds_check" somewhere in the IR // CHECK-LABEL: @test_check #[no_mangle] -pub fn test_check() { - // CHECK: panic - unreachable!() +pub fn test_check(y: &[i32]) -> i32 { + // CHECK: panic_bounds_check + y[12] }