class AdLint::Exam::CBuiltin::W0770

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/ld_check.rb, line 178
def initialize(phase_ctxt)
  super
  fun_traversal = phase_ctxt[:ld_function_traversal]
  fun_traversal.on_declaration += T(:check_function_declaration)
  fun_traversal.on_definition  += T(:check_function_definition)
  @fun_map = phase_ctxt[:ld_function_map]
  var_traversal = phase_ctxt[:ld_variable_traversal]
  var_traversal.on_declaration += T(:check_variable)
  var_traversal.on_definition  += T(:check_variable)
  @var_map = phase_ctxt[:ld_variable_map]
end

Private Instance Methods

check_function(fun) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 203
def check_function(fun)
  similar_dcls =
    @fun_map.lookup_function_declarations(fun.name).select { |fun_dcl|
      fun_dcl.explicit?
    }

  if similar_dcls.size > 1
    W(fun.location, fun.signature, *similar_dcls.map { |pair|
      C(:C0001, pair.location, pair.signature) unless pair == fun
    }.compact)
  end
end
check_function_declaration(fun_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 191
def check_function_declaration(fun_dcl)
  if fun_dcl.extern? && fun_dcl.explicit?
    check_function(fun_dcl)
  end
end
check_function_definition(fun_def) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 197
def check_function_definition(fun_def)
  if fun_def.extern?
    check_function(fun_def)
  end
end
check_variable(var) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 216
def check_variable(var)
  if var.extern?
    similar_dcls = @var_map.lookup_variable_declarations(var.name)
    if similar_dcls.size > 1
      W(var.location, var.name, *similar_dcls.map { |pair|
        C(:C0001, pair.location, pair.name) unless pair == var
      }.compact)
    end
  end
end