From a69eab16ec3435bd505a7dafcb9a82b5eace49a2 Mon Sep 17 00:00:00 2001 From: Stefan Plantikow Date: Mon, 5 Dec 2011 01:23:10 +0100 Subject: [PATCH] typeck: Fix for #932 --- src/comp/middle/typeck.rs | 14 ++++++++++++++ src/test/compile-fail/cast-from-nil.rs | 2 ++ src/test/compile-fail/cast-to-nil.rs | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 src/test/compile-fail/cast-from-nil.rs create mode 100644 src/test/compile-fail/cast-to-nil.rs diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 9731bcaf4442..bb82a9597844 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 000000000000..a76df00d0d53 --- /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 000000000000..44c0f5a1da2a --- /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