expression->base.type = arithmetic_type;
}
+/**
+ * Check the semantic restrictions for a div/mod expression.
+ */
+static void semantic_divmod_arithmetic(binary_expression_t *expression) {
+ semantic_binexpr_arithmetic(expression);
+ if (warning.div_by_zero && is_type_integer(expression->base.type)) {
+ if (is_constant_expression(expression->right) &&
+ fold_constant(expression->right) == 0)
+ warningf(&expression->base.source_position, "division by zero");
+ }
+}
+
static void semantic_shift_op(binary_expression_t *expression)
{
expression_t *const left = expression->left;
expression->base.type = type_left;
}
+static void semantic_divmod_assign(binary_expression_t *expression)
+{
+ semantic_arithmetic_assign(expression);
+ if (warning.div_by_zero && is_type_integer(expression->base.type)) {
+ if (is_constant_expression(expression->right) &&
+ fold_constant(expression->right) == 0)
+ warningf(&expression->base.source_position, "division by zero");
+ }
+}
+
static void semantic_arithmetic_addsubb_assign(binary_expression_t *expression)
{
expression_t *const left = expression->left;
CREATE_BINEXPR_PARSER(',', EXPR_BINARY_COMMA, semantic_comma, 1)
CREATE_BINEXPR_PARSER('*', EXPR_BINARY_MUL, semantic_binexpr_arithmetic, 1)
-CREATE_BINEXPR_PARSER('/', EXPR_BINARY_DIV, semantic_binexpr_arithmetic, 1)
-CREATE_BINEXPR_PARSER('%', EXPR_BINARY_MOD, semantic_binexpr_arithmetic, 1)
+CREATE_BINEXPR_PARSER('/', EXPR_BINARY_DIV, semantic_divmod_arithmetic, 1)
+CREATE_BINEXPR_PARSER('%', EXPR_BINARY_MOD, semantic_divmod_arithmetic, 1)
CREATE_BINEXPR_PARSER('+', EXPR_BINARY_ADD, semantic_add, 1)
CREATE_BINEXPR_PARSER('-', EXPR_BINARY_SUB, semantic_sub, 1)
CREATE_BINEXPR_PARSER('<', EXPR_BINARY_LESS, semantic_comparison, 1)
CREATE_BINEXPR_PARSER(T_ASTERISKEQUAL, EXPR_BINARY_MUL_ASSIGN,
semantic_arithmetic_assign, 0)
CREATE_BINEXPR_PARSER(T_SLASHEQUAL, EXPR_BINARY_DIV_ASSIGN,
- semantic_arithmetic_assign, 0)
+ semantic_divmod_assign, 0)
CREATE_BINEXPR_PARSER(T_PERCENTEQUAL, EXPR_BINARY_MOD_ASSIGN,
- semantic_arithmetic_assign, 0)
+ semantic_divmod_assign, 0)
CREATE_BINEXPR_PARSER(T_LESSLESSEQUAL, EXPR_BINARY_SHIFTLEFT_ASSIGN,
semantic_arithmetic_assign, 0)
CREATE_BINEXPR_PARSER(T_GREATERGREATEREQUAL, EXPR_BINARY_SHIFTRIGHT_ASSIGN,
.char_subscripts = true,
.declaration_after_statement = false,
.deprecated_declarations = true,
+ .div_by_zero = true,
.empty_statement = false,
.fatal_errors = false,
.float_equal = false,
OPT("char-subscripts", char_subscripts);
OPT("declaration-after-statement", declaration_after_statement);
OPT("deprecated-declarations", deprecated_declarations);
+ OPT("div_by_zero", div_by_zero);
OPT("empty-statement", empty_statement);
OPT("error", s_are_errors);
OPTX("extra") {