// compile-flags: -O #![crate_type = "lib"] #![allow(incomplete_features)] #![feature(unsized_locals, unsized_fn_params)] use std::cell::Cell; use std::hint; // Check to make sure that we can deduce the `readonly` attribute from function bodies for // parameters passed indirectly. pub struct BigStruct { blah: [i32; 1024], } pub struct BigCellContainer { blah: [Cell; 1024], } // The by-value parameter for this big struct can be marked readonly. // // CHECK: @use_big_struct_immutably({{.*}} readonly {{.*}} %big_struct) #[no_mangle] pub fn use_big_struct_immutably(big_struct: BigStruct) { hint::black_box(&big_struct); } // The by-value parameter for this big struct can't be marked readonly, because we mutate it. // // CHECK-NOT: @use_big_struct_mutably({{.*}} readonly {{.*}} %big_struct) #[no_mangle] pub fn use_big_struct_mutably(mut big_struct: BigStruct) { big_struct.blah[987] = 654; hint::black_box(&big_struct); } // The by-value parameter for this big struct can't be marked readonly, because it contains // UnsafeCell. // // CHECK-NOT: @use_big_cell_container({{.*}} readonly {{.*}} %big_cell_container) #[no_mangle] pub fn use_big_cell_container(big_cell_container: BigCellContainer) { hint::black_box(&big_cell_container); } // Make sure that we don't mistakenly mark a big struct as `readonly` when passed through a generic // type parameter if it contains UnsafeCell. // // CHECK-NOT: @use_something({{.*}} readonly {{.*}} %something) #[no_mangle] #[inline(never)] pub fn use_something(something: T) { hint::black_box(&something); } #[no_mangle] pub fn forward_big_cell_container(big_cell_container: BigCellContainer) { use_something(big_cell_container) }