class AdLint::Exam::CBuiltin::W0007

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 139
def initialize(phase_ctxt)
  super
  trav = phase_ctxt[:cc1_ast_traversal]
  trav.enter_switch_statement += T(:enter_switch_statement)
end

Private Instance Methods

end_with_break_or_return_statement?(stmt) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 181
def end_with_break_or_return_statement?(stmt)
  case stmt
  when Cc1::CompoundStatement
    end_with_break_or_return_statement?(stmt.block_Items.last)
  when Cc1::BreakStatement
    true
  when Cc1::ReturnStatement
    true
  end
end
enter_switch_statement(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 146
def enter_switch_statement(node)
  prv_item = nil
  node.statement.block_items.each do |item|
    if prv_item
      case item
      when Cc1::CaseLabeledStatement, Cc1::DefaultLabeledStatement
        case prv_item
        when Cc1::CompoundStatement
          unless end_with_break_or_return_statement?(item)
            W(item.location)
            warn_inner_case_labeled_statement(item)
          end
        when Cc1::BreakStatement, Cc1::ReturnStatement
          ;
        else
          W(item.location)
          warn_inner_case_labeled_statement(item)
        end
      end
    end

    item = item.statement while item.kind_of?(Cc1::LabeledStatement)
    prv_item = item
  end
end
warn_inner_case_labeled_statement(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 172
def warn_inner_case_labeled_statement(node)
  child = node
  loop do
    child = child.statement
    break unless child.kind_of?(Cc1::CaseLabeledStatement)
    W(child.location)
  end
end