Skip to content

Commit 92d848f

Browse files
committed
Prereq2 for async drop - ResumedAfterDrop panic messages
1 parent f8f9f26 commit 92d848f

File tree

12 files changed

+132
-47
lines changed

12 files changed

+132
-47
lines changed

compiler/rustc_const_eval/src/const_eval/machine.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ impl<'tcx> interpret::Machine<'tcx> for CompileTimeMachine<'tcx> {
502502
RemainderByZero(op) => RemainderByZero(eval_to_int(op)?),
503503
ResumedAfterReturn(coroutine_kind) => ResumedAfterReturn(*coroutine_kind),
504504
ResumedAfterPanic(coroutine_kind) => ResumedAfterPanic(*coroutine_kind),
505+
ResumedAfterDrop(coroutine_kind) => ResumedAfterDrop(*coroutine_kind),
505506
MisalignedPointerDereference { required, found } => MisalignedPointerDereference {
506507
required: eval_to_int(required)?,
507508
found: eval_to_int(found)?,

compiler/rustc_hir/src/lang_items.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ language_item_table! {
318318
PanicAsyncGenFnResumedPanic, sym::panic_const_async_gen_fn_resumed_panic, panic_const_async_gen_fn_resumed_panic, Target::Fn, GenericRequirement::None;
319319
PanicGenFnNonePanic, sym::panic_const_gen_fn_none_panic, panic_const_gen_fn_none_panic, Target::Fn, GenericRequirement::None;
320320
PanicNullPointerDereference, sym::panic_null_pointer_dereference, panic_null_pointer_dereference, Target::Fn, GenericRequirement::None;
321+
PanicCoroutineResumedDrop, sym::panic_const_coroutine_resumed_drop, panic_const_coroutine_resumed_drop, Target::Fn, GenericRequirement::None;
322+
PanicAsyncFnResumedDrop, sym::panic_const_async_fn_resumed_drop, panic_const_async_fn_resumed_drop, Target::Fn, GenericRequirement::None;
323+
PanicAsyncGenFnResumedDrop, sym::panic_const_async_gen_fn_resumed_drop, panic_const_async_gen_fn_resumed_drop, Target::Fn, GenericRequirement::None;
324+
PanicGenFnNoneDrop, sym::panic_const_gen_fn_none_drop, panic_const_gen_fn_none_drop, Target::Fn, GenericRequirement::None;
321325
/// libstd panic entry point. Necessary for const eval to be able to catch it
322326
BeginPanic, sym::begin_panic, begin_panic_fn, Target::Fn, GenericRequirement::None;
323327

compiler/rustc_middle/messages.ftl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
middle_assert_async_resume_after_drop = `async fn` resumed after async drop
2+
13
middle_assert_async_resume_after_panic = `async fn` resumed after panicking
24
35
middle_assert_async_resume_after_return = `async fn` resumed after completion
46
7+
middle_assert_coroutine_resume_after_drop = coroutine resumed after async drop
8+
59
middle_assert_coroutine_resume_after_panic = coroutine resumed after panicking
610
711
middle_assert_coroutine_resume_after_return = coroutine resumed after completion
812
913
middle_assert_divide_by_zero =
1014
attempt to divide `{$val}` by zero
1115
16+
middle_assert_gen_resume_after_drop = `gen` fn or block cannot be further iterated on after it async dropped
17+
1218
middle_assert_gen_resume_after_panic = `gen` fn or block cannot be further iterated on after it panicked
1319
1420
middle_assert_misaligned_ptr_deref =

compiler/rustc_middle/src/mir/syntax.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,7 @@ pub enum AssertKind<O> {
10661066
RemainderByZero(O),
10671067
ResumedAfterReturn(CoroutineKind),
10681068
ResumedAfterPanic(CoroutineKind),
1069+
ResumedAfterDrop(CoroutineKind),
10691070
MisalignedPointerDereference { required: O, found: O },
10701071
NullPointerDereference,
10711072
}

compiler/rustc_middle/src/mir/terminator.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,16 @@ impl<O> AssertKind<O> {
208208
LangItem::PanicGenFnNonePanic
209209
}
210210
NullPointerDereference => LangItem::PanicNullPointerDereference,
211+
ResumedAfterDrop(CoroutineKind::Coroutine(_)) => LangItem::PanicCoroutineResumedDrop,
212+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Async, _)) => {
213+
LangItem::PanicAsyncFnResumedDrop
214+
}
215+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _)) => {
216+
LangItem::PanicAsyncGenFnResumedDrop
217+
}
218+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Gen, _)) => {
219+
LangItem::PanicGenFnNoneDrop
220+
}
211221

212222
BoundsCheck { .. } | MisalignedPointerDereference { .. } => {
213223
bug!("Unexpected AssertKind")
@@ -298,6 +308,18 @@ impl<O> AssertKind<O> {
298308
ResumedAfterPanic(CoroutineKind::Desugared(CoroutineDesugaring::Gen, _)) => {
299309
write!(f, "\"`gen fn` should just keep returning `None` after panicking\"")
300310
}
311+
ResumedAfterDrop(CoroutineKind::Coroutine(_)) => {
312+
write!(f, "\"coroutine resumed after async drop\"")
313+
}
314+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Async, _)) => {
315+
write!(f, "\"`async fn` resumed after async drop\"")
316+
}
317+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _)) => {
318+
write!(f, "\"`async gen fn` resumed after async drop\"")
319+
}
320+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Gen, _)) => {
321+
write!(f, "\"`gen fn` resumed after drop\"")
322+
}
301323
}
302324
}
303325

@@ -345,6 +367,19 @@ impl<O> AssertKind<O> {
345367
middle_assert_coroutine_resume_after_panic
346368
}
347369
NullPointerDereference => middle_assert_null_ptr_deref,
370+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Async, _)) => {
371+
middle_assert_async_resume_after_drop
372+
}
373+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _)) => {
374+
todo!()
375+
}
376+
ResumedAfterDrop(CoroutineKind::Desugared(CoroutineDesugaring::Gen, _)) => {
377+
middle_assert_gen_resume_after_drop
378+
}
379+
ResumedAfterDrop(CoroutineKind::Coroutine(_)) => {
380+
middle_assert_coroutine_resume_after_drop
381+
}
382+
348383
MisalignedPointerDereference { .. } => middle_assert_misaligned_ptr_deref,
349384
}
350385
}
@@ -377,7 +412,10 @@ impl<O> AssertKind<O> {
377412
add!("left", format!("{left:#?}"));
378413
add!("right", format!("{right:#?}"));
379414
}
380-
ResumedAfterReturn(_) | ResumedAfterPanic(_) | NullPointerDereference => {}
415+
ResumedAfterReturn(_)
416+
| ResumedAfterPanic(_)
417+
| NullPointerDereference
418+
| ResumedAfterDrop(_) => {}
381419
MisalignedPointerDereference { required, found } => {
382420
add!("required", format!("{required:#?}"));
383421
add!("found", format!("{found:#?}"));

compiler/rustc_middle/src/mir/visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ macro_rules! make_mir_visitor {
635635
OverflowNeg(op) | DivisionByZero(op) | RemainderByZero(op) => {
636636
self.visit_operand(op, location);
637637
}
638-
ResumedAfterReturn(_) | ResumedAfterPanic(_) | NullPointerDereference => {
638+
ResumedAfterReturn(_) | ResumedAfterPanic(_) | NullPointerDereference | ResumedAfterDrop(_) => {
639639
// Nothing to visit
640640
}
641641
MisalignedPointerDereference { required, found } => {

compiler/rustc_smir/src/rustc_smir/convert/mir.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,9 @@ impl<'tcx> Stable<'tcx> for mir::AssertMessage<'tcx> {
494494
AssertKind::ResumedAfterPanic(coroutine) => {
495495
stable_mir::mir::AssertMessage::ResumedAfterPanic(coroutine.stable(tables))
496496
}
497+
AssertKind::ResumedAfterDrop(coroutine) => {
498+
stable_mir::mir::AssertMessage::ResumedAfterDrop(coroutine.stable(tables))
499+
}
497500
AssertKind::MisalignedPointerDereference { required, found } => {
498501
stable_mir::mir::AssertMessage::MisalignedPointerDereference {
499502
required: required.stable(tables),

compiler/rustc_smir/src/stable_mir/mir/body.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ pub enum AssertMessage {
267267
RemainderByZero(Operand),
268268
ResumedAfterReturn(CoroutineKind),
269269
ResumedAfterPanic(CoroutineKind),
270+
ResumedAfterDrop(CoroutineKind),
270271
MisalignedPointerDereference { required: Operand, found: Operand },
271272
NullPointerDereference,
272273
}
@@ -320,6 +321,22 @@ impl AssertMessage {
320321
_,
321322
)) => Ok("`gen fn` should just keep returning `AssertMessage::None` after panicking"),
322323

324+
AssertMessage::ResumedAfterDrop(CoroutineKind::Coroutine(_)) => {
325+
Ok("coroutine resumed after async drop")
326+
}
327+
AssertMessage::ResumedAfterDrop(CoroutineKind::Desugared(
328+
CoroutineDesugaring::Async,
329+
_,
330+
)) => Ok("`async fn` resumed after async drop"),
331+
AssertMessage::ResumedAfterDrop(CoroutineKind::Desugared(
332+
CoroutineDesugaring::Gen,
333+
_,
334+
)) => Ok("`async gen fn` resumed after async drop"),
335+
AssertMessage::ResumedAfterDrop(CoroutineKind::Desugared(
336+
CoroutineDesugaring::AsyncGen,
337+
_,
338+
)) => Ok("`gen fn` should just keep returning `AssertMessage::None` after async drop"),
339+
323340
AssertMessage::BoundsCheck { .. } => Ok("index out of bounds"),
324341
AssertMessage::MisalignedPointerDereference { .. } => {
325342
Ok("misaligned pointer dereference")

compiler/rustc_smir/src/stable_mir/mir/pretty.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,9 @@ fn pretty_assert_message<W: Write>(writer: &mut W, msg: &AssertMessage) -> io::R
312312
AssertMessage::NullPointerDereference => {
313313
write!(writer, "\"null pointer dereference occurred\"")
314314
}
315-
AssertMessage::ResumedAfterReturn(_) | AssertMessage::ResumedAfterPanic(_) => {
315+
AssertMessage::ResumedAfterReturn(_)
316+
| AssertMessage::ResumedAfterPanic(_)
317+
| AssertMessage::ResumedAfterDrop(_) => {
316318
write!(writer, "{}", msg.description().unwrap())
317319
}
318320
}

compiler/rustc_smir/src/stable_mir/mir/visit.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,8 @@ macro_rules! make_mir_visitor {
372372
}
373373
AssertMessage::ResumedAfterReturn(_)
374374
| AssertMessage::ResumedAfterPanic(_)
375-
| AssertMessage::NullPointerDereference => {
375+
| AssertMessage::NullPointerDereference
376+
| AssertMessage::ResumedAfterDrop(_) => {
376377
//nothing to visit
377378
}
378379
AssertMessage::MisalignedPointerDereference { required, found } => {

0 commit comments

Comments
 (0)