class AdLint::Exam::CBuiltin::W0490::AmbiguousExpressionDetector

Public Class Methods

new(phase_ctxt, expr) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10134
def initialize(phase_ctxt, expr)
  @phase_ctxt        = phase_ctxt
  @target_expr       = expr
  @encl_expr_stack   = [expr]
  @highprec_exprs    = Hash.new(0)
  @logical_and_exprs = Hash.new(0)
end

Public Instance Methods

execute() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10142
def execute
  @target_expr.accept(self)
end
visit_additive_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10170
def visit_additive_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_and_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10190
def visit_and_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_array_subscript_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10152
def visit_array_subscript_expression(node)
  node.expression.accept(self)
  AmbiguousExpressionDetector.new(@phase_ctxt,
                                  node.array_subscript).execute
end
visit_conditional_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10222
def visit_conditional_expression(node)
  cond_expr = node.condition
  then_expr = node.then_expression
  else_expr = node.else_expression
  AmbiguousExpressionDetector.new(@phase_ctxt, cond_expr).execute
  AmbiguousExpressionDetector.new(@phase_ctxt, then_expr).execute
  AmbiguousExpressionDetector.new(@phase_ctxt, else_expr).execute
end
visit_equality_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10185
def visit_equality_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_exclusive_or_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10195
def visit_exclusive_or_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_function_call_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10158
def visit_function_call_expression(node)
  node.expression.accept(self)
  node.argument_expressions.each do |expr|
    AmbiguousExpressionDetector.new(@phase_ctxt, expr).execute
  end
end
visit_grouped_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10146
def visit_grouped_expression(node)
  @encl_expr_stack.push(node)
  super
  @encl_expr_stack.pop
end
visit_inclusive_or_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10200
def visit_inclusive_or_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_logical_and_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10205
def visit_logical_and_expression(node)
  super
  cur_encl = current_encl_expr
  @logical_and_exprs[cur_encl] += 1
  if @highprec_exprs[cur_encl] > 0
    W(cur_encl.head_location)
  end
end
visit_logical_or_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10214
def visit_logical_or_expression(node)
  super
  cur_encl = current_encl_expr
  if @highprec_exprs[cur_encl] + @logical_and_exprs[cur_encl] > 0
    W(cur_encl.head_location)
  end
end
visit_multiplicative_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10165
def visit_multiplicative_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_relational_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10180
def visit_relational_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end
visit_shift_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10175
def visit_shift_expression(node)
  super
  @highprec_exprs[current_encl_expr] += 1
end

Private Instance Methods

current_encl_expr() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10232
def current_encl_expr
  @encl_expr_stack.last
end
suppressors() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10244
def suppressors
  @phase_ctxt[:suppressors]
end