add comment and test: we do not do value-based reasoning for promotion of unions

This commit is contained in:
Ralf Jung 2024-02-29 10:14:16 +01:00
parent 4cdd20584c
commit d9a2886ef8
3 changed files with 46 additions and 25 deletions

View File

@ -284,6 +284,7 @@ where
if Q::in_adt_inherently(cx, def, args) { if Q::in_adt_inherently(cx, def, args) {
return true; return true;
} }
// Don't do any value-based reasoning for unions.
if def.is_union() && Q::in_any_value_of_ty(cx, rvalue.ty(cx.body, cx.tcx)) { if def.is_union() && Q::in_any_value_of_ty(cx, rvalue.ty(cx.body, cx.tcx)) {
return true; return true;
} }

View File

@ -3,6 +3,7 @@
#![allow(unconditional_panic)] #![allow(unconditional_panic)]
use std::cell::Cell; use std::cell::Cell;
use std::mem::ManuallyDrop;
// We do not promote mutable references. // We do not promote mutable references.
static mut TEST1: Option<&mut [i32]> = Some(&mut [1, 2, 3]); //~ ERROR temporary value dropped while borrowed static mut TEST1: Option<&mut [i32]> = Some(&mut [1, 2, 3]); //~ ERROR temporary value dropped while borrowed
@ -69,4 +70,12 @@ fn main() {
let _val: &'static _ = &[&TEST_DROP; 1]; let _val: &'static _ = &[&TEST_DROP; 1];
//~^ ERROR temporary value dropped while borrowed //~^ ERROR temporary value dropped while borrowed
//~| ERROR temporary value dropped while borrowed //~| ERROR temporary value dropped while borrowed
// Make sure there is no value-based reasoning for unions.
union UnionWithCell {
f1: i32,
f2: ManuallyDrop<Cell<i32>>,
}
let x: &'static _ = &UnionWithCell { f1: 0 };
//~^ ERROR temporary value dropped while borrowed
} }

View File

