adlint 3.0.10 → 3.2.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 (137) hide show
  1. data/ChangeLog +67 -0
  2. data/MANIFEST +2 -0
  3. data/NEWS +10 -3
  4. data/etc/mesg.d/c_builtin/en_US/messages.yml +29 -1
  5. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +29 -1
  6. data/etc/mesg.d/core/en_US/messages.yml +1 -1
  7. data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
  8. data/features/code_check/W0003.feature +5 -0
  9. data/features/code_check/W0023.feature +32 -0
  10. data/features/code_check/W0024.feature +22 -0
  11. data/features/code_check/W0093.feature +71 -0
  12. data/features/code_check/W0097.feature +4 -0
  13. data/features/code_check/W0100.feature +10 -0
  14. data/features/code_check/W0119.feature +8 -0
  15. data/features/code_check/W0133.feature +8 -0
  16. data/features/code_check/W0134.feature +8 -0
  17. data/features/code_check/W0136.feature +8 -0
  18. data/features/code_check/W0138.feature +8 -0
  19. data/features/code_check/W0140.feature +8 -0
  20. data/features/code_check/W0142.feature +8 -0
  21. data/features/code_check/W0143.feature +8 -0
  22. data/features/code_check/W0144.feature +8 -0
  23. data/features/code_check/W0145.feature +8 -0
  24. data/features/code_check/W0146.feature +8 -0
  25. data/features/code_check/W0147.feature +8 -0
  26. data/features/code_check/W0148.feature +8 -0
  27. data/features/code_check/W0149.feature +8 -0
  28. data/features/code_check/W0150.feature +8 -0
  29. data/features/code_check/W0151.feature +8 -0
  30. data/features/code_check/W0152.feature +8 -0
  31. data/features/code_check/W0153.feature +8 -0
  32. data/features/code_check/W0154.feature +8 -0
  33. data/features/code_check/W0155.feature +8 -0
  34. data/features/code_check/W0156.feature +8 -0
  35. data/features/code_check/W0157.feature +8 -0
  36. data/features/code_check/W0158.feature +8 -0
  37. data/features/code_check/W0159.feature +8 -0
  38. data/features/code_check/W0160.feature +8 -0
  39. data/features/code_check/W0161.feature +8 -0
  40. data/features/code_check/W0162.feature +8 -0
  41. data/features/code_check/W0163.feature +8 -0
  42. data/features/code_check/W0164.feature +8 -0
  43. data/features/code_check/W0165.feature +8 -0
  44. data/features/code_check/W0166.feature +8 -0
  45. data/features/code_check/W0167.feature +8 -0
  46. data/features/code_check/W0168.feature +8 -0
  47. data/features/code_check/W0169.feature +8 -0
  48. data/features/code_check/W0170.feature +8 -0
  49. data/features/code_check/W0171.feature +8 -0
  50. data/features/code_check/W0172.feature +8 -0
  51. data/features/code_check/W0173.feature +8 -0
  52. data/features/code_check/W0174.feature +8 -0
  53. data/features/code_check/W0175.feature +8 -0
  54. data/features/code_check/W0176.feature +8 -0
  55. data/features/code_check/W0177.feature +8 -0
  56. data/features/code_check/W0178.feature +8 -0
  57. data/features/code_check/W0179.feature +8 -0
  58. data/features/code_check/W0180.feature +8 -0
  59. data/features/code_check/W0181.feature +8 -0
  60. data/features/code_check/W0250.feature +8 -0
  61. data/features/code_check/W0422.feature +194 -0
  62. data/features/code_check/W0459.feature +16 -0
  63. data/features/code_check/W0460.feature +342 -0
  64. data/features/code_check/W0461.feature +5 -0
  65. data/features/code_check/W0497.feature +12 -0
  66. data/features/code_check/W0499.feature +6 -0
  67. data/features/code_check/W0502.feature +6 -0
  68. data/features/code_check/W0570.feature +47 -0
  69. data/features/code_check/W0573.feature +8 -0
  70. data/features/code_check/W0582.feature +4 -0
  71. data/features/code_check/W0583.feature +4 -0
  72. data/features/code_check/W0584.feature +10 -0
  73. data/features/code_check/W0599.feature +10 -0
  74. data/features/code_check/W0644.feature +2 -0
  75. data/features/code_check/W0649.feature +14 -0
  76. data/features/code_check/W0650.feature +12 -0
  77. data/features/code_check/W0685.feature +10 -0
  78. data/features/code_check/W0686.feature +8 -0
  79. data/features/code_check/W0711.feature +2 -0
  80. data/features/code_check/W0712.feature +2 -0
  81. data/features/code_check/W0713.feature +2 -0
  82. data/features/code_check/W0714.feature +2 -0
  83. data/features/code_check/W0715.feature +2 -0
  84. data/features/code_check/W0718.feature +2 -0
  85. data/features/code_check/W0719.feature +8 -0
  86. data/features/code_check/W0732.feature +18 -0
  87. data/features/code_check/W0733.feature +18 -0
  88. data/features/code_check/W0734.feature +24 -0
  89. data/features/code_check/W0735.feature +24 -0
  90. data/features/code_check/W0747.feature +8 -0
  91. data/features/code_check/W0749.feature +8 -0
  92. data/features/code_check/W0750.feature +8 -0
  93. data/features/code_check/W0753.feature +8 -0
  94. data/features/code_check/W0754.feature +8 -0
  95. data/features/code_check/W0759.feature +8 -0
  96. data/features/code_check/W0760.feature +8 -0
  97. data/features/code_check/W0761.feature +8 -0
  98. data/features/code_check/W0762.feature +8 -0
  99. data/features/code_check/W0794.feature +6 -0
  100. data/features/code_check/W1050.feature +8 -0
  101. data/features/code_check/W1066.feature +8 -0
  102. data/features/code_check/W1067.feature +8 -0
  103. data/features/code_check/W1068.feature +8 -0
  104. data/features/code_check/W1071.feature +4 -0
  105. data/features/code_check/W9003.feature +2 -0
  106. data/lib/adlint/cc1.rb +1 -0
  107. data/lib/adlint/cc1/branch.rb +34 -13
  108. data/lib/adlint/cc1/conv.rb +3 -3
  109. data/lib/adlint/cc1/ctrlexpr.rb +12 -7
  110. data/lib/adlint/cc1/environ.rb +12 -2
  111. data/lib/adlint/cc1/expr.rb +10 -8
  112. data/lib/adlint/cc1/interp.rb +56 -49
  113. data/lib/adlint/cc1/mediator.rb +9 -5
  114. data/lib/adlint/cc1/object.rb +37 -34
  115. data/lib/adlint/cc1/trace.rb +287 -0
  116. data/lib/adlint/cc1/type.rb +15 -15
  117. data/lib/adlint/cc1/value.rb +823 -427
  118. data/lib/adlint/cpp/eval.rb +5 -2
  119. data/lib/adlint/cpp/source.rb +21 -22
  120. data/lib/adlint/exam/c_builtin/cc1_check.rb +1636 -1067
  121. data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +28 -22
  122. data/lib/adlint/exam/c_builtin/cc1_code.rb +4 -4
  123. data/lib/adlint/exam/c_builtin/cc1_metric.rb +14 -14
  124. data/lib/adlint/location.rb +5 -7
  125. data/lib/adlint/metric.rb +2 -2
  126. data/lib/adlint/prelude.rb +6 -2
  127. data/lib/adlint/report.rb +2 -2
  128. data/lib/adlint/version.rb +3 -3
  129. data/share/doc/developers_guide_ja.html +10 -4
  130. data/share/doc/developers_guide_ja.texi +8 -2
  131. data/share/doc/users_guide_en.html +679 -72
  132. data/share/doc/users_guide_en.texi +557 -12
  133. data/share/doc/users_guide_ja.html +678 -74
  134. data/share/doc/users_guide_ja.texi +554 -13
  135. data/spec/adlint/cc1/ctrlexpr_spec.rb +20 -11
  136. data/spec/adlint/cc1/domain_spec.rb +9 -0
  137. metadata +4 -2
