ir_type *firm_type = NULL;
switch (type->kind) {
case TYPE_ERROR:
- panic("error type occurred");
+ /* Happens while constant folding, when there was an error */
+ return create_atomic_type(&type_void->atomic);
+
case TYPE_ATOMIC:
firm_type = create_atomic_type(&type->atomic);
break;
static void warn_div_by_zero(binary_expression_t const *const expression)
{
- if (warning.div_by_zero &&
- is_type_integer(expression->base.type) &&
- is_constant_expression(expression->right) &&
- fold_constant(expression->right) == 0) {
+ if (!warning.div_by_zero ||
+ !is_type_integer(expression->base.type))
+ return;
+
+ expression_t const *const right = expression->right;
+ /* The type of the right operand can be different for /= */
+ if (is_type_integer(right->base.type) &&
+ is_constant_expression(right) &&
+ fold_constant(right) == 0) {
warningf(&expression->base.source_position, "division by zero");
}
}