adlint 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/ChangeLog +413 -5
  2. data/MANIFEST +6 -0
  3. data/NEWS +43 -4
  4. data/etc/mesg.d/en_US/messages.yml +1 -1
  5. data/etc/mesg.d/ja_JP/messages.yml +1 -1
  6. data/lib/adlint/c.rb +1 -0
  7. data/lib/adlint/c/enum.rb +52 -0
  8. data/lib/adlint/c/expr.rb +43 -102
  9. data/lib/adlint/c/interp.rb +1 -1
  10. data/lib/adlint/c/mediator.rb +1 -0
  11. data/lib/adlint/c/message.rb +831 -49
  12. data/lib/adlint/c/message_shima.rb +236 -0
  13. data/lib/adlint/c/metric.rb +9 -0
  14. data/lib/adlint/c/object.rb +37 -32
  15. data/lib/adlint/c/parser.rb +7 -7
  16. data/lib/adlint/c/parser.y +7 -7
  17. data/lib/adlint/c/phase.rb +21 -0
  18. data/lib/adlint/c/syntax.rb +11 -4
  19. data/lib/adlint/c/type.rb +1 -1
  20. data/lib/adlint/cpp.rb +1 -0
  21. data/lib/adlint/cpp/asm.rb +73 -0
  22. data/lib/adlint/cpp/message.rb +13 -0
  23. data/lib/adlint/cpp/message_shima.rb +36 -0
  24. data/lib/adlint/cpp/phase.rb +3 -0
  25. data/lib/adlint/cpp/source.rb +9 -0
  26. data/lib/adlint/version.rb +3 -3
  27. data/share/demo/Makefile +4 -0
  28. data/share/demo/bad_conv/bad_conv.c +12 -0
  29. data/share/demo/bad_enum/bad_enum.c +48 -2
  30. data/share/demo/bad_label/bad_label.c +26 -0
  31. data/share/demo/bad_macro/bad_macro.c +3 -0
  32. data/share/demo/implicit_conv/implicit_conv.c +1 -0
  33. data/share/demo/inline_asm/inline_asm.c +18 -0
  34. data/share/demo/invalid_call/invalid_call.c +5 -0
  35. data/share/demo/multi_decl/multi_decl_1.c +30 -0
  36. data/share/demo/overflow/overflow.c +3 -3
  37. data/share/demo/redundant_select/redundant_select.c +25 -0
  38. data/share/demo/reserved_ident/reserved_ident.c +98 -0
  39. data/share/doc/developers_guide_ja.html +3 -3
  40. data/share/doc/developers_guide_ja.texi +1 -1
  41. data/share/doc/users_guide_en.html +234 -126
  42. data/share/doc/users_guide_en.texi +207 -98
  43. data/share/doc/users_guide_ja.html +247 -156
  44. data/share/doc/users_guide_ja.texi +221 -130
  45. data/share/sample/vim-7.3/adlint/xxd/adlint_traits.yml +1 -1
  46. metadata +8 -2
data/MANIFEST CHANGED
@@ -38,6 +38,7 @@ lib/adlint/c/const.rb
38
38
  lib/adlint/c/conv.rb
39
39
  lib/adlint/c/ctrlexpr.rb
40
40
  lib/adlint/c/domain.rb
41
+ lib/adlint/c/enum.rb
41
42
  lib/adlint/c/environ.rb
42
43
  lib/adlint/c/expr.rb
43
44
  lib/adlint/c/format.rb
@@ -61,6 +62,7 @@ lib/adlint/c/util.rb
61
62
  lib/adlint/c/value.rb
62
63
  lib/adlint/code.rb
63
64
  lib/adlint/cpp.rb
65
+ lib/adlint/cpp/asm.rb
64
66
  lib/adlint/cpp/code.rb
65
67
  lib/adlint/cpp/constexpr.y
66
68
  lib/adlint/cpp/constexpr.rb
@@ -113,6 +115,7 @@ share/demo/bad_conv/bad_conv.c
113
115
  share/demo/bad_enum/bad_enum.c