@@ -108,7 +108,7 @@ module Cc1 #:nodoc:
108
108
  when from_type.pointer?
109
109
  void_pointer?(from_type) || void_pointer?(to_type)
110
110
  when from_type.integer?
111
- !from_type.enum? && from_val.must_be_equal_to?(scalar_value_of(0))
111
+ !from_type.enum? && from_val.test_must_be_null.true?
112
112
  else
113
113
  void_pointer?(to_type)
114
114
  end
@@ -121,12 +121,12 @@ module Cc1 #:nodoc:
121
121
  case
122
122
  when orig_var.type.signed? && to_type.unsigned?
123
123
  min_val = scalar_value_of(to_type.min)
124
- if (orig_var.value < min_val).may_be_true?
124
+ if (orig_var.value < min_val).test_may_be_true.true?
125
125
  return min_val - orig_var.value + scalar_value_of(1)
126
126
  end
127
127
  when orig_var.type.unsigned? && to_type.signed?
128
128
  max_val = scalar_value_of(to_type.max)
129
- if (orig_var.value > max_val).may_be_true?
129
+ if (orig_var.value > max_val).test_may_be_true.true?
130
130
  return max_val - orig_var.value + scalar_value_of(1)
131
131
  end
132
132
  end
@@ -67,10 +67,10 @@ module Cc1 #:nodoc:
67
67
  end
68
68
 
69
69
  def ensure_true_by_narrowing(alt_expr = nil)
70
- target_expr = alt_expr || @target_expr
70
+ expr = alt_expr || @target_expr
71
71
 
72
- if target_expr
73
- new_manip = ValueDomainNarrower.new(@interpreter, target_expr)
72
+ if expr
73
+ new_manip = ValueDomainNarrower.new(@interpreter, expr)
74
74
  if @branch.implicit_condition?
75
75
  eval_quietly { new_manip.prepare! }
76
76
  else
@@ -85,10 +85,10 @@ module Cc1 #:nodoc:
85
85
  end
86
86
 
87
87
  def ensure_true_by_widening(alt_expr = nil)
88
- target_expr = alt_expr || @target_expr
88
+ expr = alt_expr || @target_expr
89
89
 
90
- if target_expr
91
- new_manip = ValueDomainWidener.new(@interpreter, target_expr)
90
+ if expr
91
+ new_manip = ValueDomainWidener.new(@interpreter, expr)
92
92
  if @branch.implicit_condition?
93
93
  eval_quietly { new_manip.prepare! }
94
94
  else
@@ -124,6 +124,10 @@ module Cc1 #:nodoc:
124
124
  @target_expr && !collect_logical_and_expressions(@target_expr).empty?
125
125
  end
126
126
 
127
+ def to_expr
128
+ @target_expr
129
+ end
130
+
127
131
  private
128
132
  def eval_quietly(&block)
129
133
  originally_quiet = @interpreter.quiet?
@@ -919,7 +923,7 @@ module Cc1 #:nodoc:
919
923
  @phantom_val
920
924
  end
921
925
 
922
- def assign!(val)
926
+ def assign!(val, *)
923
927
  @phantom_val = val
924
928
  end
925
929
 
@@ -932,6 +936,7 @@ module Cc1 #:nodoc:
932
936
  end
933
937
 
934
938
  Summary = Struct.new(:object_id, :name, :type, :value)
939
+ private_constant :Summary
935
940
  end
936
941
 
937
942
  end
@@ -81,8 +81,10 @@ module Cc1 #:nodoc:
81
81
  end
82
82
 
83
83
  def enter_branch_group(*opts)
84
- @branch_groups[@branch_depth] =
85
- BranchGroup.new(self, @branch_groups[@branch_depth - 1], *opts)
84
+ if trunk_group = @branch_groups[@branch_depth - 1]
85
+ trunk = trunk_group.current_branch
86
+ end
87
+ @branch_groups[@branch_depth] = BranchGroup.new(self, trunk, *opts)
86
88
  end
