allow indexing into constant arrays
This commit is contained in:
parent
af5d9d65e7
commit
6683fa4d42
10 changed files with 190 additions and 28 deletions
16
src/test/compile-fail/array_const_index-0.rs
Normal file
16
src/test/compile-fail/array_const_index-0.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2015 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
static A: &'static [i32] = &[];
|
||||
static B: i32 = (&A)[1]; //~ ERROR: const index-expr is out of bounds
|
||||
|
||||
fn main() {
|
||||
let _ = B;
|
||||
}
|
||||
16
src/test/compile-fail/array_const_index-1.rs
Normal file
16
src/test/compile-fail/array_const_index-1.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2015 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
const A: [i32; 0] = [];
|
||||
const B: i32 = A[1]; //~ ERROR: const index-expr is out of bounds
|
||||
|
||||
fn main() {
|
||||
let _ = B;
|
||||
}
|
||||
20
src/test/compile-fail/const-array-oob-arith.rs
Normal file
20
src/test/compile-fail/const-array-oob-arith.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2015 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
const ARR: [i32; 6] = [42, 43, 44, 45, 46, 47];
|
||||
const IDX: usize = 3;
|
||||
const VAL: i32 = ARR[IDX];
|
||||
const BONG: [i32; (ARR[0] - 41) as usize] = [5];
|
||||
const BLUB: [i32; (ARR[0] - 40) as usize] = [5]; //~ ERROR: mismatched types
|
||||
const BOO: [i32; (ARR[0] - 41) as usize] = [5, 99]; //~ ERROR: mismatched types
|
||||
|
||||
fn main() {
|
||||
let _ = VAL;
|
||||
}
|
||||
|
|
@ -9,7 +9,10 @@
|
|||
// except according to those terms.
|
||||
|
||||
const FOO: [u32; 3] = [1, 2, 3];
|
||||
const BAR: u32 = FOO[5]; //~ ERROR const index-expr is out of bounds
|
||||
const BAR: u32 = FOO[5]; // no error, because the error below occurs before regular const eval
|
||||
|
||||
const BLUB: [u32; FOO[4]] = [5, 6];
|
||||
//~^ ERROR array length constant evaluation error: array index out of bounds [E0250]
|
||||
|
||||
fn main() {
|
||||
let _ = BAR;
|
||||
|
|
|
|||
17
src/test/run-pass/array_const_index-1.rs
Normal file
17
src/test/run-pass/array_const_index-1.rs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2015 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
|
||||
fn main() {
|
||||
const ARR: [i32; 6] = [42, 43, 44, 45, 46, 47];
|
||||
const IDX: usize = 3;
|
||||
const VAL: i32 = ARR[IDX];
|
||||
const BLUB: [i32; (ARR[0] - 41) as usize] = [5];
|
||||
}
|
||||
|
|
@ -12,30 +12,33 @@
|
|||
// and unsized) work properly.
|
||||
|
||||
|
||||
const aa: [isize; 3] = [1, 2, 3];
|
||||
const ab: &'static [isize; 3] = &aa;
|
||||
const ac: &'static [isize] = ab;
|
||||
const ad: &'static [isize] = &aa;
|
||||
const ae: &'static [isize; 3] = &[1, 2, 3];
|
||||
const af: &'static [isize] = &[1, 2, 3];
|
||||
const AA: [isize; 3] = [1, 2, 3];
|
||||
const AB: &'static [isize; 3] = &AA;
|
||||
const AC: &'static [isize] = AB;
|
||||
const AD: &'static [isize] = &AA;
|
||||
const AE: &'static [isize; 3] = &[1, 2, 3];
|
||||
const AF: &'static [isize] = &[1, 2, 3];
|
||||
|
||||
static ca: isize = aa[0];
|
||||
static cb: isize = ab[1];
|
||||
static cc: isize = ac[2];
|
||||
static cd: isize = ad[0];
|
||||
static ce: isize = ae[1];
|
||||
static cf: isize = af[2];
|
||||
static CA: isize = AA[0];
|
||||
static CB: isize = AB[1];
|
||||
static CC: isize = AC[2];
|
||||
static CD: isize = AD[0];
|
||||
static CE: isize = AE[1];
|
||||
static CF: isize = AF[2];
|
||||
|
||||
static AG: &'static isize = &AA[2];
|
||||
|
||||
fn main () {
|
||||
let b: &[isize] = &[1, 2, 3];
|
||||
assert_eq!(ac, b);
|
||||
assert_eq!(ad, b);
|
||||
assert_eq!(af, b);
|
||||
assert_eq!(AC, b);
|
||||
assert_eq!(AD, b);
|
||||
assert_eq!(AF, b);
|
||||
assert_eq!(*AG, 3);
|
||||
|
||||
assert_eq!(ca, 1);
|
||||
assert_eq!(cb, 2);
|
||||
assert_eq!(cc, 3);
|
||||
assert_eq!(cd, 1);
|
||||
assert_eq!(ce, 2);
|
||||
assert_eq!(cf, 3);
|
||||
assert_eq!(CA, 1);
|
||||
assert_eq!(CB, 2);
|
||||
assert_eq!(CC, 3);
|
||||
assert_eq!(CD, 1);
|
||||
assert_eq!(CE, 2);
|
||||
assert_eq!(CF, 3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,14 +8,13 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
|
||||
enum E { V1(isize), V0 }
|
||||
const C: &'static [E] = &[E::V0, E::V1(0xDEADBEE)];
|
||||
static C0: E = C[0];
|
||||
static C1: E = C[1];
|
||||
const D: &'static [E; 2] = &[E::V0, E::V1(0xDEADBEE)];
|
||||
static D0: E = C[0];
|
||||
static D1: E = C[1];
|
||||
const D: &'static [E; 2] = &[E::V0, E::V1(0xDEAFBEE)];
|
||||
static D0: E = D[0];
|
||||
static D1: E = D[1];
|
||||
|
||||
pub fn main() {
|
||||
match C0 {
|
||||
|
|
@ -32,7 +31,7 @@ pub fn main() {
|
|||
_ => panic!()
|
||||
}
|
||||
match D1 {
|
||||
E::V1(n) => assert_eq!(n, 0xDEADBEE),
|
||||
E::V1(n) => assert_eq!(n, 0xDEAFBEE),
|
||||
_ => panic!()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ const C: *const u8 = B as *const u8;
|
|||
pub fn main() {
|
||||
unsafe {
|
||||
let foo = &A as *const u8;
|
||||
assert_eq!(foo, C);
|
||||
assert_eq!(str::from_utf8_unchecked(&A), "hi");
|
||||
assert_eq!(*C, A[0]);
|
||||
assert_eq!(*(&B[0] as *const u8), A[0]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue