From 2f5334dff2cf7be2f1cc33565c55925b58950694 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Wed, 21 Dec 2022 05:03:11 +0000 Subject: [PATCH 1/2] forgot a return in drop tracking handle_uninhabited_return --- .../drop_ranges/cfg_build.rs | 1 + ...=> unresolved-ct-var.drop_tracking.stderr} | 22 +++--- src/test/ui/generator/unresolved-ct-var.rs | 2 + .../generator/unresolved-ct-var.stock.stderr | 78 +++++++++++++++++++ 4 files changed, 92 insertions(+), 11 deletions(-) rename src/test/ui/generator/{unresolved-ct-var.stderr => unresolved-ct-var.drop_tracking.stderr} (88%) create mode 100644 src/test/ui/generator/unresolved-ct-var.stock.stderr diff --git a/compiler/rustc_hir_typeck/src/generator_interior/drop_ranges/cfg_build.rs b/compiler/rustc_hir_typeck/src/generator_interior/drop_ranges/cfg_build.rs index fd8ea1ad7bff4..16806fdba4fbc 100644 --- a/compiler/rustc_hir_typeck/src/generator_interior/drop_ranges/cfg_build.rs +++ b/compiler/rustc_hir_typeck/src/generator_interior/drop_ranges/cfg_build.rs @@ -233,6 +233,7 @@ impl<'a, 'tcx> DropRangeVisitor<'a, 'tcx> { self.tcx() .sess .delay_span_bug(expr.span, format!("could not resolve infer vars in `{ty}`")); + return; } let ty = self.tcx().erase_regions(ty); let m = self.tcx().parent_module(expr.hir_id).to_def_id(); diff --git a/src/test/ui/generator/unresolved-ct-var.stderr b/src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr similarity index 88% rename from src/test/ui/generator/unresolved-ct-var.stderr rename to src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr index fdf00dfad7ab7..a328c43765db2 100644 --- a/src/test/ui/generator/unresolved-ct-var.stderr +++ b/src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr @@ -1,5 +1,5 @@ error[E0277]: `[(); _]` is not a future - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ---------------------------^^^^^^ @@ -13,61 +13,61 @@ LL | let s = std::array::from_fn(|_| ()).await; = note: required for `[(); _]` to implement `IntoFuture` error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:6:17 + --> $DIR/unresolved-ct-var.rs:8:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:6:17 + --> $DIR/unresolved-ct-var.rs:8:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:6:17 + --> $DIR/unresolved-ct-var.rs:8:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:6:17 + --> $DIR/unresolved-ct-var.rs:8:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:6:17 + --> $DIR/unresolved-ct-var.rs:8:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:6:44 + --> $DIR/unresolved-ct-var.rs:8:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ diff --git a/src/test/ui/generator/unresolved-ct-var.rs b/src/test/ui/generator/unresolved-ct-var.rs index 0a1570fc2395e..6720f46588723 100644 --- a/src/test/ui/generator/unresolved-ct-var.rs +++ b/src/test/ui/generator/unresolved-ct-var.rs @@ -1,5 +1,7 @@ // incremental // edition:2021 +// revisions: drop_tracking stock +//[drop_tracking] compile-flags: -Zdrop-tracking fn main() { let _ = async { diff --git a/src/test/ui/generator/unresolved-ct-var.stock.stderr b/src/test/ui/generator/unresolved-ct-var.stock.stderr new file mode 100644 index 0000000000000..a328c43765db2 --- /dev/null +++ b/src/test/ui/generator/unresolved-ct-var.stock.stderr @@ -0,0 +1,78 @@ +error[E0277]: `[(); _]` is not a future + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ---------------------------^^^^^^ + | | | + | | `[(); _]` is not a future + | | help: remove the `.await` + | this call returns `[(); _]` + | + = help: the trait `Future` is not implemented for `[(); _]` + = note: [(); _] must be a future or must implement `IntoFuture` to be awaited + = note: required for `[(); _]` to implement `IntoFuture` + +error[E0698]: type inside `async` block must be known in this context + --> $DIR/unresolved-ct-var.rs:8:17 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` + | +note: the type is part of the `async` block because of this `await` + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^ + +error[E0698]: type inside `async` block must be known in this context + --> $DIR/unresolved-ct-var.rs:8:17 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` + | +note: the type is part of the `async` block because of this `await` + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^ + +error[E0698]: type inside `async` block must be known in this context + --> $DIR/unresolved-ct-var.rs:8:17 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` + | +note: the type is part of the `async` block because of this `await` + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^ + +error[E0698]: type inside `async` block must be known in this context + --> $DIR/unresolved-ct-var.rs:8:17 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` + | +note: the type is part of the `async` block because of this `await` + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^ + +error[E0698]: type inside `async` block must be known in this context + --> $DIR/unresolved-ct-var.rs:8:17 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` + | +note: the type is part of the `async` block because of this `await` + --> $DIR/unresolved-ct-var.rs:8:44 + | +LL | let s = std::array::from_fn(|_| ()).await; + | ^^^^^^ + +error: aborting due to 6 previous errors + +Some errors have detailed explanations: E0277, E0698. +For more information about an error, try `rustc --explain E0277`. From 51ba7b4e43179f1262c7684ad3c0a04ddb703e9d Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Thu, 22 Dec 2022 17:51:45 +0000 Subject: [PATCH 2/2] Use separate files instead of revisions --- .../unresolved-ct-var-drop-tracking.rs | 15 +++++++++++++ ...=> unresolved-ct-var-drop-tracking.stderr} | 22 +++++++++---------- src/test/ui/generator/unresolved-ct-var.rs | 2 -- ...acking.stderr => unresolved-ct-var.stderr} | 22 +++++++++---------- 4 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 src/test/ui/generator/unresolved-ct-var-drop-tracking.rs rename src/test/ui/generator/{unresolved-ct-var.stock.stderr => unresolved-ct-var-drop-tracking.stderr} (84%) rename src/test/ui/generator/{unresolved-ct-var.drop_tracking.stderr => unresolved-ct-var.stderr} (88%) diff --git a/src/test/ui/generator/unresolved-ct-var-drop-tracking.rs b/src/test/ui/generator/unresolved-ct-var-drop-tracking.rs new file mode 100644 index 0000000000000..a6589348d301e --- /dev/null +++ b/src/test/ui/generator/unresolved-ct-var-drop-tracking.rs @@ -0,0 +1,15 @@ +// incremental +// edition:2021 +// compile-flags: -Zdrop-tracking + +fn main() { + let _ = async { + let s = std::array::from_fn(|_| ()).await; + //~^ ERROR `[(); _]` is not a future + //~| ERROR type inside `async` block must be known in this context + //~| ERROR type inside `async` block must be known in this context + //~| ERROR type inside `async` block must be known in this context + //~| ERROR type inside `async` block must be known in this context + //~| ERROR type inside `async` block must be known in this context + }; +} diff --git a/src/test/ui/generator/unresolved-ct-var.stock.stderr b/src/test/ui/generator/unresolved-ct-var-drop-tracking.stderr similarity index 84% rename from src/test/ui/generator/unresolved-ct-var.stock.stderr rename to src/test/ui/generator/unresolved-ct-var-drop-tracking.stderr index a328c43765db2..9e1fed54c548a 100644 --- a/src/test/ui/generator/unresolved-ct-var.stock.stderr +++ b/src/test/ui/generator/unresolved-ct-var-drop-tracking.stderr @@ -1,5 +1,5 @@ error[E0277]: `[(); _]` is not a future - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ---------------------------^^^^^^ @@ -13,61 +13,61 @@ LL | let s = std::array::from_fn(|_| ()).await; = note: required for `[(); _]` to implement `IntoFuture` error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var-drop-tracking.rs:7:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ diff --git a/src/test/ui/generator/unresolved-ct-var.rs b/src/test/ui/generator/unresolved-ct-var.rs index 6720f46588723..0a1570fc2395e 100644 --- a/src/test/ui/generator/unresolved-ct-var.rs +++ b/src/test/ui/generator/unresolved-ct-var.rs @@ -1,7 +1,5 @@ // incremental // edition:2021 -// revisions: drop_tracking stock -//[drop_tracking] compile-flags: -Zdrop-tracking fn main() { let _ = async { diff --git a/src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr b/src/test/ui/generator/unresolved-ct-var.stderr similarity index 88% rename from src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr rename to src/test/ui/generator/unresolved-ct-var.stderr index a328c43765db2..fdf00dfad7ab7 100644 --- a/src/test/ui/generator/unresolved-ct-var.drop_tracking.stderr +++ b/src/test/ui/generator/unresolved-ct-var.stderr @@ -1,5 +1,5 @@ error[E0277]: `[(); _]` is not a future - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ---------------------------^^^^^^ @@ -13,61 +13,61 @@ LL | let s = std::array::from_fn(|_| ()).await; = note: required for `[(); _]` to implement `IntoFuture` error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var.rs:6:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var.rs:6:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var.rs:6:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var.rs:6:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^ error[E0698]: type inside `async` block must be known in this context - --> $DIR/unresolved-ct-var.rs:8:17 + --> $DIR/unresolved-ct-var.rs:6:17 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^^^^^^^^^^^^^^ cannot infer the value of const parameter `N` declared on the function `from_fn` | note: the type is part of the `async` block because of this `await` - --> $DIR/unresolved-ct-var.rs:8:44 + --> $DIR/unresolved-ct-var.rs:6:44 | LL | let s = std::array::from_fn(|_| ()).await; | ^^^^^^