Skip to content

Commit

Permalink
Rollup merge of rust-lang#55262 - oli-obk:dangling_alloc_id_ice, r=Ra…
Browse files Browse the repository at this point in the history
…lfJung

Change the ICE from rust-lang#55223 to a hard error

cc @SimonSapin

r? @RalfJung
  • Loading branch information
Mark-Simulacrum authored Oct 27, 2018
2 parents b3740b1 + 599eb12 commit 805fcb6
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/librustc_mir/interpret/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,11 @@ where
if self.alloc_map.contains_key(&alloc) {
// Not yet interned, so proceed recursively
self.intern_static(alloc, mutability)?;
} else if self.dead_alloc_map.contains_key(&alloc) {
// dangling pointer
return err!(ValidationFailure(
"encountered dangling pointer in final constant".into(),
))
}
}
Ok(())
Expand Down
30 changes: 30 additions & 0 deletions src/test/ui/consts/dangling-alloc-id-ice-2.nll.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
warning[E0716]: temporary value dropped while borrowed
--> $DIR/dangling-alloc-id-ice-2.rs:5:28
|
LL | static MAP: Slice = Slice(&[
| ___________________________-^
| |___________________________|
| ||
LL | || b"CloseEvent" as &'static [u8],
LL | || ]);
| || -- temporary value is freed at the end of this statement
| ||_|
| |__creates a temporary which is freed while still in use
| cast requires that borrow lasts for `'static`
|
= warning: This error has been downgraded to a warning for backwards compatibility with previous releases.
It represents potential unsoundness in your code.
This warning will become a hard error in the future.

error[E0080]: could not evaluate static initializer
--> $DIR/dangling-alloc-id-ice-2.rs:5:1
|
LL | / static MAP: Slice = Slice(&[
LL | | b"CloseEvent" as &'static [u8],
LL | | ]);
| |___^ type validation failed: encountered dangling pointer in final constant

error: aborting due to previous error

Some errors occurred: E0080, E0716.
For more information about an error, try `rustc --explain E0080`.
10 changes: 10 additions & 0 deletions src/test/ui/consts/dangling-alloc-id-ice-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// FIXME(#55223) this is just a reproduction test showing the wrong behavior

struct Slice(&'static [&'static [u8]]);

static MAP: Slice = Slice(&[
b"CloseEvent" as &'static [u8],
]);


fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/consts/dangling-alloc-id-ice-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0080]: could not evaluate static initializer
--> $DIR/dangling-alloc-id-ice-2.rs:5:1
|
LL | / static MAP: Slice = Slice(&[
LL | | b"CloseEvent" as &'static [u8],
LL | | ]);
| |___^ type validation failed: encountered dangling pointer in final constant

error: aborting due to previous error

For more information about this error, try `rustc --explain E0080`.
15 changes: 15 additions & 0 deletions src/test/ui/consts/dangling-alloc-id-ice.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// https://github.com/rust-lang/rust/issues/55223

#![feature(const_let)]

union Foo<'a> {
y: &'a (),
long_live_the_unit: &'static (),
}

const FOO: &() = { //~ ERROR any use of this value will cause an error
let y = ();
unsafe { Foo { y: &y }.long_live_the_unit }
};

fn main() {}
13 changes: 13 additions & 0 deletions src/test/ui/consts/dangling-alloc-id-ice.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: any use of this value will cause an error
--> $DIR/dangling-alloc-id-ice.rs:10:1
|
LL | / const FOO: &() = { //~ ERROR any use of this value will cause an error
LL | | let y = ();
LL | | unsafe { Foo { y: &y }.long_live_the_unit }
LL | | };
| |__^ type validation failed: encountered dangling pointer in final constant
|
= note: #[deny(const_err)] on by default

error: aborting due to previous error

10 changes: 10 additions & 0 deletions src/test/ui/consts/dangling_raw_ptr.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![feature(const_let)]

const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
let x = 42;
&x
};

fn main() {
let x = FOO;
}
13 changes: 13 additions & 0 deletions src/test/ui/consts/dangling_raw_ptr.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: any use of this value will cause an error
--> $DIR/dangling_raw_ptr.rs:3:1
|
LL | / const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
LL | | let x = 42;
LL | | &x
LL | | };
| |__^ type validation failed: encountered dangling pointer in final constant
|
= note: #[deny(const_err)] on by default

error: aborting due to previous error

0 comments on commit 805fcb6

Please sign in to comment.