Close accidental promotion check hole
This commit is contained in:
parent
bb6755859c
commit
9ec72dfe72
7 changed files with 99 additions and 16 deletions
|
@ -216,12 +216,6 @@ impl<'tcx> Validator<'_, 'tcx> {
|
||||||
return Err(Unpromotable);
|
return Err(Unpromotable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We cannot promote things that need dropping, since the promoted value
|
|
||||||
// would not get dropped.
|
|
||||||
if self.qualif_local::<qualifs::NeedsDrop>(place.local) {
|
|
||||||
return Err(Unpromotable);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
_ => bug!(),
|
_ => bug!(),
|
||||||
|
@ -262,13 +256,17 @@ impl<'tcx> Validator<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let span = self.body.local_decls[local].source_info.span;
|
false
|
||||||
span_bug!(span, "{:?} not promotable, qualif_local shouldn't have been called", local);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn validate_local(&mut self, local: Local) -> Result<(), Unpromotable> {
|
fn validate_local(&mut self, local: Local) -> Result<(), Unpromotable> {
|
||||||
if let TempState::Defined { location: loc, uses, valid } = self.temps[local] {
|
if let TempState::Defined { location: loc, uses, valid } = self.temps[local] {
|
||||||
|
// We cannot promote things that need dropping, since the promoted value
|
||||||
|
// would not get dropped.
|
||||||
|
if self.qualif_local::<qualifs::NeedsDrop>(local) {
|
||||||
|
return Err(Unpromotable);
|
||||||
|
}
|
||||||
valid.or_else(|_| {
|
valid.or_else(|_| {
|
||||||
let ok = {
|
let ok = {
|
||||||
let block = &self.body[loc.block];
|
let block = &self.body[loc.block];
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// check-pass
|
|
||||||
// known-bug: #91009
|
|
||||||
|
|
||||||
#![feature(const_mut_refs)]
|
#![feature(const_mut_refs)]
|
||||||
#![feature(const_trait_impl)]
|
#![feature(const_trait_impl)]
|
||||||
struct Panic;
|
struct Panic;
|
||||||
|
@ -8,6 +5,8 @@ impl const Drop for Panic { fn drop(&mut self) { panic!(); } }
|
||||||
pub const fn id<T>(x: T) -> T { x }
|
pub const fn id<T>(x: T) -> T { x }
|
||||||
pub const C: () = {
|
pub const C: () = {
|
||||||
let _: &'static _ = &id(&Panic);
|
let _: &'static _ = &id(&Panic);
|
||||||
|
//~^ ERROR: temporary value dropped while borrowed
|
||||||
|
//~| ERROR: temporary value dropped while borrowed
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
23
src/test/ui/consts/promoted_const_call.stderr
Normal file
23
src/test/ui/consts/promoted_const_call.stderr
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call.rs:7:26
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&Panic);
|
||||||
|
| ---------- ^^^^^^^^^^ creates a temporary value which is freed while still in use
|
||||||
|
| |
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
...
|
||||||
|
LL | };
|
||||||
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call.rs:7:30
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&Panic);
|
||||||
|
| ---------- ^^^^^ - temporary value is freed at the end of this statement
|
||||||
|
| | |
|
||||||
|
| | creates a temporary value which is freed while still in use
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0716`.
|
|
@ -1,10 +1,10 @@
|
||||||
// check-pass
|
|
||||||
// known-bug: #91009
|
|
||||||
|
|
||||||
#![feature(const_precise_live_drops)]
|
#![feature(const_precise_live_drops)]
|
||||||
pub const fn id<T>(x: T) -> T { x }
|
pub const fn id<T>(x: T) -> T { x }
|
||||||
pub const C: () = {
|
pub const C: () = {
|
||||||
let _: &'static _ = &id(&String::new());
|
let _: &'static _ = &id(&String::new());
|
||||||
|
//~^ ERROR: temporary value dropped while borrowed
|
||||||
|
//~| ERROR: temporary value dropped while borrowed
|
||||||
|
//~| ERROR: destructor of `String` cannot be evaluated at compile-time
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
30
src/test/ui/consts/promoted_const_call2.stderr
Normal file
30
src/test/ui/consts/promoted_const_call2.stderr
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call2.rs:4:26
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&String::new());
|
||||||
|
| ---------- ^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
|
||||||
|
| |
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
...
|
||||||
|
LL | };
|
||||||
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call2.rs:4:30
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&String::new());
|
||||||
|
| ---------- ^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
|
||||||
|
| | |
|
||||||
|
| | creates a temporary value which is freed while still in use
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
|
||||||
|
error[E0493]: destructor of `String` cannot be evaluated at compile-time
|
||||||
|
--> $DIR/promoted_const_call2.rs:4:30
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&String::new());
|
||||||
|
| ^^^^^^^^^^^^^ the destructor for this type cannot be evaluated in constants
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0493, E0716.
|
||||||
|
For more information about an error, try `rustc --explain E0493`.
|
|
@ -6,9 +6,11 @@ pub const C: () = {
|
||||||
|
|
||||||
let _: &'static _ = &id(&String::new());
|
let _: &'static _ = &id(&String::new());
|
||||||
//~^ ERROR: destructor of `String` cannot be evaluated at compile-time
|
//~^ ERROR: destructor of `String` cannot be evaluated at compile-time
|
||||||
|
//~| ERROR: temporary value dropped while borrowed
|
||||||
|
//~| ERROR: temporary value dropped while borrowed
|
||||||
|
|
||||||
let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
|
let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
|
||||||
// Promoted. bug!
|
//~^ ERROR: temporary value dropped while borrowed
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -26,7 +26,38 @@ LL | let _: &'static _ = &String::new();
|
||||||
LL | };
|
LL | };
|
||||||
| - temporary value is freed at the end of this statement
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call3.rs:7:26
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&String::new());
|
||||||
|
| ---------- ^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
|
||||||
|
| |
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
...
|
||||||
|
LL | };
|
||||||
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call3.rs:7:30
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &id(&String::new());
|
||||||
|
| ---------- ^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
|
||||||
|
| | |
|
||||||
|
| | creates a temporary value which is freed while still in use
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
|
||||||
|
error[E0716]: temporary value dropped while borrowed
|
||||||
|
--> $DIR/promoted_const_call3.rs:12:26
|
||||||
|
|
|
||||||
|
LL | let _: &'static _ = &std::mem::ManuallyDrop::new(String::new());
|
||||||
|
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
|
||||||
|
| |
|
||||||
|
| type annotation requires that borrow lasts for `'static`
|
||||||
|
LL |
|
||||||
|
LL | };
|
||||||
|
| - temporary value is freed at the end of this statement
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0493, E0716.
|
Some errors have detailed explanations: E0493, E0716.
|
||||||
For more information about an error, try `rustc --explain E0493`.
|
For more information about an error, try `rustc --explain E0493`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue