Skip to content

Commit

Permalink
Rollup merge of rust-lang#73515 - christianpoveda:livedrop-diagnostic…
Browse files Browse the repository at this point in the history
…s, r=oli-obk

Add second message for LiveDrop errors

This is an attempt to fix rust-lang#72907 by adding a second message to the `LiveDrop` diagnostics. Changing from this
```
error[E0493]: destructors cannot be evaluated at compile-time
 --> src/lib.rs:7:9
  |
7 |     let mut always_returned = None;
  |         ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors

error: aborting due to previous error
```
to this
```
error[E0493]: destructors cannot be evaluated at compile-time
  --> foo.rs:6:9
   |
6  |     let mut always_returned = None;
   |         ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors
...
10 |         always_returned = never_returned;
   |         --------------- value is dropped here

error: aborting due to previous error
```
r? @RalfJung @ecstatic-morse
  • Loading branch information
Manishearth committed Jun 22, 2020
2 parents 9916c09 + 9355168 commit 59b57b2
Show file tree
Hide file tree
Showing 14 changed files with 120 additions and 24 deletions.
13 changes: 8 additions & 5 deletions src/librustc_mir/transform/check_consts/ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,20 @@ pub struct InlineAsm;
impl NonConstOp for InlineAsm {}

#[derive(Debug)]
pub struct LiveDrop;
pub struct LiveDrop(pub Option<Span>);
impl NonConstOp for LiveDrop {
fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
struct_span_err!(
let mut diagnostic = struct_span_err!(
ccx.tcx.sess,
span,
E0493,
"destructors cannot be evaluated at compile-time"
)
.span_label(span, format!("{}s cannot evaluate destructors", ccx.const_kind()))
.emit();
);
diagnostic.span_label(span, format!("{}s cannot evaluate destructors", ccx.const_kind()));
if let Some(span) = self.0 {
diagnostic.span_label(span, "value is dropped here");
}
diagnostic.emit();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ impl std::ops::Deref for CheckLiveDrops<'mir, 'tcx> {

impl CheckLiveDrops<'mir, 'tcx> {
fn check_live_drop(&self, span: Span) {
ops::non_const(self.ccx, ops::LiveDrop, span);
ops::non_const(self.ccx, ops::LiveDrop(None), span);
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/librustc_mir/transform/check_consts/validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,10 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
};

if needs_drop {
self.check_op_spanned(ops::LiveDrop, err_span);
self.check_op_spanned(
ops::LiveDrop(Some(terminator.source_info.span)),
err_span,
);
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/test/ui/check-static-values-constraints.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ LL | ..SafeStruct{field1: SafeEnum::Va
| ___________________________________________^
LL | |
LL | | field2: SafeEnum::Variant1}};
| |________________________________________________________________________________^ statics cannot evaluate destructors
| | ^- value is dropped here
| |________________________________________________________________________________|
| statics cannot evaluate destructors

error[E0010]: allocations are not allowed in statics
--> $DIR/check-static-values-constraints.rs:79:33
Expand Down
16 changes: 12 additions & 4 deletions src/test/ui/consts/const-eval/const_let.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,33 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/const_let.rs:16:32
|
LL | const Y: FakeNeedsDrop = { let mut x = FakeNeedsDrop; x = FakeNeedsDrop; x };
| ^^^^^ constants cannot evaluate destructors
| ^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/const_let.rs:20:33
|
LL | const Y2: FakeNeedsDrop = { let mut x; x = FakeNeedsDrop; x = FakeNeedsDrop; x };
| ^^^^^ constants cannot evaluate destructors
| ^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/const_let.rs:24:21
|
LL | const Z: () = { let mut x = None; x = Some(FakeNeedsDrop); };
| ^^^^^ constants cannot evaluate destructors
| ^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/const_let.rs:28:22
|
LL | const Z2: () = { let mut x; x = None; x = Some(FakeNeedsDrop); };
| ^^^^^ constants cannot evaluate destructors
| ^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error: aborting due to 4 previous errors

Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/consts/const-eval/issue-65394.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
|
LL | let mut x = Vec::<i32>::new();
| ^^^^^ constants cannot evaluate destructors
...
LL | };
| - value is dropped here

error: aborting due to 2 previous errors

Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/consts/const-eval/livedrop.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![feature(const_if_match)]
#![feature(const_loop)]

const _: Option<Vec<i32>> = {
let mut never_returned = Some(Vec::new());
let mut always_returned = None; //~ ERROR destructors cannot be evaluated at compile-time

let mut i = 0;
loop {
always_returned = never_returned;
never_returned = None;

i += 1;
if i == 10 {
break always_returned;
}
}
};

fn main() {}
12 changes: 12 additions & 0 deletions src/test/ui/consts/const-eval/livedrop.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/livedrop.rs:6:9
|
LL | let mut always_returned = None;
| ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors
...
LL | always_returned = never_returned;
| --------------- value is dropped here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0493`.
12 changes: 12 additions & 0 deletions src/test/ui/consts/control-flow/drop-fail.stock.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,36 @@ error[E0493]: destructors cannot be evaluated at compile-time
|
LL | let x = Some(Vec::new());
| ^ constants cannot evaluate destructors
...
LL | };
| - value is dropped here

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/drop-fail.rs:23:9
|
LL | let vec_tuple = (Vec::new(),);
| ^^^^^^^^^ constants cannot evaluate destructors
...
LL | };
| - value is dropped here

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/drop-fail.rs:31:9
|
LL | let x: Result<_, Vec<i32>> = Ok(Vec::new());
| ^ constants cannot evaluate destructors
...
LL | };
| - value is dropped here

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/drop-fail.rs:41:9
|
LL | let mut tmp = None;
| ^^^^^^^ constants cannot evaluate destructors
...
LL | };
| - value is dropped here

error: aborting due to 4 previous errors

Expand Down
12 changes: 9 additions & 3 deletions src/test/ui/consts/min_const_fn/min_const_fn.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/min_const_fn.rs:37:25
|
LL | const fn into_inner(self) -> T { self.0 }
| ^^^^ constant functions cannot evaluate destructors
| ^^^^ - value is dropped here
| |
| constant functions cannot evaluate destructors

error[E0723]: mutable references in const fn are unstable
--> $DIR/min_const_fn.rs:39:36
Expand All @@ -17,7 +19,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/min_const_fn.rs:44:28
|
LL | const fn into_inner_lt(self) -> T { self.0 }
| ^^^^ constant functions cannot evaluate destructors
| ^^^^ - value is dropped here
| |
| constant functions cannot evaluate destructors

error[E0723]: mutable references in const fn are unstable
--> $DIR/min_const_fn.rs:46:42
Expand All @@ -32,7 +36,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/min_const_fn.rs:51:27
|
LL | const fn into_inner_s(self) -> T { self.0 }
| ^^^^ constant functions cannot evaluate destructors
| ^^^^ - value is dropped here
| |
| constant functions cannot evaluate destructors

error[E0723]: mutable references in const fn are unstable
--> $DIR/min_const_fn.rs:53:38
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/feature-gate-unleash_the_miri_inside_of_you.rs:11:20
|
LL | const F: u32 = (U::X, 42).1;
| ^^^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error: aborting due to previous error

Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/consts/unstable-const-fn-in-libcore.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,18 @@ error[E0493]: destructors cannot be evaluated at compile-time
|
LL | const fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T {
| ^ constant functions cannot evaluate destructors
...
LL | }
| - value is dropped here

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/unstable-const-fn-in-libcore.rs:19:47
|
LL | const fn unwrap_or_else<F: FnOnce() -> T>(self, f: F) -> T {
| ^^^^ constant functions cannot evaluate destructors
...
LL | }
| - value is dropped here

error: aborting due to 3 previous errors

Expand Down
4 changes: 3 additions & 1 deletion src/test/ui/span/E0493.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/E0493.rs:17:17
|
LL | const F : Foo = (Foo { a : 0 }, Foo { a : 1 }).1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error: aborting due to previous error

Expand Down
31 changes: 24 additions & 7 deletions src/test/ui/static/static-drop-scope.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:9:60
|
LL | static PROMOTION_FAIL_S: Option<&'static WithDtor> = Some(&WithDtor);
| ^^^^^^^^ statics cannot evaluate destructors
| ^^^^^^^^- value is dropped here
| |
| statics cannot evaluate destructors

error[E0716]: temporary value dropped while borrowed
--> $DIR/static-drop-scope.rs:9:60
Expand All @@ -18,7 +20,9 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:13:59
|
LL | const PROMOTION_FAIL_C: Option<&'static WithDtor> = Some(&WithDtor);
| ^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^- value is dropped here
| |
| constants cannot evaluate destructors

error[E0716]: temporary value dropped while borrowed
--> $DIR/static-drop-scope.rs:13:59
Expand All @@ -34,37 +38,50 @@ error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:17:28
|
LL | static EARLY_DROP_S: i32 = (WithDtor, 0).1;
| ^^^^^^^^^^^^^ statics cannot evaluate destructors
| ^^^^^^^^^^^^^ - value is dropped here
| |
| statics cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:20:27
|
LL | const EARLY_DROP_C: i32 = (WithDtor, 0).1;
| ^^^^^^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:23:24
|
LL | const fn const_drop<T>(_: T) {}
| ^ constant functions cannot evaluate destructors
| ^ - value is dropped here
| |
| constant functions cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:27:5
|
LL | (x, ()).1
| ^^^^^^^ constant functions cannot evaluate destructors
LL |
LL | }
| - value is dropped here

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:31:34
|
LL | const EARLY_DROP_C_OPTION: i32 = (Some(WithDtor), 0).1;
| ^^^^^^^^^^^^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^^^^^^^^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error[E0493]: destructors cannot be evaluated at compile-time
--> $DIR/static-drop-scope.rs:36:43
|
LL | const EARLY_DROP_C_OPTION_CONSTANT: i32 = (HELPER, 0).1;
| ^^^^^^^^^^^ constants cannot evaluate destructors
| ^^^^^^^^^^^ - value is dropped here
| |
| constants cannot evaluate destructors

error: aborting due to 10 previous errors

Expand Down

0 comments on commit 59b57b2

Please sign in to comment.