--- p/types.c.orig Sat Feb 19 16:11:11 2005 +++ p/types.c Mon Feb 21 17:33:03 2005 @@ -1530,7 +1530,11 @@ { if (why == MINUS_EXPR || why == PLUS_EXPR) { - int uns = TREE_UNSIGNED (TREE_TYPE (val1)) && TREE_UNSIGNED (TREE_TYPE (val2)); + int uns1 = TREE_UNSIGNED (TREE_TYPE (val1)) + || (TREE_CODE (val1) == INTEGER_CST && tree_int_cst_sgn (val1) >= 0); + int uns2 = TREE_UNSIGNED (TREE_TYPE (val2)) + || (TREE_CODE (val2) == INTEGER_CST && tree_int_cst_sgn (val2) >= 0); + int uns = uns1 && uns2; int maxprec = MAX (TYPE_PRECISION (TREE_TYPE (val1)), TYPE_PRECISION (TREE_TYPE (val2))); /* The difference of two unsigned values should be done unsigned (otherwise there's no way to compute in the top range), but if