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
@ -584,6 +584,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||
// modify their locations.
|
||||
let all_facts = &mut None;
|
||||
let mut constraints = Default::default();
|
||||
let mut type_tests = Default::default();
|
||||
let mut closure_bounds = Default::default();
|
||||
let mut liveness_constraints =
|
||||
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 constraints,
|
||||
);
|
||||
mem::swap(&mut this.cx.borrowck_context.constraints.type_tests, &mut type_tests);
|
||||
mem::swap(
|
||||
&mut this.cx.borrowck_context.constraints.closure_bounds_mapping,
|
||||
&mut closure_bounds,
|
||||
@ -619,6 +621,13 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||
swap_constraints(self);
|
||||
|
||||
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() {
|
||||
let mut constraint = constraint.clone();
|
||||
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…
x
Reference in New Issue
Block a user