core expr eval: special handling for undef cmp expr
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Tue, 28 Apr 2009 14:07:23 +0000 (16:07 +0200)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Tue, 28 Apr 2009 14:07:23 +0000 (16:07 +0200)
commitab736da560c93b707653d342f7932f8b677e08fc
treeeb18c62ed715189b5979de9918ae23f519e86496
parenta554337202cd05cd4b2c69177f9c42c9aca7ff9b
core expr eval: special handling for undef cmp expr

undef == expression is evaluated in the following way:
 - default:
           (type_of(expression))(undef) == expression.
   If the expression is undef too, the whole comparison it's
   evaluated to true (internally it's evaluated to
   (str) undef == (str) undef =>    "" == "" => true).
   E.g.:  undef == 0   -> (int)undef == 0   -> 0 == 0  -> true
          undef == "a" -> (str)undef == "a" -> ""=="a" -> false
          undef == undef -> true
 - if UNDEF_EQ_UNDEF_TRUE is defined, the == comparison is always
   false except for undef == undef which is true.
   E.g.:  undef == 0 -> false ; undef == "" false
 - if UNDEF_EQ_ALWAY_FALSE is defined, the result is always false

!= is always the reverse of ==.

Note: this covers only the case when undef is on the _left_ side
 (the case in which we do not know what to convert undef to). If
 the undef is on the right side, it will work like for any other
 comparison: expr == undef => expr == (type_of(expr)) undef.
rvalue.c