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/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