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/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 original.type.same_as?(promoted_type)
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 lhs_original.type.same_as?(arith_type)
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 rhs_original.type.same_as?(arith_type)
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 original.type.same_as?(promoted_type)
82
+ if promoted_type.same_as?(original.type)
83
83
  original
84
84
  else
85
85
  do_conversion(original, promoted_type) || original
@@ -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
- notify_equality_expr_evaled(@node, lhs_converted, rhs_converted, result)
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?
@@ -537,7 +537,30 @@ module C #:nodoc:
537
537
  end
538
538
 
539
539
  def *(rhs_domain)
540
- self / (ValueDomain.equal_to(1.0) / rhs_domain)
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(rhs_domain._narrow_by_eq(lhs_domain.domain))
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(rhs_domain._narrow_by_ne(lhs_domain.domain))
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(rhs_domain._narrow_by_lt(lhs_domain.domain))
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(rhs_domain._narrow_by_gt(lhs_domain.domain))
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