Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add second message for LiveDrop errors #73515

Merged
merged 2 commits into from
Jun 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -12,6 +12,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
pvdrz marked this conversation as resolved.
Show resolved Hide resolved
| |
| 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