self.infix = False
if self.type.is_int and env.directives['overflowcheck'] and self.operator in ('+', '-', '*'):
self.overflow_check = True
- self.func = self.type.overflow_check_binop(self.op_names[self.operator], env)
+ self.func = self.type.overflow_check_binop(
+ self.op_names[self.operator],
+ env,
+ const_rhs = self.operand2.has_constant_result())
self.is_temp = True
if not self.infix or (type1.is_numeric and type2.is_numeric):
self.operand1 = self.operand1.coerce_to(self.type, env)
# delegation
return self.typedef_base_type.create_from_py_utility_code(env)
- def overflow_check_binop(self, binop, env):
+ def overflow_check_binop(self, binop, env, const_rhs=False):
+ if const_rhs:
+ binop += "_const"
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
type = self.declaration_code("")
name = self.specialization_name()
# be negative for signed ints, which is good.
return "0xbad0bad0"
- def overflow_check_binop(self, binop, env):
+ def overflow_check_binop(self, binop, env, const_rhs=False):
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
type = self.declaration_code("")
name = self.specialization_name()
+ if const_rhs:
+ binop += "_const"
if type in ('int', 'long', 'long long'):
env.use_utility_code(TempitaUtilityCode.load("BaseCaseSigned", "Overflow.c", context={'INT': type, 'NAME': name}))
elif type in ('unsigned int', 'unsigned long', 'unsigned long long'):