114
116
  share/demo/bad_indent/bad_indent.c
115
117
  share/demo/bad_init/bad_init.c
118
+ share/demo/bad_label/bad_label.c
116
119
  share/demo/bad_line/bad_line.c
117
120
  share/demo/bad_macro/bad_macro.c
118
121
  share/demo/bad_return/bad_return.c
@@ -140,6 +143,7 @@ share/demo/indirect_recur/indirect_recur_2.h
140
143
  share/demo/indirect_recur/indirect_recur_3.c
141
144
  share/demo/indirect_recur/indirect_recur_3.h
142
145
  share/demo/indirect_recur/indirect_recur_4.c
146
+ share/demo/inline_asm/inline_asm.c
143
147
  share/demo/intro_demo/intro_demo.c
144
148
  share/demo/intro_demo/intro_demo.h
145
149
  share/demo/intro_demo/useless_header.h
@@ -180,6 +184,8 @@ share/demo/octal_const/octal_const.c
180
184
  share/demo/output_by_param/output_by_param.c
181
185
  share/demo/overflow/overflow.c
182
186
  share/demo/press_release/press_release.c
187
+ share/demo/redundant_select/redundant_select.c
188
+ share/demo/reserved_ident/reserved_ident.c
183
189
  share/demo/retn_lvar_addr/retn_lvar_addr.c
184
190
  share/demo/sequence_point/sequence_point.c
185
191
  share/demo/shift_expr/shift_expr.c
data/NEWS CHANGED
@@ -21,6 +21,49 @@
21
21
 
22
22
  ++
23
23
 
