Check types of statics in MIR typeck
This commit is contained in:
parent
cd9f5ff2a1
commit
ddc25456c5
@ -309,6 +309,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
let tcx = self.tcx();
|
||||
if let ty::ConstKind::Unevaluated(def_id, substs, promoted) = constant.literal.val {
|
||||
if let Some(promoted) = promoted {
|
||||
let check_err = |verifier: &mut TypeVerifier<'a, 'b, 'tcx>,
|
||||
@ -358,10 +359,23 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
if let ty::FnDef(def_id, substs) = constant.literal.ty.kind {
|
||||
let tcx = self.tcx();
|
||||
} else if let Some(static_def_id) = constant.check_static_ptr(tcx) {
|
||||
let unnormalized_ty = tcx.type_of(static_def_id);
|
||||
let locations = location.to_locations();
|
||||
let normalized_ty = self.cx.normalize(unnormalized_ty, locations);
|
||||
let literal_ty = constant.literal.ty.builtin_deref(true).unwrap().ty;
|
||||
|
||||
if let Err(terr) = self.cx.eq_types(
|
||||
normalized_ty,
|
||||
literal_ty,
|
||||
locations,
|
||||
ConstraintCategory::Boring,
|
||||
) {
|
||||
span_mirbug!(self, constant, "bad static type {:?} ({:?})", constant, terr);
|
||||
}
|
||||
}
|
||||
|
||||
if let ty::FnDef(def_id, substs) = constant.literal.ty.kind {
|
||||
let instantiated_predicates = tcx.predicates_of(def_id).instantiate(tcx, substs);
|
||||
self.cx.normalize_and_prove_instantiated_predicates(
|
||||
instantiated_predicates,
|
||||
|
30
src/test/ui/nll/issue-69114-static-mut-ty.rs
Normal file
30
src/test/ui/nll/issue-69114-static-mut-ty.rs
Normal file
@ -0,0 +1,30 @@
|
||||
// Check that borrowck ensures that `static mut` items have the expected type.
|
||||
|
||||
static FOO: u8 = 42;
|
||||
static mut BAR: &'static u8 = &FOO;
|
||||
static mut BAR_ELIDED: &u8 = &FOO;
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
println!("{} {}", BAR, BAR_ELIDED);
|
||||
set_bar();
|
||||
set_bar_elided();
|
||||
println!("{} {}", BAR, BAR_ELIDED);
|
||||
}
|
||||
}
|
||||
|
||||
fn set_bar() {
|
||||
let n = 42;
|
||||
unsafe {
|
||||
BAR = &n;
|
||||
//~^ ERROR does not live long enough
|
||||
}
|
||||
}
|
||||
|
||||
fn set_bar_elided() {
|
||||
let n = 42;
|
||||
unsafe {
|
||||
BAR_ELIDED = &n;
|
||||
//~^ ERROR does not live long enough
|
||||
}
|
||||
}
|
27
src/test/ui/nll/issue-69114-static-mut-ty.stderr
Normal file
27
src/test/ui/nll/issue-69114-static-mut-ty.stderr
Normal file
@ -0,0 +1,27 @@
|
||||
error[E0597]: `n` does not live long enough
|
||||
--> $DIR/issue-69114-static-mut-ty.rs:19:15
|
||||
|
|
||||
LL | BAR = &n;
|
||||
| ------^^
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| assignment requires that `n` is borrowed for `'static`
|
||||
...
|
||||
LL | }
|
||||
| - `n` dropped here while still borrowed
|
||||
|
||||
error[E0597]: `n` does not live long enough
|
||||
--> $DIR/issue-69114-static-mut-ty.rs:27:22
|
||||
|
|
||||
LL | BAR_ELIDED = &n;
|
||||
| -------------^^
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| assignment requires that `n` is borrowed for `'static`
|
||||
...
|
||||
LL | }
|
||||
| - `n` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
9
src/test/ui/nll/issue-69114-static-ty.rs
Normal file
9
src/test/ui/nll/issue-69114-static-ty.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// Check that borrowck ensures that `static` items have the expected type.
|
||||
|
||||
static FOO: &'static (dyn Fn(&'static u8) + Send + Sync) = &drop;
|
||||
|
||||
fn main() {
|
||||
let n = 42;
|
||||
FOO(&n);
|
||||
//~^ ERROR does not live long enough
|
||||
}
|
15
src/test/ui/nll/issue-69114-static-ty.stderr
Normal file
15
src/test/ui/nll/issue-69114-static-ty.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error[E0597]: `n` does not live long enough
|
||||
--> $DIR/issue-69114-static-ty.rs:7:9
|
||||
|
|
||||
LL | FOO(&n);
|
||||
| ----^^-
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| argument requires that `n` is borrowed for `'static`
|
||||
LL |
|
||||
LL | }
|
||||
| - `n` dropped here while still borrowed
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
Loading…
x
Reference in New Issue
Block a user