class AdLint::Exam::CBuiltin::W0489::AmbiguousExpressionDetector

Public Class Methods

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

Public Instance Methods

execute() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9955
def execute
  @target_expr.accept(self)
end
visit_address_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9985
def visit_address_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_alignof_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10005
def visit_alignof_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_cast_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10010
def visit_cast_expression(node)
  node.operand.accept(self)
  @unary_exprs[current_encl_expr] += 1
end
visit_conditional_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10029
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_grouped_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9959
def visit_grouped_expression(node)
  @encl_expr_stack.push(node)
  super
  @encl_expr_stack.pop
end
visit_indirection_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9990
def visit_indirection_expression(node)
  super
  @unary_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 10015
def visit_logical_and_expression(node)
  super
  if include_ambiguous_expr?
    W(current_encl_expr.head_location)
  end
end
visit_logical_or_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10022
def visit_logical_or_expression(node)
  super
  if include_ambiguous_expr?
    W(current_encl_expr.head_location)
  end
end
visit_postfix_decrement_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9970
def visit_postfix_decrement_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_postfix_increment_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9965
def visit_postfix_increment_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_prefix_decrement_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9980
def visit_prefix_decrement_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_prefix_increment_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9975
def visit_prefix_increment_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_sizeof_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10000
def visit_sizeof_expression(node)
  super
  @unary_exprs[current_encl_expr] += 1
end
visit_unary_arithmetic_expression(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 9995
def visit_unary_arithmetic_expression(node)
  super
  @unary_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 10043
def current_encl_expr
  @encl_expr_stack.last
end
include_ambiguous_expr?() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10039
def include_ambiguous_expr?
  @unary_exprs[current_encl_expr] > 0
end
suppressors() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10055
def suppressors
  @phase_ctxt[:suppressors]
end