class AdLint::Cc1::ValueComparison
Public Class Methods
new(manip, node, lhs_manip, rhs_manip)
click to toggle source
Calls superclass method
AdLint::Cc1::ValueDomainNarrowing::new
# File lib/adlint/cc1/ctrlexpr.rb, line 700 def initialize(manip, node, lhs_manip, rhs_manip) super @operator = ComparisonOperator.new(node.operator) @lhs_manip = lhs_manip @rhs_manip = rhs_manip end
Private Instance Methods
do_narrowing()
click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 708 def do_narrowing @lhs_manip.execute! lhs_var = object_to_variable(@lhs_manip.result, @node.lhs_operand) @rhs_manip.execute! rhs_var = object_to_variable(@rhs_manip.result, @node.rhs_operand) unless lhs_var.type.scalar? && rhs_var.type.scalar? return create_tmpvar(int_t) end unless lhs_var.value.scalar? && rhs_var.value.scalar? return create_tmpvar(int_t) end lhs_conved, rhs_conved = do_logical_arithmetic_conversion(@node, lhs_var, rhs_var) lhs_val = lhs_conved.value rhs_val = rhs_conved.value case @operator when Operator::EQ rslt_var = create_tmpvar(int_t, lhs_val == rhs_val) when Operator::NE rslt_var = create_tmpvar(int_t, lhs_val != rhs_val) when Operator::LT rslt_var = create_tmpvar(int_t, lhs_val < rhs_val) when Operator::GT rslt_var = create_tmpvar(int_t, lhs_val > rhs_val) when Operator::LE rslt_var = create_tmpvar(int_t, lhs_val <= rhs_val) when Operator::GE rslt_var = create_tmpvar(int_t, lhs_val >= rhs_val) else __NOTREACHED__ end notify_variable_value_referred(@node, lhs_var) notify_variable_value_referred(@node, rhs_var) case @operator when Operator::EQ, Operator::NE notify_equality_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var) when Operator::LT, Operator::GT, Operator::LE, Operator::GE notify_relational_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var) else __NOTREACHED__ end case when lhs_conved.designated_by_lvalue? ensure_relation(lhs_conved, @operator, rhs_val) when rhs_conved.designated_by_lvalue? ensure_relation(rhs_conved, @operator.for_commutation, lhs_val) else # NOTE: Domain of the rvalue should not be narrowed. end rslt_var end