https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645
--- Comment #8 from M Welinder <terra at gnome dot org> --- > That is a different issue. You access expr->func.argc and expr->func.func > in your if expression. And of course they are uninitialised. No, I don't. You see, C has this feature for the && operator that if the first condition is false, then the second is not evaluated. It is in Section 6.5.13 of the standard: 6.5.13 Logical AND operator [...] [#4] Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated. The first condition is false because it compares GNM_EXPR_OP_LT to GNM_EXPR_OP_FUNCALL. These have the values 0 and 1 respectively, which are comfortably within the range of allowed values for type unsigned char. 0 and 1 are not equal, so the == operator (see Section 6.5.9) evaluates to 0. Still thinking about Andrew's suggestion that Valgrind might be at fault. It wouldn't be the first bitfield related problem there.