87
89
 
88
90
  def current_branch_group
@@ -105,6 +107,14 @@ module Cc1 #:nodoc:
105
107
  end
106
108
  end
107
109
 
110
+ def current_branch
111
+ if cur_group = current_branch_group
112
+ cur_group.current_branch
113
+ else
114
+ nil
115
+ end
116
+ end
117
+
108
118
  def leave_branch
109
119
  # NOTE: Don't delete current branch!
110
120
  @branch_depth -= 1
@@ -304,7 +304,7 @@ module Cc1 #:nodoc:
304
304
  notify_sequence_point_reached(SequencePoint.new(node.lhs_operand))
305
305
  lhs_val = lhs_var.value
306
306
 
307
- if lhs_val.scalar? && lhs_val.must_be_false?
307
+ if lhs_val.scalar? && lhs_val.test_must_be_false.true?
308
308
  # NOTE: Doing the short-circuit evaluation.
309
309
  notify_variable_value_referred(node, lhs_var)
310
310
  return create_tmpvar(int_t, scalar_value_of_false)
@@ -356,7 +356,7 @@ module Cc1 #:nodoc:
356
356
  notify_sequence_point_reached(SequencePoint.new(node.lhs_operand))
357
357
  lhs_val = lhs_var.value
358
358
 
359
- if lhs_val.scalar? && lhs_val.must_be_true?
359
+ if lhs_val.scalar? && lhs_val.test_must_be_true.true?
360
360
  # NOTE: Doing the short-circuit evaluation.
361
361
  notify_variable_value_referred(node, lhs_var)
362
362
  return create_tmpvar(int_t, scalar_value_of_true)
@@ -634,7 +634,7 @@ module Cc1 #:nodoc:
634
634
  # _notify_variable_value_referred(node, var)
635
635
 
636
636
  if var.value.scalar?
637
- var.assign!(var.value + scalar_value_of(1))
637
+ var.assign!(var.value + scalar_value_of(1), node, current_branch)
638
638
  _notify_variable_value_updated(node, var)
639
639
  end
640
640
 
@@ -657,7 +657,7 @@ module Cc1 #:nodoc:
657
657
  # _notify_variable_value_referred(node, var)
658
658
 
659
659
  if var.value.scalar?
660
- var.assign!(var.value - scalar_value_of(1))
660
+ var.assign!(var.value - scalar_value_of(1), node, current_branch)
661
661
  _notify_variable_value_updated(node, var)
662
662
  end
663
663
 
@@ -680,7 +680,7 @@ module Cc1 #:nodoc:
680
680
  # _notify_variable_value_referred(node, var)
681
681
 
682
682
  if var.value.scalar?
683
- var.assign!(var.value + scalar_value_of(1))
683
+ var.assign!(var.value + scalar_value_of(1), node, current_branch)
684
684
  _notify_variable_value_updated(node, var)
685
685
  end
686
686
 
@@ -703,7 +703,7 @@ module Cc1 #:nodoc:
703
703
  # _notify_variable_value_referred(node, var)
704
704
 
705
705
  if var.value.scalar?
706
- var.assign!(var.value - scalar_value_of(1))
706
+ var.assign!(var.value - scalar_value_of(1), node, current_branch)
707
707
  _notify_variable_value_updated(node, var)
708
708
  end
709
709
 
@@ -1166,7 +1166,8 @@ module Cc1 #:nodoc:
1166
1166
  # NOTE: Even if rhs_obj is a NamedVariable, new value will be
1167
1167
  # instantiated in value-coercing.
1168
1168
  # So, value-aliasing never occurs.
1169
- lhs_var.assign!(rhs_conved.value.to_defined_value)
1169
+ defined_val = rhs_conved.value.to_defined_value
1170
+ lhs_var.assign!(defined_val, node, current_branch)
1170
1171
  _notify_variable_value_referred(node, rhs_var)
