Module: AdLint::Cc1::Conversion
- Included in:
- ExpressionEvaluator, InitializerInterpreter, Interpreter, SubInterpreter, ValueDomainManipulator, ValueDomainNarrowing, Exam::CBuiltin::W0582, Exam::CBuiltin::W0583, Exam::CBuiltin::W0584, Exam::CBuiltin::W9003
- Defined in:
- lib/adlint/cc1/conv.rb
Overview
:nodoc:
Instance Method Summary collapse
-
#do_conversion(orig_var, to_type) ⇒ Object
NOTE: Host class of this module must include InterpreterMediator.
- #do_default_argument_promotion(orig_var) ⇒ Object
- #do_integer_promotion(orig_var) ⇒ Object
- #do_usual_arithmetic_conversion(lhs_orig, rhs_orig) ⇒ Object
- #untyped_pointer_conversion?(from_type, to_type, from_val) ⇒ Boolean
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
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 |