]> git.lizzy.rs Git - rust.git/commitdiff
suggest to add move keyword for generator
authorcsmoe <csmoe@msn.com>
Sun, 6 Oct 2019 13:58:32 +0000 (21:58 +0800)
committercsmoe <csmoe@msn.com>
Tue, 8 Oct 2019 11:13:48 +0000 (11:13 +0000)
src/librustc_mir/borrow_check/conflict_errors.rs
src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs
src/test/ui/async-await/async-borrowck-escaping-block-error.fixed [new file with mode: 0644]
src/test/ui/async-await/async-borrowck-escaping-block-error.rs
src/test/ui/async-await/async-borrowck-escaping-block-error.stderr

index ef459ef0c1b702c6692317b39dbb7a5ee5fcb8c0..2f9df7bd77e847bd99e0e5850f613ca2a35dc015 100644 (file)
@@ -750,6 +750,11 @@ pub(super) fn report_borrowed_value_does_not_live_long_enough(
         let kind_place = kind.filter(|_| place_desc.is_some()).map(|k| (k, place_span.0));
         let explanation = self.explain_why_borrow_contains_point(location, &borrow, kind_place);
 
+        debug!(
+            "report_borrowed_value_does_not_live_long_enough(place_desc: {:?}, explanation: {:?})",
+            place_desc,
+            explanation
+        );
         let err = match (place_desc, explanation) {
             (Some(_), _) if self.is_place_thread_local(root_place) => {
                 self.report_thread_local_value_does_not_live_long_enough(drop_span, borrow_span)
@@ -790,6 +795,24 @@ pub(super) fn report_borrowed_value_does_not_live_long_enough(
                 span,
                 &format!("`{}`", name),
             ),
+            (
+                Some(ref name),
+                BorrowExplanation::MustBeValidFor {
+                    category: category @ ConstraintCategory::OpaqueType,
+                    from_closure: false,
+                    ref region_name,
+                    span,
+                    ..
+                },
+
+            ) if borrow_spans.for_generator() => self.report_escaping_closure_capture(
+                borrow_spans.args_or_use(),
+                borrow_span,
+                region_name,
+                category,
+                span,
+                &format!("`{}`", name),
+            ),
             (
                 ref name,
                 BorrowExplanation::MustBeValidFor {
@@ -1214,6 +1237,9 @@ fn report_escaping_closure_capture(
             ConstraintCategory::Return => {
                 err.span_note(constraint_span, "closure is returned here");
             }
+            ConstraintCategory::OpaqueType => {
+                err.span_note(constraint_span, "generator is returned here");
+            }
             ConstraintCategory::CallArgument => {
                 fr_name.highlight_region_name(&mut err);
                 err.span_note(
index ff4243df6e9b869cd9bd648de705c68fe040ff7f..5354b45f92d0a236dfd90f1cfa5f0d69db94ed34 100644 (file)
@@ -17,6 +17,7 @@
 
 mod find_use;
 
+#[derive(Debug)]
 pub(in crate::borrow_check) enum BorrowExplanation {
     UsedLater(LaterUseKind, Span),
     UsedLaterInLoop(LaterUseKind, Span),
@@ -35,7 +36,7 @@ pub(in crate::borrow_check) enum BorrowExplanation {
     Unexplained,
 }
 
-#[derive(Clone, Copy)]
+#[derive(Clone, Copy, Debug)]
 pub(in crate::borrow_check) enum LaterUseKind {
     TraitCapture,
     ClosureCapture,
diff --git a/src/test/ui/async-await/async-borrowck-escaping-block-error.fixed b/src/test/ui/async-await/async-borrowck-escaping-block-error.fixed
new file mode 100644 (file)
index 0000000..f004b41
--- /dev/null
@@ -0,0 +1,12 @@
+// edition:2018
+// run-rustfix
+
+fn foo() -> Box<impl std::future::Future<Output = u32>> {
+    let x = 0u32;
+    Box::new(async move { x } )
+    //~^ ERROR E0373
+}
+
+fn main() {
+    let _foo = foo();
+}
index 49f59e4149313fea0680002ca2ebaed14ad81e3f..4f35fd52ca39beed26bfb01c5becd7ef41c7e593 100644 (file)
@@ -1,9 +1,12 @@
 // edition:2018
-#![feature(async_closure,async_await)]
+// run-rustfix
+
 fn foo() -> Box<impl std::future::Future<Output = u32>> {
     let x = 0u32;
     Box::new(async { x } )
     //~^ ERROR E0373
 }
 
-fn main() {}
+fn main() {
+    let _foo = foo();
+}
index 5771ccbcf9d1e0caef4e60e73a684d46c88538c0..af17ecc86fbf9b1d52d8b942e91a07189019daaa 100644 (file)
@@ -1,5 +1,5 @@
 error[E0373]: closure may outlive the current function, but it borrows `x`, which is owned by the current function
-  --> $DIR/async-borrowck-escaping-block-error.rs:5:20
+  --> $DIR/async-borrowck-escaping-block-error.rs:6:20
    |
 LL |     Box::new(async { x } )
    |                    ^^-^^
@@ -8,7 +8,7 @@ LL |     Box::new(async { x } )
    |                    may outlive borrowed value `x`
    |
 note: generator is returned here
-  --> $DIR/async-borrowck-escaping-block-error.rs:3:13
+  --> $DIR/async-borrowck-escaping-block-error.rs:4:13
    |
 LL | fn foo() -> Box<impl std::future::Future<Output = u32>> {
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^