1171
1172
  _notify_variable_value_updated(node, lhs_var)
1172
1173
 
@@ -1453,7 +1454,8 @@ module Cc1 #:nodoc:
1453
1454
 
1454
1455
  # NOTE: Domain of the arithmetic result value will be restricted by
1455
1456
  # min-max of the variable type.
1456
- lhs_var.assign!(rhs_conved.value.to_defined_value)
1457
+ defined_val = rhs_conved.value.to_defined_value
1458
+ lhs_var.assign!(defined_val, node, current_branch)
1457
1459
  _notify_variable_value_updated(node, lhs_var)
1458
1460
 
1459
1461
  notify_assignment_expr_evaled(node, lhs_var, rhs_conved)
@@ -346,7 +346,7 @@ module Cc1 #:nodoc:
346
346
  def_plugin_and_notifier :goto_stmt_evaled, :stmt, :label_name
347
347
 
348
348
  # NOTE: Notified when the interpreter evaluates a return-statement.
349
- def_plugin_and_notifier :return_stmt_evaled, :stmt, :retn_var
349
+ def_plugin_and_notifier :return_stmt_evaled, :stmt, :ret_var
350
350
 
351
351
  # NOTE: Notified when the interpreter evaluates an implicit return.
352
352
  def_plugin_and_notifier :implicit_return_evaled, :loc
@@ -554,7 +554,7 @@ module Cc1 #:nodoc:
554
554
  dcl.mark_as_referred_by(node.identifier)
555
555
  end
556
556
 
557
- var = declare_variable(node)
557
+ var = declare_variable(node, current_branch)
558
558
  notify_variable_declared(node, var)
559
559
  evaluate_sequence_point(node.declarator)
560
560
  end
@@ -572,21 +572,23 @@ module Cc1 #:nodoc:
572
572
  # NOTE: Unable to define variable of incomplete type such as an array
573
573
  # without length.
574
574
  init_var, init_conved = evaluate_initializer(node)
575
- var = define_variable(node, init_conved.value.to_defined_value)
575
+ var = define_variable(node, current_branch,
576
+ init_conved.value.to_defined_value)
576
577
  else
577
578
  # NOTE: Declare variable first in order to correctly evaluate
578
579
  # sizeof-expression that refers to the defining variable in the
579
580
  # initializer.
580
- declare_variable(node)
581
+ declare_variable(node, current_branch)
581
582
  init_var, init_conved = evaluate_initializer(node)
582
- var = define_variable(node, init_conved.value.to_defined_value)
583
+ var = define_variable(node, current_branch,
584
+ init_conved.value.to_defined_value)
583
585
  end
584
586
 
585
587
  notify_variable_value_referred(node, init_var)
586
588
  notify_variable_defined(node, var)
587
589
  notify_variable_initialized(node, var, init_var)
588
590
  else
589
- notify_variable_defined(node, define_variable(node))
591
+ notify_variable_defined(node, define_variable(node, current_branch))
590
592
  end
591
593
 
592
594
  evaluate_sequence_point(node.init_declarator.declarator)
@@ -859,7 +861,7 @@ module Cc1 #:nodoc:
859
861
  end
860
862
 
861
863
  if id
862
- var = define_variable(node.to_variable_definition,
864
+ var = define_variable(node.to_variable_definition, nil,
863
865
  node.type.parameter_value)
864
866
  notify_parameter_defined(node, var)
865
867
  end
@@ -1013,11 +1015,11 @@ module Cc1 #:nodoc:
1013
1015
  notify_if_ctrlexpr_evaled(node, ctrlexpr_val)
1014
1016
 
1015
1017
  case
1016
- when ctrlexpr_val.must_be_true?
1018
+ when ctrlexpr_val.test_must_be_true.true?
1017
1019
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND, COMPLETE) do
1018
1020
  interpret(node.statement)
1019
1021
  end
1020
- when ctrlexpr_val.may_be_true?
1022
+ when ctrlexpr_val.test_may_be_true.true?
1021
1023
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND) do
1022
1024
  interpret(node.statement)
