adlint 1.8.2 → 1.8.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 +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
|