class AdLint::Exam::CBuiltin::W0492

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 10421
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_or_union)
  interp.on_union_declared    += T(:declare_struct_or_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 = [[]]
  @memb_names  = [[]]
end

Private Instance Methods

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

  pair_names = @memb_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_members(struct_or_union_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10489
def declare_members(struct_or_union_dcl)
  memb_dcls = MemberExtractor.new.tap { |extr|
    struct_or_union_dcl.accept(extr)
  }.result.select { |memb| !memb.identifier.nil? }

  memb_dcls.each do |memb_dcl|
    pair_names =
      (@dcl_names + @tag_names + @label_names).flatten.select { |id|
        id.value == memb_dcl.identifier.value
      }
    unless pair_names.empty?
      W(memb_dcl.location, memb_dcl.identifier.value,
        *pair_names.map { |pair| C(:C0001, pair.location, pair.value) })
    end

    @memb_names.last.push(memb_dcl.identifier)
  end
end
declare_struct_or_union(struct_or_union_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10471
def declare_struct_or_union(struct_or_union_dcl)
  tag_name = struct_or_union_dcl.identifier
  return unless tag_name

  pair_names = @memb_names.flatten.select { |id|
    id.value == tag_name.value
  }

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

  @tag_names.last.push(tag_name)

  declare_members(struct_or_union_dcl)
end
declare_typedef(typedef_dcl) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10524
def declare_typedef(typedef_dcl)
  dcl_name = typedef_dcl.identifier

  pair_names = @memb_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_variable(var_dcl, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10456
def declare_variable(var_dcl, *)
  dcl_name = var_dcl.identifier

  pair_names = @memb_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 10555
def define_label(labeled_stmt)
  label_name = labeled_stmt.label

  pair_names = @memb_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 10539
def define_parameter(param_def, *)
  dcl_name = param_def.identifier
  return unless dcl_name

  pair_names = @memb_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 10441
def define_variable(var_def, *)
  dcl_name = var_def.identifier

  pair_names = @memb_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 10570
def enter_scope(*)
  @dcl_names.push([])
  @tag_names.push([])
  @label_names.push([])
  @memb_names.push([])
end
leave_scope(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 10577
def leave_scope(*)
  @dcl_names.pop
  @tag_names.pop
  @label_names.pop
  @memb_names.pop
end