pike.git / src / pike_types.c

version» Context lines:

pike.git/src/pike_types.c:2758:    if (min1 == 1) min1 = 0;    if (min2 == 1) min2 = 0;    if (max1 == -1) max1 = 0;    if (max2 == -1) max2 = 0;       if (zero_implied == 3) {    /* Or between integer masks.    * This is a bit more lenient than the default further below,    * and is used for generating the type for enums.    */ -  if (max2 >= max1) { -  if (max1 > 0) { -  max2 |= max1; -  } -  } else if (max2 > 0) { -  max2 |= max1; -  } else { -  max2 = max1; -  } -  if (min2 <= min1) { -  if (min1 < 0) { -  min2 &= min1; -  } -  } else if (min2 < 0) { -  min2 &= min1; -  } else { -  min2 = min1; -  } -  /* Ensure that zero is always in the range. */ +  +  /* Ensure that zero is always in the range. +  * This also ensures that there'll be an overlap. +  */ +  if (max1 < 0) max1 = 0;    if (max2 < 0) max2 = 0; -  +  if (min1 > 0) min1 = 0;    if (min2 > 0) min2 = 0; -  Pike_compiler->type_stackp--; -  free_type(top); -  push_int_type(min2, max2); -  break; +  +  /* Both max values are now >= 0, so this or is safe. */ +  max1 |= max2; +  +  if ((min1 < 0) && (min2 < 0)) { +  min1 &= min2;    }    } -  +  }       if ((min1 > max2) && (min1 > max2 + 1)) {    /* No overlap. */    push_finished_type(t);   #ifdef PIKE_DEBUG    } else if ((min2 > max1) && (min2 > max1 + 1)) {    /* No overlap and wrong order! */    Pike_fatal("Bad integer ordering in lower_or_pike_types().\n");   #endif    } else {