about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-05-08 10:23:55 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-05-08 10:23:55 -0700
commitcc40f41ee5baefa0dc1845dd9d794abe90511161 (patch)
treefb6be736659941028d131ed16b539e1791f9927e /src
parent33cde4aac2ec1b0a493d0acaa4c4fb45de0c6e94 (diff)
downloadrust-cc40f41ee5baefa0dc1845dd9d794abe90511161.tar.gz
rust-cc40f41ee5baefa0dc1845dd9d794abe90511161.zip
Instead of ICEing on incorrect pattern, use delay_span_bug
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/mem_categorization.rs12
-rw-r--r--src/test/ui/fn-in-pat.rs16
-rw-r--r--src/test/ui/fn-in-pat.stderr9
3 files changed, 35 insertions, 2 deletions
diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs
index f6caf357b39..7edd5c5a9de 100644
--- a/src/librustc/middle/mem_categorization.rs
+++ b/src/librustc/middle/mem_categorization.rs
@@ -1300,8 +1300,16 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
                         }
                     }
                     def => {
-                        span_bug!(pat.span, "tuple struct pattern didn't resolve \
-                                             to variant or struct {:?}", def);
+                        debug!(
+                            "tuple struct pattern didn't resolve to variant or struct {:?} at {:?}",
+                            def,
+                            pat.span,
+                        );
+                        self.tcx.sess.delay_span_bug(pat.span, &format!(
+                            "tuple struct pattern didn't resolve to variant or struct {:?}",
+                            def,
+                        ));
+                        return Err(());
                     }
                 };
 
diff --git a/src/test/ui/fn-in-pat.rs b/src/test/ui/fn-in-pat.rs
new file mode 100644
index 00000000000..ed76b2c5db0
--- /dev/null
+++ b/src/test/ui/fn-in-pat.rs
@@ -0,0 +1,16 @@
+struct A {}
+
+impl A {
+    fn new() {}
+}
+
+fn hof<F>(_: F) where F: FnMut(()) {}
+
+fn ice() {
+    hof(|c| match c {
+        A::new() => (), //~ ERROR expected tuple struct/variant, found method
+        _ => ()
+    })
+}
+
+fn main() {}
diff --git a/src/test/ui/fn-in-pat.stderr b/src/test/ui/fn-in-pat.stderr
new file mode 100644
index 00000000000..eee97fe9587
--- /dev/null
+++ b/src/test/ui/fn-in-pat.stderr
@@ -0,0 +1,9 @@
+error[E0164]: expected tuple struct/variant, found method `<A>::new`
+  --> $DIR/fn-in-pat.rs:11:9
+   |
+LL |         A::new() => (),
+   |         ^^^^^^^^ not a tuple variant or struct
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0164`.