@ -1,5 +1,5 @@
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:8:50 --> $DIR/promote-not.rs:9:50
| |
LL | static mut TEST1: Option<&mut [i32]> = Some(&mut [1, 2, 3]); LL | static mut TEST1: Option<&mut [i32]> = Some(&mut [1, 2, 3]);
| ----------^^^^^^^^^- | ----------^^^^^^^^^-
@ -9,7 +9,7 @@ LL | static mut TEST1: Option<&mut [i32]> = Some(&mut [1, 2, 3]);
| using this value as a static requires that borrow lasts for `'static` | using this value as a static requires that borrow lasts for `'static`
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:11:18 --> $DIR/promote-not.rs:12:18
| |
LL | let x = &mut [1,2,3]; LL | let x = &mut [1,2,3];
| ^^^^^^^ creates a temporary value which is freed while still in use | ^^^^^^^ creates a temporary value which is freed while still in use
@ -19,7 +19,7 @@ LL | };
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:33:29 --> $DIR/promote-not.rs:34:29
| |
LL | let _x: &'static i32 = &unsafe { U { x: 0 }.x }; LL | let _x: &'static i32 = &unsafe { U { x: 0 }.x };
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ------------ ^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -29,7 +29,7 @@ LL | };
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:39:29 --> $DIR/promote-not.rs:40:29
| |
LL | let _val: &'static _ = &(Cell::new(1), 2).1; LL | let _val: &'static _ = &(Cell::new(1), 2).1;
| ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -39,7 +39,7 @@ LL | };
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:20:32 --> $DIR/promote-not.rs:21:32
| |
LL | let _x: &'static () = &foo(); LL | let _x: &'static () = &foo();
| ----------- ^^^^^ creates a temporary value which is freed while still in use | ----------- ^^^^^ creates a temporary value which is freed while still in use
@ -49,7 +49,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:28:29 --> $DIR/promote-not.rs:29:29
| |
LL | let _x: &'static i32 = &unsafe { U { x: 0 }.x }; LL | let _x: &'static i32 = &unsafe { U { x: 0 }.x };
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ------------ ^^^^^^^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -59,7 +59,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:46:29 --> $DIR/promote-not.rs:47:29
| |
LL | let _val: &'static _ = &(Cell::new(1), 2).0; LL | let _val: &'static _ = &(Cell::new(1), 2).0;
| ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -70,7 +70,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:47:29 --> $DIR/promote-not.rs:48:29
| |
LL | let _val: &'static _ = &(Cell::new(1), 2).1; LL | let _val: &'static _ = &(Cell::new(1), 2).1;
| ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -81,7 +81,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:50:29 --> $DIR/promote-not.rs:51:29
| |
LL | let _val: &'static _ = &(1/0); LL | let _val: &'static _ = &(1/0);
| ---------- ^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^ creates a temporary value which is freed while still in use
@ -92,7 +92,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:51:29 --> $DIR/promote-not.rs:52:29
| |
LL | let _val: &'static _ = &(1/(1-1)); LL | let _val: &'static _ = &(1/(1-1));
| ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use
@ -103,7 +103,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:52:29 --> $DIR/promote-not.rs:53:29
| |
LL | let _val: &'static _ = &((1+1)/(1-1)); LL | let _val: &'static _ = &((1+1)/(1-1));
| ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -114,7 +114,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:53:29 --> $DIR/promote-not.rs:54:29
| |
LL | let _val: &'static _ = &(i32::MIN/-1); LL | let _val: &'static _ = &(i32::MIN/-1);
| ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -125,7 +125,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:54:29 --> $DIR/promote-not.rs:55:29
| |
LL | let _val: &'static _ = &(i32::MIN/(0-1)); LL | let _val: &'static _ = &(i32::MIN/(0-1));
| ---------- ^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -136,7 +136,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:55:29 --> $DIR/promote-not.rs:56:29
| |
LL | let _val: &'static _ = &(-128i8/-1); LL | let _val: &'static _ = &(-128i8/-1);
| ---------- ^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -147,7 +147,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:56:29 --> $DIR/promote-not.rs:57:29
| |
LL | let _val: &'static _ = &(1%0); LL | let _val: &'static _ = &(1%0);
| ---------- ^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^ creates a temporary value which is freed while still in use
@ -158,7 +158,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:57:29 --> $DIR/promote-not.rs:58:29
| |
LL | let _val: &'static _ = &(1%(1-1)); LL | let _val: &'static _ = &(1%(1-1));
| ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use
@ -169,7 +169,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:58:29 --> $DIR/promote-not.rs:59:29
| |
LL | let _val: &'static _ = &([1,2,3][4]+1); LL | let _val: &'static _ = &([1,2,3][4]+1);
| ---------- ^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -180,7 +180,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:61:29 --> $DIR/promote-not.rs:62:29
| |
LL | let _val: &'static _ = &TEST_DROP; LL | let _val: &'static _ = &TEST_DROP;
| ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use
@ -191,7 +191,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:63:29 --> $DIR/promote-not.rs:64:29
| |
LL | let _val: &'static _ = &&TEST_DROP; LL | let _val: &'static _ = &&TEST_DROP;
| ---------- ^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -202,7 +202,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:63:30 --> $DIR/promote-not.rs:64:30
| |
LL | let _val: &'static _ = &&TEST_DROP; LL | let _val: &'static _ = &&TEST_DROP;
| ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use
@ -213,7 +213,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:66:29 --> $DIR/promote-not.rs:67:29
| |
LL | let _val: &'static _ = &(&TEST_DROP,); LL | let _val: &'static _ = &(&TEST_DROP,);
| ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -224,7 +224,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:66:31 --> $DIR/promote-not.rs:67:31
| |
LL | let _val: &'static _ = &(&TEST_DROP,); LL | let _val: &'static _ = &(&TEST_DROP,);
| ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^ creates a temporary value which is freed while still in use
@ -235,7 +235,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:69:29 --> $DIR/promote-not.rs:70:29
| |
LL | let _val: &'static _ = &[&TEST_DROP; 1]; LL | let _val: &'static _ = &[&TEST_DROP; 1];
| ---------- ^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use | ---------- ^^^^^^^^^^^^^^^ creates a temporary value which is freed while still in use
@ -246,7 +246,7 @@ LL | }
| - temporary value is freed at the end of this statement | - temporary value is freed at the end of this statement
error[E0716]: temporary value dropped while borrowed error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:69:31 --> $DIR/promote-not.rs:70:31
| |
LL | let _val: &'static _ = &[&TEST_DROP; 1]; LL | let _val: &'static _ = &[&TEST_DROP; 1];
| ---------- ^^^^^^^^^ - temporary value is freed at the end of this statement | ---------- ^^^^^^^^^ - temporary value is freed at the end of this statement
@ -254,6 +254,17 @@ LL | let _val: &'static _ = &[&TEST_DROP; 1];
| | creates a temporary value which is freed while still in use | | creates a temporary value which is freed while still in use
| type annotation requires that borrow lasts for `'static` | type annotation requires that borrow lasts for `'static`
error: aborting due to 24 previous errors error[E0716]: temporary value dropped while borrowed
--> $DIR/promote-not.rs:79:26
|
LL | let x: &'static _ = &UnionWithCell { f1: 0 };
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^ 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 25 previous errors
For more information about this error, try `rustc --explain E0716`. For more information about this error, try `rustc --explain E0716`.