From f36f9fc91ccc86c7004979689da981184559e57a Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Thu, 21 Mar 2013 11:32:57 -0700 Subject: [PATCH] rustc: Comments only - explain the invariant about ty_err and ty_bot a little --- src/librustc/middle/typeck/check/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index e74c417b05fab..12c88ae7198db 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -1127,6 +1127,16 @@ pub fn break_here() { debug!("break here!"); } +/// Invariant: +/// If an expression has any sub-expressions that result in a type error, +/// inspecting that expression's type with `ty::type_is_error` will return +/// true. Likewise, if an expression is known to diverge, inspecting its +/// type with `ty::type_is_bot` will return true (n.b.: since Rust is +/// strict, _|_ can appear in the type of an expression that does not, +/// itself, diverge: for example, fn() -> _|_.) +/// Note that inspecting a type's structure *directly* may expose the fact +/// that there are actually multiple representations for both `ty_err` and +/// `ty_bot`, so avoid that when err and bot need to be handled differently. pub fn check_expr_with_unifier(fcx: @mut FnCtxt, expr: @ast::expr, expected: Option,