diff options
| author | Pietro Albini <pietro@pietroalbini.org> | 2018-11-11 00:21:14 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-11 00:21:14 +0100 |
| commit | e121305abd45ff7dc88bad8089424abaa926aff0 (patch) | |
| tree | f1a9df65bf5f10b81e542ffb1307882b4cd94de2 | |
| parent | d2aeef06f2f41c0b7f4d13cd59cd07ad8a377e83 (diff) | |
| parent | 1206549d1b3dbdd694b1218516f522e71228b3b5 (diff) | |
| download | rust-e121305abd45ff7dc88bad8089424abaa926aff0.tar.gz rust-e121305abd45ff7dc88bad8089424abaa926aff0.zip | |
Rollup merge of #55792 - oli-obk:propsicle, r=RalfJung
Prevent ICE in const-prop array oob check fixes https://github.com/rust-lang/rust/issues/55772 fixes https://github.com/rust-lang/rust/issues/54541
| -rw-r--r-- | src/librustc_mir/transform/const_prop.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/consts/const-prop-ice.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/consts/const-prop-ice.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/consts/const-prop-ice2.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/consts/const-prop-ice2.stderr | 10 |
5 files changed, 36 insertions, 8 deletions
diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 4f92ba40048..885d70dc430 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -591,8 +591,8 @@ impl<'b, 'a, 'tcx> Visitor<'tcx> for ConstPropagator<'b, 'a, 'tcx> { if let TerminatorKind::Assert { expected, msg, cond, .. } = kind { if let Some(value) = self.eval_operand(cond, source_info) { trace!("assertion on {:?} should be {:?}", value, expected); - let expected = Immediate::Scalar(Scalar::from_bool(*expected).into()); - if expected != value.0.to_immediate() { + let expected = ScalarMaybeUndef::from(Scalar::from_bool(*expected)); + if expected != self.ecx.read_scalar(value.0).unwrap() { // poison all places this operand references so that further code // doesn't use the invalid value match cond { @@ -628,20 +628,20 @@ impl<'b, 'a, 'tcx> Visitor<'tcx> for ConstPropagator<'b, 'a, 'tcx> { let len = self .eval_operand(len, source_info) .expect("len must be const"); - let len = match len.0.to_immediate() { - Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Bits { + let len = match self.ecx.read_scalar(len.0) { + Ok(ScalarMaybeUndef::Scalar(Scalar::Bits { bits, .. })) => bits, - _ => bug!("const len not primitive: {:?}", len), + other => bug!("const len not primitive: {:?}", other), }; let index = self .eval_operand(index, source_info) .expect("index must be const"); - let index = match index.0.to_immediate() { - Immediate::Scalar(ScalarMaybeUndef::Scalar(Scalar::Bits { + let index = match self.ecx.read_scalar(index.0) { + Ok(ScalarMaybeUndef::Scalar(Scalar::Bits { bits, .. })) => bits, - _ => bug!("const index not primitive: {:?}", index), + other => bug!("const index not primitive: {:?}", other), }; format!( "index out of bounds: \ diff --git a/src/test/ui/consts/const-prop-ice.rs b/src/test/ui/consts/const-prop-ice.rs new file mode 100644 index 00000000000..13309f978b6 --- /dev/null +++ b/src/test/ui/consts/const-prop-ice.rs @@ -0,0 +1,3 @@ +fn main() { + [0; 3][3u64 as usize]; //~ ERROR the len is 3 but the index is 3 +} diff --git a/src/test/ui/consts/const-prop-ice.stderr b/src/test/ui/consts/const-prop-ice.stderr new file mode 100644 index 00000000000..749ef952b5d --- /dev/null +++ b/src/test/ui/consts/const-prop-ice.stderr @@ -0,0 +1,10 @@ +error: index out of bounds: the len is 3 but the index is 3 + --> $DIR/const-prop-ice.rs:2:5 + | +LL | [0; 3][3u64 as usize]; //~ ERROR the len is 3 but the index is 3 + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[deny(const_err)] on by default + +error: aborting due to previous error + diff --git a/src/test/ui/consts/const-prop-ice2.rs b/src/test/ui/consts/const-prop-ice2.rs new file mode 100644 index 00000000000..e5fd79f1167 --- /dev/null +++ b/src/test/ui/consts/const-prop-ice2.rs @@ -0,0 +1,5 @@ +fn main() { + enum Enum { One=1 } + let xs=[0;1 as usize]; + println!("{}", xs[Enum::One as usize]); //~ ERROR the len is 1 but the index is 1 +} diff --git a/src/test/ui/consts/const-prop-ice2.stderr b/src/test/ui/consts/const-prop-ice2.stderr new file mode 100644 index 00000000000..4febd0ee1e3 --- /dev/null +++ b/src/test/ui/consts/const-prop-ice2.stderr @@ -0,0 +1,10 @@ +error: index out of bounds: the len is 1 but the index is 1 + --> $DIR/const-prop-ice2.rs:4:20 + | +LL | println!("{}", xs[Enum::One as usize]); //~ ERROR the len is 1 but the index is 1 + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[deny(const_err)] on by default + +error: aborting due to previous error + |
