Skip to content

Commit

Permalink
Rollup merge of rust-lang#67630 - oli-obk:extern_ptr_dangling, r=spas…
Browse files Browse the repository at this point in the history
…torino

Treat extern statics just like statics in the "const pointer to static" representation

fixes rust-lang#67612

r? @spastorino

cc @RalfJung this does not affect runtime promotion at all. This is just about promotion within static item bodies.
  • Loading branch information
Centril authored Jan 8, 2020
2 parents caa231d + 097e14d commit 60bef14
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
2 changes: 0 additions & 2 deletions src/librustc/ty/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -533,8 +533,6 @@ impl<'tcx> TyCtxt<'tcx> {

if self.is_mutable_static(def_id) {
self.mk_mut_ptr(static_ty)
} else if self.is_foreign_item(def_id) {
self.mk_imm_ptr(static_ty)
} else {
self.mk_imm_ref(self.lifetimes.re_erased, static_ty)
}
Expand Down
71 changes: 71 additions & 0 deletions src/test/mir-opt/const-promotion-extern-static.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
extern "C" {
static X: i32;
}

static Y: i32 = 42;

static mut BAR: *const &'static i32 = [&Y].as_ptr();

static mut FOO: *const &'static i32 = [unsafe { &X }].as_ptr();

fn main() {}

// END RUST SOURCE
// START rustc.FOO.PromoteTemps.before.mir
// bb0: {
// ...
// _5 = const Scalar(AllocId(1).0x0) : &i32;
// _4 = &(*_5);
// _3 = [move _4];
// _2 = &_3;
// _1 = move _2 as &[&'static i32] (Pointer(Unsize));
// _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1];
// }
// ...
// bb2: {
// StorageDead(_5);
// StorageDead(_3);
// return;
// }
// END rustc.FOO.PromoteTemps.before.mir
// START rustc.BAR.PromoteTemps.before.mir
// bb0: {
// ...
// _5 = const Scalar(AllocId(0).0x0) : &i32;
// _4 = &(*_5);
// _3 = [move _4];
// _2 = &_3;
// _1 = move _2 as &[&'static i32] (Pointer(Unsize));
// _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1];
// }
// ...
// bb2: {
// StorageDead(_5);
// StorageDead(_3);
// return;
// }
// END rustc.BAR.PromoteTemps.before.mir
// START rustc.BAR.PromoteTemps.after.mir
// bb0: {
// ...
// _2 = &(promoted[0]: [&'static i32; 1]);
// _1 = move _2 as &[&'static i32] (Pointer(Unsize));
// _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1];
// }
// ...
// bb2: {
// return;
// }
// END rustc.BAR.PromoteTemps.after.mir
// START rustc.FOO.PromoteTemps.after.mir
// bb0: {
// ...
// _2 = &(promoted[0]: [&'static i32; 1]);
// _1 = move _2 as &[&'static i32] (Pointer(Unsize));
// _0 = const core::slice::<impl [&'static i32]>::as_ptr(move _1) -> [return: bb2, unwind: bb1];
// }
// ...
// bb2: {
// return;
// }
// END rustc.FOO.PromoteTemps.after.mir

0 comments on commit 60bef14

Please sign in to comment.