about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/comp/middle/typeck.rs14
-rw-r--r--src/test/compile-fail/cast-from-nil.rs2
-rw-r--r--src/test/compile-fail/cast-to-nil.rs2
3 files changed, 18 insertions, 0 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 9731bcaf444..bb82a959784 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -2116,6 +2116,20 @@ fn check_expr_with_unifier(fcx: @fn_ctxt, expr: @ast::expr, unify: unifier,
         let t_1 = ast_ty_to_ty_crate(fcx.ccx, t);
         let t_e = expr_ty(tcx, e);
 
+        if ty::type_is_nil(tcx, t_e) {
+            tcx.sess.span_err(expr.span,
+                              "cast from nil: " +
+                                  ty_to_str(tcx, expr_ty(tcx, e)) + " as " +
+                                  ty_to_str(tcx, t_1));
+        }
+
+        if ty::type_is_nil(tcx, t_1) {
+            tcx.sess.span_err(expr.span,
+                              "cast to nil: " +
+                                  ty_to_str(tcx, expr_ty(tcx, e)) + " as " +
+                                  ty_to_str(tcx, t_1));
+        }
+
         // FIXME there are more forms of cast to support, eventually.
         if !(   type_is_scalar(fcx, expr.span, t_e)
              && type_is_scalar(fcx, expr.span, t_1)) {
diff --git a/src/test/compile-fail/cast-from-nil.rs b/src/test/compile-fail/cast-from-nil.rs
new file mode 100644
index 00000000000..a76df00d0d5
--- /dev/null
+++ b/src/test/compile-fail/cast-from-nil.rs
@@ -0,0 +1,2 @@
+// error-pattern: cast from nil: () as u32
+fn main() { let u = (assert true) as u32; }
\ No newline at end of file
diff --git a/src/test/compile-fail/cast-to-nil.rs b/src/test/compile-fail/cast-to-nil.rs
new file mode 100644
index 00000000000..44c0f5a1da2
--- /dev/null
+++ b/src/test/compile-fail/cast-to-nil.rs
@@ -0,0 +1,2 @@
+// error-pattern: cast to nil: u32 as ()
+fn main() { let u = 0u32 as (); }
\ No newline at end of file