Rollup merge of #51308 - fanzier:const-prop-array-bounds-check, r=oli-obk
Check array indices in constant propagation Previously, uses of constant weren't correctly propagated. This fixes #48920. r? @oli-obk because you suggested it
This commit is contained in:
commit
54cb13d975
10 changed files with 28 additions and 22 deletions
|
@ -240,16 +240,6 @@ impl<'b, 'a, 'tcx:'b> ConstPropagator<'b, 'a, 'tcx> {
|
||||||
) -> Option<Const<'tcx>> {
|
) -> Option<Const<'tcx>> {
|
||||||
let span = source_info.span;
|
let span = source_info.span;
|
||||||
match *rvalue {
|
match *rvalue {
|
||||||
// No need to overwrite an already evaluated constant
|
|
||||||
Rvalue::Use(Operand::Constant(box Constant {
|
|
||||||
literal: Literal::Value {
|
|
||||||
value: &ty::Const {
|
|
||||||
val: ConstVal::Value(_),
|
|
||||||
..
|
|
||||||
},
|
|
||||||
},
|
|
||||||
..
|
|
||||||
})) => None,
|
|
||||||
// This branch exists for the sanity type check
|
// This branch exists for the sanity type check
|
||||||
Rvalue::Use(Operand::Constant(ref c)) => {
|
Rvalue::Use(Operand::Constant(ref c)) => {
|
||||||
assert_eq!(c.ty, place_ty);
|
assert_eq!(c.ty, place_ty);
|
||||||
|
|
|
@ -19,8 +19,8 @@ pub const C: u8 = 200u8 * 4; //~ ERROR const_err
|
||||||
//~^ ERROR this constant cannot be used
|
//~^ ERROR this constant cannot be used
|
||||||
pub const D: u8 = 42u8 - (42u8 + 1); //~ ERROR const_err
|
pub const D: u8 = 42u8 - (42u8 + 1); //~ ERROR const_err
|
||||||
//~^ ERROR this constant cannot be used
|
//~^ ERROR this constant cannot be used
|
||||||
pub const E: u8 = [5u8][1];
|
pub const E: u8 = [5u8][1]; //~ ERROR const_err
|
||||||
//~^ ERROR const_err
|
//~| ERROR this constant cannot be used
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _a = A;
|
let _a = A;
|
||||||
|
|
|
@ -31,6 +31,7 @@ fn main() {
|
||||||
let d = 42u8 - (42u8 + 1);
|
let d = 42u8 - (42u8 + 1);
|
||||||
//~^ ERROR const_err
|
//~^ ERROR const_err
|
||||||
let _e = [5u8][1];
|
let _e = [5u8][1];
|
||||||
|
//~^ ERROR const_err
|
||||||
black_box(a);
|
black_box(a);
|
||||||
black_box(b);
|
black_box(b);
|
||||||
black_box(c);
|
black_box(c);
|
||||||
|
|
|
@ -23,6 +23,7 @@ fn main() {
|
||||||
let d = 42u8 - (42u8 + 1);
|
let d = 42u8 - (42u8 + 1);
|
||||||
//~^ ERROR const_err
|
//~^ ERROR const_err
|
||||||
let _e = [5u8][1];
|
let _e = [5u8][1];
|
||||||
|
//~^ ERROR const_err
|
||||||
black_box(b);
|
black_box(b);
|
||||||
black_box(c);
|
black_box(c);
|
||||||
black_box(d);
|
black_box(d);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
const C: [u32; 5] = [0; 5];
|
const C: [u32; 5] = [0; 5];
|
||||||
|
|
||||||
|
#[allow(const_err)]
|
||||||
fn test() -> u32 {
|
fn test() -> u32 {
|
||||||
C[10]
|
C[10]
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
const C: &'static [u8; 5] = b"hello";
|
const C: &'static [u8; 5] = b"hello";
|
||||||
|
|
||||||
|
#[allow(const_err)]
|
||||||
fn test() -> u8 {
|
fn test() -> u8 {
|
||||||
C[10]
|
C[10]
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
const C: &'static [u8; 5] = b"hello";
|
const C: &'static [u8; 5] = b"hello";
|
||||||
|
|
||||||
|
#[allow(const_err)]
|
||||||
fn mir() -> u8 {
|
fn mir() -> u8 {
|
||||||
C[10]
|
C[10]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
error[E0080]: constant evaluation error
|
|
||||||
--> $DIR/index_out_of_bound.rs:11:19
|
|
||||||
|
|
|
||||||
LL | static FOO: i32 = [][0];
|
|
||||||
| ^^^^^ index out of bounds: the len is 0 but the index is 0
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
|
|
@ -11,4 +11,7 @@
|
||||||
static FOO: i32 = [][0];
|
static FOO: i32 = [][0];
|
||||||
//~^ ERROR E0080
|
//~^ ERROR E0080
|
||||||
|
|
||||||
fn main() {}
|
fn main() {
|
||||||
|
let array = [std::env::args().len()];
|
||||||
|
array[1]; //~ ERROR index out of bounds
|
||||||
|
}
|
17
src/test/ui/const-eval/index_out_of_bounds.stderr
Normal file
17
src/test/ui/const-eval/index_out_of_bounds.stderr
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
error[E0080]: constant evaluation error
|
||||||
|
--> $DIR/index_out_of_bounds.rs:11:19
|
||||||
|
|
|
||||||
|
LL | static FOO: i32 = [][0];
|
||||||
|
| ^^^^^ index out of bounds: the len is 0 but the index is 0
|
||||||
|
|
||||||
|
error: index out of bounds: the len is 1 but the index is 1
|
||||||
|
--> $DIR/index_out_of_bounds.rs:16:5
|
||||||
|
|
|
||||||
|
LL | array[1]; //~ ERROR index out of bounds
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: #[deny(const_err)] on by default
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
Loading…
Add table
Add a link
Reference in a new issue