Just in case anyone else finds this via a search engine, the bug is a typo in the eval_signed function in mcpp_eval.c. The line: v1 = (--*valpp)->val ? v1 : v2; should read valp--; v1 = (valp->val) ? v1 : v2; because later in the code the value of valpp is updated from valp. The eval_unsigned function has this right already.