class AdLint::Exam::CBuiltin::W0491

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 10258
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_variable_defined  += T(:define_variable)
  interp.on_variable_declared += T(:declare_variable)
  interp.on_struct_declared   += T(:declare_struct)
  interp.on_union_declared    += T(:declare_union)
  interp.on_enum_declared     += T(:declare_enum)
  interp.on_typedef_declared  += T(:declare_typedef)
  interp.on_parameter_defined += T(:define_parameter)
  interp.on_label_defined     += T(:define_label)
  interp.on_block_started     += T(:enter_scope)
  interp.on_block_ended       += T(:leave_scope)
  @dcl_names   = [[]]
  @tag_names   = [[]]
  @label_names = [[]]
end

Private Instance Methods

declare_enum(enum_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10339
def declare_enum(enum_dcl)
  tag_name = enum_dcl.identifier
  return unless tag_name

  pair_names = (@dcl_names + @label_names).flatten.select { |id|
    id.value == tag_name.value
  }

  unless pair_names.empty?
    W(enum_dcl.location, tag_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @tag_names.last.push(tag_name)
end
declare_struct(struct_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10307
def declare_struct(struct_dcl)
  tag_name = struct_dcl.identifier
  return unless tag_name

  pair_names = (@dcl_names + @label_names).flatten.select { |id|
    id.value == tag_name.value
  }

  unless pair_names.empty?
    W(struct_dcl.location, tag_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @tag_names.last.push(tag_name)
end
declare_typedef(typedef_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10355
def declare_typedef(typedef_dcl)
  dcl_name = typedef_dcl.identifier

  pair_names = (@tag_names + @label_names).flatten.select { |id|
    id.value == dcl_name.value
  }

  unless pair_names.empty?
    W(typedef_dcl.location, dcl_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @dcl_names.last.push(dcl_name)
end
declare_union(union_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10323
def declare_union(union_dcl)
  tag_name = union_dcl.identifier
  return unless tag_name

  pair_names = (@dcl_names + @label_names).flatten.select { |id|
    id.value == tag_name.value
  }

  unless pair_names.empty?
    W(union_dcl.location, tag_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @tag_names.last.push(tag_name)
end
declare_variable(var_dcl, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10292
def declare_variable(var_dcl, *)
  dcl_name = var_dcl.identifier

  pair_names = (@tag_names + @label_names).flatten.select { |id|
    id.value == dcl_name.value
  }

  unless pair_names.empty?
    W(var_dcl.location, dcl_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @dcl_names.last.push(dcl_name)
end
define_label(labeled_stmt) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10386
def define_label(labeled_stmt)
  label_name = labeled_stmt.label

  pair_names = (@dcl_names + @tag_names).flatten.select { |id|
    id.value == label_name.value
  }

  unless pair_names.empty?
    W(labeled_stmt.location, label_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @label_names.last.push(label_name)
end
define_parameter(param_def, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10370
def define_parameter(param_def, *)
  dcl_name = param_def.identifier
  return unless dcl_name

  pair_names = (@tag_names + @label_names).flatten.select { |id|
    id.value == dcl_name.value
  }

  unless pair_names.empty?
    W(param_def.location, dcl_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @dcl_names.last.push(dcl_name)
end
define_variable(var_def, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10277
def define_variable(var_def, *)
  dcl_name = var_def.identifier

  pair_names = (@tag_names + @label_names).flatten.select { |id|
    id.value == dcl_name.value
  }

  unless pair_names.empty?
    W(var_def.location, dcl_name.value,
      *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
  end

  @dcl_names.last.push(dcl_name)
end
enter_scope(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10401
def enter_scope(*)
  @dcl_names.push([])
  @tag_names.push([])
  @label_names.push([])
end
leave_scope(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10407
def leave_scope(*)
  @dcl_names.pop
  @tag_names.pop
  @label_names.pop
end