1023
1025
  end
@@ -1047,12 +1049,12 @@ module Cc1 #:nodoc:
1047
1049
  notify_if_else_ctrlexpr_evaled(node, ctrlexpr_val)
1048
1050
 
1049
1051
  case
1050
- when ctrlexpr_val.must_be_true?
1052
+ when ctrlexpr_val.test_must_be_true.true?
1051
1053
  branched_eval(ctrlexpr, NARROWING, FINAL, IMPLICIT_COND, COMPLETE) do
1052
1054
  interpret(node.then_statement)
1053
1055
  end
1054
1056
  return
1055
- when ctrlexpr_val.may_be_true?
1057
+ when ctrlexpr_val.test_may_be_true.true?
1056
1058
  branched_eval(ctrlexpr, NARROWING, IMPLICIT_COND) do
1057
1059
  interpret(node.then_statement)
1058
1060
  end
@@ -1074,11 +1076,10 @@ module Cc1 #:nodoc:
1074
1076
  node.executed = true
1075
1077
  notify_while_stmt_started(node)
1076
1078
 
1077
- widen_varying_variable_value_domain(node)
1078
-
1079
- ctrlexpr_obj = interpret(node.expression)
1079
+ ctrlexpr_obj = interpret_iteration_ctrlexpr(node, node.expression)
1080
1080
  ctrlexpr_var = object_to_variable(ctrlexpr_obj, node.expression)
1081
1081
  ctrlexpr_val = value_of(ctrlexpr_var)
1082
+
1082
1083
  notify_variable_value_referred(node.expression, ctrlexpr_var)
1083
1084
  notify_sequence_point_reached(SequencePoint.new(node.expression))
1084
1085
  notify_while_ctrlexpr_evaled(node, ctrlexpr_val)
@@ -1086,7 +1087,7 @@ module Cc1 #:nodoc:
1086
1087
  orig_ctrlexpr, ctrlexpr = node.deduct_controlling_expression
1087
1088
 
1088
1089
  case
1089
- when ctrlexpr_val.must_be_true?
1090
+ when ctrlexpr_val.test_must_be_true.true?
1090
1091
  begin
1091
1092
  enter_iteration_statement(orig_ctrlexpr)
1092
1093
  branch_opts = [ITERATION, NARROWING, FINAL, IMPLICIT_COND, COMPLETE]
@@ -1094,7 +1095,7 @@ module Cc1 #:nodoc:
1094
1095
  ensure
1095
1096
  leave_iteration_statement(orig_ctrlexpr)
1096
1097
  end
1097
- when ctrlexpr_val.may_be_true?
1098
+ when ctrlexpr_val.test_may_be_true.true?
1098
1099
  begin
1099
1100
  enter_iteration_statement(orig_ctrlexpr)
1100
1101
  branch_opts = [ITERATION, NARROWING, FINAL, IMPLICIT_COND]
@@ -1150,9 +1151,9 @@ module Cc1 #:nodoc:
1150
1151
  end
1151
1152
 
1152
1153
  case
1153
- when ctrlexpr_val.must_be_true?
1154
+ when ctrlexpr_val.test_must_be_true.true?
1154
1155
  interpret_for_body_statement(node, true)
1155
- when ctrlexpr_val.may_be_true?
1156
+ when ctrlexpr_val.test_may_be_true.true?
1156
1157
  interpret_for_body_statement(node, false)
1157
1158
  end
1158
1159
  ensure
@@ -1175,9 +1176,9 @@ module Cc1 #:nodoc:
1175
1176
  end
1176
1177
 
1177
1178
  case
1178
- when ctrlexpr_val.must_be_true?
1179
+ when ctrlexpr_val.test_must_be_true.true?
1179
1180
  interpret_for_body_statement(node, true)
1180
- when ctrlexpr_val.may_be_true?
1181
+ when ctrlexpr_val.test_may_be_true.true?
1181
1182
  interpret_for_body_statement(node, false)
