class AdLint::Exam::CBuiltin::W1037

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 274
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 295
def check_function(fun)
  similar_dcls_or_funs =
    @fun_map.lookup_function_declarations(fun.name).select { |dcl|
      dcl.explicit? && dcl.extern? && dcl.signature != fun.signature
    } + @fun_map.lookup_functions(fun.name).select { |mapped_fun|
      mapped_fun.extern? && mapped_fun.signature != fun.signature
    }

  unless similar_dcls_or_funs.empty?
    W(fun.location, fun.signature,
      *similar_dcls_or_funs.map { |pair|
        C(:C0001, pair.location, pair.signature)
      })
  end
end
check_function_declaration(fun) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 287
def check_function_declaration(fun)
  check_function(fun) if fun.extern? && fun.explicit?
end
check_function_definition(fun) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 291
def check_function_definition(fun)
  check_function(fun) if fun.extern?
end
check_variable(var) click to toggle source
# File lib/adlint/exam/c_builtin/ld_check.rb, line 311
def check_variable(var)
  if var.extern?
    dcls_or_vars = @var_map.lookup_variable_declarations(var.name) +
                   @var_map.lookup_variables(var.name)
    similar_dcls_or_vars = dcls_or_vars.select { |dcl_or_var|
      dcl_or_var.extern? && dcl_or_var.type != var.type
    }

    unless similar_dcls_or_vars.empty?
      W(var.location, var.name, *similar_dcls_or_vars.map { |pair|
        C(:C0001, pair.location, pair.name)
      })
    end
  end
end