> Does the following fix it? Nope, sorry. I was looking at this code in c-common.c, where the expr is first created, but I don't know what that ends up calling:
/* Create the sum or difference. */
if (resultcode == MINUS_EXPR)
intop = fold_build1 (NEGATE_EXPR, sizetype, intop);
ret = fold_build2 (POINTER_PLUS_EXPR, result_type, ptrop, intop);
It's calling NEGATE on an unsigned type, which seems wrong to me.
