adlint 1.8.2 → 1.8.10
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +192 -0
- data/MANIFEST +1 -0
- data/NEWS +40 -4
- data/etc/mesg.d/en_US/messages.yml +1 -1
- data/etc/mesg.d/ja_JP/messages.yml +1 -1
- data/lib/adlint/c/code.rb +88 -124
- data/lib/adlint/c/conv.rb +4 -4
- data/lib/adlint/c/ctrlexpr.rb +8 -2
- data/lib/adlint/c/domain.rb +405 -5
- data/lib/adlint/c/format.rb +6 -6
- data/lib/adlint/c/message.rb +227 -350
- data/lib/adlint/c/message_shima.rb +1 -2
- data/lib/adlint/c/object.rb +1 -1
- data/lib/adlint/c/type.rb +43 -1
- data/lib/adlint/cpp/util.rb +29 -0
- data/lib/adlint/version.rb +2 -2
- data/share/demo/Makefile +1 -0
- data/share/demo/integer_promotion/integer_promotion.c +17 -0
- data/share/doc/developers_guide_ja.html +3 -3
- data/share/doc/developers_guide_ja.texi +1 -1
- 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 +3 -2
data/lib/adlint/c/conv.rb
CHANGED
@@ -48,7 +48,7 @@ module C #:nodoc:
|
|
48
48
|
return original unless original.type.integer?
|
49
49
|
|
50
50
|
promoted_type = original.type.integer_promoted_type
|
51
|
-
if
|
51
|
+
if promoted_type.same_as?(original.type)
|
52
52
|
original
|
53
53
|
else
|
54
54
|
do_conversion(original, promoted_type) || original
|
@@ -62,13 +62,13 @@ module C #:nodoc:
|
|
62
62
|
|
63
63
|
arith_type = lhs_original.type.arithmetic_type_with(rhs_original.type)
|
64
64
|
|
65
|
-
if
|
65
|
+
if arith_type.same_as?(lhs_original.type)
|
66
66
|
lhs_converted = lhs_original
|
67
67
|
else
|
68
68
|
lhs_converted = do_conversion(lhs_original, arith_type) || lhs_original
|
69
69
|
end
|
70
70
|
|
71
|
-
if
|
71
|
+
if arith_type.same_as?(rhs_original.type)
|
72
72
|
rhs_converted = rhs_original
|
73
73
|
else
|
74
74
|
rhs_converted = do_conversion(rhs_original, arith_type) || rhs_original
|
@@ -79,7 +79,7 @@ module C #:nodoc:
|
|
79
79
|
|
80
80
|
def do_default_argument_promotion(original)
|
81
81
|
promoted_type = original.type.argument_promoted_type
|
82
|
-
if
|
82
|
+
if promoted_type.same_as?(original.type)
|
83
83
|
original
|
84
84
|
else
|
85
85
|
do_conversion(original, promoted_type) || original
|
data/lib/adlint/c/ctrlexpr.rb
CHANGED
@@ -62,7 +62,6 @@ module C #:nodoc:
|
|
62
62
|
def ensure_true_by_narrowing(expression = nil)
|
63
63
|
if expression
|
64
64
|
new_manip = ValueDomainNarrower.new(@interpreter, expression)
|
65
|
-
@manipulators.push(new_manip)
|
66
65
|
begin
|
67
66
|
if @branch.implicit_condition?
|
68
67
|
@interpreter._suppress_notification = true
|
@@ -783,7 +782,14 @@ module C #:nodoc:
|
|
783
782
|
# NOTREACHED
|
784
783
|
end
|
785
784
|
|
786
|
-
|
785
|
+
case @operator_symbol
|
786
|
+
when :==, :!=
|
787
|
+
notify_equality_expr_evaled(@node,
|
788
|
+
lhs_converted, rhs_converted, result)
|
789
|
+
when :<, :>, :<=, :>=
|
790
|
+
notify_relational_expr_evaled(@node,
|
791
|
+
lhs_converted, rhs_converted, result)
|
792
|
+
end
|
787
793
|
|
788
794
|
case
|
789
795
|
when lhs_converted.designated_by_lvalue?
|
data/lib/adlint/c/domain.rb
CHANGED
@@ -537,7 +537,30 @@ module C #:nodoc:
|
|
537
537
|
end
|
538
538
|
|
539
539
|
def *(rhs_domain)
|
540
|
-
|
540
|
+
# NOTE: Operator * cannot be defined by `LHS / (1.0 / RHS)'.
|
541
|
+
# Because `1.0 / RHS' will make NaN, when the value domain of the
|
542
|
+
# right hand side contains 0.
|
543
|
+
subclass_responsibility
|
544
|
+
end
|
545
|
+
|
546
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
547
|
+
subclass_responsibility
|
548
|
+
end
|
549
|
+
|
550
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
551
|
+
subclass_responsibility
|
552
|
+
end
|
553
|
+
|
554
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
555
|
+
subclass_responsibility
|
556
|
+
end
|
557
|
+
|
558
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
559
|
+
subclass_responsibility
|
560
|
+
end
|
561
|
+
|
562
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
563
|
+
subclass_responsibility
|
541
564
|
end
|
542
565
|
|
543
566
|
def /(rhs_domain)
|
@@ -1252,6 +1275,48 @@ module C #:nodoc:
|
|
1252
1275
|
rhs_domain
|
1253
1276
|
end
|
1254
1277
|
|
1278
|
+
def *(rhs_domain)
|
1279
|
+
rhs_domain._mul_nil(self)
|
1280
|
+
end
|
1281
|
+
|
1282
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
1283
|
+
# NOTE: NilValueDomain contains no values.
|
1284
|
+
# So, any arithmetic operation with NilValueDomain makes
|
1285
|
+
# NilValueDomain.
|
1286
|
+
lhs_domain
|
1287
|
+
end
|
1288
|
+
|
1289
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
1290
|
+
# NOTE: NilValueDomain contains no values.
|
1291
|
+
# So, any arithmetic operation with NilValueDomain makes
|
1292
|
+
# NilValueDomain.
|
1293
|
+
# NOTE: NaN is a subclass of UnlimitedValueDomain.
|
1294
|
+
# Arithmetic operation with UnlimitedValueDomain should make
|
1295
|
+
# UnlimitedValueDomain, and with NaN should make NaN.
|
1296
|
+
rhs_domain
|
1297
|
+
end
|
1298
|
+
|
1299
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
1300
|
+
# NOTE: NilValueDomain contains no values.
|
1301
|
+
# So, any arithmetic operation with NilValueDomain makes
|
1302
|
+
# NilValueDomain.
|
1303
|
+
rhs_domain
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
1307
|
+
# NOTE: NilValueDomain contains no values.
|
1308
|
+
# So, any arithmetic operation with NilValueDomain makes
|
1309
|
+
# NilValueDomain.
|
1310
|
+
rhs_domain
|
1311
|
+
end
|
1312
|
+
|
1313
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
1314
|
+
# NOTE: NilValueDomain contains no values.
|
1315
|
+
# So, any arithmetic operation with NilValueDomain makes
|
1316
|
+
# NilValueDomain.
|
1317
|
+
rhs_domain
|
1318
|
+
end
|
1319
|
+
|
1255
1320
|
def /(rhs_domain)
|
1256
1321
|
rhs_domain._div_nil(self)
|
1257
1322
|
end
|
@@ -2068,6 +2133,47 @@ module C #:nodoc:
|
|
2068
2133
|
rhs_domain
|
2069
2134
|
end
|
2070
2135
|
|
2136
|
+
def *(rhs_domain)
|
2137
|
+
rhs_domain._mul_unlimited(self)
|
2138
|
+
end
|
2139
|
+
|
2140
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
2141
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
2142
|
+
# This method invokes NilValueDomain#_mul_unlimited.
|
2143
|
+
rhs_domain * lhs_domain
|
2144
|
+
end
|
2145
|
+
|
2146
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
2147
|
+
# NOTE: UnlimitedValueDomain contains everything.
|
2148
|
+
# So, this arithmetic operation with UnlimitedValueDomain makes
|
2149
|
+
# UnlimitedValueDomain.
|
2150
|
+
# NOTE: NaN is a subclass of UnlimitedValueDomain.
|
2151
|
+
# Arithmetic operation with UnlimitedValueDomain should make
|
2152
|
+
# UnlimitedValueDomain, and with NaN should make NaN.
|
2153
|
+
lhs_domain.nan? ? lhs_domain : rhs_domain
|
2154
|
+
end
|
2155
|
+
|
2156
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
2157
|
+
# NOTE: UnlimitedValueDomain contains everything.
|
2158
|
+
# So, this arithmetic operation with UnlimitedValueDomain makes
|
2159
|
+
# UnlimitedValueDomain.
|
2160
|
+
rhs_domain
|
2161
|
+
end
|
2162
|
+
|
2163
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
2164
|
+
# NOTE: UnlimitedValueDomain contains everything.
|
2165
|
+
# So, this arithmetic operation with UnlimitedValueDomain makes
|
2166
|
+
# UnlimitedValueDomain.
|
2167
|
+
rhs_domain
|
2168
|
+
end
|
2169
|
+
|
2170
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
2171
|
+
# NOTE: UnlimitedValueDomain contains everything.
|
2172
|
+
# So, this arithmetic operation with UnlimitedValueDomain makes
|
2173
|
+
# UnlimitedValueDomain.
|
2174
|
+
rhs_domain
|
2175
|
+
end
|
2176
|
+
|
2071
2177
|
def /(rhs_domain)
|
2072
2178
|
rhs_domain._div_unlimited(self)
|
2073
2179
|
end
|
@@ -2947,6 +3053,60 @@ module C #:nodoc:
|
|
2947
3053
|
ValueDomain.greater_than(lhs_domain.value + rhs_domain.value)
|
2948
3054
|
end
|
2949
3055
|
|
3056
|
+
def *(rhs_domain)
|
3057
|
+
rhs_domain._mul_equal_to(self)
|
3058
|
+
end
|
3059
|
+
|
3060
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
3061
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
3062
|
+
# This method invokes NilValueDomain#_mul_equal_to.
|
3063
|
+
rhs_domain * lhs_domain
|
3064
|
+
end
|
3065
|
+
|
3066
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
3067
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
3068
|
+
# This method invokes UnlimitedValueDomain#_mul_equal_to.
|
3069
|
+
rhs_domain * lhs_domain
|
3070
|
+
end
|
3071
|
+
|
3072
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
3073
|
+
ValueDomain.equal_to(lhs_domain.value * rhs_domain.value)
|
3074
|
+
end
|
3075
|
+
|
3076
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
3077
|
+
if rhs_domain.value == 0
|
3078
|
+
ValueDomain.equal_to(0)
|
3079
|
+
else
|
3080
|
+
case
|
3081
|
+
when lhs_domain.value <= 0 && rhs_domain.value < 0
|
3082
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3083
|
+
when lhs_domain.value > 0 && rhs_domain.value < 0
|
3084
|
+
ValueDomain.of_unlimited
|
3085
|
+
when lhs_domain.value <= 0 && rhs_domain.value > 0
|
3086
|
+
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3087
|
+
when lhs_domain.value > 0 && rhs_domain.value > 0
|
3088
|
+
ValueDomain.of_unlimited
|
3089
|
+
end
|
3090
|
+
end
|
3091
|
+
end
|
3092
|
+
|
3093
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
3094
|
+
if rhs_domain.value == 0
|
3095
|
+
ValueDomain.equal_to(0)
|
3096
|
+
else
|
3097
|
+
case
|
3098
|
+
when lhs_domain.value >= 0 && rhs_domain.value < 0
|
3099
|
+
ValueDomain.less_than(lhs_domain.value * rhs_domain.value)
|
3100
|
+
when lhs_domain.value < 0 && rhs_domain.value < 0
|
3101
|
+
ValueDomain.of_unlimited
|
3102
|
+
when lhs_domain.value >= 0 && rhs_domain.value > 0
|
3103
|
+
ValueDomain.greater_than(lhs_domain.value * rhs_domain.value)
|
3104
|
+
when lhs_domain.value < 0 && rhs_domain.value > 0
|
3105
|
+
ValueDomain.of_unlimited
|
3106
|
+
end
|
3107
|
+
end
|
3108
|
+
end
|
3109
|
+
|
2950
3110
|
def /(rhs_domain)
|
2951
3111
|
rhs_domain._div_equal_to(self)
|
2952
3112
|
end
|
@@ -3758,6 +3918,54 @@ module C #:nodoc:
|
|
3758
3918
|
ValueDomain.of_unlimited
|
3759
3919
|
end
|
3760
3920
|
|
3921
|
+
def *(rhs_domain)
|
3922
|
+
rhs_domain._mul_less_than(self)
|
3923
|
+
end
|
3924
|
+
|
3925
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
3926
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
3927
|
+
# This method invokes NilValueDomain#_mul_less_than.
|
3928
|
+
rhs_domain * lhs_domain
|
3929
|
+
end
|
3930
|
+
|
3931
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
3932
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
3933
|
+
# This method invokes UnlimitedValueDomain#_mul_less_than.
|
3934
|
+
rhs_domain * lhs_domain
|
3935
|
+
end
|
3936
|
+
|
3937
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
3938
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
3939
|
+
# This method invokes EqualToValueDomain#_mul_less_than.
|
3940
|
+
rhs_domain * lhs_domain
|
3941
|
+
end
|
3942
|
+
|
3943
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
3944
|
+
if rhs_domain.value > 0
|
3945
|
+
ValueDomain.of_unlimited
|
3946
|
+
else
|
3947
|
+
case
|
3948
|
+
when lhs_domain.value <= 0
|
3949
|
+
ValueDomain.greater_than(0)
|
3950
|
+
when lhs_domain.value > 0
|
3951
|
+
ValueDomain.less_than(0)
|
3952
|
+
end
|
3953
|
+
end
|
3954
|
+
end
|
3955
|
+
|
3956
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
3957
|
+
if rhs_domain.value > 0
|
3958
|
+
ValueDomain.of_unlimited
|
3959
|
+
else
|
3960
|
+
case
|
3961
|
+
when lhs_domain.value >= 0
|
3962
|
+
ValueDomain.less_than(0)
|
3963
|
+
when lhs_domain.value < 0
|
3964
|
+
ValueDomain.greater_than(0)
|
3965
|
+
end
|
3966
|
+
end
|
3967
|
+
end
|
3968
|
+
|
3761
3969
|
def /(rhs_domain)
|
3762
3970
|
rhs_domain._div_less_than(self)
|
3763
3971
|
end
|
@@ -4608,6 +4816,47 @@ module C #:nodoc:
|
|
4608
4816
|
ValueDomain.greater_than(lhs_domain.value + rhs_domain.value)
|
4609
4817
|
end
|
4610
4818
|
|
4819
|
+
def *(rhs_domain)
|
4820
|
+
rhs_domain._mul_greater_than(self)
|
4821
|
+
end
|
4822
|
+
|
4823
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
4824
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
4825
|
+
# This method invokes NilValueDomain#_mul_greater_than.
|
4826
|
+
rhs_domain * lhs_domain
|
4827
|
+
end
|
4828
|
+
|
4829
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
4830
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
4831
|
+
# This method invokes UnlimitedValueDomain#_mul_greater_than.
|
4832
|
+
rhs_domain * lhs_domain
|
4833
|
+
end
|
4834
|
+
|
4835
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
4836
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
4837
|
+
# This method invokes EqualToValueDomain#_mul_greater_than.
|
4838
|
+
rhs_domain * lhs_domain
|
4839
|
+
end
|
4840
|
+
|
4841
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
4842
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
4843
|
+
# This method invokes LessThanValueDomain#_mul_greater_than.
|
4844
|
+
rhs_domain * lhs_domain
|
4845
|
+
end
|
4846
|
+
|
4847
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
4848
|
+
if rhs_domain.value < 0
|
4849
|
+
ValueDomain.of_unlimited
|
4850
|
+
else
|
4851
|
+
case
|
4852
|
+
when lhs_domain.value < 0
|
4853
|
+
ValueDomain.of_unlimited
|
4854
|
+
when lhs_domain.value >= 0
|
4855
|
+
ValueDomain.greater_than(0)
|
4856
|
+
end
|
4857
|
+
end
|
4858
|
+
end
|
4859
|
+
|
4611
4860
|
def /(rhs_domain)
|
4612
4861
|
rhs_domain._div_greater_than(self)
|
4613
4862
|
end
|
@@ -5343,6 +5592,36 @@ module C #:nodoc:
|
|
5343
5592
|
rhs_domain + lhs_domain
|
5344
5593
|
end
|
5345
5594
|
|
5595
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
5596
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5597
|
+
# This method invokes CompositeValueDomain#*.
|
5598
|
+
rhs_domain * lhs_domain
|
5599
|
+
end
|
5600
|
+
|
5601
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
5602
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5603
|
+
# This method invokes CompositeValueDomain#*.
|
5604
|
+
rhs_domain * lhs_domain
|
5605
|
+
end
|
5606
|
+
|
5607
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
5608
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5609
|
+
# This method invokes CompositeValueDomain#*.
|
5610
|
+
rhs_domain * lhs_domain
|
5611
|
+
end
|
5612
|
+
|
5613
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
5614
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5615
|
+
# This method invokes CompositeValueDomain#*.
|
5616
|
+
rhs_domain * lhs_domain
|
5617
|
+
end
|
5618
|
+
|
5619
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
5620
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
5621
|
+
# This method invokes CompositeValueDomain#*.
|
5622
|
+
rhs_domain * lhs_domain
|
5623
|
+
end
|
5624
|
+
|
5346
5625
|
def _div_nil(lhs_domain, rhs_domain = self)
|
5347
5626
|
_div(lhs_domain, rhs_domain)
|
5348
5627
|
end
|
@@ -5813,6 +6092,11 @@ module C #:nodoc:
|
|
5813
6092
|
new_sub_domains.first.intersection(new_sub_domains.last)
|
5814
6093
|
end
|
5815
6094
|
|
6095
|
+
def *(rhs_domain)
|
6096
|
+
new_sub_domains = domain_pair.map { |lhs| lhs * rhs_domain }
|
6097
|
+
new_sub_domains.first.intersection(new_sub_domains.last)
|
6098
|
+
end
|
6099
|
+
|
5816
6100
|
def /(rhs_domain)
|
5817
6101
|
new_sub_domains = domain_pair.map { |lhs| lhs / rhs_domain }
|
5818
6102
|
new_sub_domains.first.intersection(new_sub_domains.last)
|
@@ -6091,6 +6375,11 @@ module C #:nodoc:
|
|
6091
6375
|
new_sub_domains.first.union(new_sub_domains.last)
|
6092
6376
|
end
|
6093
6377
|
|
6378
|
+
def *(rhs_domain)
|
6379
|
+
new_sub_domains = domain_pair.map { |lhs| lhs * rhs_domain }
|
6380
|
+
new_sub_domains.first.union(new_sub_domains.last)
|
6381
|
+
end
|
6382
|
+
|
6094
6383
|
def /(rhs_domain)
|
6095
6384
|
new_sub_domains = domain_pair.map { |lhs| lhs / rhs_domain }
|
6096
6385
|
new_sub_domains.first.union(new_sub_domains.last)
|
@@ -6309,7 +6598,7 @@ module C #:nodoc:
|
|
6309
6598
|
def_delegator :@domain, :_intersect_greater_than?
|
6310
6599
|
|
6311
6600
|
def _narrow_by_eq(rhs_domain, lhs_domain = self)
|
6312
|
-
ValueDomain.of_undefined(
|
6601
|
+
ValueDomain.of_undefined(lhs_domain.domain._narrow_by_eq(rhs_domain))
|
6313
6602
|
end
|
6314
6603
|
|
6315
6604
|
def_delegator :@domain, :_narrow_nil_by_eq
|
@@ -6319,7 +6608,7 @@ module C #:nodoc:
|
|
6319
6608
|
def_delegator :@domain, :_narrow_greater_than_by_eq
|
6320
6609
|
|
6321
6610
|
def _narrow_by_ne(rhs_domain, lhs_domain = self)
|
6322
|
-
ValueDomain.of_undefined(
|
6611
|
+
ValueDomain.of_undefined(lhs_domain.domain._narrow_by_ne(rhs_domain))
|
6323
6612
|
end
|
6324
6613
|
|
6325
6614
|
def_delegator :@domain, :_narrow_nil_by_ne
|
@@ -6329,7 +6618,7 @@ module C #:nodoc:
|
|
6329
6618
|
def_delegator :@domain, :_narrow_greater_than_by_ne
|
6330
6619
|
|
6331
6620
|
def _narrow_by_lt(rhs_domain, lhs_domain = self)
|
6332
|
-
ValueDomain.of_undefined(
|
6621
|
+
ValueDomain.of_undefined(lhs_domain.domain._narrow_by_lt(rhs_domain))
|
6333
6622
|
end
|
6334
6623
|
|
6335
6624
|
def_delegator :@domain, :_narrow_nil_by_lt
|
@@ -6339,7 +6628,7 @@ module C #:nodoc:
|
|
6339
6628
|
def_delegator :@domain, :_narrow_greater_than_by_lt
|
6340
6629
|
|
6341
6630
|
def _narrow_by_gt(rhs_domain, lhs_domain = self)
|
6342
|
-
ValueDomain.of_undefined(
|
6631
|
+
ValueDomain.of_undefined(lhs_domain.domain._narrow_by_gt(rhs_domain))
|
6343
6632
|
end
|
6344
6633
|
|
6345
6634
|
def_delegator :@domain, :_narrow_nil_by_gt
|
@@ -6348,6 +6637,13 @@ module C #:nodoc:
|
|
6348
6637
|
def_delegator :@domain, :_narrow_less_than_by_gt
|
6349
6638
|
def_delegator :@domain, :_narrow_greater_than_by_gt
|
6350
6639
|
|
6640
|
+
def_delegator :@domain, :_widen_by_eq
|
6641
|
+
def_delegator :@domain, :_widen_by_ne
|
6642
|
+
def_delegator :@domain, :_widen_by_lt
|
6643
|
+
def_delegator :@domain, :_widen_by_gt
|
6644
|
+
def_delegator :@domain, :_widen_by_le
|
6645
|
+
def_delegator :@domain, :_widen_by_ge
|
6646
|
+
|
6351
6647
|
def inversion
|
6352
6648
|
ValueDomain.of_undefined(@domain.inversion)
|
6353
6649
|
end
|
@@ -6398,6 +6694,40 @@ module C #:nodoc:
|
|
6398
6694
|
rhs_domain + lhs_domain
|
6399
6695
|
end
|
6400
6696
|
|
6697
|
+
def *(rhs_domain)
|
6698
|
+
ValueDomain.of_undefined(@domain * rhs_domain)
|
6699
|
+
end
|
6700
|
+
|
6701
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
6702
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6703
|
+
# This method invokes UndefinedValueDomain#*.
|
6704
|
+
rhs_domain * lhs_domain
|
6705
|
+
end
|
6706
|
+
|
6707
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
6708
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6709
|
+
# This method invokes UndefinedValueDomain#*.
|
6710
|
+
rhs_domain * lhs_domain
|
6711
|
+
end
|
6712
|
+
|
6713
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
6714
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6715
|
+
# This method invokes UndefinedValueDomain#*.
|
6716
|
+
rhs_domain * lhs_domain
|
6717
|
+
end
|
6718
|
+
|
6719
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
6720
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6721
|
+
# This method invokes UndefinedValueDomain#*.
|
6722
|
+
rhs_domain * lhs_domain
|
6723
|
+
end
|
6724
|
+
|
6725
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
6726
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
6727
|
+
# This method invokes UndefinedValueDomain#*.
|
6728
|
+
rhs_domain * lhs_domain
|
6729
|
+
end
|
6730
|
+
|
6401
6731
|
def /(rhs_domain)
|
6402
6732
|
ValueDomain.of_undefined(@domain / rhs_domain)
|
6403
6733
|
end
|
@@ -6883,6 +7213,34 @@ module C #:nodoc:
|
|
6883
7213
|
ValueDomain.of_ambiguous(@undefined)
|
6884
7214
|
end
|
6885
7215
|
|
7216
|
+
def widen(operator_symbol, operand_value_domain)
|
7217
|
+
self
|
7218
|
+
end
|
7219
|
+
|
7220
|
+
def _widen_by_eq(rhs_domain, lhs_domain = self)
|
7221
|
+
ValueDomain.of_ambiguous(@undefined)
|
7222
|
+
end
|
7223
|
+
|
7224
|
+
def _widen_by_ne(rhs_domain, lhs_domain = self)
|
7225
|
+
ValueDomain.of_ambiguous(@undefined)
|
7226
|
+
end
|
7227
|
+
|
7228
|
+
def _widen_by_lt(rhs_domain, lhs_domain = self)
|
7229
|
+
ValueDomain.of_ambiguous(@undefined)
|
7230
|
+
end
|
7231
|
+
|
7232
|
+
def _widen_by_gt(rhs_domain, lhs_domain = self)
|
7233
|
+
ValueDomain.of_ambiguous(@undefined)
|
7234
|
+
end
|
7235
|
+
|
7236
|
+
def _widen_by_le(rhs_domain, lhs_domain = self)
|
7237
|
+
ValueDomain.of_ambiguous(@undefined)
|
7238
|
+
end
|
7239
|
+
|
7240
|
+
def _widen_by_ge(rhs_domain, lhs_domain = self)
|
7241
|
+
ValueDomain.of_ambiguous(@undefined)
|
7242
|
+
end
|
7243
|
+
|
6886
7244
|
def inversion
|
6887
7245
|
self
|
6888
7246
|
end
|
@@ -6933,6 +7291,40 @@ module C #:nodoc:
|
|
6933
7291
|
rhs_domain + lhs_domain
|
6934
7292
|
end
|
6935
7293
|
|
7294
|
+
def *(rhs_domain)
|
7295
|
+
self
|
7296
|
+
end
|
7297
|
+
|
7298
|
+
def _mul_nil(lhs_domain, rhs_domain = self)
|
7299
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
7300
|
+
# This method invokes AmbiguousValueDomain#*.
|
7301
|
+
rhs_domain * lhs_domain
|
7302
|
+
end
|
7303
|
+
|
7304
|
+
def _mul_unlimited(lhs_domain, rhs_domain = self)
|
7305
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
7306
|
+
# This method invokes AmbiguousValueDomain#*.
|
7307
|
+
rhs_domain * lhs_domain
|
7308
|
+
end
|
7309
|
+
|
7310
|
+
def _mul_equal_to(lhs_domain, rhs_domain = self)
|
7311
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
7312
|
+
# This method invokes AmbiguousValueDomain#*.
|
7313
|
+
rhs_domain * lhs_domain
|
7314
|
+
end
|
7315
|
+
|
7316
|
+
def _mul_less_than(lhs_domain, rhs_domain = self)
|
7317
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
7318
|
+
# This method invokes AmbiguousValueDomain#*.
|
7319
|
+
rhs_domain * lhs_domain
|
7320
|
+
end
|
7321
|
+
|
7322
|
+
def _mul_greater_than(lhs_domain, rhs_domain = self)
|
7323
|
+
# NOTE: `LHS * RHS' equals to `RHS * LHS'.
|
7324
|
+
# This method invokes AmbiguousValueDomain#*.
|
7325
|
+
rhs_domain * lhs_domain
|
7326
|
+
end
|
7327
|
+
|
6936
7328
|
def /(rhs_domain)
|
6937
7329
|
self
|
6938
7330
|
end
|
@@ -7496,4 +7888,12 @@ if $0 == __FILE__
|
|
7496
7888
|
d2 = ValueDomain.equal_to(127)
|
7497
7889
|
p d1, d2
|
7498
7890
|
p d1 < d2
|
7891
|
+
|
7892
|
+
puts "---"
|
7893
|
+
d1 = ValueDomain.greater_than_or_equal_to(-2147483648)
|
7894
|
+
d1 = d1.intersection(ValueDomain.less_than_or_equal_to(2147483647))
|
7895
|
+
d1 = ValueDomain.of_undefined(d1)
|
7896
|
+
d2 = ValueDomain.equal_to(1)
|
7897
|
+
p d1, d2
|
7898
|
+
p d1.narrow(:!=, d2)
|
7499
7899
|
end
|