Module: AdLint::Cc1::Conversion

Overview

:nodoc:

Instance Method Summary collapse

Instance Method Details

#do_conversion(orig_var, to_type) ⇒ Object

NOTE: Host class of this module must include InterpreterMediator.



38
39
40
41
42
43
44
45
46
# File 'lib/adlint/cc1/conv.rb', line 38

def do_conversion(orig_var, to_type)
  if orig_var.type.coercible?(to_type)
    # NOTE: Value will be coerced into the destination type in
    #       VariableTableMediator#create_tmpvar.
    create_tmpvar(to_type, wrap_around_value(orig_var, to_type))
  else
    nil
  end
end

#do_default_argument_promotion(orig_var) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/adlint/cc1/conv.rb', line 81

def do_default_argument_promotion(orig_var)
  promoted_type = orig_var.type.argument_promoted_type
  if orig_var.type.same_as?(promoted_type)
    orig_var
  else
    do_conversion(orig_var, promoted_type) || orig_var
  end
end

#do_integer_promotion(orig_var) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# File 'lib/adlint/cc1/conv.rb', line 48

def do_integer_promotion(orig_var)
  return orig_var unless orig_var.type.integer?

  promoted_type = orig_var.type.integer_promoted_type
  if orig_var.type.same_as?(promoted_type)
    orig_var
  else
    do_conversion(orig_var, promoted_type) || orig_var
  end
end

#do_usual_arithmetic_conversion(lhs_orig, rhs_orig) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/adlint/cc1/conv.rb', line 59

def do_usual_arithmetic_conversion(lhs_orig, rhs_orig)
  if lhs_orig.type.pointer? && rhs_orig.type.pointer?
    return lhs_orig, rhs_orig
  end

  arith_type = lhs_orig.type.arithmetic_type_with(rhs_orig.type)

  if lhs_orig.type.same_as?(arith_type)
    lhs_conved = lhs_orig
  else
    lhs_conved = do_conversion(lhs_orig, arith_type) || lhs_orig
  end

  if rhs_orig.type.same_as?(arith_type)
    rhs_conved = rhs_orig
  else
    rhs_conved = do_conversion(rhs_orig, arith_type) || rhs_orig
  end

  return lhs_conved, rhs_conved
end

#untyped_pointer_conversion?(from_type, to_type, from_val) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/adlint/cc1/conv.rb', line 90

def untyped_pointer_conversion?(from_type, to_type, from_val)
  return false unless to_type.pointer?

  # NOTE: Untyped pointer conversion is defined as below;
  #
  #           from_type     |     to_type      |      result
  #       ------------------+------------------+-----------------
  #        void pointer     | void pointer     | true
  #        void pointer     | non-void pointer | true
  #        non-void pointer | void pointer     | true
  #        non-void pointer | non-void pointer | false
  #        non-enum integer | void pointer     | from_val == 0
  #        non-enum integer | non-void pointer | from_val == 0
  #        enum             | void pointer     | false
  #        enum             | non-void pointer | false
  #        other            | void pointer     | true
  #        other            | non-void pointer | false
  case
  when from_type.pointer?
    void_pointer?(from_type) || void_pointer?(to_type)
  when from_type.integer?
    !from_type.enum? && from_val.test_must_be_null.true?
  else
    void_pointer?(to_type)
  end
end