Rollup merge of #102187 - b-naber:inline-const-source-info, r=eholk
Use correct location for type tests in promoted constants Previously we forgot to remap the location in a type test collected when visiting the body of a promoted constant back to the usage location, causing an ICE when trying to get span information for that type test. Fixes https://github.com/rust-lang/rust/issues/102117
This commit is contained in:
commit
5e04567ac7
3 changed files with 76 additions and 0 deletions
|
@ -584,6 +584,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||||
// modify their locations.
|
// modify their locations.
|
||||||
let all_facts = &mut None;
|
let all_facts = &mut None;
|
||||||
let mut constraints = Default::default();
|
let mut constraints = Default::default();
|
||||||
|
let mut type_tests = Default::default();
|
||||||
let mut closure_bounds = Default::default();
|
let mut closure_bounds = Default::default();
|
||||||
let mut liveness_constraints =
|
let mut liveness_constraints =
|
||||||
LivenessValues::new(Rc::new(RegionValueElements::new(&promoted_body)));
|
LivenessValues::new(Rc::new(RegionValueElements::new(&promoted_body)));
|
||||||
|
@ -595,6 +596,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||||
&mut this.cx.borrowck_context.constraints.outlives_constraints,
|
&mut this.cx.borrowck_context.constraints.outlives_constraints,
|
||||||
&mut constraints,
|
&mut constraints,
|
||||||
);
|
);
|
||||||
|
mem::swap(&mut this.cx.borrowck_context.constraints.type_tests, &mut type_tests);
|
||||||
mem::swap(
|
mem::swap(
|
||||||
&mut this.cx.borrowck_context.constraints.closure_bounds_mapping,
|
&mut this.cx.borrowck_context.constraints.closure_bounds_mapping,
|
||||||
&mut closure_bounds,
|
&mut closure_bounds,
|
||||||
|
@ -619,6 +621,13 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||||
swap_constraints(self);
|
swap_constraints(self);
|
||||||
|
|
||||||
let locations = location.to_locations();
|
let locations = location.to_locations();
|
||||||
|
|
||||||
|
// Use location of promoted const in collected constraints
|
||||||
|
for type_test in type_tests.iter() {
|
||||||
|
let mut type_test = type_test.clone();
|
||||||
|
type_test.locations = locations;
|
||||||
|
self.cx.borrowck_context.constraints.type_tests.push(type_test)
|
||||||
|
}
|
||||||
for constraint in constraints.outlives().iter() {
|
for constraint in constraints.outlives().iter() {
|
||||||
let mut constraint = constraint.clone();
|
let mut constraint = constraint.clone();
|
||||||
constraint.locations = locations;
|
constraint.locations = locations;
|
||||||
|
|
30
src/test/ui/consts/issue-102117.rs
Normal file
30
src/test/ui/consts/issue-102117.rs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#![feature(inline_const, const_type_id)]
|
||||||
|
|
||||||
|
use std::alloc::Layout;
|
||||||
|
use std::any::TypeId;
|
||||||
|
use std::mem::transmute;
|
||||||
|
use std::ptr::drop_in_place;
|
||||||
|
|
||||||
|
pub struct VTable {
|
||||||
|
layout: Layout,
|
||||||
|
type_id: TypeId,
|
||||||
|
drop_in_place: unsafe fn(*mut ()),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VTable {
|
||||||
|
pub fn new<T>() -> &'static Self {
|
||||||
|
const {
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
|
//~| ERROR the parameter type `T` may not live long enough
|
||||||
|
&VTable {
|
||||||
|
layout: Layout::new::<T>(),
|
||||||
|
type_id: TypeId::of::<T>(),
|
||||||
|
drop_in_place: unsafe {
|
||||||
|
transmute::<unsafe fn(*mut T), unsafe fn(*mut ())>(drop_in_place::<T>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
37
src/test/ui/consts/issue-102117.stderr
Normal file
37
src/test/ui/consts/issue-102117.stderr
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
|
--> $DIR/issue-102117.rs:16:9
|
||||||
|
|
|
||||||
|
LL | / const {
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | | &VTable {
|
||||||
|
... |
|
||||||
|
LL | | }
|
||||||
|
LL | | }
|
||||||
|
| |_________^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
||||||
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
||||||
|
LL | pub fn new<T: 'static>() -> &'static Self {
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
|
--> $DIR/issue-102117.rs:16:9
|
||||||
|
|
|
||||||
|
LL | / const {
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | | &VTable {
|
||||||
|
... |
|
||||||
|
LL | | }
|
||||||
|
LL | | }
|
||||||
|
| |_________^ ...so that the type `T` will meet its required lifetime bounds
|
||||||
|
|
|
||||||
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
||||||
|
LL | pub fn new<T: 'static>() -> &'static Self {
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0310`.
|
Loading…
Add table
Add a link
Reference in a new issue