24
+ === \AdLint 1.6.0 is released (2012-04-06)
25
+
26
+ ==== Changes since the 1.4.0 release
27
+
28
+ * Add W0541 detection
29
+ * Add W0573 detection
30
+ * Add W0579 detection
31
+ * Add W0685 detection
32
+ * Add W0686 detection
33
+ * Add W0781 detection
34
+ * Add W0787 detection
35
+ * Add W0788 detection
36
+ * Add W0789 detection
37
+ * Add W0807 detection
38
+ * Add W0808 detection
39
+ * Add W0809 detection
40
+ * Add W1030 detection
41
+ * Add W1053 detection
42
+ * Add W1054 detection
43
+ * Add W1055 detection
44
+ * Add W1056 detection
45
+ * Add W1057 detection
46
+ * Add W1058 detection
47
+ * Add W1059 detection
48
+ * Add W1060 detection
49
+ * Add W1061 detection
50
+ * Add W1062 detection
51
+ * Add W1063 detection
52
+ * Fix W0027 detection not to warn when a pointer variable is compared
53
+ with NULL constant
54
+ * Fix W0728, W0729 and W0730 detections not to warn when the target
55
+ is a variable of the other enum type
56
+ * Fix W0104 detection not to warn about invariant parameter of array
57
+ type whose base type is qualified as const
58
+ * Fix bad W0031, W0100, W0104, W0459 and W0460 detections
59
+ * Fix bad FN_UNUV measurement
60
+ * Update the user's guide in Japanese
61
+ * Update the user's guide in English
62
+
63
+ See the file
64
+ {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
65
+ for more details.
66
+
24
67
  === \AdLint 1.4.0 is released (2012-03-29)
25
68
 
26
69
  ==== Changes since the 1.2.0 release
@@ -56,10 +99,6 @@
56
99
  * Update the user's guide in Japanese
57
100
  * Update the user's guide in English
58
101
 
59
- See the file
60
- {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
61
- for more details.
62
-
63
102
  === \AdLint 1.2.0 is released (2012-03-21)
64
103
 
65
104
  ==== Changes since the 1.0.0 release
@@ -36,7 +36,7 @@
36
36
  # X9999: "Your custom message for the fatal error of #9999."
37
37
  # E9999: "Your custom message for the error of #9999."
38
38
 
39
- version: "1.4.0"
39
+ version: "1.6.0"
40
40
 
41
41
  message_definition:
42
42
  X0001: "An unknown exception `%s' is found."
@@ -36,7 +36,7 @@
36
36
  # X9999: "Your custom message for the fatal error of #9999."
37
37
  # E9999: "Your custom message for the error of #9999."
38
38
 
39
- version: "1.4.0"
39
+ version: "1.6.0"
40
40
 
41
41
  message_definition:
42
42
  X0001: "不明な例外条件 `%s' を検出しました。"
data/lib/adlint/c.rb CHANGED
@@ -36,6 +36,7 @@ require "adlint/c/ctrlexpr"
36
36
  require "adlint/c/const"
37
37
  require "adlint/c/conv"
38
38
  require "adlint/c/domain"
39
+ require "adlint/c/enum"
39
40
  require "adlint/c/environ"
40
41
  require "adlint/c/expr"
41
42
  require "adlint/c/format"
@@ -0,0 +1,52 @@
1
+ # C Enumerators.
2
+ #
3
+ # Author:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
4
+ # Copyright:: Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
5
+ # License:: GPLv3+: GNU General Public License version 3 or later
6
+ #
7
+ # Owner:: Yutaka Yanoh <mailto:yanoh@users.sourceforge.net>
8
+
9
+ #--
10
+ # ___ ____ __ ___ _________
11
+ # / | / _ |/ / / / | / /__ __/ Source Code Static Analyzer
12
+ # / /| | / / / / / / / |/ / / / AdLint - Advanced Lint
13
+ # / __ |/ /_/ / /___/ / /| / / /
14
+ # /_/ |_|_____/_____/_/_/ |_/ /_/ Copyright (C) 2010-2012, OGIS-RI Co.,Ltd.
15
+ #
16
+ # This file is part of AdLint.
17
+ #
18
+ # AdLint is free software: you can redistribute it and/or modify it under the
19
+ # terms of the GNU General Public License as published by the Free Software
20
+ # Foundation, either version 3 of the License, or (at your option) any later
21
+ # version.
22
+ #
23
+ # AdLint is distributed in the hope that it will be useful, but WITHOUT ANY
24
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
25
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26
+ #
27
+ # You should have received a copy of the GNU General Public License along with
28
+ # AdLint. If not, see <http://www.gnu.org/licenses/>.
29
+ #
30
+ #++
31
+
32
+ require "adlint/c/syntax"
33
+
34
+ module AdLint #:nodoc:
35
+ module C #:nodoc:
36
+
37
+ class EnumeratorTable
38
+ def initialize
39
+ @enumerators = {}
40
+ end
41
+
42
+ def define(enumerator)
43
+ @enumerators[enumerator.identifier.value] = enumerator
44
+ end
45
+
46
+ def lookup(name_str)
47
+ @enumerators[name_str]
48
+ end
49
+ end
50
+
51
+ end
52
+ end
data/lib/adlint/c/expr.rb CHANGED
@@ -45,16 +45,10 @@ module C #:nodoc:
45
45
  variable.declarations_and_definitions.each do |decl_or_def|
46
46
  decl_or_def.mark_as_referred_by(node.identifier)
47
47
  end
48
- if variable.type.array?
49
- # NOTE: Array object is referred to derive the start address.
50
- # NOTE: Kill this notification not to confuse the W0459 and W0460
51
- # detections of the expression-statement `a[i] = 0;' when
52
- # contents of `a' is not initialized.
53
- # _notify_variable_value_referred(node, variable)
54
- variable = temporary_variable(pointer_type(variable.type.base_type),
55
- pointer_value_of(variable))
56
- end
57
48
  _notify_object_referred(node, variable)
49
+ # NOTE: Array object will be converted into its start address by the
50
+ # outer expression. So, it is correct to return an array object
51
+ # itself.
58
52
  return variable
59
53
  end
60
54
 
@@ -68,40 +62,43 @@ module C #:nodoc:
68
62
 
69
63
  if enumerator = enumerator_named(node.identifier.value)
70
64
  enumerator.mark_as_referred_by(node.identifier)
71
- return temporary_variable(enumerator.type, ScalarValue.of(enumerator.value))
65
+ return temporary_variable(enumerator.type,
66
+ ScalarValue.of(enumerator.value))
72
67
  end
73
68
 
74
69
  define_implicit_function(node.identifier.value)
75
70
  end
76
- module_function :execute_object_specifier
77
71
 
78
72
  def execute_array_subscript_expression(node, object, subscript)
79
73
  unless object.variable? && (object.type.array? || object.type.pointer?)
80
74
  return temporary_variable
81
75
  end
82
- _notify_variable_value_referred(node, object)
83
76
 
84
77
  array_or_pointer = object
85
78
 
86
79
  result_type = array_or_pointer.type.unqualify.base_type
87
80
  result_type = pointer_type(result_type) if result_type.array?
88
81
 
89
- unless subscript.variable? && subscript.value.scalar? &&
90
- subscript.value.exist?
91
- return temporary_variable(result_type)
92
- end
93
- _notify_variable_value_referred(node, subscript)
94
-
95
82
  case
96
83
  when array_or_pointer.type.array?
97
84
  array = array_or_pointer
85
+ # NOTE: An array-subscript-expression with an array object only refers
86
+ # the array object, never refer the value of the array object.
98
87
  when array_or_pointer.type.pointer?
99
88
  if pointee = pointee_of(array_or_pointer) and pointee.type.array?
100
89
  array = pointee
101
- _notify_variable_value_referred(node, array)
102
90
  end
91
+ # NOTE: An array-subscript-expression with a pointer object do refers
92
+ # the value of the pointer object.
93
+ _notify_variable_value_referred(node, array_or_pointer)
103
94
  end
104
95
 
96
+ unless subscript.variable? && subscript.value.scalar? &&
97
+ subscript.value.exist?
98
+ return temporary_variable(result_type)
99
+ end
100
+ _notify_variable_value_referred(node, subscript)
101
+
105
102
  # NOTE: An array subscript converted to `int' implicitly.
106
103
  if subscript.type.same_as?(int_type)
107
104
  int_subscript = subscript
@@ -118,21 +115,16 @@ module C #:nodoc:
118
115
  subscript_value = int_subscript.value.unique_sample
119
116
  if array and inner_variable = array.inner_variable_at(subscript_value)
120
117
  _notify_object_referred(node, inner_variable)
121
- if inner_variable.type.array?
122
- result = temporary_variable(result_type,
123
- pointer_value_of(inner_variable))
124
- else
118
+ if inner_variable.type.same_as?(result_type)
125
119
  result = inner_variable
126
120
  end
127
- else
128
- result = temporary_variable(result_type)
129
121
  end
122
+ result ||= temporary_variable(result_type)
130
123
 
131
124
  notify_array_subscript_expr_evaled(node, array_or_pointer,
132
125
  int_subscript, array, result)
133
126
  result
134
127
  end
135
- module_function :execute_array_subscript_expression
136
128
 
137
129
  def execute_function_call_expression(node, object, args)
138
130
  if object.function?
@@ -151,8 +143,6 @@ module C #:nodoc:
151
143
  end
152
144
  _notify_variable_value_referred(node, object)
153
145
 
154
- args.each { |arg, expr| _notify_variable_value_referred(expr, arg) }
155
-
156
146
  # NOTE: The ISO C99 standard saids;
157
147
  #
158
148
  # 6.5.2.2 Function calls
@@ -166,13 +156,12 @@ module C #:nodoc:
166
156
 
167
157
  result = function.call(interpreter, node, args)
168
158
  unless function.builtin?
169
- notify_function_call_expr_evaled(node, function,
170
- args.map { |arg, expr| arg }, result)
159
+ arg_variables = args.map { |arg, expr| object_to_variable(arg) }
160
+ notify_function_call_expr_evaled(node, function, arg_variables, result)
171
161
  end
172
162
 
173
163
  result
174
164
  end
175
- module_function :execute_function_call_expression
176
165
 
177
166
  def execute_member_access_by_value_expression(node, object)
178
167
  unless object.variable? && object.type.composite?
@@ -181,7 +170,8 @@ module C #:nodoc:
181
170
  variable = object
182
171
 
183
172
  member_variable = variable.inner_variable_named(node.identifier.value)
184
- _notify_variable_value_referred(node, variable)
173
+ # NOTE: A member-access-by-value-expression only refers the composite
174
+ # object, never refer the value of the composite object.
185
175
 
186
176
  # NOTE: `member_variable' is nil when this expression represents the
187
177
  # direct member access extension.
@@ -189,16 +179,11 @@ module C #:nodoc:
189
179
 
190
180
  if member_variable
191
181
  _notify_object_referred(node, member_variable)
192
- if member_variable.type.array?
193
- type = pointer_type(member_variable.type.base_type)
194
- return temporary_variable(type, pointer_value_of(member_variable))
195
- end
196
182
  member_variable
197
183
  else
198
184
  temporary_variable
199
185
  end
200
186
  end
201
- module_function :execute_member_access_by_value_expression
202
187
 
203
188
  def execute_member_access_by_pointer_expression(node, object)
204
189
  unqualified_type = object.type.unqualify
@@ -218,6 +203,8 @@ module C #:nodoc:
218
203
  end
219
204
  end
220
205
  end
206
+ # NOTE: A member-access-by-pointer-expression do refers the value of the
207
+ # pointer object.
221
208
  _notify_variable_value_referred(node, pointer)
222
209
 
223
210
  if pointee && pointee.type.composite?
@@ -233,16 +220,11 @@ module C #:nodoc:
233
220
 
234
221
  if member_variable
235
222
  _notify_object_referred(node, member_variable)
236
- if member_variable.type.array?
237
- type = pointer_type(member_variable.type.base_type)
238
- return temporary_variable(type, pointer_value_of(member_variable))
239
- end
240
223
  member_variable
241
224
  else
242
225
  temporary_variable
243
226
  end
244
227
  end
245
- module_function :execute_member_access_by_pointer_expression
246
228
 
247
229
  def execute_postfix_increment_expression(node, object)
248
230
  return temporary_variable unless object.variable? && object.type.scalar?
@@ -264,7 +246,6 @@ module C #:nodoc:
264
246
 
265
247
  result
266
248
  end
267
- module_function :execute_postfix_increment_expression
268
249
 
269
250
  def execute_postfix_decrement_expression(node, object)
270
251
  return temporary_variable unless object.variable? && object.type.scalar?
@@ -286,7 +267,6 @@ module C #:nodoc:
286
267
 
287
268
  result
288
269
  end
289
- module_function :execute_postfix_decrement_expression
290
270
 
291
271
  def execute_prefix_increment_expression(node, object)
292
272
  return temporary_variable unless object.variable? && object.type.scalar?
@@ -308,7 +288,6 @@ module C #:nodoc:
308
288
 
309
289
  variable
310
290
  end
311
- module_function :execute_prefix_increment_expression
312
291
 
313
292
  def execute_prefix_decrement_expression(node, object)
314
293
  return temporary_variable unless object.variable? && object.type.scalar?
@@ -330,7 +309,6 @@ module C #:nodoc:
330
309
 
331
310
  variable
332
311
  end
333
- module_function :execute_prefix_decrement_expression
334
312
 
335
313
  def execute_address_expression(node, object)
336
314
  # NOTE: An address-expression does not read the value of the object. But
@@ -340,7 +318,6 @@ module C #:nodoc:
340
318
 
341
319
  temporary_variable(pointer_type(object.type), pointer_value_of(object))
342
320
  end
343
- module_function :execute_address_expression
344
321
 
345
322
  def execute_indirection_expression(node, object)
346
323
  return temporary_variable unless object.variable? && object.type.pointer?
@@ -376,7 +353,6 @@ module C #:nodoc:
376
353
 
377
354
  pointee
378
355
  end
379
- module_function :execute_indirection_expression
380
356
 
381
357
  def execute_unary_arithmetic_expression(node, object)
382
358
  variable = object_to_variable(object)
@@ -404,7 +380,6 @@ module C #:nodoc:
404
380
 
405
381
  result
406
382
  end
407
- module_function :execute_unary_arithmetic_expression
408
383
 
409
384
  def execute_cast_expression(node, object)
410
385
  resolve_unresolved_type(node.type_name)
@@ -418,7 +393,6 @@ module C #:nodoc:
418
393
 
419
394
  converted
420
395
  end
421
- module_function :execute_cast_expression
422
396
 
423
397
  def execute_multiplicative_expression(node, lhs_object, rhs_object)
424
398
  lhs_variable = object_to_variable(lhs_object)
@@ -478,7 +452,6 @@ module C #:nodoc:
478
452
  result)
479
453
  result
480
454
  end
481
- module_function :execute_multiplicative_expression
482
455
 
483
456
  def execute_additive_expression(node, lhs_object, rhs_object)
484
457
  lhs_variable = object_to_variable(lhs_object)
@@ -531,7 +504,6 @@ module C #:nodoc:
531
504
 
532
505
  result
533
506
  end
534
- module_function :execute_additive_expression
535
507
 
536
508
  def execute_shift_expression(node, lhs_object, rhs_object)
537
509
  lhs_variable = object_to_variable(lhs_object)
@@ -592,7 +564,6 @@ module C #:nodoc:
592
564
 
593
565
  result
594
566
  end
595
- module_function :execute_shift_expression
596
567
 
597
568
  def execute_relational_expression(node, lhs_object, rhs_object)
598
569
  lhs_variable = object_to_variable(lhs_object)
@@ -652,7 +623,6 @@ module C #:nodoc:
652
623
 
653
624
  result
654
625
  end
655
- module_function :execute_relational_expression
656
626
 
657
627
  def execute_equality_expression(node, lhs_object, rhs_object)
658
628
  lhs_variable = object_to_variable(lhs_object)
@@ -706,7 +676,6 @@ module C #:nodoc:
706
676
 
707
677
  result
708
678
  end
709
- module_function :execute_equality_expression
710
679
 
711
680
  def execute_and_expression(node, lhs_object, rhs_object)
712
681
  lhs_variable = object_to_variable(lhs_object)
@@ -749,7 +718,6 @@ module C #:nodoc:
749
718
 
750
719
  result
751
720
  end
752
- module_function :execute_and_expression
753
721
 
754
722
  def execute_exclusive_or_expression(node, lhs_object, rhs_object)
755
723
  lhs_variable = object_to_variable(lhs_object)
@@ -792,7 +760,6 @@ module C #:nodoc:
792
760
 
793
761
  result
794
762
  end
795
- module_function :execute_exclusive_or_expression
796
763
 
797
764
  def execute_inclusive_or_expression(node, lhs_object, rhs_object)
798
765
  lhs_variable = object_to_variable(lhs_object)
@@ -835,7 +802,6 @@ module C #:nodoc:
835
802
 
836
803
  result
837
804
  end
838
- module_function :execute_inclusive_or_expression
839
805
 
840
806
  def execute_simple_assignment_expression(node, lhs_object, rhs_object)
841
807
  return lhs_object unless lhs_object.variable?
@@ -870,7 +836,6 @@ module C #:nodoc:
870
836
 
871
837
  lhs_variable
872
838
  end
873
- module_function :execute_simple_assignment_expression
874
839
 
875
840
  def execute_compound_assignment_expression(node, lhs_object, rhs_object)
876
841
  unless lhs_object.variable? && lhs_object.type.scalar?
@@ -911,7 +876,6 @@ module C #:nodoc:
911
876
 
912
877
  lhs_variable
913
878
  end
914
- module_function :execute_compound_assignment_expression
915
879
 
916
880
  def execute_mul_then_assign_expression(node, lhs_variable, rhs_variable)
917
881
  lhs_converted, rhs_converted =
@@ -962,7 +926,6 @@ module C #:nodoc:
962
926
 
963
927
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
964
928
  end
965
- module_function :execute_mul_then_assign_expression
966
929
 
967
930
  def execute_div_then_assign_expression(node, lhs_variable, rhs_variable)
968
931
  lhs_converted, rhs_converted =
@@ -1014,7 +977,6 @@ module C #:nodoc:
1014
977
 
1015
978
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1016
979
  end
1017
- module_function :execute_div_then_assign_expression
1018
980
 
1019
981
  def execute_mod_then_assign_expression(node, lhs_variable, rhs_variable)
1020
982
  lhs_converted, rhs_converted =
@@ -1066,7 +1028,6 @@ module C #:nodoc:
1066
1028
 
1067
1029
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1068
1030
  end
1069
- module_function :execute_mod_then_assign_expression
1070
1031
 
1071
1032
  def execute_add_then_assign_expression(node, lhs_variable, rhs_variable)
1072
1033
  lhs_converted, rhs_converted =
@@ -1117,7 +1078,6 @@ module C #:nodoc:
1117
1078
 
1118
1079
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1119
1080
  end
1120
- module_function :execute_add_then_assign_expression
1121
1081
 
1122
1082
  def execute_sub_then_assign_expression(node, lhs_variable, rhs_variable)
1123
1083
  lhs_converted, rhs_converted =
@@ -1168,7 +1128,6 @@ module C #:nodoc:
1168
1128
 
1169
1129
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1170
1130
  end
1171
- module_function :execute_sub_then_assign_expression
1172
1131
 
1173
1132
  def execute_shl_then_assign_expression(node, lhs_variable, rhs_variable)
1174
1133
  # NOTE: The ISO C99 standard saids;
@@ -1227,7 +1186,6 @@ module C #:nodoc:
1227
1186
 
1228
1187
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1229
1188
  end
1230
- module_function :execute_shl_then_assign_expression
1231
1189
 
1232
1190
  def execute_shr_then_assign_expression(node, lhs_variable, rhs_variable)
1233
1191
  # NOTE: The ISO C99 standard saids;
@@ -1286,7 +1244,6 @@ module C #:nodoc:
1286
1244
 
1287
1245
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1288
1246
  end
1289
- module_function :execute_shr_then_assign_expression
1290
1247
 
1291
1248
  def execute_and_then_assign_expression(node, lhs_variable, rhs_variable)
1292
1249
  lhs_converted, rhs_converted =
@@ -1336,7 +1293,6 @@ module C #:nodoc:
1336
1293
 
1337
1294
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1338
1295
  end
1339
- module_function :execute_and_then_assign_expression
1340
1296
 
1341
1297
  def execute_xor_then_assign_expression(node, lhs_variable, rhs_variable)
1342
1298
  lhs_converted, rhs_converted =
@@ -1387,7 +1343,6 @@ module C #:nodoc:
1387
1343
 
1388
1344
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1389
1345
  end
1390
- module_function :execute_xor_then_assign_expression
1391
1346
 
1392
1347
  def execute_ior_then_assign_expression(node, lhs_variable, rhs_variable)
1393
1348
  lhs_converted, rhs_converted =
@@ -1438,7 +1393,6 @@ module C #:nodoc:
1438
1393
 
1439
1394
  notify_assignment_expr_evaled(node, lhs_variable, result_converted)
1440
1395
  end
1441
- module_function :execute_ior_then_assign_expression
1442
1396
 
1443
1397
  def _notify_object_referred(node, object)
1444
1398
  case object
@@ -1448,7 +1402,6 @@ module C #:nodoc:
1448
1402
  interpreter.notify_function_referred(node, object)
1449
1403
  end
1450
1404
  end
1451
- module_function :_notify_object_referred
1452
1405
 
1453
1406
  def _notify_variable_value_referred(node, object)
1454
1407
  if object.variable?
@@ -1459,7 +1412,6 @@ module C #:nodoc:
1459
1412
  # is referred, notification of the outer variable's value has
1460
1413
  # already been done in sub expressions.
1461
1414
  end
1462
- module_function :_notify_variable_value_referred
1463
1415
 
1464
1416
  def _notify_variable_value_updated(node, object)
1465
1417
  if object.variable?
@@ -1473,19 +1425,16 @@ module C #:nodoc:
1473
1425
  _notify_variable_value_updated(node, object.owner)
1474
1426
  end
1475
1427
  end
1476
- module_function :_notify_variable_value_updated
1477
1428
 
1478
1429
  def _char_array_value(string_literal)
1479
1430
  chars = string_literal.chars.map { |ch| ScalarValue.of(ch.ord) }
1480
1431
  ArrayValue.new(chars + [ScalarValue.of("\0".ord)])
1481
1432
  end
1482
- module_function :_char_array_value
1483
1433
 
1484
1434
  def _wchar_array_value(string_literal)
1485
1435
  chars = string_literal.chars.map { |ch| ScalarValue.of(ch.ord) }
1486
1436
  ArrayValue.new(chars + [ScalarValue.of("\0".ord)])
1487
1437
  end
1488
- module_function :_wchar_array_value
1489
1438
  end
1490
1439
 
1491
1440
  module ExpressionEvaluator
@@ -1525,17 +1474,14 @@ module C #:nodoc:
1525
1474
 
1526
1475
  case node.literal.value
1527
1476
  when /\A"(.*)"\z/
1528
- array = temporary_variable(array_type(char_type, $1.length + 1),
1529
- _char_array_value($1))
1477
+ temporary_variable(array_type(char_type, $1.length + 1),
1478
+ _char_array_value($1))
1530
1479
  when /\AL"(.*)"\z/i
1531
- array = temporary_variable(array_type(wchar_type, $1.length + 1),
1532
- _wchar_array_value($1))
1480
+ temporary_variable(array_type(wchar_type, $1.length + 1),
1481
+ _wchar_array_value($1))
1533
1482
  else
1534
- return temporary_variable(pointer_type(char_type))
1483
+ temporary_variable(array_type(char_type))
1535
1484
  end
1536
-
1537
- temporary_variable(pointer_type(array.type.base_type),
1538
- pointer_value_of(array))
1539
1485
  end
1540
1486
 
1541
1487
  def visit_null_constant_specifier(node)
@@ -1851,28 +1797,23 @@ module C #:nodoc:
1851
1797
  def visit_conditional_expression(node)
1852
1798
  checkpoint(node.location)
1853
1799
 
1854
- condition_object = node.condition.accept(self)
1800
+ condition_variable = object_to_variable(node.condition.accept(self))
1855
1801
 
1856
- if condition_object.variable?
1857
- case
1858
- when condition_object.value.must_be_true?
1859
- result_object = node.then_expression.accept(self)
1860
- when condition_object.value.must_be_false?
1861
- result_object = node.else_expression.accept(self)
1862
- else
1863
- then_object = node.then_expression.accept(self)
1864
- else_object = node.else_expression.accept(self)
1865
- if then_object.variable? && else_object.variable?
1866
- result_value =
1867
- then_object.value.single_value_unified_with(else_object.value)
1868
- result_object = temporary_variable(then_object.type, result_value)
1869
- end
1870
- end
1802
+ case
1803
+ when condition_variable.value.must_be_true?
1804
+ result_variable = object_to_variable(node.then_expression.accept(self))
1805
+ when condition_variable.value.must_be_false?
1806
+ result_variable = object_to_variable(node.else_expression.accept(self))
1807
+ else
1808
+ then_var = object_to_variable(node.then_expression.accept(self))
1809
+ else_var = object_to_variable(node.else_expression.accept(self))
1810
+ result_value = then_var.value.single_value_unified_with(else_var.value)
1811
+ result_variable = temporary_variable(then_var.type, result_value)
1871
1812
  end
1872
1813
 
1873
- result = result_object ? result_object : temporary_variable
1874
- notify_conditional_expr_evaled(node, condition_object, result)
1875
- result
1814
+ notify_conditional_expr_evaled(node, condition_variable, result_variable)
1815
+
1816
+ result_variable
1876
1817
  end
1877
1818
 
1878
1819
  def visit_simple_assignment_expression(node)