1182
1183
  end
1183
1184
  end
@@ -1221,11 +1222,11 @@ module Cc1 #:nodoc:
1221
1222
  notify_variable_value_referred(node.expression, var)
1222
1223
 
1223
1224
  if active_fun = interpreter._active_function and
1224
- retn_type = active_fun.type.return_type
1225
- if var.type.same_as?(retn_type)
1225
+ ret_type = active_fun.type.return_type
1226
+ if var.type.same_as?(ret_type)
1226
1227
  conved = var
1227
1228
  else
1228
- conved = do_conversion(var, retn_type) || create_tmpvar(retn_type)
1229
+ conved = do_conversion(var, ret_type) || create_tmpvar(ret_type)
1229
1230
  notify_implicit_conv_performed(node.expression, var, conved)
1230
1231
  end
1231
1232
  else
@@ -1246,9 +1247,8 @@ module Cc1 #:nodoc:
1246
1247
  ctrlexpr_var = object_to_variable(ctrlexpr_obj, ctrlexpr)
1247
1248
  ctrlexpr_val = value_of(ctrlexpr_var)
1248
1249
 
1249
- widen_varying_variable_value_domain(node)
1250
- ctrlexpr_var = interpret(ctrlexpr)
1251
-
1250
+ ctrlexpr_obj = interpret_iteration_ctrlexpr(node, ctrlexpr)
1251
+ ctrlexpr_var = object_to_variable(ctrlexpr_obj, ctrlexpr)
1252
1252
  notify_variable_value_referred(ctrlexpr, ctrlexpr_var)
1253
1253
  notify_sequence_point_reached(SequencePoint.new(ctrlexpr))
1254
1254
  else
@@ -1314,27 +1314,35 @@ module Cc1 #:nodoc:
1314
1314
  end
1315
1315
  end
1316
1316
 
1317
- def widen_varying_variable_value_domain(iteration_stmt)
1318
- varying_vars = {}
1319
- iteration_stmt.varying_variable_names.each do |name|
1320
- if var = variable_named(name)
1321
- varying_vars[var] = var.value.dup
1322
- var.widen_value_domain!(Operator::EQ, var.type.arbitrary_value)
1323
- end
1317
+ def interpret_iteration_ctrlexpr(iter_stmt, ctrlexpr)
1318
+ environment.enter_branch(FINAL).execute(interpreter, nil) do
1319
+ widen_varying_variable_value_domain(iter_stmt)
1324
1320
  end
1321
+ interpret(ctrlexpr)
1322
+ ensure
1323
+ environment.leave_branch_group
1324
+ environment.leave_branch
1325
+ end
1326
+
1327
+ def widen_varying_variable_value_domain(iter_stmt)
1328
+ iter_stmt.varying_variable_names.each do |name|
1329
+ if var = variable_named(name)
1330
+ widened_sval = var.type.arbitrary_value
1331
+
1332
+ case deduct_variable_varying_path(var, iter_stmt)
1333
+ when :increase
1334
+ widened_sval.narrow_domain!(Operator::GE, var.value)
1335
+ when :decrease
1336
+ widened_sval.narrow_domain!(Operator::LE, var.value)
1337
+ end
1325
1338
 
1326
- varying_vars.each do |var, orig_val|
1327
- case deduct_variable_varying_path(var, iteration_stmt)
1328
- when :increase
1329
- var.narrow_value_domain!(Operator::GE, orig_val)
1330
- when :decrease
1331
- var.narrow_value_domain!(Operator::LE, orig_val)
1339
+ var.widen_value_domain!(Operator::EQ, widened_sval)
1332
1340
  end
1333
1341
  end
1334
1342
  end
1335
1343
 
