about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2021-02-17 20:37:58 +0100
committerGitHub <noreply@github.com>2021-02-17 20:37:58 +0100
commit13730e90bde2e55efa31b127e2175d5e90772044 (patch)
treefa090c9443c6d926098a10a49fd459e389414eea
parent7292d5ff60a914b61077764e1b10362b6cd1842b (diff)
parenta4b2fafcc19801e858afc59ed3b319c39adefc20 (diff)
downloadrust-13730e90bde2e55efa31b127e2175d5e90772044.tar.gz
rust-13730e90bde2e55efa31b127e2175d5e90772044.zip
Rollup merge of #82136 - edward-shen:mismatched-subst-and-hir, r=lcnr
Fix ICE: Use delay_span_bug for mismatched subst/hir arg

Fixes #82126.
-rw-r--r--compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs11
-rw-r--r--src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs25
-rw-r--r--src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr43
3 files changed, 72 insertions, 7 deletions
diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs
index 63a3e269d61..03738f1b40a 100644
--- a/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs
+++ b/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs
@@ -634,14 +634,11 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
                     | GenericArgKind::Const(_),
                     _,
                 ) => {
-                    // I *think* that HIR lowering should ensure this
-                    // doesn't happen, even in erroneous
-                    // programs. Else we should use delay-span-bug.
-                    span_bug!(
+                    // HIR lowering sometimes doesn't catch this in erroneous
+                    // programs, so we need to use delay_span_bug here. See #82126.
+                    self.infcx.tcx.sess.delay_span_bug(
                         hir_arg.span(),
-                        "unmatched subst and hir arg: found {:?} vs {:?}",
-                        kind,
-                        hir_arg,
+                        &format!("unmatched subst and hir arg: found {:?} vs {:?}", kind, hir_arg),
                     );
                 }
             }
diff --git a/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs
new file mode 100644
index 00000000000..2e6b88a4beb
--- /dev/null
+++ b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs
@@ -0,0 +1,25 @@
+// Regression test for #82126. Checks that mismatched lifetimes and types are
+// properly handled.
+
+// edition:2018
+
+use std::sync::Mutex;
+
+struct MarketMultiplier {}
+
+impl MarketMultiplier {
+    fn buy(&mut self) -> &mut usize {
+        todo!()
+    }
+}
+
+async fn buy_lock(generator: &Mutex<MarketMultiplier>) -> LockedMarket<'_> {
+    //~^ ERROR this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
+    //~^^ ERROR this struct takes 1 type argument but 0 type arguments were supplied
+    LockedMarket(generator.lock().unwrap().buy())
+    //~^ ERROR cannot return value referencing temporary value
+}
+
+struct LockedMarket<T>(T);
+
+fn main() {}
diff --git a/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr
new file mode 100644
index 00000000000..b6844f50488
--- /dev/null
+++ b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr
@@ -0,0 +1,43 @@
+error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
+  --> $DIR/issue-82126-mismatched-subst-and-hir.rs:16:59
+   |
+LL | async fn buy_lock(generator: &Mutex<MarketMultiplier>) -> LockedMarket<'_> {
+   |                                                           ^^^^^^^^^^^^---- help: remove these generics
+   |                                                           |
+   |                                                           expected 0 lifetime arguments
+   |
+note: struct defined here, with 0 lifetime parameters
+  --> $DIR/issue-82126-mismatched-subst-and-hir.rs:23:8
+   |
+LL | struct LockedMarket<T>(T);
+   |        ^^^^^^^^^^^^
+
+error[E0107]: this struct takes 1 type argument but 0 type arguments were supplied
+  --> $DIR/issue-82126-mismatched-subst-and-hir.rs:16:59
+   |
+LL | async fn buy_lock(generator: &Mutex<MarketMultiplier>) -> LockedMarket<'_> {
+   |                                                           ^^^^^^^^^^^^ expected 1 type argument
+   |
+note: struct defined here, with 1 type parameter: `T`
+  --> $DIR/issue-82126-mismatched-subst-and-hir.rs:23:8
+   |
+LL | struct LockedMarket<T>(T);
+   |        ^^^^^^^^^^^^ -
+help: add missing type argument
+   |
+LL | async fn buy_lock(generator: &Mutex<MarketMultiplier>) -> LockedMarket<'_, T> {
+   |                                                                          ^^^
+
+error[E0515]: cannot return value referencing temporary value
+  --> $DIR/issue-82126-mismatched-subst-and-hir.rs:19:5
+   |
+LL |     LockedMarket(generator.lock().unwrap().buy())
+   |     ^^^^^^^^^^^^^-------------------------^^^^^^^
+   |     |            |
+   |     |            temporary value created here
+   |     returns a value referencing data owned by the current function
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0107, E0515.
+For more information about an error, try `rustc --explain E0107`.