]> git.lizzy.rs Git - rust.git/commitdiff
Accept `TyError` in patterns to avoid ICE on bad input
authorEsteban Küber <esteban@kuber.com.ar>
Fri, 22 Jun 2018 01:18:39 +0000 (18:18 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Fri, 22 Jun 2018 01:18:39 +0000 (18:18 -0700)
src/librustc_mir/hair/pattern/mod.rs
src/test/ui/issue-50585.rs [new file with mode: 0644]
src/test/ui/issue-50585.stderr [new file with mode: 0644]

index 7dae79530c488d6a8abba1111479e831729fe9c4..2b1422773c117a2d8f67a724d35ae19d16257ed6 100644 (file)
@@ -505,7 +505,16 @@ fn lower_pattern_unadjusted(&mut self, pat: &'tcx hir::Pat) -> Pattern<'tcx> {
                 let def = self.tables.qpath_def(qpath, pat.hir_id);
                 let adt_def = match ty.sty {
                     ty::TyAdt(adt_def, _) => adt_def,
-                    _ => span_bug!(pat.span, "tuple struct pattern not applied to an ADT"),
+                    ty::TyError => {  // Avoid ICE (#50585)
+                        return Pattern {
+                            span: pat.span,
+                            ty,
+                            kind: Box::new(PatternKind::Wild),
+                        };
+                    }
+                    _ => span_bug!(pat.span,
+                                   "tuple struct pattern not applied to an ADT {:?}",
+                                   ty.sty),
                 };
                 let variant_def = adt_def.variant_of_def(def);
 
@@ -637,6 +646,9 @@ fn lower_variant_or_leaf(
                     let substs = match ty.sty {
                         ty::TyAdt(_, substs) |
                         ty::TyFnDef(_, substs) => substs,
+                        ty::TyError => {  // Avoid ICE (#50585)
+                            return PatternKind::Wild;
+                        }
                         _ => bug!("inappropriate type for def: {:?}", ty.sty),
                     };
                     PatternKind::Variant {
diff --git a/src/test/ui/issue-50585.rs b/src/test/ui/issue-50585.rs
new file mode 100644 (file)
index 0000000..0c063d4
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+    |y: Vec<[(); for x in 0..2 {}]>| {};
+    //~^ ERROR mismatched types
+}
diff --git a/src/test/ui/issue-50585.stderr b/src/test/ui/issue-50585.stderr
new file mode 100644 (file)
index 0000000..3f9328d
--- /dev/null
@@ -0,0 +1,14 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-50585.rs:12:18
+   |
+LL | fn main() {
+   |           - expected `()` because of default return type
+LL |     |y: Vec<[(); for x in 0..2 {}]>| {};
+   |                  ^^^^^^^^^^^^^^^^ expected usize, found ()
+   |
+   = note: expected type `usize`
+              found type `()`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.