1336
- def deduct_variable_varying_path(var, iteration_stmt)
1337
- histogram = iteration_stmt.varying_expressions.map { |expr|
1344
+ def deduct_variable_varying_path(var, iter_stmt)
1345
+ histogram = iter_stmt.varying_expressions.map { |expr|
1338
1346
  case expr
1339
1347
  when SimpleAssignmentExpression
1340
1348
  deduct_ctrl_var_path_by_simple_assignment_expr(var, expr)
@@ -1491,9 +1499,9 @@ module Cc1 #:nodoc:
1491
1499
  end
1492
1500
 
1493
1501
  case
1494
- when ctrlexpr_val.must_be_true?
1502
+ when ctrlexpr_val.test_must_be_true.true?
1495
1503
  branch_opts.push(FINAL, COMPLETE)
1496
- when ctrlexpr_val.must_be_false?
1504
+ when ctrlexpr_val.test_must_be_false.true?
1497
1505
  # NOTE: To end the current branch group of switch-statement if this
1498
1506
  # case-clause is the final one.
1499
1507
  branched_eval(ctrlexpr, *branch_opts) {}
@@ -1555,14 +1563,13 @@ module Cc1 #:nodoc:
1555
1563
  ctrlexpr_val = value_of(interpret(ctrlexpr, QUIET))
1556
1564
 
1557
1565
  case
1558
- when ctrlexpr_val.must_be_true?
1566
+ when ctrlexpr_val.test_must_be_true.true?
1559
1567
  branch_opts.push(FINAL, COMPLETE)
1560
- when ctrlexpr_val.must_be_false?
1568
+ when ctrlexpr_val.test_must_be_false.true?
1561
1569
  return
1562
1570
  end
1563
1571
 
1564
- value_domain_manip =
1565
- branch.controlling_expression.ensure_true_by_widening(ctrlexpr)
1572
+ value_domain_manip = branch.ctrlexpr.ensure_true_by_widening(ctrlexpr)
1566
1573
  end
1567
1574
 
1568
1575
  value_domain_manip.commit!
@@ -1689,7 +1696,7 @@ module Cc1 #:nodoc:
1689
1696
  ctrlexpr = ctrlexpr.to_normalized_logical
1690
1697
 
1691
1698
  then_var = nil
1692
- if ctrlexpr_val.may_be_true?
1699
+ if ctrlexpr_val.test_may_be_true.true?
1693
1700
  branched_eval(ctrlexpr, NARROWING, IMPLICIT_COND) do
1694
1701
  then_var = object_to_variable(interpret(node.then_expression),
1695
1702
  node.then_expression)
@@ -1697,7 +1704,7 @@ module Cc1 #:nodoc:
1697
1704
  end
1698
1705
 
1699
1706
  else_var = nil
1700
- if ctrlexpr_val.may_be_false?
1707
+ if ctrlexpr_val.test_may_be_false.true?
1701
1708
  branched_eval(nil, NARROWING, FINAL, COMPLETE) do
1702
1709
  else_var = object_to_variable(interpret(node.else_expression),
1703
1710
  node.else_expression)
@@ -254,6 +254,10 @@ module Cc1 #:nodoc:
254
254
  environment.reset
255
255
  end
256
256
 
257
+ def current_branch
258
+ environment.current_branch
259
+ end
260
+
257
261
  def scalar_value_of(numeric)
258
262
  ScalarValue.of(numeric, logical_right_shift?)
259
263
  end
@@ -307,12 +311,12 @@ module Cc1 #:nodoc:
307
311
  end
308
312
 
309
313
  def branched_eval(expr = nil, *opts, &block)
310
- current_branch = environment.enter_branch(*opts)
311
- interpreter.notify_branch_started(current_branch)
312
- current_branch.execute(interpreter, expr, &block)
314
+ cur_branch = environment.enter_branch(*opts)
315
+ interpreter.notify_branch_started(cur_branch)
316
+ cur_branch.execute(interpreter, expr, &block)
313
317
  ensure
314
- interpreter.notify_branch_ended(current_branch)
315
- environment.leave_branch_group if current_branch.final?
318
+ interpreter.notify_branch_ended(cur_branch)
319
+ environment.leave_branch_group if cur_branch.final?
316
320
  environment.leave_branch
317
321
  end
318
322