25 lines
754 B
Rust
25 lines
754 B
Rust
|
#![feature(const_mut_refs)]
|
||
|
#![feature(const_fn)]
|
||
|
#![feature(raw_ref_op)]
|
||
|
const NULL: *mut i32 = std::ptr::null_mut();
|
||
|
const A: *const i32 = &4;
|
||
|
|
||
|
// It could be made sound to allow it to compile,
|
||
|
// but we do not want to allow this to compile,
|
||
|
// as that would be an enormous footgun in oli-obk's opinion.
|
||
|
const B: *mut i32 = &mut 4; //~ ERROR mutable references are not allowed
|
||
|
|
||
|
// Could be ok, but the same analysis that prevents the mutable one above will also bail out here
|
||
|
// Using a block with some complex content, because just `&45` would get promoted,
|
||
|
// which is not what we want to test here.
|
||
|
const C: *const i32 = &{
|
||
|
let mut x = 42;
|
||
|
x += 3;
|
||
|
x
|
||
|
};
|
||
|
|
||
|
fn main() {
|
||
|
println!("{}", unsafe { *A });
|
||
|
unsafe { *B = 4 } // Bad news
|
||
|
}
|