Skip to content

Commit

Permalink
add test for ICE: failed to get layout for [type error] rust-lang#92979
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiaskrgr committed Mar 25, 2024
1 parent 6fe5555 commit a3c2d75
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
78 changes: 78 additions & 0 deletions tests/ui/layout/failed-to-get-layout-for-type-error-ice-92979.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// ICE: failed to get layout for [type error]
// issue: rust-lang/rust#92979

use std::fs;
use std::fs::File;
use std::io::Read;
use std::convert::TryInto;

fn get_file_as_byte_vec(filename: &String) -> Vec<u8> {
let mut f = File::open(&filename).expect("no file found");
let metadata = fs::metadata(&filename).expect("unable to read metadata");
let mut buffer = vec![0; metadata.len() as usize];
f.read(&mut buffer).expect("buffer overflow");

buffer
}



fn demo<T, const N: usize>(v: Vec<T>) -> [T; N] {
v.try_into()
.unwrap_or_else(|v: Vec<T>| panic!("Expected a Vec of length {} but it was {}", N, v.len()))
}


fn main() {

// Specify filepath
let file: &String = &String::from("SomeBinaryDataFileWith4ByteHeaders_f32s_and_u32s");

// Read file into a vector of bytes
let file_data = get_file_as_byte_vec(file);

// Print length of vector and first few values
let length = file_data.len();
println!("The read function read {} bytes", length);
println!("The first few bytes:");
for i in 0..20{
println!("{}", file_data[i]);
}

// Manually count just to make sure
let mut n: u64 = 0;
for data in file_data{
n += 1;
}
println!("We counted {} bytes", n);
assert!(n as usize == length, "Manual counting does not equal len method");

// Simulation parameters
const N: usize = 49627502; // Number of Particles
const bs: f64 = 125.0; // Box Size
const HEADER_INCREMENT: u64 = 4*1;

// Initialize index and counter variables
let (mut j, mut pos, mut vel, mut id, mut mass): (u64, u64, u64, u64, u64) = (0, 0, 0, 0, 0);

// Unpack Position Data
j += HEADER_INCREMENT;
let mut position: Vec<f32> = Vec::new();
while position.len() < N*3 {

let p: Vec<u8> = Vec::new();
for item in 0i8..4 {
let item = item;
p.push(file_data[j as usize]);
j += 1;
}
&mut position[position.len()] = f32::from_be_bytes(demo(p));
//~^ ERROR invalid left-hand side of assignment
}

// Ensure position data is indeed position by checking values
for p in position {
assert!((p > 0.) & (p < 125.), "Not in box")
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
error[E0070]: invalid left-hand side of assignment
--> $DIR/failed-to-get-layout-for-type-error-ice-92979.rs:69:39
|
LL | &mut position[position.len()] = f32::from_be_bytes(demo(p));
| ----------------------------- ^
| |
| cannot assign to this expression
|
help: consider dereferencing here to assign to the mutably borrowed value
|
LL | *&mut position[position.len()] = f32::from_be_bytes(demo(p));
| +

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0070`.

0 comments on commit a3c2d75

Please sign in to comment.