adlint 3.0.8 → 3.0.10
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.
- data/ChangeLog +295 -0
- data/MANIFEST +9 -0
- data/NEWS +25 -4
- data/etc/mesg.d/c_builtin/en_US/messages.yml +1 -1
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +1 -1
- data/etc/mesg.d/core/en_US/messages.yml +1 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
- data/features/code_check/E0008.feature +20 -0
- data/features/code_check/W0093.feature +1 -1
- data/features/code_check/W0097.feature +30 -0
- data/features/code_check/W0100.feature +66 -0
- data/features/code_check/W0422.feature +157 -0
- data/features/code_check/W0459.feature +118 -0
- data/features/code_check/W0461.feature +115 -0
- data/features/code_check/W0610.feature +59 -0
- data/features/code_check/W0612.feature +29 -0
- data/features/code_check/W0613.feature +33 -0
- data/features/code_check/W0704.feature +25 -0
- data/features/code_check/W0705.feature +33 -0
- data/features/code_check/W1050.feature +43 -0
- data/features/code_check/W1071.feature +30 -0
- data/features/code_check/W9001.feature +24 -0
- data/lib/adlint/cc1/branch.rb +32 -9
- data/lib/adlint/cc1/builtin.rb +2 -2
- data/lib/adlint/cc1/conv.rb +33 -33
- data/lib/adlint/cc1/ctrlexpr.rb +30 -30
- data/lib/adlint/cc1/domain.rb +12 -4
- data/lib/adlint/cc1/environ.rb +2 -1
- data/lib/adlint/cc1/expr.rb +135 -125
- data/lib/adlint/cc1/format.rb +3 -3
- data/lib/adlint/cc1/interp.rb +123 -109
- data/lib/adlint/cc1/lexer.rb +44 -40
- data/lib/adlint/cc1/mediator.rb +2 -2
- data/lib/adlint/cc1/object.rb +121 -36
- data/lib/adlint/cc1/option.rb +1 -0
- data/lib/adlint/cc1/parser.rb +874 -845
- data/lib/adlint/cc1/parser.y +22 -2
- data/lib/adlint/cc1/syntax.rb +37 -18
- data/lib/adlint/cc1/type.rb +3 -3
- data/lib/adlint/cc1/value.rb +58 -50
- data/lib/adlint/cpp/lexer.rb +5 -1
- data/lib/adlint/cpp/macro.rb +30 -30
- data/lib/adlint/cpp/subst.rb +4 -4
- data/lib/adlint/exam/c_builtin/cc1_check.rb +172 -172
- data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +11 -11
- data/lib/adlint/exam/c_builtin/cpp_check.rb +2 -2
- data/lib/adlint/memo.rb +13 -13
- data/lib/adlint/prelude.rb +2 -2
- data/lib/adlint/version.rb +2 -2
- data/share/doc/developers_guide_ja.html +7 -5
- data/share/doc/developers_guide_ja.texi +5 -3
- data/share/doc/users_guide_en.html +3 -3
- data/share/doc/users_guide_en.texi +1 -1
- data/share/doc/users_guide_ja.html +3 -3
- data/share/doc/users_guide_ja.texi +1 -1
- metadata +11 -2
data/lib/adlint/cc1/ctrlexpr.rb
CHANGED
@@ -518,9 +518,9 @@ module Cc1 #:nodoc:
|
|
518
518
|
end
|
519
519
|
|
520
520
|
class NilValueDomainNarrower < ValueDomainManipulator
|
521
|
-
def initialize(interp,
|
521
|
+
def initialize(interp, branch_group)
|
522
522
|
super(interp, nil)
|
523
|
-
@branch_group =
|
523
|
+
@branch_group = branch_group
|
524
524
|
end
|
525
525
|
|
526
526
|
def prepare!
|
@@ -537,9 +537,9 @@ module Cc1 #:nodoc:
|
|
537
537
|
end
|
538
538
|
|
539
539
|
class NilValueDomainWidener < ValueDomainManipulator
|
540
|
-
def initialize(interp,
|
540
|
+
def initialize(interp, branch_group)
|
541
541
|
super(interp, nil)
|
542
|
-
@branch_group =
|
542
|
+
@branch_group = branch_group
|
543
543
|
end
|
544
544
|
|
545
545
|
def prepare!
|
@@ -648,9 +648,9 @@ module Cc1 #:nodoc:
|
|
648
648
|
rhs_vals = rhs_manip.narrowed_values
|
649
649
|
|
650
650
|
@narrowed_values = lhs_vals.merge(rhs_vals) { |key, lhs_val, rhs_val|
|
651
|
-
|
652
|
-
|
653
|
-
|
651
|
+
rslt_val = lhs_val.dup
|
652
|
+
rslt_val.narrow_domain!(Operator::EQ, rhs_val)
|
653
|
+
rslt_val
|
654
654
|
}
|
655
655
|
end
|
656
656
|
|
@@ -659,9 +659,9 @@ module Cc1 #:nodoc:
|
|
659
659
|
rhs_vals = rhs_manip.narrowed_values
|
660
660
|
|
661
661
|
@narrowed_values = lhs_vals.merge(rhs_vals) { |key, lhs_val, rhs_val|
|
662
|
-
|
663
|
-
|
664
|
-
|
662
|
+
rslt_val = lhs_val.dup
|
663
|
+
rslt_val.widen_domain!(Operator::EQ, rhs_val)
|
664
|
+
rslt_val
|
665
665
|
}
|
666
666
|
end
|
667
667
|
|
@@ -670,18 +670,18 @@ module Cc1 #:nodoc:
|
|
670
670
|
def_delegator :@manipulator, :interpreter
|
671
671
|
private :interpreter
|
672
672
|
|
673
|
-
alias :
|
673
|
+
alias :_orig_interpret :interpret
|
674
674
|
def interpret(node)
|
675
675
|
case node
|
676
676
|
when ObjectSpecifier
|
677
677
|
if safely_evaluable_object_specifier?(node)
|
678
|
-
|
678
|
+
_orig_interpret(node)
|
679
679
|
else
|
680
680
|
# NOTE: Nothing to do with an undeclared object.
|
681
681
|
create_tmpvar
|
682
682
|
end
|
683
683
|
else
|
684
|
-
|
684
|
+
_orig_interpret(node)
|
685
685
|
end
|
686
686
|
end
|
687
687
|
|
@@ -724,17 +724,17 @@ module Cc1 #:nodoc:
|
|
724
724
|
|
725
725
|
case @operator
|
726
726
|
when Operator::EQ
|
727
|
-
|
727
|
+
rslt_var = create_tmpvar(int_t, lhs_val == rhs_val)
|
728
728
|
when Operator::NE
|
729
|
-
|
729
|
+
rslt_var = create_tmpvar(int_t, lhs_val != rhs_val)
|
730
730
|
when Operator::LT
|
731
|
-
|
731
|
+
rslt_var = create_tmpvar(int_t, lhs_val < rhs_val)
|
732
732
|
when Operator::GT
|
733
|
-
|
733
|
+
rslt_var = create_tmpvar(int_t, lhs_val > rhs_val)
|
734
734
|
when Operator::LE
|
735
|
-
|
735
|
+
rslt_var = create_tmpvar(int_t, lhs_val <= rhs_val)
|
736
736
|
when Operator::GE
|
737
|
-
|
737
|
+
rslt_var = create_tmpvar(int_t, lhs_val >= rhs_val)
|
738
738
|
else
|
739
739
|
__NOTREACHED__
|
740
740
|
end
|
@@ -744,9 +744,9 @@ module Cc1 #:nodoc:
|
|
744
744
|
|
745
745
|
case @operator
|
746
746
|
when Operator::EQ, Operator::NE
|
747
|
-
notify_equality_expr_evaled(@node, lhs_conved, rhs_conved,
|
747
|
+
notify_equality_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
|
748
748
|
when Operator::LT, Operator::GT, Operator::LE, Operator::GE
|
749
|
-
notify_relational_expr_evaled(@node, lhs_conved, rhs_conved,
|
749
|
+
notify_relational_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
|
750
750
|
else
|
751
751
|
__NOTREACHED__
|
752
752
|
end
|
@@ -760,7 +760,7 @@ module Cc1 #:nodoc:
|
|
760
760
|
# NOTE: Domain of the rvalue should not be narrowed.
|
761
761
|
end
|
762
762
|
|
763
|
-
|
763
|
+
rslt_var
|
764
764
|
end
|
765
765
|
end
|
766
766
|
|
@@ -815,9 +815,9 @@ module Cc1 #:nodoc:
|
|
815
815
|
lhs_val = lhs_conved.value
|
816
816
|
rhs_val = rhs_conved.value
|
817
817
|
|
818
|
-
|
819
|
-
notify_logical_and_expr_evaled(@node, lhs_conved, rhs_conved,
|
820
|
-
|
818
|
+
rslt_var = create_tmpvar(int_t, lhs_val.logical_and(rhs_val))
|
819
|
+
notify_logical_and_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
|
820
|
+
rslt_var
|
821
821
|
end
|
822
822
|
end
|
823
823
|
|
@@ -873,9 +873,9 @@ module Cc1 #:nodoc:
|
|
873
873
|
lhs_val = lhs_conved.value
|
874
874
|
rhs_val = rhs_conved.value
|
875
875
|
|
876
|
-
|
877
|
-
notify_logical_or_expr_evaled(@node, lhs_conved, rhs_conved,
|
878
|
-
|
876
|
+
rslt_var = create_tmpvar(int_t, lhs_val.logical_or(rhs_val))
|
877
|
+
notify_logical_or_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
|
878
|
+
rslt_var
|
879
879
|
end
|
880
880
|
end
|
881
881
|
|
@@ -888,8 +888,8 @@ module Cc1 #:nodoc:
|
|
888
888
|
private
|
889
889
|
def do_narrowing
|
890
890
|
if @object.variable? && @object.named?
|
891
|
-
if
|
892
|
-
@object = PhantomVariable.new(@object,
|
891
|
+
if orig_val = original_value_of(@object)
|
892
|
+
@object = PhantomVariable.new(@object, orig_val)
|
893
893
|
end
|
894
894
|
end
|
895
895
|
@object
|
data/lib/adlint/cc1/domain.rb
CHANGED
@@ -6426,8 +6426,12 @@ module Cc1 #:nodoc:
|
|
6426
6426
|
end
|
6427
6427
|
|
6428
6428
|
def &(rhs_dom)
|
6429
|
-
|
6430
|
-
|
6429
|
+
if rhs_max = rhs_dom.max_value
|
6430
|
+
ValueDomain.greater_than_or_equal_to(0, logical_shr?).intersection(
|
6431
|
+
ValueDomain.less_than_or_equal_to(rhs_max, logical_shr?))
|
6432
|
+
else
|
6433
|
+
ValueDomain.greater_than_or_equal_to(0, logical_shr?)
|
6434
|
+
end
|
6431
6435
|
end
|
6432
6436
|
|
6433
6437
|
def |(rhs_dom)
|
@@ -6789,8 +6793,12 @@ module Cc1 #:nodoc:
|
|
6789
6793
|
end
|
6790
6794
|
|
6791
6795
|
def &(rhs_dom)
|
6792
|
-
|
6793
|
-
|
6796
|
+
if rhs_max = rhs_dom.max_value
|
6797
|
+
ValueDomain.greater_than_or_equal_to(0, logical_shr?).intersection(
|
6798
|
+
ValueDomain.less_than_or_equal_to(rhs_max, logical_shr?))
|
6799
|
+
else
|
6800
|
+
ValueDomain.greater_than_or_equal_to(0, logical_shr?)
|
6801
|
+
end
|
6794
6802
|
end
|
6795
6803
|
|
6796
6804
|
def |(rhs_dom)
|
data/lib/adlint/cc1/environ.rb
CHANGED
@@ -81,7 +81,8 @@ module Cc1 #:nodoc:
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def enter_branch_group(*opts)
|
84
|
-
@branch_groups[@branch_depth] =
|
84
|
+
@branch_groups[@branch_depth] =
|
85
|
+
BranchGroup.new(self, @branch_groups[@branch_depth - 1], *opts)
|
85
86
|
end
|
86
87
|
|
87
88
|
def current_branch_group
|
data/lib/adlint/cc1/expr.rb
CHANGED
@@ -171,48 +171,48 @@ module Cc1 #:nodoc:
|
|
171
171
|
def visit_sizeof_expression(node)
|
172
172
|
checkpoint(node.location)
|
173
173
|
|
174
|
-
ope_obj =
|
174
|
+
ope_obj = rslt_var = nil
|
175
175
|
eval_without_side_effect do
|
176
|
-
|
176
|
+
rslt_type = type_of(UserTypeId.new("size_t")) || unsigned_long_t
|
177
177
|
ope_obj = node.operand.accept(self)
|
178
178
|
if ope_obj.variable?
|
179
179
|
size = ope_obj.type.aligned_byte_size
|
180
|
-
|
180
|
+
rslt_var = create_tmpvar(rslt_type, scalar_value_of(size))
|
181
181
|
else
|
182
|
-
return create_tmpvar(
|
182
|
+
return create_tmpvar(rslt_type)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
notify_sizeof_expr_evaled(node, ope_obj,
|
187
|
-
|
186
|
+
notify_sizeof_expr_evaled(node, ope_obj, rslt_var)
|
187
|
+
rslt_var
|
188
188
|
end
|
189
189
|
|
190
190
|
def visit_sizeof_type_expression(node)
|
191
191
|
checkpoint(node.location)
|
192
192
|
resolve_unresolved_type(node.operand)
|
193
193
|
|
194
|
-
|
194
|
+
rslt_var = nil
|
195
195
|
eval_without_side_effect do
|
196
|
-
|
196
|
+
rslt_type = type_of(UserTypeId.new("size_t")) || unsigned_long_t
|
197
197
|
size = node.operand.type.aligned_byte_size
|
198
|
-
|
198
|
+
rslt_var = create_tmpvar(rslt_type, scalar_value_of(size))
|
199
199
|
end
|
200
200
|
|
201
|
-
notify_sizeof_type_expr_evaled(node, node.operand.type,
|
202
|
-
|
201
|
+
notify_sizeof_type_expr_evaled(node, node.operand.type, rslt_var)
|
202
|
+
rslt_var
|
203
203
|
end
|
204
204
|
|
205
205
|
def visit_alignof_expression(node)
|
206
206
|
checkpoint(node.location)
|
207
207
|
|
208
208
|
eval_without_side_effect do
|
209
|
-
|
209
|
+
rslt_type = type_of(UserTypeId.new("size_t")) || unsigned_long_t
|
210
210
|
ope_obj = node.operand.accept(self)
|
211
211
|
if ope_obj.variable?
|
212
212
|
align = ope_obj.type.byte_alignment
|
213
|
-
create_tmpvar(
|
213
|
+
create_tmpvar(rslt_type, scalar_value_of(align))
|
214
214
|
else
|
215
|
-
create_tmpvar(
|
215
|
+
create_tmpvar(rslt_type)
|
216
216
|
end
|
217
217
|
end
|
218
218
|
end
|
@@ -222,9 +222,9 @@ module Cc1 #:nodoc:
|
|
222
222
|
resolve_unresolved_type(node.operand)
|
223
223
|
|
224
224
|
eval_without_side_effect do
|
225
|
-
|
225
|
+
rslt_type = type_of(UserTypeId.new("size_t")) || unsigned_long_t
|
226
226
|
align = node.operand.type.aligned_byte_size
|
227
|
-
create_tmpvar(
|
227
|
+
create_tmpvar(rslt_type, scalar_value_of(align))
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
@@ -322,15 +322,15 @@ module Cc1 #:nodoc:
|
|
322
322
|
|
323
323
|
if lhs_val.scalar? && rhs_val.scalar?
|
324
324
|
# NOTE: No usual-arithmetic-conversion.
|
325
|
-
|
325
|
+
rslt_var = create_tmpvar(int_t, lhs_val.logical_and(rhs_val))
|
326
326
|
else
|
327
|
-
|
327
|
+
rslt_var = create_tmpvar(int_t)
|
328
328
|
end
|
329
329
|
notify_variable_value_referred(node, lhs_var)
|
330
330
|
notify_variable_value_referred(node, rhs_var)
|
331
331
|
|
332
|
-
notify_logical_and_expr_evaled(node, lhs_var, rhs_var,
|
333
|
-
|
332
|
+
notify_logical_and_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
333
|
+
rslt_var
|
334
334
|
end
|
335
335
|
|
336
336
|
def visit_logical_or_expression(node)
|
@@ -374,15 +374,15 @@ module Cc1 #:nodoc:
|
|
374
374
|
|
375
375
|
if lhs_val.scalar? && rhs_val.scalar?
|
376
376
|
# NOTE: No usual-arithmetic-conversion.
|
377
|
-
|
377
|
+
rslt_var = create_tmpvar(int_t, lhs_val.logical_or(rhs_val))
|
378
378
|
else
|
379
|
-
|
379
|
+
rslt_var = create_tmpvar(int_t)
|
380
380
|
end
|
381
381
|
notify_variable_value_referred(node, lhs_var)
|
382
382
|
notify_variable_value_referred(node, rhs_var)
|
383
383
|
|
384
|
-
notify_logical_or_expr_evaled(node, lhs_var, rhs_var,
|
385
|
-
|
384
|
+
notify_logical_or_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
385
|
+
rslt_var
|
386
386
|
end
|
387
387
|
|
388
388
|
def visit_simple_assignment_expression(node)
|
@@ -465,7 +465,7 @@ module Cc1 #:nodoc:
|
|
465
465
|
return create_tmpvar
|
466
466
|
end
|
467
467
|
|
468
|
-
|
468
|
+
rslt_type = obj.type.unqualify.base_type
|
469
469
|
|
470
470
|
case
|
471
471
|
when obj.type.array?
|
@@ -486,7 +486,7 @@ module Cc1 #:nodoc:
|
|
486
486
|
unless subs.variable? and
|
487
487
|
subs.value.scalar? && subs.value.exist? or subs.type.void?
|
488
488
|
# NOTE: To detect bad value reference of `void' expressions.
|
489
|
-
return create_tmpvar(
|
489
|
+
return create_tmpvar(rslt_type)
|
490
490
|
end
|
491
491
|
_notify_variable_value_referred(node, subs)
|
492
492
|
|
@@ -497,22 +497,13 @@ module Cc1 #:nodoc:
|
|
497
497
|
subs, int_subs)
|
498
498
|
subs = int_subs
|
499
499
|
else
|
500
|
-
return create_tmpvar(
|
500
|
+
return create_tmpvar(rslt_type)
|
501
501
|
end
|
502
502
|
end
|
503
503
|
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
_notify_object_referred(node, inner_var)
|
508
|
-
if inner_var.type.same_as?(res_type)
|
509
|
-
res_var = inner_var
|
510
|
-
end
|
511
|
-
end
|
512
|
-
res_var ||= create_tmpvar(res_type)
|
513
|
-
|
514
|
-
notify_array_subscript_expr_evaled(node, obj, subs, ary, res_var)
|
515
|
-
res_var
|
504
|
+
rslt_var = _pick_array_element(node, ary, subs, rslt_type)
|
505
|
+
notify_array_subscript_expr_evaled(node, obj, subs, ary, rslt_var)
|
506
|
+
rslt_var
|
516
507
|
end
|
517
508
|
|
518
509
|
def eval_function_call_expr(node, obj, args)
|
@@ -544,22 +535,22 @@ module Cc1 #:nodoc:
|
|
544
535
|
notify_sequence_point_reached(SequencePoint.new(node))
|
545
536
|
end
|
546
537
|
|
547
|
-
|
538
|
+
rslt_var = nil
|
548
539
|
break_event = BreakEvent.catch {
|
549
|
-
|
540
|
+
rslt_var = fun.call(interpreter, node, args)
|
550
541
|
}
|
551
542
|
|
552
543
|
unless fun.builtin?
|
553
544
|
arg_vars = args.map { |arg_obj, arg_expr|
|
554
545
|
object_to_variable(arg_obj, arg_expr)
|
555
546
|
}
|
556
|
-
notify_function_call_expr_evaled(node, fun, arg_vars,
|
547
|
+
notify_function_call_expr_evaled(node, fun, arg_vars, rslt_var)
|
557
548
|
end
|
558
549
|
|
559
550
|
if break_event
|
560
551
|
break_event.throw
|
561
552
|
else
|
562
|
-
|
553
|
+
rslt_var
|
563
554
|
end
|
564
555
|
end
|
565
556
|
|
@@ -635,7 +626,7 @@ module Cc1 #:nodoc:
|
|
635
626
|
return create_tmpvar
|
636
627
|
end
|
637
628
|
|
638
|
-
|
629
|
+
rslt_var = create_tmpvar(var.type, var.value.dup)
|
639
630
|
|
640
631
|
# NOTE: Value of the variable is referred at this point. But value
|
641
632
|
# reference should not be notified not to confuse sequence-point
|
@@ -647,8 +638,8 @@ module Cc1 #:nodoc:
|
|
647
638
|
_notify_variable_value_updated(node, var)
|
648
639
|
end
|
649
640
|
|
650
|
-
notify_postfix_increment_expr_evaled(node, var,
|
651
|
-
|
641
|
+
notify_postfix_increment_expr_evaled(node, var, rslt_var)
|
642
|
+
rslt_var
|
652
643
|
end
|
653
644
|
|
654
645
|
def eval_postfix_decrement_expr(node, obj)
|
@@ -658,7 +649,7 @@ module Cc1 #:nodoc:
|
|
658
649
|
return create_tmpvar
|
659
650
|
end
|
660
651
|
|
661
|
-
|
652
|
+
rslt_var = create_tmpvar(var.type, var.value.dup)
|
662
653
|
|
663
654
|
# NOTE: Value of the variable is referred at this point. But value
|
664
655
|
# reference should not be notified not to confuse sequence-point
|
@@ -670,8 +661,8 @@ module Cc1 #:nodoc:
|
|
670
661
|
_notify_variable_value_updated(node, var)
|
671
662
|
end
|
672
663
|
|
673
|
-
notify_postfix_decrement_expr_evaled(node, var,
|
674
|
-
|
664
|
+
notify_postfix_decrement_expr_evaled(node, var, rslt_var)
|
665
|
+
rslt_var
|
675
666
|
end
|
676
667
|
|
677
668
|
def eval_prefix_increment_expr(node, obj)
|
@@ -681,7 +672,7 @@ module Cc1 #:nodoc:
|
|
681
672
|
return create_tmpvar
|
682
673
|
end
|
683
674
|
|
684
|
-
|
675
|
+
orig_val = var.value.dup
|
685
676
|
|
686
677
|
# NOTE: Value of the variable is referred at this point. But value
|
687
678
|
# reference should not be notified not to confuse sequence-point
|
@@ -693,7 +684,7 @@ module Cc1 #:nodoc:
|
|
693
684
|
_notify_variable_value_updated(node, var)
|
694
685
|
end
|
695
686
|
|
696
|
-
notify_prefix_increment_expr_evaled(node, var,
|
687
|
+
notify_prefix_increment_expr_evaled(node, var, orig_val)
|
697
688
|
create_tmpvar(var.type, var.value)
|
698
689
|
end
|
699
690
|
|
@@ -704,7 +695,7 @@ module Cc1 #:nodoc:
|
|
704
695
|
return create_tmpvar
|
705
696
|
end
|
706
697
|
|
707
|
-
|
698
|
+
orig_val = var.value.dup
|
708
699
|
|
709
700
|
# NOTE: Value of the variable is referred at this point. But value
|
710
701
|
# reference should not be notified not to confuse sequence-point
|
@@ -716,7 +707,7 @@ module Cc1 #:nodoc:
|
|
716
707
|
_notify_variable_value_updated(node, var)
|
717
708
|
end
|
718
709
|
|
719
|
-
notify_prefix_decrement_expr_evaled(node, var,
|
710
|
+
notify_prefix_decrement_expr_evaled(node, var, orig_val)
|
720
711
|
create_tmpvar(var.type, var.value)
|
721
712
|
end
|
722
713
|
|
@@ -778,37 +769,37 @@ module Cc1 #:nodoc:
|
|
778
769
|
|
779
770
|
case node.operator.type
|
780
771
|
when "+"
|
781
|
-
|
772
|
+
rslt_var = create_tmpvar(var.type, +var.value)
|
782
773
|
when "-"
|
783
|
-
|
774
|
+
rslt_var = create_tmpvar(var.type, -var.value)
|
784
775
|
when "~"
|
785
|
-
|
776
|
+
rslt_var = create_tmpvar(var.type, ~var.value)
|
786
777
|
when "!"
|
787
|
-
|
778
|
+
rslt_var = create_tmpvar(int_t, !var.value)
|
788
779
|
else
|
789
780
|
__NOTREACHED__
|
790
781
|
end
|
791
782
|
_notify_variable_value_referred(node, var)
|
792
783
|
|
793
|
-
notify_unary_arithmetic_expr_evaled(node, var,
|
794
|
-
|
784
|
+
notify_unary_arithmetic_expr_evaled(node, var, rslt_var)
|
785
|
+
rslt_var
|
795
786
|
end
|
796
787
|
|
797
788
|
def eval_cast_expr(node, obj)
|
798
789
|
resolve_unresolved_type(node.type_name)
|
799
790
|
|
800
791
|
var = object_to_variable(obj, node)
|
801
|
-
|
802
|
-
|
792
|
+
rslt_var = do_conversion(var, node.type_name.type) ||
|
793
|
+
create_tmpvar(node.type_name.type)
|
803
794
|
|
804
|
-
notify_explicit_conv_performed(node, var,
|
795
|
+
notify_explicit_conv_performed(node, var, rslt_var)
|
805
796
|
|
806
797
|
# NOTE: A cast-expression does not refer a source value essentially.
|
807
798
|
# But, to avoid misunderstand that a return value of a function
|
808
799
|
# is discarded when the return value is casted before assigning
|
809
800
|
# to a variable.
|
810
801
|
_notify_variable_value_referred(node, var)
|
811
|
-
|
802
|
+
rslt_var
|
812
803
|
end
|
813
804
|
|
814
805
|
def eval_multiplicative_expr(node, lhs_obj, rhs_obj)
|
@@ -841,27 +832,27 @@ module Cc1 #:nodoc:
|
|
841
832
|
when "*"
|
842
833
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
843
834
|
# min-max of the variable type.
|
844
|
-
|
835
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val * rhs_val)
|
845
836
|
when "/"
|
846
837
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
847
838
|
# min-max of the variable type.
|
848
839
|
# NOTE: "Div by 0" semantics is implemented in value-value
|
849
840
|
# arithmetic.
|
850
|
-
|
841
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val / rhs_val)
|
851
842
|
when "%"
|
852
843
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
853
844
|
# min-max of the variable type.
|
854
845
|
# NOTE: "Div by 0" semantics is implemented in value-value
|
855
846
|
# arithmetic.
|
856
|
-
|
847
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val % rhs_val)
|
857
848
|
else
|
858
849
|
__NOTREACHED__
|
859
850
|
end
|
860
851
|
_notify_variable_value_referred(node, lhs_var)
|
861
852
|
_notify_variable_value_referred(node, rhs_var)
|
862
853
|
|
863
|
-
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var,
|
864
|
-
|
854
|
+
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
855
|
+
rslt_var
|
865
856
|
end
|
866
857
|
|
867
858
|
def eval_additive_expr(node, lhs_obj, rhs_obj)
|
@@ -894,19 +885,19 @@ module Cc1 #:nodoc:
|
|
894
885
|
when "+"
|
895
886
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
896
887
|
# min-max of the variable type.
|
897
|
-
|
888
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val + rhs_val)
|
898
889
|
when "-"
|
899
890
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
900
891
|
# min-max of the variable type.
|
901
|
-
|
892
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val - rhs_val)
|
902
893
|
else
|
903
894
|
__NOTREACHED__
|
904
895
|
end
|
905
896
|
_notify_variable_value_referred(node, lhs_var)
|
906
897
|
_notify_variable_value_referred(node, rhs_var)
|
907
898
|
|
908
|
-
notify_additive_expr_evaled(node, lhs_var, rhs_var,
|
909
|
-
|
899
|
+
notify_additive_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
900
|
+
rslt_var
|
910
901
|
end
|
911
902
|
|
912
903
|
def eval_shift_expr(node, lhs_obj, rhs_obj)
|
@@ -949,19 +940,19 @@ module Cc1 #:nodoc:
|
|
949
940
|
when "<<"
|
950
941
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
951
942
|
# min-max of the variable type.
|
952
|
-
|
943
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val << rhs_val)
|
953
944
|
when ">>"
|
954
945
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
955
946
|
# min-max of the variable type.
|
956
|
-
|
947
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val >> rhs_val)
|
957
948
|
else
|
958
949
|
__NOTREACHED__
|
959
950
|
end
|
960
951
|
_notify_variable_value_referred(node, lhs_var)
|
961
952
|
_notify_variable_value_referred(node, rhs_var)
|
962
953
|
|
963
|
-
notify_shift_expr_evaled(node, lhs_var, rhs_var,
|
964
|
-
|
954
|
+
notify_shift_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
955
|
+
rslt_var
|
965
956
|
end
|
966
957
|
|
967
958
|
def eval_relational_expr(node, lhs_obj, rhs_obj)
|
@@ -992,21 +983,21 @@ module Cc1 #:nodoc:
|
|
992
983
|
|
993
984
|
case node.operator.type
|
994
985
|
when "<"
|
995
|
-
|
986
|
+
rslt_var = create_tmpvar(int_t, lhs_val < rhs_val)
|
996
987
|
when ">"
|
997
|
-
|
988
|
+
rslt_var = create_tmpvar(int_t, lhs_val > rhs_val)
|
998
989
|
when "<="
|
999
|
-
|
990
|
+
rslt_var = create_tmpvar(int_t, lhs_val <= rhs_val)
|
1000
991
|
when ">="
|
1001
|
-
|
992
|
+
rslt_var = create_tmpvar(int_t, lhs_val >= rhs_val)
|
1002
993
|
else
|
1003
994
|
__NOTREACHED__
|
1004
995
|
end
|
1005
996
|
_notify_variable_value_referred(node, lhs_var)
|
1006
997
|
_notify_variable_value_referred(node, rhs_var)
|
1007
998
|
|
1008
|
-
notify_relational_expr_evaled(node, lhs_var, rhs_var,
|
1009
|
-
|
999
|
+
notify_relational_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1000
|
+
rslt_var
|
1010
1001
|
end
|
1011
1002
|
|
1012
1003
|
def eval_equality_expr(node, lhs_obj, rhs_obj)
|
@@ -1037,17 +1028,17 @@ module Cc1 #:nodoc:
|
|
1037
1028
|
|
1038
1029
|
case node.operator.type
|
1039
1030
|
when "=="
|
1040
|
-
|
1031
|
+
rslt_var = create_tmpvar(int_t, lhs_val == rhs_val)
|
1041
1032
|
when "!="
|
1042
|
-
|
1033
|
+
rslt_var = create_tmpvar(int_t, lhs_val != rhs_val)
|
1043
1034
|
else
|
1044
1035
|
__NOTREACHED__
|
1045
1036
|
end
|
1046
1037
|
_notify_variable_value_referred(node, lhs_var)
|
1047
1038
|
_notify_variable_value_referred(node, rhs_var)
|
1048
1039
|
|
1049
|
-
notify_equality_expr_evaled(node, lhs_var, rhs_var,
|
1050
|
-
|
1040
|
+
notify_equality_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1041
|
+
rslt_var
|
1051
1042
|
end
|
1052
1043
|
|
1053
1044
|
def eval_and_expr(node, lhs_obj, rhs_obj)
|
@@ -1078,12 +1069,12 @@ module Cc1 #:nodoc:
|
|
1078
1069
|
|
1079
1070
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
1080
1071
|
# min-max of the variable type.
|
1081
|
-
|
1072
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val & rhs_val)
|
1082
1073
|
_notify_variable_value_referred(node, lhs_var)
|
1083
1074
|
_notify_variable_value_referred(node, rhs_var)
|
1084
1075
|
|
1085
|
-
notify_and_expr_evaled(node, lhs_var, rhs_var,
|
1086
|
-
|
1076
|
+
notify_and_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1077
|
+
rslt_var
|
1087
1078
|
end
|
1088
1079
|
|
1089
1080
|
def eval_exclusive_or_expr(node, lhs_obj, rhs_obj)
|
@@ -1114,12 +1105,12 @@ module Cc1 #:nodoc:
|
|
1114
1105
|
|
1115
1106
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
1116
1107
|
# min-max of the variable type.
|
1117
|
-
|
1108
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val ^ rhs_val)
|
1118
1109
|
_notify_variable_value_referred(node, lhs_var)
|
1119
1110
|
_notify_variable_value_referred(node, rhs_var)
|
1120
1111
|
|
1121
|
-
notify_exclusive_or_expr_evaled(node, lhs_var, rhs_var,
|
1122
|
-
|
1112
|
+
notify_exclusive_or_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1113
|
+
rslt_var
|
1123
1114
|
end
|
1124
1115
|
|
1125
1116
|
def eval_inclusive_or_expr(node, lhs_obj, rhs_obj)
|
@@ -1150,12 +1141,12 @@ module Cc1 #:nodoc:
|
|
1150
1141
|
|
1151
1142
|
# NOTE: Domain of the arithmetic result value will be restricted by
|
1152
1143
|
# min-max of the variable type.
|
1153
|
-
|
1144
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val | rhs_val)
|
1154
1145
|
_notify_variable_value_referred(node, lhs_var)
|
1155
1146
|
_notify_variable_value_referred(node, rhs_var)
|
1156
1147
|
|
1157
|
-
notify_inclusive_or_expr_evaled(node, lhs_var, rhs_var,
|
1158
|
-
|
1148
|
+
notify_inclusive_or_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1149
|
+
rslt_var
|
1159
1150
|
end
|
1160
1151
|
|
1161
1152
|
def eval_simple_assignment_expr(node, lhs_obj, rhs_obj)
|
@@ -1228,7 +1219,7 @@ module Cc1 #:nodoc:
|
|
1228
1219
|
|
1229
1220
|
lhs_val = lhs_conved.value
|
1230
1221
|
rhs_val = rhs_conved.value
|
1231
|
-
|
1222
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val * rhs_val)
|
1232
1223
|
|
1233
1224
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1234
1225
|
# reference should not be notified not to confuse sequence-point
|
@@ -1236,9 +1227,9 @@ module Cc1 #:nodoc:
|
|
1236
1227
|
# _notify_variable_value_referred(node, lhs_var)
|
1237
1228
|
_notify_variable_value_referred(node, rhs_var)
|
1238
1229
|
|
1239
|
-
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var,
|
1230
|
+
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1240
1231
|
|
1241
|
-
_do_assign(node, lhs_var,
|
1232
|
+
_do_assign(node, lhs_var, rslt_var)
|
1242
1233
|
end
|
1243
1234
|
|
1244
1235
|
def _do_div_then_assign(node, lhs_var, rhs_var)
|
@@ -1247,7 +1238,7 @@ module Cc1 #:nodoc:
|
|
1247
1238
|
lhs_val = lhs_conved.value
|
1248
1239
|
rhs_val = rhs_conved.value
|
1249
1240
|
# NOTE: "Div by 0" semantics is implemented in value-value arithmetic.
|
1250
|
-
|
1241
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val / rhs_val)
|
1251
1242
|
|
1252
1243
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1253
1244
|
# reference should not be notified not to confuse sequence-point
|
@@ -1255,9 +1246,9 @@ module Cc1 #:nodoc:
|
|
1255
1246
|
# _notify_variable_value_referred(node, lhs_var)
|
1256
1247
|
_notify_variable_value_referred(node, rhs_var)
|
1257
1248
|
|
1258
|
-
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var,
|
1249
|
+
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1259
1250
|
|
1260
|
-
_do_assign(node, lhs_var,
|
1251
|
+
_do_assign(node, lhs_var, rslt_var)
|
1261
1252
|
end
|
1262
1253
|
|
1263
1254
|
def _do_mod_then_assign(node, lhs_var, rhs_var)
|
@@ -1266,7 +1257,7 @@ module Cc1 #:nodoc:
|
|
1266
1257
|
lhs_val = lhs_conved.value
|
1267
1258
|
rhs_val = rhs_conved.value
|
1268
1259
|
# NOTE: "Div by 0" semantics is implemented in value-value arithmetic.
|
1269
|
-
|
1260
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val % rhs_val)
|
1270
1261
|
|
1271
1262
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1272
1263
|
# reference should not be notified not to confuse sequence-point
|
@@ -1274,9 +1265,9 @@ module Cc1 #:nodoc:
|
|
1274
1265
|
# _notify_variable_value_referred(node, lhs_var)
|
1275
1266
|
_notify_variable_value_referred(node, rhs_var)
|
1276
1267
|
|
1277
|
-
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var,
|
1268
|
+
notify_multiplicative_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1278
1269
|
|
1279
|
-
_do_assign(node, lhs_var,
|
1270
|
+
_do_assign(node, lhs_var, rslt_var)
|
1280
1271
|
end
|
1281
1272
|
|
1282
1273
|
def _do_add_then_assign(node, lhs_var, rhs_var)
|
@@ -1284,7 +1275,7 @@ module Cc1 #:nodoc:
|
|
1284
1275
|
|
1285
1276
|
lhs_val = lhs_conved.value
|
1286
1277
|
rhs_val = rhs_conved.value
|
1287
|
-
|
1278
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val + rhs_val)
|
1288
1279
|
|
1289
1280
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1290
1281
|
# reference should not be notified not to confuse sequence-point
|
@@ -1292,9 +1283,9 @@ module Cc1 #:nodoc:
|
|
1292
1283
|
# _notify_variable_value_referred(node, lhs_var)
|
1293
1284
|
_notify_variable_value_referred(node, rhs_var)
|
1294
1285
|
|
1295
|
-
notify_additive_expr_evaled(node, lhs_var, rhs_var,
|
1286
|
+
notify_additive_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1296
1287
|
|
1297
|
-
_do_assign(node, lhs_var,
|
1288
|
+
_do_assign(node, lhs_var, rslt_var)
|
1298
1289
|
end
|
1299
1290
|
|
1300
1291
|
def _do_sub_then_assign(node, lhs_var, rhs_var)
|
@@ -1302,7 +1293,7 @@ module Cc1 #:nodoc:
|
|
1302
1293
|
|
1303
1294
|
lhs_val = lhs_conved.value
|
1304
1295
|
rhs_val = rhs_conved.value
|
1305
|
-
|
1296
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val - rhs_val)
|
1306
1297
|
|
1307
1298
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1308
1299
|
# reference should not be notified not to confuse sequence-point
|
@@ -1310,9 +1301,9 @@ module Cc1 #:nodoc:
|
|
1310
1301
|
# _notify_variable_value_referred(node, lhs_var)
|
1311
1302
|
_notify_variable_value_referred(node, rhs_var)
|
1312
1303
|
|
1313
|
-
notify_additive_expr_evaled(node, lhs_var, rhs_var,
|
1304
|
+
notify_additive_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1314
1305
|
|
1315
|
-
_do_assign(node, lhs_var,
|
1306
|
+
_do_assign(node, lhs_var, rslt_var)
|
1316
1307
|
end
|
1317
1308
|
|
1318
1309
|
def _do_shl_then_assign(node, lhs_var, rhs_var)
|
@@ -1329,7 +1320,7 @@ module Cc1 #:nodoc:
|
|
1329
1320
|
|
1330
1321
|
lhs_val = lhs_conved.value
|
1331
1322
|
rhs_val = rhs_conved.value
|
1332
|
-
|
1323
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val << rhs_val)
|
1333
1324
|
|
1334
1325
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1335
1326
|
# reference should not be notified not to confuse sequence-point
|
@@ -1337,9 +1328,9 @@ module Cc1 #:nodoc:
|
|
1337
1328
|
# _notify_variable_value_referred(node, lhs_var)
|
1338
1329
|
_notify_variable_value_referred(node, rhs_var)
|
1339
1330
|
|
1340
|
-
notify_shift_expr_evaled(node, lhs_var, rhs_var,
|
1331
|
+
notify_shift_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1341
1332
|
|
1342
|
-
_do_assign(node, lhs_var,
|
1333
|
+
_do_assign(node, lhs_var, rslt_var)
|
1343
1334
|
end
|
1344
1335
|
|
1345
1336
|
def _do_shr_then_assign(node, lhs_var, rhs_var)
|
@@ -1356,7 +1347,7 @@ module Cc1 #:nodoc:
|
|
1356
1347
|
|
1357
1348
|
lhs_val = lhs_conved.value
|
1358
1349
|
rhs_val = rhs_conved.value
|
1359
|
-
|
1350
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val >> rhs_val)
|
1360
1351
|
|
1361
1352
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1362
1353
|
# reference should not be notified not to confuse sequence-point
|
@@ -1364,9 +1355,9 @@ module Cc1 #:nodoc:
|
|
1364
1355
|
# _notify_variable_value_referred(node, lhs_var)
|
1365
1356
|
_notify_variable_value_referred(node, rhs_var)
|
1366
1357
|
|
1367
|
-
notify_shift_expr_evaled(node, lhs_var, rhs_var,
|
1358
|
+
notify_shift_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1368
1359
|
|
1369
|
-
_do_assign(node, lhs_var,
|
1360
|
+
_do_assign(node, lhs_var, rslt_var)
|
1370
1361
|
end
|
1371
1362
|
|
1372
1363
|
def _do_and_then_assign(node, lhs_var, rhs_var)
|
@@ -1374,7 +1365,7 @@ module Cc1 #:nodoc:
|
|
1374
1365
|
|
1375
1366
|
lhs_val = lhs_conved.value
|
1376
1367
|
rhs_val = rhs_conved.value
|
1377
|
-
|
1368
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val & rhs_val)
|
1378
1369
|
|
1379
1370
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1380
1371
|
# reference should not be notified not to confuse sequence-point
|
@@ -1382,9 +1373,9 @@ module Cc1 #:nodoc:
|
|
1382
1373
|
# _notify_variable_value_referred(node, lhs_var)
|
1383
1374
|
_notify_variable_value_referred(node, rhs_var)
|
1384
1375
|
|
1385
|
-
notify_and_expr_evaled(node, lhs_var, rhs_var,
|
1376
|
+
notify_and_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1386
1377
|
|
1387
|
-
_do_assign(node, lhs_var,
|
1378
|
+
_do_assign(node, lhs_var, rslt_var)
|
1388
1379
|
end
|
1389
1380
|
|
1390
1381
|
def _do_xor_then_assign(node, lhs_var, rhs_var)
|
@@ -1392,7 +1383,7 @@ module Cc1 #:nodoc:
|
|
1392
1383
|
|
1393
1384
|
lhs_val = lhs_conved.value
|
1394
1385
|
rhs_val = rhs_conved.value
|
1395
|
-
|
1386
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val ^ rhs_val)
|
1396
1387
|
|
1397
1388
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1398
1389
|
# reference should not be notified not to confuse sequence-point
|
@@ -1400,9 +1391,9 @@ module Cc1 #:nodoc:
|
|
1400
1391
|
# _notify_variable_value_referred(node, lhs_var)
|
1401
1392
|
_notify_variable_value_referred(node, rhs_var)
|
1402
1393
|
|
1403
|
-
notify_exclusive_or_expr_evaled(node, lhs_var, rhs_var,
|
1394
|
+
notify_exclusive_or_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1404
1395
|
|
1405
|
-
_do_assign(node, lhs_var,
|
1396
|
+
_do_assign(node, lhs_var, rslt_var)
|
1406
1397
|
end
|
1407
1398
|
|
1408
1399
|
def _do_ior_then_assign(node, lhs_var, rhs_var)
|
@@ -1410,7 +1401,7 @@ module Cc1 #:nodoc:
|
|
1410
1401
|
|
1411
1402
|
lhs_val = lhs_conved.value
|
1412
1403
|
rhs_val = rhs_conved.value
|
1413
|
-
|
1404
|
+
rslt_var = create_tmpvar(lhs_conved.type, lhs_val | rhs_val)
|
1414
1405
|
|
1415
1406
|
# NOTE: Value of the lhs_var is referred at this point. But value
|
1416
1407
|
# reference should not be notified not to confuse sequence-point
|
@@ -1418,9 +1409,9 @@ module Cc1 #:nodoc:
|
|
1418
1409
|
# _notify_variable_value_referred(node, lhs_var)
|
1419
1410
|
_notify_variable_value_referred(node, rhs_var)
|
1420
1411
|
|
1421
|
-
notify_inclusive_or_expr_evaled(node, lhs_var, rhs_var,
|
1412
|
+
notify_inclusive_or_expr_evaled(node, lhs_var, rhs_var, rslt_var)
|
1422
1413
|
|
1423
|
-
_do_assign(node, lhs_var,
|
1414
|
+
_do_assign(node, lhs_var, rslt_var)
|
1424
1415
|
end
|
1425
1416
|
|
1426
1417
|
def _do_uarith_conversion(node, lhs_var, rhs_var)
|
@@ -1468,6 +1459,25 @@ module Cc1 #:nodoc:
|
|
1468
1459
|
notify_assignment_expr_evaled(node, lhs_var, rhs_conved)
|
1469
1460
|
end
|
1470
1461
|
|
1462
|
+
def _pick_array_element(expr, ary, subs, rslt_type)
|
1463
|
+
if ary
|
1464
|
+
if subs.value.definite?
|
1465
|
+
inner_var = ary.inner_variable_at(subs.value.unique_sample)
|
1466
|
+
if inner_var && inner_var.type.same_as?(rslt_type)
|
1467
|
+
_notify_object_referred(expr, inner_var)
|
1468
|
+
return inner_var
|
1469
|
+
end
|
1470
|
+
else
|
1471
|
+
# NOTE: To improve heuristics of array subscript evaluation with an
|
1472
|
+
# indefinite subscript.
|
1473
|
+
inner_var = ary.representative_element
|
1474
|
+
_notify_object_referred(expr, inner_var)
|
1475
|
+
return inner_var
|
1476
|
+
end
|
1477
|
+
end
|
1478
|
+
create_tmpvar(rslt_type)
|
1479
|
+
end
|
1480
|
+
|
1471
1481
|
def _notify_object_referred(node, obj)
|
1472
1482
|
case obj
|
1473
1483
|
when Variable
|