Do not promote values with const drop that need to be dropped
Changes from #88558 allowed using `~const Drop` in constants by introducing a new `NeedsNonConstDrop` qualif. The new qualif was also used for promotion purposes, and allowed promotion to happen for values that needs to be dropped but which do have a const drop impl. Since for promoted the drop implementation is never executed, this lead to observable change in behaviour. For example: ```rust struct Panic(); impl const Drop for Panic { fn drop(&mut self) { panic!(); } } fn main() { let _ = &Panic(); } ``` Restore the use of `NeedsDrop` qualif during promotion to avoid the issue.
This commit is contained in:
parent
171cbc01ef
commit
915a581bcb
6 changed files with 97 additions and 5 deletions
15
src/test/ui/consts/promoted-const-drop.rs
Normal file
15
src/test/ui/consts/promoted-const-drop.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#![feature(const_trait_impl)]
|
||||
#![feature(const_mut_refs)]
|
||||
|
||||
struct A();
|
||||
|
||||
impl const Drop for A {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
const C: A = A();
|
||||
|
||||
fn main() {
|
||||
let _: &'static A = &A(); //~ ERROR temporary value dropped while borrowed
|
||||
let _: &'static [A] = &[C]; //~ ERROR temporary value dropped while borrowed
|
||||
}
|
||||
24
src/test/ui/consts/promoted-const-drop.stderr
Normal file
24
src/test/ui/consts/promoted-const-drop.stderr
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/promoted-const-drop.rs:13:26
|
||||
|
|
||||
LL | let _: &'static A = &A();
|
||||
| ---------- ^^^ creates a temporary which is freed while still in use
|
||||
| |
|
||||
| type annotation requires that borrow lasts for `'static`
|
||||
LL | let _: &'static [A] = &[C];
|
||||
LL | }
|
||||
| - temporary value is freed at the end of this statement
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/promoted-const-drop.rs:14:28
|
||||
|
|
||||
LL | let _: &'static [A] = &[C];
|
||||
| ------------ ^^^ creates a temporary 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: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0716`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue