Skip to content

[WIP] Check coroutine upvars and resume ty in dtorck constraint, this time based off of TypingMode #144158

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

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

compiler-errors
Copy link
Member

@compiler-errors compiler-errors commented Jul 18, 2025

cc #144156, see the paragraph about a better approach.

This is broken until we start using TypingMode::Borrowck unconditionally. This also has some perf implications, since there were a few places we were collapsing TypingMode::Borrowck { defining_opaque_types: [] } into a non-body analysis typing mode, which means we may have to go back to splitting the caching between these modes.

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jul 18, 2025
@rust-log-analyzer
Copy link
Collaborator

The job aarch64-gnu-llvm-19-1 failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)

1 error[E0597]: `a` does not live long enough
2   --> $DIR/borrowing.rs:9:46
3    |
- LL |     let _b = {
-    |         -- borrow later stored here
6 LL |         let a = 3;
7    |             - binding `a` declared here
8 LL |         Pin::new(&mut #[coroutine] || yield &a).resume(())

-    |                                    --        ^ borrowed value does not live long enough
-    |                                    |
+    |                                    ----------^
+    |                                    |         |
---
+    |     |
+    |     `a` dropped here while still borrowed
+    |
+    = note: the temporary is part of an expression at the end of a block;
+            consider forcing this temporary to be dropped sooner, before the block's local variables are dropped
+ help: for example, you could save the expression's value in a new local variable `x` and then make `x` be the expression at the end of the block
+    |
+ LL |         let x = Pin::new(&mut #[coroutine] || yield &a).resume(()); x
+    |         +++++++                                                   +++
15 
16 error[E0597]: `a` does not live long enough
17   --> $DIR/borrowing.rs:16:20


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args coroutine/borrowing.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/coroutine/borrowing.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/coroutine/borrowing" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers"
stdout: none
--- stderr -------------------------------
error[E0597]: `a` does not live long enough
##[error]  --> /checkout/tests/ui/coroutine/borrowing.rs:9:46
   |
LL |         let a = 3;
   |             - binding `a` declared here
LL |         Pin::new(&mut #[coroutine] || yield &a).resume(())
   |                                    ----------^
   |                                    |         |
   |                                    |         borrowed value does not live long enough
   |                                    value captured here by coroutine
   |                                    a temporary with access to the borrow is created here ...
LL |         //~^ ERROR: `a` does not live long enough
LL |     };
   |     -- ... and the borrow might be used here, when that temporary is dropped and runs the destructor for coroutine
   |     |
   |     `a` dropped here while still borrowed
   |
   = note: the temporary is part of an expression at the end of a block;
           consider forcing this temporary to be dropped sooner, before the block's local variables are dropped
help: for example, you could save the expression's value in a new local variable `x` and then make `x` be the expression at the end of the block
   |
LL |         let x = Pin::new(&mut #[coroutine] || yield &a).resume(()); x
   |         +++++++                                                   +++

error[E0597]: `a` does not live long enough
##[error]  --> /checkout/tests/ui/coroutine/borrowing.rs:16:20
   |
LL |     let _b = {
   |         -- borrow later stored here
LL |         let a = 3;
   |             - binding `a` declared here
LL |         #[coroutine] || {
   |                      -- value captured here by coroutine
LL |             yield &a
   |                    ^ borrowed value does not live long enough
...
LL |     };
   |     - `a` dropped here while still borrowed

error: aborting due to 2 previous errors
---
---- [ui] tests/ui/coroutine/check-resume-ty-lifetimes.rs stdout ----
Saved the actual stderr to `/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/coroutine/check-resume-ty-lifetimes/check-resume-ty-lifetimes.stderr`
diff of stderr:

7 LL |             let x: &'static str = yield ();
8    |                    ^^^^^^^^^^^^ type annotation requires that `'1` must outlive `'static`
9 
- error: aborting due to 1 previous error
+ error[E0503]: cannot use `storage` because it was mutably borrowed
+   --> $DIR/check-resume-ty-lifetimes.rs:24:5
+    |
+ LL |         |_: &str| {
+    |         --------- `storage` is borrowed here
+ ...
+ LL |             storage = Some(x);
+    |             ------- borrow occurs due to use of `storage` in coroutine
+ ...
+ LL |     storage.unwrap()
---
-   --> /checkout/tests/ui/coroutine/check-resume-ty-lifetimes.rs:24:5
+ error[E0503]: cannot use `storage` because it was mutably borrowed
+   --> $DIR/check-resume-ty-lifetimes.rs:24:5
+    |
+ LL |         |_: &str| {
+    |         --------- `storage` is borrowed here
+ ...
+ LL |             storage = Some(x);
+    |             ------- borrow occurs due to use of `storage` in coroutine
+ ...
+ LL |     storage.unwrap()
---
To only update this specific test, also pass `--test-args coroutine/check-resume-ty-lifetimes.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/coroutine/check-resume-ty-lifetimes.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/coroutine/check-resume-ty-lifetimes" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers"
stdout: none
--- stderr -------------------------------
error: lifetime may not live long enough
##[error]  --> /checkout/tests/ui/coroutine/check-resume-ty-lifetimes.rs:15:20
   |
LL | fn mk_static(s: &str) -> &'static str {
   |                 - let's call the lifetime of this reference `'1`
...
LL |             let x: &'static str = yield ();
   |                    ^^^^^^^^^^^^ type annotation requires that `'1` must outlive `'static`

error[E0503]: cannot use `storage` because it was mutably borrowed
##[error]  --> /checkout/tests/ui/coroutine/check-resume-ty-lifetimes.rs:24:5
   |
LL |         |_: &str| {
   |         --------- `storage` is borrowed here
...
LL |             storage = Some(x);
   |             ------- borrow occurs due to use of `storage` in coroutine
...
LL |     storage.unwrap()
---
---- [ui] tests/ui/coroutine/issue-110929-coroutine-conflict-error-ice.rs stdout ----

error: test compilation failed although it shouldn't!
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/coroutine/issue-110929-coroutine-conflict-error-ice.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/coroutine/issue-110929-coroutine-conflict-error-ice" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2021"
stdout: none
--- stderr -------------------------------
error[E0499]: cannot borrow `*x` as mutable more than once at a time
##[error]  --> /checkout/tests/ui/coroutine/issue-110929-coroutine-conflict-error-ice.rs:10:9
   |
LL |         || yield *&mut *x;
   |         --             -- first borrow occurs due to use of `*x` in coroutine
   |         |
   |         first mutable borrow occurs here
LL |         || _ = &mut *x;
   |         ^^          -- second borrow occurs due to use of `*x` in closure
   |         |
   |         second mutable borrow occurs here
LL |     };
   |     - first borrow might be used here, when `_c` is dropped and runs the destructor for coroutine

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0499`.
------------------------------------------
---
11 error: aborting due to 1 previous error
12 

Note: some mismatched output was normalized before being compared
- LL |     //~^ ERROR cannot borrow `thing` as mutable more than once at a time
+    |                         ^^^^^^^^^^ second mutable borrow occurs here
+ LL |
+ LL | }
+    | - first borrow might be used here, when `gen` is dropped and runs the destructor for coroutine


The actual stderr differed from the expected stderr
To update references, rerun the tests and pass the `--bless` flag
To only update this specific test, also pass `--test-args coroutine/retain-resume-ref.rs`

error: 1 errors occurred comparing output.
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/coroutine/retain-resume-ref.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/coroutine/retain-resume-ref" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers"
stdout: none
--- stderr -------------------------------
error[E0499]: cannot borrow `thing` as mutable more than once at a time
##[error]  --> /checkout/tests/ui/coroutine/retain-resume-ref.rs:24:25
   |
LL |     gen.as_mut().resume(&mut thing);
   |                         ---------- first mutable borrow occurs here
LL |     gen.as_mut().resume(&mut thing);
   |                         ^^^^^^^^^^ second mutable borrow occurs here
LL |     //~^ ERROR cannot borrow `thing` as mutable more than once at a time
LL | }
   | - first borrow might be used here, when `gen` is dropped and runs the destructor for coroutine

error: aborting due to 1 previous error

---
---- [ui] tests/ui/dropck/coroutine-liveness-1.rs stdout ----

error: test compilation failed although it shouldn't!
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/dropck/coroutine-liveness-1.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/dropck/coroutine-liveness-1" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2021"
stdout: none
--- stderr -------------------------------
error[E0505]: cannot move out of `recv` because it is borrowed
##[error]  --> /checkout/tests/ui/dropck/coroutine-liveness-1.rs:13:10
   |
---
...
LL |     drop(recv);
   |          ^^^^ move out of `recv` occurs here
LL | }
   | - borrow might be used here, when `_combined_fut` is dropped and runs the destructor for coroutine

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0505`.
------------------------------------------


---- [ui] tests/ui/dropck/coroutine-liveness-2.rs stdout ----

error: test compilation failed although it shouldn't!
status: exit status: 1
command: env -u RUSTC_LOG_COLOR RUSTC_ICE="0" RUST_BACKTRACE="short" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2/bin/rustc" "/checkout/tests/ui/dropck/coroutine-liveness-2.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "-Z" "ignore-directory-in-diagnostics-source-blocks=/cargo" "-Z" "ignore-directory-in-diagnostics-source-blocks=/checkout/vendor" "--sysroot" "/checkout/obj/build/aarch64-unknown-linux-gnu/stage2" "--target=aarch64-unknown-linux-gnu" "--check-cfg" "cfg(test,FALSE)" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Zwrite-long-types-to-disk=no" "-Cstrip=debuginfo" "--emit" "metadata" "-C" "prefer-dynamic" "--out-dir" "/checkout/obj/build/aarch64-unknown-linux-gnu/test/ui/dropck/coroutine-liveness-2" "-A" "unused" "-A" "internal_features" "-A" "unused_parens" "-A" "unused_braces" "-Crpath" "-Cdebuginfo=0" "-Lnative=/checkout/obj/build/aarch64-unknown-linux-gnu/native/rust-test-helpers" "--edition=2021"
stdout: none
--- stderr -------------------------------
error[E0505]: cannot move out of `recv` because it is borrowed
##[error]  --> /checkout/tests/ui/dropck/coroutine-liveness-2.rs:18:10
   |
---
...
LL |     drop(recv);
   |          ^^^^ move out of `recv` occurs here
LL | }
   | - borrow might be used here, when `_uwu` is dropped and runs the destructor for type `(String, {async block@/checkout/tests/ui/dropck/coroutine-liveness-2.rs:9:25: 9:30})`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0505`.
------------------------------------------

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants