adlint 2.6.12 → 2.6.14

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.
Files changed (77) hide show
  1. data/ChangeLog +77 -0
  2. data/NEWS +17 -4
  3. data/bin/adlint +24 -30
  4. data/bin/adlint_chk +22 -28
  5. data/bin/adlint_cma +20 -26
  6. data/bin/adlint_sma +22 -28
  7. data/bin/adlintize +60 -58
  8. data/etc/mesg.d/c_builtin/en_US/messages.yml +168 -168
  9. data/etc/mesg.d/c_builtin/ja_JP/messages.yml +168 -168
  10. data/etc/mesg.d/core/en_US/messages.yml +1 -1
  11. data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
  12. data/features/code_check/W0119.feature +0 -5
  13. data/features/code_check/W0120.feature +1 -0
  14. data/features/code_check/W0121.feature +0 -5
  15. data/features/code_check/W0123.feature +0 -5
  16. data/features/code_check/W0125.feature +0 -5
  17. data/features/code_check/W0127.feature +0 -5
  18. data/features/code_check/W0128.feature +0 -5
  19. data/features/code_check/W0129.feature +0 -5
  20. data/features/code_check/W0130.feature +0 -5
  21. data/features/code_check/W0132.feature +1 -0
  22. data/features/code_check/W0133.feature +0 -5
  23. data/features/code_check/W0134.feature +0 -5
  24. data/features/code_check/W0135.feature +0 -5
  25. data/features/code_check/W0136.feature +0 -5
  26. data/features/code_check/W0137.feature +0 -5
  27. data/features/code_check/W0138.feature +0 -5
  28. data/features/code_check/W0139.feature +0 -5
  29. data/features/code_check/W0140.feature +0 -5
  30. data/features/code_check/W0141.feature +0 -5
  31. data/features/code_check/W0142.feature +0 -5
  32. data/features/code_check/W0157.feature +0 -5
  33. data/features/code_check/W0161.feature +0 -5
  34. data/features/code_check/W0165.feature +0 -5
  35. data/features/code_check/W0169.feature +0 -5
  36. data/features/code_check/W0177.feature +0 -5
  37. data/features/code_check/W0182.feature +0 -5
  38. data/features/code_check/W0183.feature +0 -5
  39. data/features/code_check/W0184.feature +0 -5
  40. data/features/code_check/W0212.feature +0 -5
  41. data/features/code_check/W0214.feature +0 -5
  42. data/features/code_check/W0221.feature +0 -5
  43. data/features/code_check/W0223.feature +0 -5
  44. data/features/code_check/W0230.feature +0 -5
  45. data/features/code_check/W0232.feature +0 -5
  46. data/features/code_check/W0245.feature +0 -5
  47. data/features/code_check/W0246.feature +0 -5
  48. data/features/code_check/W0247.feature +0 -5
  49. data/features/code_check/W0251.feature +0 -5
  50. data/features/code_check/W0650.feature +0 -4
  51. data/features/code_check/W0703.feature +5 -1
  52. data/features/code_check/W0719.feature +0 -10
  53. data/features/code_check/W0748.feature +0 -5
  54. data/features/code_check/W0751.feature +0 -5
  55. data/features/code_check/W0756.feature +0 -5
  56. data/features/code_check/W0763.feature +0 -5
  57. data/features/code_check/W0787.feature +7 -0
  58. data/features/code_check/W0794.feature +0 -1
  59. data/features/code_check/W1052.feature +0 -2
  60. data/features/support/env.rb +2 -7
  61. data/lib/adlint/c/syntax.rb +10 -16
  62. data/lib/adlint/cpp/macro.rb +96 -0
  63. data/lib/adlint/exam/c_builtin/c_check.rb +954 -817
  64. data/lib/adlint/exam/c_builtin/c_check_shima.rb +17 -19
  65. data/lib/adlint/exam/c_builtin/ld_check.rb +86 -44
  66. data/lib/adlint/message.rb +1 -1
  67. data/lib/adlint/util.rb +8 -8
  68. data/lib/adlint/version.rb +2 -2
  69. data/lib/adlint.rb +8 -0
  70. data/share/doc/developers_guide_ja.html +3 -3
  71. data/share/doc/developers_guide_ja.texi +1 -1
  72. data/share/doc/users_guide_en.html +5055 -5053
  73. data/share/doc/users_guide_en.texi +3817 -3818
  74. data/share/doc/users_guide_ja.html +3787 -3786
  75. data/share/doc/users_guide_ja.texi +3784 -3783
  76. data/spec/spec_helper.rb +3 -11
  77. metadata +2 -2
@@ -1350,33 +1350,33 @@ module CBuiltin #:nodoc:
1350
1350
  interp.on_function_declared += method(:add_function)
1351
1351
  interp.on_function_defined += method(:add_function)
1352
1352
  interp.on_translation_unit_ended += method(:check)
1353
- @identifiers = Hash.new { |hash, key| hash[key] = [] }
1353
+ @obj_dcls = Hash.new { |hash, key| hash[key] = [] }
1354
1354
  end
1355
1355
 
1356
1356
  private
1357
- def add_variable(decl_or_def, variable)
1358
- if variable.named?
1359
- @identifiers[mangle(variable.name)].push(
1360
- [decl_or_def.identifier, variable.declared_as_extern?])
1357
+ def add_variable(dcl_or_def, var)
1358
+ if var.named? && var.declared_as_extern?
1359
+ @obj_dcls[mangle(var.name)].push(dcl_or_def)
1361
1360
  end
1362
1361
  end
1363
1362
 
1364
- def add_function(decl_or_def, function)
1365
- if function.named?
1366
- @identifiers[mangle(function.name)].push(
1367
- [decl_or_def.identifier, function.declared_as_extern?])
1363
+ def add_function(dcl_or_def, func)
1364
+ if func.named? && func.declared_as_extern?
1365
+ @obj_dcls[mangle(func.name)].push(dcl_or_def)
1368
1366
  end
1369
1367
  end
1370
1368
 
1371
1369
  def check(*)
1372
- @identifiers.each do |key, id_array|
1373
- id_array.uniq! { |id| id[0].value }
1374
- if id_array.size > 1
1375
- id_array.each_with_index do |id, index|
1376
- next unless id[1]
1377
- pair = index == 0 ? id_array[1] : id_array[0]
1378
- C(:C0001, pair[0].location, pair[0].value)
1379
- W(:W0051, id[0].location, pair[0].value)
1370
+ @obj_dcls.each_value do |dcls|
1371
+ similar_dcls = dcls.uniq { |dcl| dcl.identifier.value }
1372
+ next unless similar_dcls.size > 1
1373
+
1374
+ similar_dcls.each do |dcl|
1375
+ W(:W0051, dcl.location, dcl.identifier.value)
1376
+ similar_dcls.each do |pair_dcl|
1377
+ if pair_dcl != dcl
1378
+ C(:C0001, pair_dcl.location, pair_dcl.identifier.value)
1379
+ end
1380
1380
  end
1381
1381
  end
1382
1382
  end
@@ -1402,44 +1402,42 @@ module CBuiltin #:nodoc:
1402
1402
 
1403
1403
  def initialize(context)
1404
1404
  super
1405
- visitor = context[:c_visitor]
1406
- visitor.enter_variable_declaration += method(:add_variable_decl)
1407
- visitor.enter_variable_definition += method(:add_variable_def)
1408
- visitor.enter_function_declaration += method(:add_function_decl)
1409
- visitor.enter_ansi_function_definition += method(:add_function_def)
1410
- visitor.enter_kandr_function_definition += method(:add_function_def)
1411
- visitor.leave_translation_unit += method(:check)
1412
- @identifiers = Hash.new { |hash, key| hash[key] = [] }
1405
+ interp = context[:c_interpreter]
1406
+ interp.on_variable_declared += method(:declare_object)
1407
+ interp.on_variable_defined += method(:declare_object)
1408
+ interp.on_function_declared += method(:declare_object)
1409
+ interp.on_function_defined += method(:declare_object)
1410
+ interp.on_block_started += method(:enter_scope)
1411
+ interp.on_block_ended += method(:leave_scope)
1412
+ @dcl_names = [Hash.new { |hash, key| hash[key] = [] }]
1413
1413
  end
1414
1414
 
1415
1415
  private
1416
- def add_variable_decl(node)
1417
- @identifiers[mangle(node.identifier.value)].push(node.identifier)
1418
- end
1416
+ def declare_object(dcl_or_def, *)
1417
+ dcl_name = dcl_or_def.identifier
1419
1418
 
1420
- def add_variable_def(node)
1421
- @identifiers[mangle(node.identifier.value)].push(node.identifier)
1422
- end
1419
+ pair_names = @dcl_names.map { |name_hash|
1420
+ name_hash[mangle(dcl_name.value)]
1421
+ }.reduce([]) { |all_names, similar_names|
1422
+ all_names + similar_names
1423
+ }.uniq { |id| id.value }.reject { |id| id.value == dcl_name.value }
1424
+
1425
+ unless pair_names.empty?
1426
+ W(:W0052, dcl_or_def.location, dcl_name.value)
1427
+ pair_names.each do |pair_name|
1428
+ C(:C0001, pair_name.location, pair_name.value)
1429
+ end
1430
+ end
1423
1431
 
1424
- def add_function_decl(node)
1425
- @identifiers[mangle(node.identifier.value)].push(node.identifier)
1432
+ @dcl_names.last[mangle(dcl_name.value)].push(dcl_name)
1426
1433
  end
1427
1434
 
1428
- def add_function_def(node)
1429
- @identifiers[mangle(node.identifier.value)].push(node.identifier)
1435
+ def enter_scope(*)
1436
+ @dcl_names.push(Hash.new { |hash, key| hash[key] = [] })
1430
1437
  end
1431
1438
 
1432
- def check(node)
1433
- @identifiers.each do |key, id_array|
1434
- id_array.uniq! { |id| id.value }
1435
- if id_array.size > 1
1436
- id_array.each_with_index do |id, index|
1437
- pair = index == 0 ? id_array[1] : id_array[0]
1438
- C(:C0001, pair.location, pair.value)
1439
- W(:W0052, id.location, pair.value)
1440
- end
1441
- end
1442
- end
1439
+ def leave_scope(*)
1440
+ @dcl_names.pop
1443
1441
  end
1444
1442
 
1445
1443
  def mangle(name)
@@ -3061,12 +3059,9 @@ module CBuiltin #:nodoc:
3061
3059
  end
3062
3060
 
3063
3061
  private
3064
- def check(initializer_or_expression, original_variable, result_variable)
3065
- return if from_type == to_type
3066
-
3067
- if original_variable.type.same_as?(from_type) &&
3068
- result_variable.type.same_as?(to_type)
3069
- W(message_id, initializer_or_expression.location)
3062
+ def check(init_or_expr, from_var, to_var)
3063
+ if match?(from_var, to_var)
3064
+ W(message_id, init_or_expr.location)
3070
3065
  end
3071
3066
  end
3072
3067
 
@@ -3078,6 +3073,28 @@ module CBuiltin #:nodoc:
3078
3073
  @interp.signed_char_type
3079
3074
  end
3080
3075
 
3076
+ def match?(from_var, to_var)
3077
+ unless from_var.type.same_as?(from_type) && to_var.type.same_as?(to_type)
3078
+ return false
3079
+ end
3080
+
3081
+ if char_type_family?(from_type) &&
3082
+ from_var.type.explicitly_signed? != from_type.explicitly_signed?
3083
+ return false
3084
+ end
3085
+ if char_type_family?(to_type) &&
3086
+ to_var.type.explicitly_signed? != to_type.explicitly_signed?
3087
+ return false
3088
+ end
3089
+
3090
+ true
3091
+ end
3092
+
3093
+ def char_type_family?(type)
3094
+ type == @interp.char_type ||
3095
+ type == @interp.signed_char_type || type == @interp.unsigned_char_type
3096
+ end
3097
+
3081
3098
  def message_id
3082
3099
  self.class.name.sub(/\A.*::/, "").intern
3083
3100
  end
@@ -3113,7 +3130,7 @@ module CBuiltin #:nodoc:
3113
3130
  end
3114
3131
 
3115
3132
  def to_type
3116
- @interp.short_type
3133
+ @interp.signed_short_type
3117
3134
  end
3118
3135
  end
3119
3136
 
@@ -3147,7 +3164,7 @@ module CBuiltin #:nodoc:
3147
3164
  end
3148
3165
 
3149
3166
  def to_type
3150
- @interp.int_type
3167
+ @interp.signed_int_type
3151
3168
  end
3152
3169
  end
3153
3170
 
@@ -3181,7 +3198,7 @@ module CBuiltin #:nodoc:
3181
3198
  end
3182
3199
 
3183
3200
  def to_type
3184
- @interp.long_type
3201
+ @interp.signed_long_type
3185
3202
  end
3186
3203
  end
3187
3204
 
@@ -3266,7 +3283,7 @@ module CBuiltin #:nodoc:
3266
3283
  end
3267
3284
 
3268
3285
  def to_type
3269
- @interp.long_long_type
3286
+ @interp.signed_long_long_type
3270
3287
  end
3271
3288
  end
3272
3289
 
@@ -3330,7 +3347,7 @@ module CBuiltin #:nodoc:
3330
3347
 
3331
3348
  private
3332
3349
  def from_type
3333
- @interp.short_type
3350
+ @interp.signed_short_type
3334
3351
  end
3335
3352
 
3336
3353
  def to_type
@@ -3364,7 +3381,7 @@ module CBuiltin #:nodoc:
3364
3381
 
3365
3382
  private
3366
3383
  def from_type
3367
- @interp.int_type
3384
+ @interp.signed_int_type
3368
3385
  end
3369
3386
 
3370
3387
  def to_type
@@ -3398,7 +3415,7 @@ module CBuiltin #:nodoc:
3398
3415
 
3399
3416
  private
3400
3417
  def from_type
3401
- @interp.long_type
3418
+ @interp.signed_long_type
3402
3419
  end
3403
3420
 
3404
3421
  def to_type
@@ -3432,7 +3449,7 @@ module CBuiltin #:nodoc:
3432
3449
 
3433
3450
  private
3434
3451
  def from_type
3435
- @interp.long_long_type
3452
+ @interp.signed_long_long_type
3436
3453
  end
3437
3454
 
3438
3455
  def to_type
@@ -3504,7 +3521,7 @@ module CBuiltin #:nodoc:
3504
3521
  end
3505
3522
 
3506
3523
  def to_type
3507
- @interp.short_type
3524
+ @interp.signed_short_type
3508
3525
  end
3509
3526
  end
3510
3527
 
@@ -3538,7 +3555,7 @@ module CBuiltin #:nodoc:
3538
3555
  end
3539
3556
 
3540
3557
  def to_type
3541
- @interp.short_type
3558
+ @interp.signed_short_type
3542
3559
  end
3543
3560
  end
3544
3561
 
@@ -3555,7 +3572,7 @@ module CBuiltin #:nodoc:
3555
3572
  end
3556
3573
 
3557
3574
  def to_type
3558
- @interp.int_type
3575
+ @interp.signed_int_type
3559
3576
  end
3560
3577
  end
3561
3578
 
@@ -3589,7 +3606,7 @@ module CBuiltin #:nodoc:
3589
3606
  end
3590
3607
 
3591
3608
  def to_type
3592
- @interp.short_type
3609
+ @interp.signed_short_type
3593
3610
  end
3594
3611
  end
3595
3612
 
@@ -3606,7 +3623,7 @@ module CBuiltin #:nodoc:
3606
3623
  end
3607
3624
 
3608
3625
  def to_type
3609
- @interp.int_type
3626
+ @interp.signed_int_type
3610
3627
  end
3611
3628
  end
3612
3629
 
@@ -3623,7 +3640,7 @@ module CBuiltin #:nodoc:
3623
3640
  end
3624
3641
 
3625
3642
  def to_type
3626
- @interp.long_type
3643
+ @interp.signed_long_type
3627
3644
  end
3628
3645
  end
3629
3646
 
@@ -3657,7 +3674,7 @@ module CBuiltin #:nodoc:
3657
3674
  end
3658
3675
 
3659
3676
  def to_type
3660
- @interp.short_type
3677
+ @interp.signed_short_type
3661
3678
  end
3662
3679
  end
3663
3680
 
@@ -3674,7 +3691,7 @@ module CBuiltin #:nodoc:
3674
3691
  end
3675
3692
 
3676
3693
  def to_type
3677
- @interp.int_type
3694
+ @interp.signed_int_type
3678
3695
  end
3679
3696
  end
3680
3697
 
@@ -3691,7 +3708,7 @@ module CBuiltin #:nodoc:
3691
3708
  end
3692
3709
 
3693
3710
  def to_type
3694
- @interp.long_type
3711
+ @interp.signed_long_type
3695
3712
  end
3696
3713
  end
3697
3714
 
@@ -3708,7 +3725,7 @@ module CBuiltin #:nodoc:
3708
3725
  end
3709
3726
 
3710
3727
  def to_type
3711
- @interp.long_long_type
3728
+ @interp.signed_long_long_type
3712
3729
  end
3713
3730
  end
3714
3731
 
@@ -3789,7 +3806,7 @@ module CBuiltin #:nodoc:
3789
3806
 
3790
3807
  private
3791
3808
  def from_type
3792
- @interp.short_type
3809
+ @interp.signed_short_type
3793
3810
  end
3794
3811
 
3795
3812
  def to_type
@@ -3806,7 +3823,7 @@ module CBuiltin #:nodoc:
3806
3823
 
3807
3824
  private
3808
3825
  def from_type
3809
- @interp.short_type
3826
+ @interp.signed_short_type
3810
3827
  end
3811
3828
 
3812
3829
  def to_type
@@ -3823,7 +3840,7 @@ module CBuiltin #:nodoc:
3823
3840
 
3824
3841
  private
3825
3842
  def from_type
3826
- @interp.short_type
3843
+ @interp.signed_short_type
3827
3844
  end
3828
3845
 
3829
3846
  def to_type
@@ -3840,7 +3857,7 @@ module CBuiltin #:nodoc:
3840
3857
 
3841
3858
  private
3842
3859
  def from_type
3843
- @interp.short_type
3860
+ @interp.signed_short_type
3844
3861
  end
3845
3862
 
3846
3863
  def to_type
@@ -3857,7 +3874,7 @@ module CBuiltin #:nodoc:
3857
3874
 
3858
3875
  private
3859
3876
  def from_type
3860
- @interp.int_type
3877
+ @interp.signed_int_type
3861
3878
  end
3862
3879
 
3863
3880
  def to_type
@@ -3874,7 +3891,7 @@ module CBuiltin #:nodoc:
3874
3891
 
3875
3892
  private
3876
3893
  def from_type
3877
- @interp.int_type
3894
+ @interp.signed_int_type
3878
3895
  end
3879
3896
 
3880
3897
  def to_type
@@ -3891,7 +3908,7 @@ module CBuiltin #:nodoc:
3891
3908
 
3892
3909
  private
3893
3910
  def from_type
3894
- @interp.int_type
3911
+ @interp.signed_int_type
3895
3912
  end
3896
3913
 
3897
3914
  def to_type
@@ -3908,7 +3925,7 @@ module CBuiltin #:nodoc:
3908
3925
 
3909
3926
  private
3910
3927
  def from_type
3911
- @interp.int_type
3928
+ @interp.signed_int_type
3912
3929
  end
3913
3930
 
3914
3931
  def to_type
@@ -3925,7 +3942,7 @@ module CBuiltin #:nodoc:
3925
3942
 
3926
3943
  private
3927
3944
  def from_type
3928
- @interp.long_type
3945
+ @interp.signed_long_type
3929
3946
  end
3930
3947
 
3931
3948
  def to_type
@@ -3942,7 +3959,7 @@ module CBuiltin #:nodoc:
3942
3959
 
3943
3960
  private
3944
3961
  def from_type
3945
- @interp.long_type
3962
+ @interp.signed_long_type
3946
3963
  end
3947
3964
 
3948
3965
  def to_type
@@ -3959,7 +3976,7 @@ module CBuiltin #:nodoc:
3959
3976
 
3960
3977
  private
3961
3978
  def from_type
3962
- @interp.long_type
3979
+ @interp.signed_long_type
3963
3980
  end
3964
3981
 
3965
3982
  def to_type
@@ -3976,7 +3993,7 @@ module CBuiltin #:nodoc:
3976
3993
 
3977
3994
  private
3978
3995
  def from_type
3979
- @interp.long_type
3996
+ @interp.signed_long_type
3980
3997
  end
3981
3998
 
3982
3999
  def to_type
@@ -4010,7 +4027,7 @@ module CBuiltin #:nodoc:
4010
4027
 
4011
4028
  private
4012
4029
  def from_type
4013
- @interp.short_type
4030
+ @interp.signed_short_type
4014
4031
  end
4015
4032
 
4016
4033
  def to_type
@@ -4027,7 +4044,7 @@ module CBuiltin #:nodoc:
4027
4044
 
4028
4045
  private
4029
4046
  def from_type
4030
- @interp.int_type
4047
+ @interp.signed_int_type
4031
4048
  end
4032
4049
 
4033
4050
  def to_type
@@ -4044,7 +4061,7 @@ module CBuiltin #:nodoc:
4044
4061
 
4045
4062
  private
4046
4063
  def from_type
4047
- @interp.long_type
4064
+ @interp.signed_long_type
4048
4065
  end
4049
4066
 
4050
4067
  def to_type
@@ -4061,7 +4078,7 @@ module CBuiltin #:nodoc:
4061
4078
 
4062
4079
  private
4063
4080
  def from_type
4064
- @interp.long_long_type
4081
+ @interp.signed_long_long_type
4065
4082
  end
4066
4083
 
4067
4084
  def to_type
@@ -4078,7 +4095,7 @@ module CBuiltin #:nodoc:
4078
4095
 
4079
4096
  private
4080
4097
  def from_type
4081
- @interp.long_long_type
4098
+ @interp.signed_long_long_type
4082
4099
  end
4083
4100
 
4084
4101
  def to_type
@@ -4095,7 +4112,7 @@ module CBuiltin #:nodoc:
4095
4112
 
4096
4113
  private
4097
4114
  def from_type
4098
- @interp.long_long_type
4115
+ @interp.signed_long_long_type
4099
4116
  end
4100
4117
 
4101
4118
  def to_type
@@ -4112,7 +4129,7 @@ module CBuiltin #:nodoc:
4112
4129
 
4113
4130
  private
4114
4131
  def from_type
4115
- @interp.long_long_type
4132
+ @interp.signed_long_long_type
4116
4133
  end
4117
4134
 
4118
4135
  def to_type
@@ -4129,7 +4146,7 @@ module CBuiltin #:nodoc:
4129
4146
 
4130
4147
  private
4131
4148
  def from_type
4132
- @interp.long_long_type
4149
+ @interp.signed_long_long_type
4133
4150
  end
4134
4151
 
4135
4152
  def to_type
@@ -4248,7 +4265,7 @@ module CBuiltin #:nodoc:
4248
4265
 
4249
4266
  private
4250
4267
  def from_type
4251
- @interp.short_type
4268
+ @interp.signed_short_type
4252
4269
  end
4253
4270
 
4254
4271
  def to_type
@@ -4265,7 +4282,7 @@ module CBuiltin #:nodoc:
4265
4282
 
4266
4283
  private
4267
4284
  def from_type
4268
- @interp.short_type
4285
+ @interp.signed_short_type
4269
4286
  end
4270
4287
 
4271
4288
  def to_type
@@ -4282,7 +4299,7 @@ module CBuiltin #:nodoc:
4282
4299
 
4283
4300
  private
4284
4301
  def from_type
4285
- @interp.short_type
4302
+ @interp.signed_short_type
4286
4303
  end
4287
4304
 
4288
4305
  def to_type
@@ -4350,7 +4367,7 @@ module CBuiltin #:nodoc:
4350
4367
 
4351
4368
  private
4352
4369
  def from_type
4353
- @interp.int_type
4370
+ @interp.signed_int_type
4354
4371
  end
4355
4372
 
4356
4373
  def to_type
@@ -4367,7 +4384,7 @@ module CBuiltin #:nodoc:
4367
4384
 
4368
4385
  private
4369
4386
  def from_type
4370
- @interp.int_type
4387
+ @interp.signed_int_type
4371
4388
  end
4372
4389
 
4373
4390
  def to_type
@@ -4384,7 +4401,7 @@ module CBuiltin #:nodoc:
4384
4401
 
4385
4402
  private
4386
4403
  def from_type
4387
- @interp.int_type
4404
+ @interp.signed_int_type
4388
4405
  end
4389
4406
 
4390
4407
  def to_type
@@ -4452,7 +4469,7 @@ module CBuiltin #:nodoc:
4452
4469
 
4453
4470
  private
4454
4471
  def from_type
4455
- @interp.long_type
4472
+ @interp.signed_long_type
4456
4473
  end
4457
4474
 
4458
4475
  def to_type
@@ -4469,7 +4486,7 @@ module CBuiltin #:nodoc:
4469
4486
 
4470
4487
  private
4471
4488
  def from_type
4472
- @interp.long_type
4489
+ @interp.signed_long_type
4473
4490
  end
4474
4491
 
4475
4492
  def to_type
@@ -4486,7 +4503,7 @@ module CBuiltin #:nodoc:
4486
4503
 
4487
4504
  private
4488
4505
  def from_type
4489
- @interp.long_type
4506
+ @interp.signed_long_type
4490
4507
  end
4491
4508
 
4492
4509
  def to_type
@@ -4554,7 +4571,7 @@ module CBuiltin #:nodoc:
4554
4571
 
4555
4572
  private
4556
4573
  def from_type
4557
- @interp.long_long_type
4574
+ @interp.signed_long_long_type
4558
4575
  end
4559
4576
 
4560
4577
  def to_type
@@ -4571,7 +4588,7 @@ module CBuiltin #:nodoc:
4571
4588
 
4572
4589
  private
4573
4590
  def from_type
4574
- @interp.long_long_type
4591
+ @interp.signed_long_long_type
4575
4592
  end
4576
4593
 
4577
4594
  def to_type
@@ -4588,7 +4605,7 @@ module CBuiltin #:nodoc:
4588
4605
 
4589
4606
  private
4590
4607
  def from_type
4591
- @interp.long_long_type
4608
+ @interp.signed_long_long_type
4592
4609
  end
4593
4610
 
4594
4611
  def to_type
@@ -4711,7 +4728,7 @@ module CBuiltin #:nodoc:
4711
4728
  end
4712
4729
 
4713
4730
  def to_type
4714
- @interp.short_type
4731
+ @interp.signed_short_type
4715
4732
  end
4716
4733
  end
4717
4734
 
@@ -4745,7 +4762,7 @@ module CBuiltin #:nodoc:
4745
4762
  end
4746
4763
 
4747
4764
  def to_type
4748
- @interp.int_type
4765
+ @interp.signed_int_type
4749
4766
  end
4750
4767
  end
4751
4768
 
@@ -4779,7 +4796,7 @@ module CBuiltin #:nodoc:
4779
4796
  end
4780
4797
 
4781
4798
  def to_type
4782
- @interp.long_type
4799
+ @interp.signed_long_type
4783
4800
  end
4784
4801
  end
4785
4802
 
@@ -4864,7 +4881,7 @@ module CBuiltin #:nodoc:
4864
4881
  end
4865
4882
 
4866
4883
  def to_type
4867
- @interp.short_type
4884
+ @interp.signed_short_type
4868
4885
  end
4869
4886
  end
4870
4887
 
@@ -4898,7 +4915,7 @@ module CBuiltin #:nodoc:
4898
4915
  end
4899
4916
 
4900
4917
  def to_type
4901
- @interp.int_type
4918
+ @interp.signed_int_type
4902
4919
  end
4903
4920
  end
4904
4921
 
@@ -4932,7 +4949,7 @@ module CBuiltin #:nodoc:
4932
4949
  end
4933
4950
 
4934
4951
  def to_type
4935
- @interp.long_type
4952
+ @interp.signed_long_type
4936
4953
  end
4937
4954
  end
4938
4955
 
@@ -5017,7 +5034,7 @@ module CBuiltin #:nodoc:
5017
5034
  end
5018
5035
 
5019
5036
  def to_type
5020
- @interp.short_type
5037
+ @interp.signed_short_type
5021
5038
  end
5022
5039
  end
5023
5040
 
@@ -5051,7 +5068,7 @@ module CBuiltin #:nodoc:
5051
5068
  end
5052
5069
 
5053
5070
  def to_type
5054
- @interp.int_type
5071
+ @interp.signed_int_type
5055
5072
  end
5056
5073
  end
5057
5074
 
@@ -5085,7 +5102,7 @@ module CBuiltin #:nodoc:
5085
5102
  end
5086
5103
 
5087
5104
  def to_type
5088
- @interp.long_type
5105
+ @interp.signed_long_type
5089
5106
  end
5090
5107
  end
5091
5108
 
@@ -5119,7 +5136,7 @@ module CBuiltin #:nodoc:
5119
5136
  end
5120
5137
 
5121
5138
  def to_type
5122
- @interp.long_long_type
5139
+ @interp.signed_long_long_type
5123
5140
  end
5124
5141
  end
5125
5142
 
@@ -5153,7 +5170,7 @@ module CBuiltin #:nodoc:
5153
5170
  end
5154
5171
 
5155
5172
  def to_type
5156
- @interp.long_long_type
5173
+ @interp.signed_long_long_type
5157
5174
  end
5158
5175
  end
5159
5176
 
@@ -5187,7 +5204,7 @@ module CBuiltin #:nodoc:
5187
5204
  end
5188
5205
 
5189
5206
  def to_type
5190
- @interp.long_long_type
5207
+ @interp.signed_long_long_type
5191
5208
  end
5192
5209
  end
5193
5210
 
@@ -5221,7 +5238,7 @@ module CBuiltin #:nodoc:
5221
5238
  end
5222
5239
 
5223
5240
  def to_type
5224
- @interp.short_type
5241
+ @interp.signed_short_type
5225
5242
  end
5226
5243
  end
5227
5244
 
@@ -5238,7 +5255,7 @@ module CBuiltin #:nodoc:
5238
5255
  end
5239
5256
 
5240
5257
  def to_type
5241
- @interp.int_type
5258
+ @interp.signed_int_type
5242
5259
  end
5243
5260
  end
5244
5261
 
@@ -5255,7 +5272,7 @@ module CBuiltin #:nodoc:
5255
5272
  end
5256
5273
 
5257
5274
  def to_type
5258
- @interp.long_type
5275
+ @interp.signed_long_type
5259
5276
  end
5260
5277
  end
5261
5278
 
@@ -5272,7 +5289,7 @@ module CBuiltin #:nodoc:
5272
5289
  end
5273
5290
 
5274
5291
  def to_type
5275
- @interp.int_type
5292
+ @interp.signed_int_type
5276
5293
  end
5277
5294
  end
5278
5295
 
@@ -5289,7 +5306,7 @@ module CBuiltin #:nodoc:
5289
5306
  end
5290
5307
 
5291
5308
  def to_type
5292
- @interp.long_type
5309
+ @interp.signed_long_type
5293
5310
  end
5294
5311
  end
5295
5312
 
@@ -5306,7 +5323,7 @@ module CBuiltin #:nodoc:
5306
5323
  end
5307
5324
 
5308
5325
  def to_type
5309
- @interp.long_type
5326
+ @interp.signed_long_type
5310
5327
  end
5311
5328
  end
5312
5329
 
@@ -5323,7 +5340,7 @@ module CBuiltin #:nodoc:
5323
5340
  end
5324
5341
 
5325
5342
  def to_type
5326
- @interp.long_long_type
5343
+ @interp.signed_long_long_type
5327
5344
  end
5328
5345
  end
5329
5346
 
@@ -5340,7 +5357,7 @@ module CBuiltin #:nodoc:
5340
5357
  end
5341
5358
 
5342
5359
  def to_type
5343
- @interp.long_long_type
5360
+ @interp.signed_long_long_type
5344
5361
  end
5345
5362
  end
5346
5363
 
@@ -5357,7 +5374,7 @@ module CBuiltin #:nodoc:
5357
5374
  end
5358
5375
 
5359
5376
  def to_type
5360
- @interp.long_long_type
5377
+ @interp.signed_long_long_type
5361
5378
  end
5362
5379
  end
5363
5380
 
@@ -5374,7 +5391,7 @@ module CBuiltin #:nodoc:
5374
5391
  end
5375
5392
 
5376
5393
  def to_type
5377
- @interp.long_long_type
5394
+ @interp.signed_long_long_type
5378
5395
  end
5379
5396
  end
5380
5397
 
@@ -5388,29 +5405,26 @@ module CBuiltin #:nodoc:
5388
5405
  def initialize(context)
5389
5406
  super
5390
5407
  @interp = context[:c_interpreter]
5391
- @interp.on_function_started += method(:start_function)
5392
- @interp.on_function_ended += method(:end_function)
5393
- @interp.on_return_stmt_evaled += method(:check_return_statement)
5394
- @current_function = nil
5408
+ @interp.on_function_started += method(:enter_function)
5409
+ @interp.on_function_ended += method(:leave_function)
5410
+ @interp.on_return_stmt_evaled += method(:check)
5411
+ @current_func = nil
5395
5412
  end
5396
5413
 
5397
5414
  private
5398
- def start_function(function_definition, function)
5399
- @current_function = function
5415
+ def enter_function(func_def, func)
5416
+ @current_func = func
5400
5417
  end
5401
5418
 
5402
- def end_function(function_definition, function)
5403
- @current_function = nil
5419
+ def leave_function(func_def, func)
5420
+ @current_func = nil
5404
5421
  end
5405
5422
 
5406
- def check_return_statement(return_statement, result_variable)
5407
- return unless @current_function
5408
- return if from_type == to_type
5409
- return unless result_variable
5410
-
5411
- if result_variable.type.same_as?(from_type) &&
5412
- @current_function.type.return_type.same_as?(to_type)
5413
- W(message_id, return_statement.location, @current_function.name)
5423
+ def check(return_stmt, result_var)
5424
+ if @current_func && result_var
5425
+ if match?(result_var.type, @current_func.type.return_type)
5426
+ W(message_id, return_stmt.location, @current_func.name)
5427
+ end
5414
5428
  end
5415
5429
  end
5416
5430
 
@@ -5422,6 +5436,28 @@ module CBuiltin #:nodoc:
5422
5436
  @interp.signed_char_type
5423
5437
  end
5424
5438
 
5439
+ def match?(expr_type, func_type)
5440
+ unless expr_type.same_as?(from_type) && func_type.same_as?(to_type)
5441
+ return false
5442
+ end
5443
+
5444
+ if char_type_family?(expr_type) &&
5445
+ expr_type.explicitly_signed? != from_type.explicitly_signed?
5446
+ return false
5447
+ end
5448
+ if char_type_family?(func_type) &&
5449
+ func_type.explicitly_signed? != to_type.explicitly_signed?
5450
+ return false
5451
+ end
5452
+
5453
+ true
5454
+ end
5455
+
5456
+ def char_type_family?(type)
5457
+ type == @interp.char_type ||
5458
+ type == @interp.signed_char_type || type == @interp.unsigned_char_type
5459
+ end
5460
+
5425
5461
  def message_id
5426
5462
  self.class.name.sub(/\A.*::/, "").intern
5427
5463
  end
@@ -5457,7 +5493,7 @@ module CBuiltin #:nodoc:
5457
5493
  end
5458
5494
 
5459
5495
  def to_type
5460
- @interp.short_type
5496
+ @interp.signed_short_type
5461
5497
  end
5462
5498
  end
5463
5499
 
@@ -5491,7 +5527,7 @@ module CBuiltin #:nodoc:
5491
5527
  end
5492
5528
 
5493
5529
  def to_type
5494
- @interp.int_type
5530
+ @interp.signed_int_type
5495
5531
  end
5496
5532
  end
5497
5533
 
@@ -5525,7 +5561,7 @@ module CBuiltin #:nodoc:
5525
5561
  end
5526
5562
 
5527
5563
  def to_type
5528
- @interp.long_type
5564
+ @interp.signed_long_type
5529
5565
  end
5530
5566
  end
5531
5567
 
@@ -5610,7 +5646,7 @@ module CBuiltin #:nodoc:
5610
5646
  end
5611
5647
 
5612
5648
  def to_type
5613
- @interp.long_long_type
5649
+ @interp.signed_long_long_type
5614
5650
  end
5615
5651
  end
5616
5652
 
@@ -5674,7 +5710,7 @@ module CBuiltin #:nodoc:
5674
5710
 
5675
5711
  private
5676
5712
  def from_type
5677
- @interp.short_type
5713
+ @interp.signed_short_type
5678
5714
  end
5679
5715
 
5680
5716
  def to_type
@@ -5708,7 +5744,7 @@ module CBuiltin #:nodoc:
5708
5744
 
5709
5745
  private
5710
5746
  def from_type
5711
- @interp.int_type
5747
+ @interp.signed_int_type
5712
5748
  end
5713
5749
 
5714
5750
  def to_type
@@ -5742,7 +5778,7 @@ module CBuiltin #:nodoc:
5742
5778
 
5743
5779
  private
5744
5780
  def from_type
5745
- @interp.long_type
5781
+ @interp.signed_long_type
5746
5782
  end
5747
5783
 
5748
5784
  def to_type
@@ -5776,7 +5812,7 @@ module CBuiltin #:nodoc:
5776
5812
 
5777
5813
  private
5778
5814
  def from_type
5779
- @interp.long_long_type
5815
+ @interp.signed_long_long_type
5780
5816
  end
5781
5817
 
5782
5818
  def to_type
@@ -5848,7 +5884,7 @@ module CBuiltin #:nodoc:
5848
5884
  end
5849
5885
 
5850
5886
  def to_type
5851
- @interp.short_type
5887
+ @interp.signed_short_type
5852
5888
  end
5853
5889
  end
5854
5890
 
@@ -5882,7 +5918,7 @@ module CBuiltin #:nodoc:
5882
5918
  end
5883
5919
 
5884
5920
  def to_type
5885
- @interp.short_type
5921
+ @interp.signed_short_type
5886
5922
  end
5887
5923
  end
5888
5924
 
@@ -5899,7 +5935,7 @@ module CBuiltin #:nodoc:
5899
5935
  end
5900
5936
 
5901
5937
  def to_type
5902
- @interp.int_type
5938
+ @interp.signed_int_type
5903
5939
  end
5904
5940
  end
5905
5941
 
@@ -5933,7 +5969,7 @@ module CBuiltin #:nodoc:
5933
5969
  end
5934
5970
 
5935
5971
  def to_type
5936
- @interp.short_type
5972
+ @interp.signed_short_type
5937
5973
  end
5938
5974
  end
5939
5975
 
@@ -5950,7 +5986,7 @@ module CBuiltin #:nodoc:
5950
5986
  end
5951
5987
 
5952
5988
  def to_type
5953
- @interp.int_type
5989
+ @interp.signed_int_type
5954
5990
  end
5955
5991
  end
5956
5992
 
@@ -5967,7 +6003,7 @@ module CBuiltin #:nodoc:
5967
6003
  end
5968
6004
 
5969
6005
  def to_type
5970
- @interp.long_type
6006
+ @interp.signed_long_type
5971
6007
  end
5972
6008
  end
5973
6009
 
@@ -6001,7 +6037,7 @@ module CBuiltin #:nodoc:
6001
6037
  end
6002
6038
 
6003
6039
  def to_type
6004
- @interp.short_type
6040
+ @interp.signed_short_type
6005
6041
  end
6006
6042
  end
6007
6043
 
@@ -6018,7 +6054,7 @@ module CBuiltin #:nodoc:
6018
6054
  end
6019
6055
 
6020
6056
  def to_type
6021
- @interp.int_type
6057
+ @interp.signed_int_type
6022
6058
  end
6023
6059
  end
6024
6060
 
@@ -6035,7 +6071,7 @@ module CBuiltin #:nodoc:
6035
6071
  end
6036
6072
 
6037
6073
  def to_type
6038
- @interp.long_type
6074
+ @interp.signed_long_type
6039
6075
  end
6040
6076
  end
6041
6077
 
@@ -6052,7 +6088,7 @@ module CBuiltin #:nodoc:
6052
6088
  end
6053
6089
 
6054
6090
  def to_type
6055
- @interp.long_long_type
6091
+ @interp.signed_long_long_type
6056
6092
  end
6057
6093
  end
6058
6094
 
@@ -6133,7 +6169,7 @@ module CBuiltin #:nodoc:
6133
6169
 
6134
6170
  private
6135
6171
  def from_type
6136
- @interp.short_type
6172
+ @interp.signed_short_type
6137
6173
  end
6138
6174
 
6139
6175
  def to_type
@@ -6150,7 +6186,7 @@ module CBuiltin #:nodoc:
6150
6186
 
6151
6187
  private
6152
6188
  def from_type
6153
- @interp.short_type
6189
+ @interp.signed_short_type
6154
6190
  end
6155
6191
 
6156
6192
  def to_type
@@ -6167,7 +6203,7 @@ module CBuiltin #:nodoc:
6167
6203
 
6168
6204
  private
6169
6205
  def from_type
6170
- @interp.short_type
6206
+ @interp.signed_short_type
6171
6207
  end
6172
6208
 
6173
6209
  def to_type
@@ -6184,7 +6220,7 @@ module CBuiltin #:nodoc:
6184
6220
 
6185
6221
  private
6186
6222
  def from_type
6187
- @interp.short_type
6223
+ @interp.signed_short_type
6188
6224
  end
6189
6225
 
6190
6226
  def to_type
@@ -6201,7 +6237,7 @@ module CBuiltin #:nodoc:
6201
6237
 
6202
6238
  private
6203
6239
  def from_type
6204
- @interp.int_type
6240
+ @interp.signed_int_type
6205
6241
  end
6206
6242
 
6207
6243
  def to_type
@@ -6218,7 +6254,7 @@ module CBuiltin #:nodoc:
6218
6254
 
6219
6255
  private
6220
6256
  def from_type
6221
- @interp.int_type
6257
+ @interp.signed_int_type
6222
6258
  end
6223
6259
 
6224
6260
  def to_type
@@ -6235,7 +6271,7 @@ module CBuiltin #:nodoc:
6235
6271
 
6236
6272
  private
6237
6273
  def from_type
6238
- @interp.int_type
6274
+ @interp.signed_int_type
6239
6275
  end
6240
6276
 
6241
6277
  def to_type
@@ -6252,7 +6288,7 @@ module CBuiltin #:nodoc:
6252
6288
 
6253
6289
  private
6254
6290
  def from_type
6255
- @interp.int_type
6291
+ @interp.signed_int_type
6256
6292
  end
6257
6293
 
6258
6294
  def to_type
@@ -6269,7 +6305,7 @@ module CBuiltin #:nodoc:
6269
6305
 
6270
6306
  private
6271
6307
  def from_type
6272
- @interp.long_type
6308
+ @interp.signed_long_type
6273
6309
  end
6274
6310
 
6275
6311
  def to_type
@@ -6286,7 +6322,7 @@ module CBuiltin #:nodoc:
6286
6322
 
6287
6323
  private
6288
6324
  def from_type
6289
- @interp.long_type
6325
+ @interp.signed_long_type
6290
6326
  end
6291
6327
 
6292
6328
  def to_type
@@ -6303,7 +6339,7 @@ module CBuiltin #:nodoc:
6303
6339
 
6304
6340
  private
6305
6341
  def from_type
6306
- @interp.long_type
6342
+ @interp.signed_long_type
6307
6343
  end
6308
6344
 
6309
6345
  def to_type
@@ -6320,7 +6356,7 @@ module CBuiltin #:nodoc:
6320
6356
 
6321
6357
  private
6322
6358
  def from_type
6323
- @interp.long_type
6359
+ @interp.signed_long_type
6324
6360
  end
6325
6361
 
6326
6362
  def to_type
@@ -6354,7 +6390,7 @@ module CBuiltin #:nodoc:
6354
6390
 
6355
6391
  private
6356
6392
  def from_type
6357
- @interp.short_type
6393
+ @interp.signed_short_type
6358
6394
  end
6359
6395
 
6360
6396
  def to_type
@@ -6371,7 +6407,7 @@ module CBuiltin #:nodoc:
6371
6407
 
6372
6408
  private
6373
6409
  def from_type
6374
- @interp.int_type
6410
+ @interp.signed_int_type
6375
6411
  end
6376
6412
 
6377
6413
  def to_type
@@ -6388,7 +6424,7 @@ module CBuiltin #:nodoc:
6388
6424
 
6389
6425
  private
6390
6426
  def from_type
6391
- @interp.long_type
6427
+ @interp.signed_long_type
6392
6428
  end
6393
6429
 
6394
6430
  def to_type
@@ -6405,7 +6441,7 @@ module CBuiltin #:nodoc:
6405
6441
 
6406
6442
  private
6407
6443
  def from_type
6408
- @interp.long_long_type
6444
+ @interp.signed_long_long_type
6409
6445
  end
6410
6446
 
6411
6447
  def to_type
@@ -6422,7 +6458,7 @@ module CBuiltin #:nodoc:
6422
6458
 
6423
6459
  private
6424
6460
  def from_type
6425
- @interp.long_long_type
6461
+ @interp.signed_long_long_type
6426
6462
  end
6427
6463
 
6428
6464
  def to_type
@@ -6439,7 +6475,7 @@ module CBuiltin #:nodoc:
6439
6475
 
6440
6476
  private
6441
6477
  def from_type
6442
- @interp.long_long_type
6478
+ @interp.signed_long_long_type
6443
6479
  end
6444
6480
 
6445
6481
  def to_type
@@ -6456,7 +6492,7 @@ module CBuiltin #:nodoc:
6456
6492
 
6457
6493
  private
6458
6494
  def from_type
6459
- @interp.long_long_type
6495
+ @interp.signed_long_long_type
6460
6496
  end
6461
6497
 
6462
6498
  def to_type
@@ -6473,7 +6509,7 @@ module CBuiltin #:nodoc:
6473
6509
 
6474
6510
  private
6475
6511
  def from_type
6476
- @interp.long_long_type
6512
+ @interp.signed_long_long_type
6477
6513
  end
6478
6514
 
6479
6515
  def to_type
@@ -6592,7 +6628,7 @@ module CBuiltin #:nodoc:
6592
6628
 
6593
6629
  private
6594
6630
  def from_type
6595
- @interp.short_type
6631
+ @interp.signed_short_type
6596
6632
  end
6597
6633
 
6598
6634
  def to_type
@@ -6609,7 +6645,7 @@ module CBuiltin #:nodoc:
6609
6645
 
6610
6646
  private
6611
6647
  def from_type
6612
- @interp.short_type
6648
+ @interp.signed_short_type
6613
6649
  end
6614
6650
 
6615
6651
  def to_type
@@ -6626,7 +6662,7 @@ module CBuiltin #:nodoc:
6626
6662
 
6627
6663
  private
6628
6664
  def from_type
6629
- @interp.short_type
6665
+ @interp.signed_short_type
6630
6666
  end
6631
6667
 
6632
6668
  def to_type
@@ -6694,7 +6730,7 @@ module CBuiltin #:nodoc:
6694
6730
 
6695
6731
  private
6696
6732
  def from_type
6697
- @interp.int_type
6733
+ @interp.signed_int_type
6698
6734
  end
6699
6735
 
6700
6736
  def to_type
@@ -6711,7 +6747,7 @@ module CBuiltin #:nodoc:
6711
6747
 
6712
6748
  private
6713
6749
  def from_type
6714
- @interp.int_type
6750
+ @interp.signed_int_type
6715
6751
  end
6716
6752
 
6717
6753
  def to_type
@@ -6728,7 +6764,7 @@ module CBuiltin #:nodoc:
6728
6764
 
6729
6765
  private
6730
6766
  def from_type
6731
- @interp.int_type
6767
+ @interp.signed_int_type
6732
6768
  end
6733
6769
 
6734
6770
  def to_type
@@ -6796,7 +6832,7 @@ module CBuiltin #:nodoc:
6796
6832
 
6797
6833
  private
6798
6834
  def from_type
6799
- @interp.long_type
6835
+ @interp.signed_long_type
6800
6836
  end
6801
6837
 
6802
6838
  def to_type
@@ -6813,7 +6849,7 @@ module CBuiltin #:nodoc:
6813
6849
 
6814
6850
  private
6815
6851
  def from_type
6816
- @interp.long_type
6852
+ @interp.signed_long_type
6817
6853
  end
6818
6854
 
6819
6855
  def to_type
@@ -6830,7 +6866,7 @@ module CBuiltin #:nodoc:
6830
6866
 
6831
6867
  private
6832
6868
  def from_type
6833
- @interp.long_type
6869
+ @interp.signed_long_type
6834
6870
  end
6835
6871
 
6836
6872
  def to_type
@@ -6898,7 +6934,7 @@ module CBuiltin #:nodoc:
6898
6934
 
6899
6935
  private
6900
6936
  def from_type
6901
- @interp.long_long_type
6937
+ @interp.signed_long_long_type
6902
6938
  end
6903
6939
 
6904
6940
  def to_type
@@ -6915,7 +6951,7 @@ module CBuiltin #:nodoc:
6915
6951
 
6916
6952
  private
6917
6953
  def from_type
6918
- @interp.long_long_type
6954
+ @interp.signed_long_long_type
6919
6955
  end
6920
6956
 
6921
6957
  def to_type
@@ -6932,7 +6968,7 @@ module CBuiltin #:nodoc:
6932
6968
 
6933
6969
  private
6934
6970
  def from_type
6935
- @interp.long_long_type
6971
+ @interp.signed_long_long_type
6936
6972
  end
6937
6973
 
6938
6974
  def to_type
@@ -7055,7 +7091,7 @@ module CBuiltin #:nodoc:
7055
7091
  end
7056
7092
 
7057
7093
  def to_type
7058
- @interp.short_type
7094
+ @interp.signed_short_type
7059
7095
  end
7060
7096
  end
7061
7097
 
@@ -7089,7 +7125,7 @@ module CBuiltin #:nodoc:
7089
7125
  end
7090
7126
 
7091
7127
  def to_type
7092
- @interp.int_type
7128
+ @interp.signed_int_type
7093
7129
  end
7094
7130
  end
7095
7131
 
@@ -7123,7 +7159,7 @@ module CBuiltin #:nodoc:
7123
7159
  end
7124
7160
 
7125
7161
  def to_type
7126
- @interp.long_type
7162
+ @interp.signed_long_type
7127
7163
  end
7128
7164
  end
7129
7165
 
@@ -7208,7 +7244,7 @@ module CBuiltin #:nodoc:
7208
7244
  end
7209
7245
 
7210
7246
  def to_type
7211
- @interp.short_type
7247
+ @interp.signed_short_type
7212
7248
  end
7213
7249
  end
7214
7250
 
@@ -7242,7 +7278,7 @@ module CBuiltin #:nodoc:
7242
7278
  end
7243
7279
 
7244
7280
  def to_type
7245
- @interp.int_type
7281
+ @interp.signed_int_type
7246
7282
  end
7247
7283
  end
7248
7284
 
@@ -7276,7 +7312,7 @@ module CBuiltin #:nodoc:
7276
7312
  end
7277
7313
 
7278
7314
  def to_type
7279
- @interp.long_type
7315
+ @interp.signed_long_type
7280
7316
  end
7281
7317
  end
7282
7318
 
@@ -7361,7 +7397,7 @@ module CBuiltin #:nodoc:
7361
7397
  end
7362
7398
 
7363
7399
  def to_type
7364
- @interp.short_type
7400
+ @interp.signed_short_type
7365
7401
  end
7366
7402
  end
7367
7403
 
@@ -7395,7 +7431,7 @@ module CBuiltin #:nodoc:
7395
7431
  end
7396
7432
 
7397
7433
  def to_type
7398
- @interp.int_type
7434
+ @interp.signed_int_type
7399
7435
  end
7400
7436
  end
7401
7437
 
@@ -7429,7 +7465,7 @@ module CBuiltin #:nodoc:
7429
7465
  end
7430
7466
 
7431
7467
  def to_type
7432
- @interp.long_type
7468
+ @interp.signed_long_type
7433
7469
  end
7434
7470
  end
7435
7471
 
@@ -7463,7 +7499,7 @@ module CBuiltin #:nodoc:
7463
7499
  end
7464
7500
 
7465
7501
  def to_type
7466
- @interp.long_long_type
7502
+ @interp.signed_long_long_type
7467
7503
  end
7468
7504
  end
7469
7505
 
@@ -7497,7 +7533,7 @@ module CBuiltin #:nodoc:
7497
7533
  end
7498
7534
 
7499
7535
  def to_type
7500
- @interp.long_long_type
7536
+ @interp.signed_long_long_type
7501
7537
  end
7502
7538
  end
7503
7539
 
@@ -7531,7 +7567,7 @@ module CBuiltin #:nodoc:
7531
7567
  end
7532
7568
 
7533
7569
  def to_type
7534
- @interp.long_long_type
7570
+ @interp.signed_long_long_type
7535
7571
  end
7536
7572
  end
7537
7573
 
@@ -7561,7 +7597,7 @@ module CBuiltin #:nodoc:
7561
7597
 
7562
7598
  private
7563
7599
  def from_type
7564
- @interp.short_type
7600
+ @interp.signed_short_type
7565
7601
  end
7566
7602
 
7567
7603
  def to_type
@@ -7595,7 +7631,7 @@ module CBuiltin #:nodoc:
7595
7631
 
7596
7632
  private
7597
7633
  def from_type
7598
- @interp.int_type
7634
+ @interp.signed_int_type
7599
7635
  end
7600
7636
 
7601
7637
  def to_type
@@ -7612,11 +7648,11 @@ module CBuiltin #:nodoc:
7612
7648
 
7613
7649
  private
7614
7650
  def from_type
7615
- @interp.int_type
7651
+ @interp.signed_int_type
7616
7652
  end
7617
7653
 
7618
7654
  def to_type
7619
- @interp.short_type
7655
+ @interp.signed_short_type
7620
7656
  end
7621
7657
  end
7622
7658
 
@@ -7663,7 +7699,7 @@ module CBuiltin #:nodoc:
7663
7699
 
7664
7700
  private
7665
7701
  def from_type
7666
- @interp.long_type
7702
+ @interp.signed_long_type
7667
7703
  end
7668
7704
 
7669
7705
  def to_type
@@ -7680,11 +7716,11 @@ module CBuiltin #:nodoc:
7680
7716
 
7681
7717
  private
7682
7718
  def from_type
7683
- @interp.long_type
7719
+ @interp.signed_long_type
7684
7720
  end
7685
7721
 
7686
7722
  def to_type
7687
- @interp.short_type
7723
+ @interp.signed_short_type
7688
7724
  end
7689
7725
  end
7690
7726
 
@@ -7697,11 +7733,11 @@ module CBuiltin #:nodoc:
7697
7733
 
7698
7734
  private
7699
7735
  def from_type
7700
- @interp.long_type
7736
+ @interp.signed_long_type
7701
7737
  end
7702
7738
 
7703
7739
  def to_type
7704
- @interp.int_type
7740
+ @interp.signed_int_type
7705
7741
  end
7706
7742
  end
7707
7743
 
@@ -7765,7 +7801,7 @@ module CBuiltin #:nodoc:
7765
7801
 
7766
7802
  private
7767
7803
  def from_type
7768
- @interp.long_long_type
7804
+ @interp.signed_long_long_type
7769
7805
  end
7770
7806
 
7771
7807
  def to_type
@@ -7782,11 +7818,11 @@ module CBuiltin #:nodoc:
7782
7818
 
7783
7819
  private
7784
7820
  def from_type
7785
- @interp.long_long_type
7821
+ @interp.signed_long_long_type
7786
7822
  end
7787
7823
 
7788
7824
  def to_type
7789
- @interp.short_type
7825
+ @interp.signed_short_type
7790
7826
  end
7791
7827
  end
7792
7828
 
@@ -7799,11 +7835,11 @@ module CBuiltin #:nodoc:
7799
7835
 
7800
7836
  private
7801
7837
  def from_type
7802
- @interp.long_long_type
7838
+ @interp.signed_long_long_type
7803
7839
  end
7804
7840
 
7805
7841
  def to_type
7806
- @interp.int_type
7842
+ @interp.signed_int_type
7807
7843
  end
7808
7844
  end
7809
7845
 
@@ -7816,11 +7852,11 @@ module CBuiltin #:nodoc:
7816
7852
 
7817
7853
  private
7818
7854
  def from_type
7819
- @interp.long_long_type
7855
+ @interp.signed_long_long_type
7820
7856
  end
7821
7857
 
7822
7858
  def to_type
7823
- @interp.long_type
7859
+ @interp.signed_long_type
7824
7860
  end
7825
7861
  end
7826
7862
 
@@ -7905,7 +7941,7 @@ module CBuiltin #:nodoc:
7905
7941
  end
7906
7942
 
7907
7943
  def to_type
7908
- @interp.short_type
7944
+ @interp.signed_short_type
7909
7945
  end
7910
7946
  end
7911
7947
 
@@ -7922,7 +7958,7 @@ module CBuiltin #:nodoc:
7922
7958
  end
7923
7959
 
7924
7960
  def to_type
7925
- @interp.int_type
7961
+ @interp.signed_int_type
7926
7962
  end
7927
7963
  end
7928
7964
 
@@ -7939,7 +7975,7 @@ module CBuiltin #:nodoc:
7939
7975
  end
7940
7976
 
7941
7977
  def to_type
7942
- @interp.long_type
7978
+ @interp.signed_long_type
7943
7979
  end
7944
7980
  end
7945
7981
 
@@ -7956,7 +7992,7 @@ module CBuiltin #:nodoc:
7956
7992
  end
7957
7993
 
7958
7994
  def to_type
7959
- @interp.int_type
7995
+ @interp.signed_int_type
7960
7996
  end
7961
7997
  end
7962
7998
 
@@ -7973,7 +8009,7 @@ module CBuiltin #:nodoc:
7973
8009
  end
7974
8010
 
7975
8011
  def to_type
7976
- @interp.long_type
8012
+ @interp.signed_long_type
7977
8013
  end
7978
8014
  end
7979
8015
 
@@ -7990,7 +8026,7 @@ module CBuiltin #:nodoc:
7990
8026
  end
7991
8027
 
7992
8028
  def to_type
7993
- @interp.long_type
8029
+ @interp.signed_long_type
7994
8030
  end
7995
8031
  end
7996
8032
 
@@ -8007,7 +8043,7 @@ module CBuiltin #:nodoc:
8007
8043
  end
8008
8044
 
8009
8045
  def to_type
8010
- @interp.long_long_type
8046
+ @interp.signed_long_long_type
8011
8047
  end
8012
8048
  end
8013
8049
 
@@ -8024,7 +8060,7 @@ module CBuiltin #:nodoc:
8024
8060
  end
8025
8061
 
8026
8062
  def to_type
8027
- @interp.long_long_type
8063
+ @interp.signed_long_long_type
8028
8064
  end
8029
8065
  end
8030
8066
 
@@ -8041,7 +8077,7 @@ module CBuiltin #:nodoc:
8041
8077
  end
8042
8078
 
8043
8079
  def to_type
8044
- @interp.long_long_type
8080
+ @interp.signed_long_long_type
8045
8081
  end
8046
8082
  end
8047
8083
 
@@ -8058,7 +8094,7 @@ module CBuiltin #:nodoc:
8058
8094
  end
8059
8095
 
8060
8096
  def to_type
8061
- @interp.long_long_type
8097
+ @interp.signed_long_long_type
8062
8098
  end
8063
8099
  end
8064
8100
 
@@ -9928,128 +9964,160 @@ module CBuiltin #:nodoc:
9928
9964
  interp.on_label_defined += method(:define_label)
9929
9965
  interp.on_block_started += method(:enter_scope)
9930
9966
  interp.on_block_ended += method(:leave_scope)
9931
- @variable_names = [[]]
9967
+ @dcl_names = [[]]
9932
9968
  @tag_names = [[]]
9933
9969
  @label_names = [[]]
9934
9970
  end
9935
9971
 
9936
9972
  private
9937
- def define_variable(variable_definition, variable)
9938
- variable_id = variable_definition.identifier
9973
+ def define_variable(var_def, *)
9974
+ dcl_name = var_def.identifier
9939
9975
 
9940
- (@tag_names + @label_names).each do |identifier_array|
9941
- if identifier_array.any? { |id| id.value == variable_id.value }
9942
- W(:W0491, variable_definition.location, variable_id.value)
9943
- return
9976
+ pair_names = (@tag_names + @label_names).flatten.select { |id|
9977
+ id.value == dcl_name.value
9978
+ }
9979
+
9980
+ unless pair_names.empty?
9981
+ W(:W0491, var_def.location, dcl_name.value)
9982
+ pair_names.each do |pair_name|
9983
+ C(:C0001, pair_name.location, pair_name.value)
9944
9984
  end
9945
9985
  end
9946
9986
 
9947
- @variable_names.last.push(variable_id)
9987
+ @dcl_names.last.push(dcl_name)
9948
9988
  end
9949
9989
 
9950
- def declare_variable(variable_declaration, variable)
9951
- variable_id = variable_declaration.identifier
9990
+ def declare_variable(var_dcl, *)
9991
+ dcl_name = var_dcl.identifier
9952
9992
 
9953
- (@tag_names + @label_names).each do |identifier_array|
9954
- if identifier_array.any? { |id| id.value == variable_id.value }
9955
- W(:W0491, variable_declaration.location, variable_id.value)
9956
- return
9993
+ pair_names = (@tag_names + @label_names).flatten.select { |id|
9994
+ id.value == dcl_name.value
9995
+ }
9996
+
9997
+ unless pair_names.empty?
9998
+ W(:W0491, var_dcl.location, dcl_name.value)
9999
+ pair_names.each do |pair_name|
10000
+ C(:C0001, pair_name.location, pair_name.value)
9957
10001
  end
9958
10002
  end
9959
10003
 
9960
- @variable_names.last.push(variable_id)
10004
+ @dcl_names.last.push(dcl_name)
9961
10005
  end
9962
10006
 
9963
- def declare_struct(struct_type_declaration)
9964
- tag_id = struct_type_declaration.identifier
9965
- return unless tag_id
10007
+ def declare_struct(struct_dcl)
10008
+ tag_name = struct_dcl.identifier
10009
+ return unless tag_name
9966
10010
 
9967
- (@variable_names + @label_names).each do |identifier_array|
9968
- if identifier_array.any? { |id| id.value == tag_id.value }
9969
- W(:W0491, struct_type_declaration.location, tag_id.value)
9970
- return
10011
+ pair_names = (@dcl_names + @label_names).flatten.select { |id|
10012
+ id.value == tag_name.value
10013
+ }
10014
+
10015
+ unless pair_names.empty?
10016
+ W(:W0491, struct_dcl.location, tag_name.value)
10017
+ pair_names.each do |pair_name|
10018
+ C(:C0001, pair_name.location, pair_name.value)
9971
10019
  end
9972
10020
  end
9973
10021
 
9974
- @tag_names.last.push(tag_id)
10022
+ @tag_names.last.push(tag_name)
9975
10023
  end
9976
10024
 
9977
- def declare_union(union_type_declaration)
9978
- tag_id = union_type_declaration.identifier
9979
- return unless tag_id
10025
+ def declare_union(union_dcl)
10026
+ tag_name = union_dcl.identifier
10027
+ return unless tag_name
9980
10028
 
9981
- (@variable_names + @label_names).each do |identifier_array|
9982
- if identifier_array.any? { |id| id.value == tag_id.value }
9983
- W(:W0491, union_type_declaration.location, tag_id.value)
9984
- return
10029
+ pair_names = (@dcl_names + @label_names).flatten.select { |id|
10030
+ id.value == tag_name.value
10031
+ }
10032
+
10033
+ unless pair_names.empty?
10034
+ W(:W0491, union_dcl.location, tag_name.value)
10035
+ pair_names.each do |pair_name|
10036
+ C(:C0001, pair_name.location, pair_name.value)
9985
10037
  end
9986
10038
  end
9987
10039
 
9988
- @tag_names.last.push(tag_id)
10040
+ @tag_names.last.push(tag_name)
9989
10041
  end
9990
10042
 
9991
- def declare_enum(enum_type_declaration)
9992
- tag_id = enum_type_declaration.identifier
9993
- return unless tag_id
10043
+ def declare_enum(enum_dcl)
10044
+ tag_name = enum_dcl.identifier
10045
+ return unless tag_name
9994
10046
 
9995
- (@variable_names + @label_names).each do |identifier_array|
9996
- if identifier_array.any? { |id| id.value == tag_id.value }
9997
- W(:W0491, enum_type_declaration.location, tag_id.value)
9998
- return
10047
+ pair_names = (@dcl_names + @label_names).flatten.select { |id|
10048
+ id.value == tag_name.value
10049
+ }
10050
+
10051
+ unless pair_names.empty?
10052
+ W(:W0491, enum_dcl.location, tag_name.value)
10053
+ pair_names.each do |pair_name|
10054
+ C(:C0001, pair_name.location, pair_name.value)
9999
10055
  end
10000
10056
  end
10001
10057
 
10002
- @tag_names.last.push(tag_id)
10058
+ @tag_names.last.push(tag_name)
10003
10059
  end
10004
10060
 
10005
- def declare_typedef(typedef_declaration)
10006
- typedef_id = typedef_declaration.identifier
10061
+ def declare_typedef(typedef_dcl)
10062
+ dcl_name = typedef_dcl.identifier
10007
10063
 
10008
- (@tag_names + @label_names).each do |identifier_array|
10009
- if identifier_array.any? { |id| id.value == typedef_id.value }
10010
- W(:W0491, typedef_declaration.location, typedef_id.value)
10011
- return
10064
+ pair_names = (@tag_names + @label_names).flatten.select { |id|
10065
+ id.value == dcl_name.value
10066
+ }
10067
+
10068
+ unless pair_names.empty?
10069
+ W(:W0491, typedef_dcl.location, dcl_name.value)
10070
+ pair_names.each do |pair_name|
10071
+ C(:C0001, pair_name.location, pair_name.value)
10012
10072
  end
10013
10073
  end
10014
10074
 
10015
- @variable_names.last.push(typedef_id)
10075
+ @dcl_names.last.push(dcl_name)
10016
10076
  end
10017
10077
 
10018
- def define_parameter(parameter_definition, variable)
10019
- param_id = parameter_definition.identifier
10020
- return unless param_id
10078
+ def define_parameter(param_def, *)
10079
+ dcl_name = param_def.identifier
10080
+ return unless dcl_name
10021
10081
 
10022
- (@tag_names + @label_names).each do |identifier_array|
10023
- if identifier_array.any? { |id| id.value == param_id.value }
10024
- W(:W0491, parameter_definition.location, param_id.value)
10025
- return
10082
+ pair_names = (@tag_names + @label_names).flatten.select { |id|
10083
+ id.value == dcl_name.value
10084
+ }
10085
+
10086
+ unless pair_names.empty?
10087
+ W(:W0491, param_def.location, dcl_name.value)
10088
+ pair_names.each do |pair_name|
10089
+ C(:C0001, pair_name.location, pair_name.value)
10026
10090
  end
10027
10091
  end
10028
10092
 
10029
- @variable_names.last.push(param_id)
10093
+ @dcl_names.last.push(dcl_name)
10030
10094
  end
10031
10095
 
10032
- def define_label(generic_labeled_statement)
10033
- label_id = generic_labeled_statement.label
10096
+ def define_label(labeled_stmt)
10097
+ label_name = labeled_stmt.label
10034
10098
 
10035
- (@variable_names + @tag_names).each do |identifier_array|
10036
- if identifier_array.any? { |id| id.value == label_id.value }
10037
- W(:W0491, generic_labeled_statement.location, label_id.value)
10038
- return
10099
+ pair_names = (@dcl_names + @tag_names).flatten.select { |id|
10100
+ id.value == label_name.value
10101
+ }
10102
+
10103
+ unless pair_names.empty?
10104
+ W(:W0491, labeled_stmt.location, label_name.value)
10105
+ pair_names.each do |pair_name|
10106
+ C(:C0001, pair_name.location, pair_name.value)
10039
10107
  end
10040
10108
  end
10041
10109
 
10042
- @label_names.last.push(label_id)
10110
+ @label_names.last.push(label_name)
10043
10111
  end
10044
10112
 
10045
- def enter_scope(compound_statement)
10046
- @variable_names.push([])
10113
+ def enter_scope(*)
10114
+ @dcl_names.push([])
10047
10115
  @tag_names.push([])
10048
10116
  @label_names.push([])
10049
10117
  end
10050
10118
 
10051
- def leave_scope(compound_statement)
10052
- @variable_names.pop
10119
+ def leave_scope(*)
10120
+ @dcl_names.pop
10053
10121
  @tag_names.pop
10054
10122
  @label_names.pop
10055
10123
  end
@@ -10067,169 +10135,178 @@ module CBuiltin #:nodoc:
10067
10135
  interp = context[:c_interpreter]
10068
10136
  interp.on_variable_defined += method(:define_variable)
10069
10137
  interp.on_variable_declared += method(:declare_variable)
10070
- interp.on_struct_declared += method(:declare_struct)
10071
- interp.on_union_declared += method(:declare_union)
10138
+ interp.on_struct_declared += method(:declare_struct_or_union)
10139
+ interp.on_union_declared += method(:declare_struct_or_union)
10072
10140
  interp.on_enum_declared += method(:declare_enum)
10073
10141
  interp.on_typedef_declared += method(:declare_typedef)
10074
10142
  interp.on_parameter_defined += method(:define_parameter)
10075
10143
  interp.on_label_defined += method(:define_label)
10076
10144
  interp.on_block_started += method(:enter_scope)
10077
10145
  interp.on_block_ended += method(:leave_scope)
10078
- @variable_names = [[]]
10146
+ @dcl_names = [[]]
10079
10147
  @tag_names = [[]]
10080
10148
  @label_names = [[]]
10081
- @member_names = [[]]
10149
+ @memb_names = [[]]
10082
10150
  end
10083
10151
 
10084
10152
  private
10085
- def define_variable(variable_definition, variable)
10086
- variable_id = variable_definition.identifier
10153
+ def define_variable(var_def, *)
10154
+ dcl_name = var_def.identifier
10087
10155
 
10088
- @member_names.each do |identifier_array|
10089
- if identifier_array.any? { |id| id.value == variable_id.value }
10090
- W(:W0492, variable_definition.location, variable_id.value)
10091
- return
10156
+ pair_names = @memb_names.flatten.select { |id|
10157
+ id.value == dcl_name.value
10158
+ }
10159
+
10160
+ unless pair_names.empty?
10161
+ W(:W0492, var_def.location, dcl_name.value)
10162
+ pair_names.each do |pair_name|
10163
+ C(:C0001, pair_name.location, pair_name.value)
10092
10164
  end
10093
10165
  end
10094
10166
 
10095
- @variable_names.last.push(variable_id)
10167
+ @dcl_names.last.push(dcl_name)
10096
10168
  end
10097
10169
 
10098
- def declare_variable(variable_declaration, variable)
10099
- variable_id = variable_declaration.identifier
10170
+ def declare_variable(var_dcl, *)
10171
+ dcl_name = var_dcl.identifier
10100
10172
 
10101
- @member_names.each do |identifier_array|
10102
- if identifier_array.any? { |id| id.value == variable_id.value }
10103
- W(:W0492, variable_declaration.location, variable_id.value)
10104
- return
10173
+ pair_names = @memb_names.flatten.select { |id|
10174
+ id.value == dcl_name.value
10175
+ }
10176
+
10177
+ unless pair_names.empty?
10178
+ W(:W0492, var_dcl.location, dcl_name.value)
10179
+ pair_names.each do |pair_name|
10180
+ C(:C0001, pair_name.location, pair_name.value)
10105
10181
  end
10106
10182
  end
10107
10183
 
10108
- @variable_names.last.push(variable_id)
10184
+ @dcl_names.last.push(dcl_name)
10109
10185
  end
10110
10186
 
10111
- def declare_struct(struct_type_declaration)
10112
- tag_id = struct_type_declaration.identifier
10113
- return unless tag_id
10187
+ def declare_struct_or_union(struct_or_union_dcl)
10188
+ tag_name = struct_or_union_dcl.identifier
10189
+ return unless tag_name
10114
10190
 
10115
- @member_names.each do |identifier_array|
10116
- if identifier_array.any? { |id| id.value == tag_id.value }
10117
- W(:W0492, struct_type_declaration.location, tag_id.value)
10118
- break
10119
- end
10120
- end
10121
-
10122
- member_declarations = MemberExtractor.new.tap { |ext|
10123
- struct_type_declaration.accept(ext)
10124
- }.result
10191
+ pair_names = @memb_names.flatten.select { |id|
10192
+ id.value == tag_name.value
10193
+ }
10125
10194
 
10126
- (@variable_names + @tag_names + @label_names).each do |identifier_array|
10127
- identifier_array.each do |identifier|
10128
- member = member_declarations.find { |memb|
10129
- memb.identifier.value == identifier.value
10130
- }
10131
- W(:W0492, member.location, member.identifier.value) if member
10195
+ unless pair_names.empty?
10196
+ W(:W0492, struct_or_union_dcl.location, tag_name.value)
10197
+ pair_names.each do |pair_name|
10198
+ C(:C0001, pair_name.location, pair_name.value)
10132
10199
  end
10133
10200
  end
10134
10201
 
10135
- @member_names.last.push(
10136
- *member_declarations.map { |memb| memb.identifier })
10137
- end
10202
+ @tag_names.last.push(tag_name)
10138
10203
 
10139
- def declare_union(union_type_declaration)
10140
- tag_id = union_type_declaration.identifier
10141
- return unless tag_id
10142
-
10143
- @member_names.each do |identifier_array|
10144
- if identifier_array.any? { |id| id.value == tag_id.value }
10145
- W(:W0492, union_type_declaration.location, tag_id.value)
10146
- break
10147
- end
10148
- end
10204
+ declare_members(struct_or_union_dcl)
10205
+ end
10149
10206
 
10150
- member_declarations = MemberExtractor.new.tap { |ext|
10151
- union_type_declaration.accept(ext)
10207
+ def declare_members(struct_or_union_dcl)
10208
+ memb_dcls = MemberExtractor.new.tap { |ext|
10209
+ struct_or_union_dcl.accept(ext)
10152
10210
  }.result
10153
10211
 
10154
- (@variable_names + @tag_names + @label_names).each do |identifier_array|
10155
- identifier_array.each do |identifier|
10156
- member = member_declarations.find { |memb|
10157
- memb.identifier.value == identifier.value
10212
+ memb_dcls.each do |memb_dcl|
10213
+ pair_names =
10214
+ (@dcl_names + @tag_names + @label_names).flatten.select { |id|
10215
+ id.value == memb_dcl.identifier.value
10158
10216
  }
10159
- W(:W0492, member.location, member.identifier.value) if member
10217
+ unless pair_names.empty?
10218
+ W(:W0492, memb_dcl.location, memb_dcl.identifier.value)
10219
+ pair_names.each do |pair_name|
10220
+ C(:C0001, pair_name.location, pair_name.value)
10221
+ end
10160
10222
  end
10161
- end
10162
10223
 
10163
- @member_names.last.push(
10164
- *member_declarations.map { |memb| memb.identifier })
10224
+ @memb_names.last.push(memb_dcl.identifier)
10225
+ end
10165
10226
  end
10166
10227
 
10167
- def declare_enum(enum_type_declaration)
10168
- tag_id = enum_type_declaration.identifier
10169
- return unless tag_id
10228
+ def declare_enum(enum_dcl)
10229
+ tag_name = enum_dcl.identifier
10230
+ return unless tag_name
10170
10231
 
10171
- @member_names.each do |identifier_array|
10172
- if identifier_array.any? { |id| id.value == tag_id.value }
10173
- W(:W0492, enum_type_declaration.location, tag_id.value)
10174
- return
10232
+ pair_names = @memb_names.flatten.select { |id|
10233
+ id.value == tag_name.value
10234
+ }
10235
+
10236
+ unless pair_names.empty?
10237
+ W(:W0492, enum_dcl.location, tag_name.value)
10238
+ pair_names.each do |pair_name|
10239
+ C(:C0001, pair_name.location, pair_name.value)
10175
10240
  end
10176
10241
  end
10177
10242
 
10178
- @tag_names.last.push(tag_id)
10243
+ @tag_names.last.push(tag_name)
10179
10244
  end
10180
10245
 
10181
- def declare_typedef(typedef_declaration)
10182
- typedef_id = typedef_declaration.identifier
10246
+ def declare_typedef(typedef_dcl)
10247
+ dcl_name = typedef_dcl.identifier
10183
10248
 
10184
- @member_names.each do |identifier_array|
10185
- if identifier_array.any? { |id| id.value == typedef_id.value }
10186
- W(:W0492, typedef_declaration.location, typedef_id.value)
10187
- return
10249
+ pair_names = @memb_names.flatten.select { |id|
10250
+ id.value == dcl_name.value
10251
+ }
10252
+
10253
+ unless pair_names.empty?
10254
+ W(:W0492, typedef_dcl.location, dcl_name.value)
10255
+ pair_names.each do |pair_name|
10256
+ C(:C0001, pair_name.location, pair_name.value)
10188
10257
  end
10189
10258
  end
10190
10259
 
10191
- @variable_names.last.push(typedef_id)
10260
+ @dcl_names.last.push(dcl_name)
10192
10261
  end
10193
10262
 
10194
- def define_parameter(parameter_definition, variable)
10195
- param_id = parameter_definition.identifier
10196
- return unless param_id
10263
+ def define_parameter(param_def, *)
10264
+ dcl_name = param_def.identifier
10265
+ return unless dcl_name
10197
10266
 
10198
- @member_names.each do |identifier_array|
10199
- if identifier_array.any? { |id| id.value == param_id.value }
10200
- W(:W0492, parameter_definition.location, param_id.value)
10201
- return
10267
+ pair_names = @memb_names.flatten.select { |id|
10268
+ id.value == dcl_name.value
10269
+ }
10270
+
10271
+ unless pair_names.empty?
10272
+ W(:W0492, param_def.location, dcl_name.value)
10273
+ pair_names.each do |pair_name|
10274
+ C(:C0001, pair_name.location, pair_name.value)
10202
10275
  end
10203
10276
  end
10204
10277
 
10205
- @variable_names.last.push(param_id)
10278
+ @dcl_names.last.push(dcl_name)
10206
10279
  end
10207
10280
 
10208
- def define_label(generic_labeled_statement)
10209
- label_id = generic_labeled_statement.label
10281
+ def define_label(labeled_stmt)
10282
+ label_name = labeled_stmt.label
10210
10283
 
10211
- @member_names.each do |identifier_array|
10212
- if identifier_array.any? { |id| id.value == label_id.value }
10213
- W(:W0492, generic_labeled_statement.location, label_id.value)
10214
- return
10284
+ pair_names = @memb_names.flatten.select { |id|
10285
+ id.value == label_name.value
10286
+ }
10287
+
10288
+ unless pair_names.empty?
10289
+ W(:W0492, labeled_stmt.location, label_name.value)
10290
+ pair_names.each do |pair_name|
10291
+ C(:C0001, pair_name.location, pair_name.value)
10215
10292
  end
10216
10293
  end
10217
10294
 
10218
- @label_names.last.push(label_id)
10295
+ @label_names.last.push(label_name)
10219
10296
  end
10220
10297
 
10221
- def enter_scope(compound_statement)
10222
- @variable_names.push([])
10298
+ def enter_scope(*)
10299
+ @dcl_names.push([])
10223
10300
  @tag_names.push([])
10224
10301
  @label_names.push([])
10225
- @member_names.push([])
10302
+ @memb_names.push([])
10226
10303
  end
10227
10304
 
10228
- def leave_scope(compound_statement)
10229
- @variable_names.pop
10305
+ def leave_scope(*)
10306
+ @dcl_names.pop
10230
10307
  @tag_names.pop
10231
10308
  @label_names.pop
10232
- @member_names.pop
10309
+ @memb_names.pop
10233
10310
  end
10234
10311
 
10235
10312
  class MemberExtractor < C::SyntaxTreeVisitor
@@ -10241,16 +10318,16 @@ module CBuiltin #:nodoc:
10241
10318
 
10242
10319
  def visit_struct_type_declaration(node)
10243
10320
  if node.struct_declarations
10244
- node.struct_declarations.each do |struct_declaration|
10245
- struct_declaration.accept(self)
10321
+ node.struct_declarations.each do |struct_dcl|
10322
+ struct_dcl.accept(self)
10246
10323
  end
10247
10324
  end
10248
10325
  end
10249
10326
 
10250
10327
  def visit_union_type_declaration(node)
10251
10328
  if node.struct_declarations
10252
- node.struct_declarations.each do |struct_declaration|
10253
- struct_declaration.accept(self)
10329
+ node.struct_declarations.each do |struct_dcl|
10330
+ struct_dcl.accept(self)
10254
10331
  end
10255
10332
  end
10256
10333
  end
@@ -15507,39 +15584,66 @@ module CBuiltin #:nodoc:
15507
15584
  interp.on_enum_declared += method(:declare_enum)
15508
15585
  interp.on_block_started += method(:enter_scope)
15509
15586
  interp.on_block_ended += method(:leave_scope)
15510
- @tag_names = [Set.new]
15587
+ @tag_names = [[]]
15511
15588
  end
15512
15589
 
15513
15590
  private
15514
- def declare_struct(struct_type_declaration)
15515
- tag_name = struct_type_declaration.identifier.value
15516
- if @tag_names.any? { |names| names.include?(tag_name) }
15517
- W(:W0703, struct_type_declaration.location, tag_name)
15591
+ def declare_struct(struct_dcl)
15592
+ tag_name = struct_dcl.identifier
15593
+
15594
+ pair_names = @tag_names.flatten.select { |id|
15595
+ id.value == tag_name.value
15596
+ }
15597
+
15598
+ unless pair_names.empty?
15599
+ W(:W0703, struct_dcl.location, tag_name.value)
15600
+ pair_names.each do |pair_name|
15601
+ C(:C0001, pair_name.location, pair_name.value)
15602
+ end
15518
15603
  end
15519
- @tag_names.last.add(tag_name)
15604
+
15605
+ @tag_names.last.push(tag_name)
15520
15606
  end
15521
15607
 
15522
- def declare_union(union_type_declaration)
15523
- tag_name = union_type_declaration.identifier.value
15524
- if @tag_names.any? { |names| names.include?(tag_name) }
15525
- W(:W0703, union_type_declaration.location, tag_name)
15608
+ def declare_union(union_dcl)
15609
+ tag_name = union_dcl.identifier
15610
+
15611
+ pair_names = @tag_names.flatten.select { |id|
15612
+ id.value == tag_name.value
15613
+ }
15614
+
15615
+ unless pair_names.empty?
15616
+ W(:W0703, union_dcl.location, tag_name.value)
15617
+ pair_names.each do |pair_name|
15618
+ C(:C0001, pair_name.location, pair_name.value)
15619
+ end
15526
15620
  end
15527
- @tag_names.last.add(tag_name)
15621
+
15622
+ @tag_names.last.push(tag_name)
15528
15623
  end
15529
15624
 
15530
- def declare_enum(enum_type_declaration)
15531
- tag_name = enum_type_declaration.identifier.value
15532
- if @tag_names.any? { |names| names.include?(tag_name) }
15533
- W(:W0703, enum_type_declaration.location, tag_name)
15625
+ def declare_enum(enum_dcl)
15626
+ tag_name = enum_dcl.identifier
15627
+
15628
+ pair_names = @tag_names.flatten.select { |id|
15629
+ id.value == tag_name.value
15630
+ }
15631
+
15632
+ unless pair_names.empty?
15633
+ W(:W0703, enum_dcl.location, tag_name.value)
15634
+ pair_names.each do |pair_name|
15635
+ C(:C0001, pair_name.location, pair_name.value)
15636
+ end
15534
15637
  end
15535
- @tag_names.last.add(tag_name)
15638
+
15639
+ @tag_names.last.push(tag_name)
15536
15640
  end
15537
15641
 
15538
- def enter_scope(compound_statement)
15539
- @tag_names.push(Set.new)
15642
+ def enter_scope(*)
15643
+ @tag_names.push([])
15540
15644
  end
15541
15645
 
15542
- def leave_scope(compound_statement)
15646
+ def leave_scope(*)
15543
15647
  @tag_names.pop
15544
15648
  end
15545
15649
  end
@@ -15563,115 +15667,178 @@ module CBuiltin #:nodoc:
15563
15667
  interp.on_parameter_defined += method(:define_parameter)
15564
15668
  interp.on_block_started += method(:enter_scope)
15565
15669
  interp.on_block_ended += method(:leave_scope)
15566
- @vdcls = [Set.new]
15567
- @vdefs = [Set.new]
15568
- @fdcls = [Set.new]
15569
- @fdefs = [Set.new]
15570
- @tdefs = [Set.new]
15571
- @enums = [Set.new]
15670
+ @vdcls = [[]]
15671
+ @vdefs = [[]]
15672
+ @fdcls = [[]]
15673
+ @fdefs = [[]]
15674
+ @tdefs = [[]]
15675
+ @enums = [[]]
15572
15676
  end
15573
15677
 
15574
15678
  private
15575
- def define_variable(variable_definition, variable)
15576
- identifier = variable_definition.identifier.value
15577
- if wider_identifiers_of_variable_definition.include?(identifier)
15578
- W(:W0704, variable_definition.location, identifier)
15679
+ def define_variable(var_def, *)
15680
+ dcl_name = var_def.identifier
15681
+
15682
+ pair_names = wider_identifiers_of_variable_definition.select { |id|
15683
+ id.value == dcl_name.value
15684
+ }
15685
+
15686
+ unless pair_names.empty?
15687
+ W(:W0704, var_def.location, dcl_name.value)
15688
+ pair_names.each do |pair_name|
15689
+ C(:C0001, pair_name.location, pair_name.value)
15690
+ end
15579
15691
  end
15580
- @vdefs.last.add(identifier)
15692
+
15693
+ @vdefs.last.push(dcl_name)
15581
15694
  end
15582
15695
 
15583
15696
  def wider_identifiers_of_variable_definition
15584
15697
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] +
15585
- @tdefs[0..-2] + @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15698
+ @tdefs[0..-2] + @enums[0..-2]).flatten
15586
15699
  end
15587
15700
 
15588
- def declare_function(function_declaration, function)
15589
- identifier = function_declaration.identifier.value
15590
- if wider_identifiers_of_function_declaration.include?(identifier)
15591
- W(:W0704, function_declaration.location, identifier)
15701
+ def declare_function(func_dcl, *)
15702
+ dcl_name = func_dcl.identifier
15703
+
15704
+ pair_names = wider_identifiers_of_function_declaration.select { |id|
15705
+ id.value == dcl_name.value
15706
+ }
15707
+
15708
+ unless pair_names.empty?
15709
+ W(:W0704, func_dcl.location, dcl_name.value)
15710
+ pair_names.each do |pair_name|
15711
+ C(:C0001, pair_name.location, pair_name.value)
15712
+ end
15592
15713
  end
15593
- @fdcls.last.add(identifier)
15714
+
15715
+ @fdcls.last.push(dcl_name)
15594
15716
  end
15595
15717
 
15596
15718
  def wider_identifiers_of_function_declaration
15597
15719
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] +
15598
- @tdefs[0..-2] + @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15720
+ @tdefs[0..-2] + @enums[0..-2]).flatten
15599
15721
  end
15600
15722
 
15601
- def declare_variable(variable_declaration, variable)
15602
- identifier = variable_declaration.identifier.value
15603
- if wider_identifiers_of_variable_declaration.include?(identifier)
15604
- W(:W0704, variable_declaration.location, identifier)
15723
+ def declare_variable(var_dcl, *)
15724
+ dcl_name = var_dcl.identifier
15725
+
15726
+ pair_names = wider_identifiers_of_variable_declaration.select { |id|
15727
+ id.value == dcl_name.value
15728
+ }
15729
+
15730
+ unless pair_names.empty?
15731
+ W(:W0704, var_dcl.location, dcl_name.value)
15732
+ pair_names.each do |pair_name|
15733
+ C(:C0001, pair_name.location, pair_name.value)
15734
+ end
15605
15735
  end
15606
- @vdcls.last.add(identifier)
15736
+
15737
+ @vdcls.last.push(dcl_name)
15607
15738
  end
15608
15739
 
15609
15740
  def wider_identifiers_of_variable_declaration
15610
15741
  (@vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] + @tdefs[0..-2] +
15611
- @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15742
+ @enums[0..-2]).flatten
15612
15743
  end
15613
15744
 
15614
- def declare_enum(enum_type_declaration)
15615
- enum_type_declaration.enumerators.each do |enum|
15616
- identifier = enum.identifier.value
15617
- if wider_identifiers_of_enum_declaration.include?(identifier)
15618
- W(:W0704, enum.location, identifier)
15745
+ def declare_enum(enum_dcl)
15746
+ enum_dcl.enumerators.each do |enum|
15747
+ enum_name = enum.identifier
15748
+
15749
+ pair_names = wider_identifiers_of_enum_declaration.select { |id|
15750
+ id.value == enum_name.value
15751
+ }
15752
+
15753
+ unless pair_names.empty?
15754
+ W(:W0704, enum.location, enum_name.value)
15755
+ pair_names.each do |pair_name|
15756
+ C(:C0001, pair_name.location, pair_name.value)
15757
+ end
15619
15758
  end
15620
- @enums.last.add(identifier)
15759
+
15760
+ @enums.last.push(enum_name)
15621
15761
  end
15622
15762
  end
15623
15763
 
15624
15764
  def wider_identifiers_of_enum_declaration
15625
15765
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] +
15626
- @tdefs[0..-2] + @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15766
+ @tdefs[0..-2] + @enums[0..-2]).flatten
15627
15767
  end
15628
15768
 
15629
- def declare_typedef(typedef_declaration)
15630
- identifier = typedef_declaration.identifier.value
15631
- if wider_identifiers_of_typedef_declaration.include?(identifier)
15632
- W(:W0704, typedef_declaration.location, identifier)
15769
+ def declare_typedef(typedef_dcl)
15770
+ dcl_name = typedef_dcl.identifier
15771
+
15772
+ pair_names = wider_identifiers_of_typedef_declaration.select { |id|
15773
+ id.value == dcl_name.value
15774
+ }
15775
+
15776
+ unless pair_names.empty?
15777
+ W(:W0704, typedef_dcl.location, dcl_name.value)
15778
+ pair_names.each do |pair_name|
15779
+ C(:C0001, pair_name.location, pair_name.value)
15780
+ end
15633
15781
  end
15634
- @enums.last.add(identifier)
15782
+
15783
+ @enums.last.push(dcl_name)
15635
15784
  end
15636
15785
 
15637
15786
  def wider_identifiers_of_typedef_declaration
15638
15787
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] +
15639
- @tdefs[0..-2] + @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15788
+ @tdefs[0..-2] + @enums[0..-2]).flatten
15640
15789
  end
15641
15790
 
15642
- def define_function(function_definition, function)
15643
- identifier = function_definition.identifier.value
15644
- if wider_identifiers_of_function_definition.include?(identifier)
15645
- W(:W0704, function_definition.location, identifier)
15791
+ def define_function(func_def, *)
15792
+ dcl_name = func_def.identifier
15793
+
15794
+ pair_names = wider_identifiers_of_function_definition.select { |id|
15795
+ id.value == dcl_name.value
15796
+ }
15797
+
15798
+ unless pair_names.empty?
15799
+ W(:W0704, func_def.location, dcl_name.value)
15800
+ pair_names.each do |pair_name|
15801
+ C(:C0001, pair_name.location, pair_name.value)
15802
+ end
15646
15803
  end
15647
- @fdefs.last.add(identifier)
15804
+
15805
+ @fdefs.last.push(dcl_name)
15648
15806
  end
15649
15807
 
15650
15808
  def wider_identifiers_of_function_definition
15651
15809
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdefs[0..-2] + @tdefs[0..-2] +
15652
- @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15810
+ @enums[0..-2]).flatten
15653
15811
  end
15654
15812
 
15655
- def define_parameter(parameter_definition, variable)
15656
- identifier = parameter_definition.identifier.value
15657
- if wider_identifiers_of_parameter_definition.include?(identifier)
15658
- W(:W0704, parameter_definition.location, identifier)
15813
+ def define_parameter(param_def, *)
15814
+ dcl_name = param_def.identifier
15815
+
15816
+ pair_names = wider_identifiers_of_parameter_definition.select { |id|
15817
+ id.value == dcl_name.value
15818
+ }
15819
+
15820
+ unless pair_names.empty?
15821
+ W(:W0704, param_def.location, dcl_name.value)
15822
+ pair_names.each do |pair_name|
15823
+ C(:C0001, pair_name.location, pair_name.value)
15824
+ end
15659
15825
  end
15660
- @vdefs.last.add(identifier)
15826
+
15827
+ @vdefs.last.push(dcl_name)
15661
15828
  end
15662
15829
 
15663
15830
  def wider_identifiers_of_parameter_definition
15664
15831
  (@vdcls[0..-2] + @vdefs[0..-2] + @fdcls[0..-2] + @fdefs[0..-2] +
15665
- @tdefs[0..-2] + @enums[0..-2]).reduce(Set.new) { |r, s| r + s }
15832
+ @tdefs[0..-2] + @enums[0..-2]).flatten
15666
15833
  end
15667
15834
 
15668
15835
  def enter_scope(compound_statement)
15669
- @vdcls.push(Set.new)
15670
- @vdefs.push(Set.new)
15671
- @fdcls.push(Set.new)
15672
- @fdefs.push(Set.new)
15673
- @tdefs.push(Set.new)
15674
- @enums.push(Set.new)
15836
+ @vdcls.push([])
15837
+ @vdefs.push([])
15838
+ @fdcls.push([])
15839
+ @fdefs.push([])
15840
+ @tdefs.push([])
15841
+ @enums.push([])
15675
15842
  end
15676
15843
 
15677
15844
  def leave_scope(compound_statement)
@@ -17487,7 +17654,7 @@ module CBuiltin #:nodoc:
17487
17654
 
17488
17655
  private
17489
17656
  def from_type
17490
- @interp.short_type
17657
+ @interp.signed_short_type
17491
17658
  end
17492
17659
 
17493
17660
  def to_type
@@ -17521,7 +17688,7 @@ module CBuiltin #:nodoc:
17521
17688
 
17522
17689
  private
17523
17690
  def from_type
17524
- @interp.int_type
17691
+ @interp.signed_int_type
17525
17692
  end
17526
17693
 
17527
17694
  def to_type
@@ -17538,11 +17705,11 @@ module CBuiltin #:nodoc:
17538
17705
 
17539
17706
  private
17540
17707
  def from_type
17541
- @interp.int_type
17708
+ @interp.signed_int_type
17542
17709
  end
17543
17710
 
17544
17711
  def to_type
17545
- @interp.short_type
17712
+ @interp.signed_short_type
17546
17713
  end
17547
17714
  end
17548
17715
 
@@ -17589,7 +17756,7 @@ module CBuiltin #:nodoc:
17589
17756
 
17590
17757
  private
17591
17758
  def from_type
17592
- @interp.long_type
17759
+ @interp.signed_long_type
17593
17760
  end
17594
17761
 
17595
17762
  def to_type
@@ -17606,11 +17773,11 @@ module CBuiltin #:nodoc:
17606
17773
 
17607
17774
  private
17608
17775
  def from_type
17609
- @interp.long_type
17776
+ @interp.signed_long_type
17610
17777
  end
17611
17778
 
17612
17779
  def to_type
17613
- @interp.short_type
17780
+ @interp.signed_short_type
17614
17781
  end
17615
17782
  end
17616
17783
 
@@ -17623,11 +17790,11 @@ module CBuiltin #:nodoc:
17623
17790
 
17624
17791
  private
17625
17792
  def from_type
17626
- @interp.long_type
17793
+ @interp.signed_long_type
17627
17794
  end
17628
17795
 
17629
17796
  def to_type
17630
- @interp.int_type
17797
+ @interp.signed_int_type
17631
17798
  end
17632
17799
  end
17633
17800
 
@@ -17691,7 +17858,7 @@ module CBuiltin #:nodoc:
17691
17858
 
17692
17859
  private
17693
17860
  def from_type
17694
- @interp.long_long_type
17861
+ @interp.signed_long_long_type
17695
17862
  end
17696
17863
 
17697
17864
  def to_type
@@ -17708,11 +17875,11 @@ module CBuiltin #:nodoc:
17708
17875
 
17709
17876
  private
17710
17877
  def from_type
17711
- @interp.long_long_type
17878
+ @interp.signed_long_long_type
17712
17879
  end
17713
17880
 
17714
17881
  def to_type
17715
- @interp.short_type
17882
+ @interp.signed_short_type
17716
17883
  end
17717
17884
  end
17718
17885
 
@@ -17725,11 +17892,11 @@ module CBuiltin #:nodoc:
17725
17892
 
17726
17893
  private
17727
17894
  def from_type
17728
- @interp.long_long_type
17895
+ @interp.signed_long_long_type
17729
17896
  end
17730
17897
 
17731
17898
  def to_type
17732
- @interp.int_type
17899
+ @interp.signed_int_type
17733
17900
  end
17734
17901
  end
17735
17902
 
@@ -17742,11 +17909,11 @@ module CBuiltin #:nodoc:
17742
17909
 
17743
17910
  private
17744
17911
  def from_type
17745
- @interp.long_long_type
17912
+ @interp.signed_long_long_type
17746
17913
  end
17747
17914
 
17748
17915
  def to_type
17749
- @interp.long_type
17916
+ @interp.signed_long_type
17750
17917
  end
17751
17918
  end
17752
17919
 
@@ -17882,42 +18049,33 @@ module CBuiltin #:nodoc:
17882
18049
  interp.on_variable_declared += method(:declare_variable)
17883
18050
  interp.on_function_declared += method(:declare_function)
17884
18051
  interp.on_translation_unit_ended += method(:check)
17885
- @variable_declarations = Hash.new { |hash, key| hash[key] = [] }
17886
- @function_declarations = Hash.new { |hash, key| hash[key] = [] }
18052
+ @obj_dcls = Hash.new { |hash, key| hash[key] = [] }
17887
18053
  end
17888
18054
 
17889
18055
  private
17890
- def declare_variable(variable_declaration, variable)
17891
- if variable.named? && variable.declared_as_extern?
17892
- @variable_declarations[variable.name].push(variable_declaration)
18056
+ def declare_variable(var_dcl, var)
18057
+ if var.named? && var.declared_as_extern?
18058
+ @obj_dcls[var.name].push(var_dcl)
17893
18059
  end
17894
18060
  end
17895
18061
 
17896
- def declare_function(function_declaration, function)
17897
- if function.named? && function.declared_as_extern?
17898
- @function_declarations[function.name].push(function_declaration)
18062
+ def declare_function(func_dcl, func)
18063
+ if func.named? && func.declared_as_extern?
18064
+ @obj_dcls[func.name].push(func_dcl)
17899
18065
  end
17900
18066
  end
17901
18067
 
17902
18068
  def check(*)
17903
- @variable_declarations.each_value do |declarations|
17904
- decl_locations = declarations.map { |decl|
17905
- decl.location
17906
- }.uniq { |location| location.fpath }
17907
- if decl_locations.size > 1
17908
- decl_locations.each do |location|
17909
- W(:W0771, location, declarations.first.identifier.value)
17910
- end
17911
- end
17912
- end
17913
-
17914
- @function_declarations.each_value do |declarations|
17915
- decl_locations = declarations.map { |decl|
17916
- decl.location
17917
- }.uniq { |location| location.fpath }
17918
- if decl_locations.size > 1
17919
- decl_locations.each do |location|
17920
- W(:W0771, location, declarations.first.identifier.value)
18069
+ @obj_dcls.each_value do |dcls|
18070
+ similar_dcls = dcls.uniq { |dcl| dcl.location.fpath }
18071
+ next unless similar_dcls.size > 1
18072
+
18073
+ similar_dcls.each do |dcl|
18074
+ W(:W0771, dcl.location, dcl.identifier.value)
18075
+ similar_dcls.each do |pair_dcl|
18076
+ if pair_dcl != dcl
18077
+ C(:C0001, pair_dcl.location, pair_dcl.identifier.value)
18078
+ end
17921
18079
  end
17922
18080
  end
17923
18081
  end
@@ -17993,36 +18151,34 @@ module CBuiltin #:nodoc:
17993
18151
  end
17994
18152
 
17995
18153
  private
17996
- def check(initializer_or_expression, original_variable, result_variable)
17997
- return unless @rvalues
17998
- return unless original_variable.type.floating?
17999
-
18000
- case expression = @rvalues[original_variable]
18001
- when C::AdditiveExpression, C::MultiplicativeExpression
18002
- if original_variable.type.same_as?(from_type) &&
18003
- result_variable.type.same_as?(to_type)
18004
- W(message_id, expression.location)
18154
+ def check(*, orig_var, result_var)
18155
+ if @rvalues && orig_var.type.floating?
18156
+ case expr = @rvalues[orig_var]
18157
+ when C::AdditiveExpression, C::MultiplicativeExpression
18158
+ if orig_var.type.same_as?(from_type) &&
18159
+ result_var.type.same_as?(to_type)
18160
+ W(message_id, expr.location)
18161
+ end
18005
18162
  end
18006
18163
  end
18007
18164
  end
18008
18165
 
18009
- def clear_rvalues(function_definition, function)
18166
+ def clear_rvalues(*)
18010
18167
  @rvalues = {}
18011
18168
  end
18012
18169
 
18013
- def handle_additive(additive_expression,
18014
- lhs_variable, rhs_variable, result_variable)
18015
- memorize_rvalue_derivation(result_variable, additive_expression)
18170
+ def handle_additive(expr, lhs_var, rhs_var, result_var)
18171
+ memorize_rvalue_derivation(result_var, expr)
18016
18172
  end
18017
18173
 
18018
- def handle_multiplicative(multiplicative_expression,
18019
- lhs_variable, rhs_variable, result_variable)
18020
- return if multiplicative_expression.operator.type == "%"
18021
- memorize_rvalue_derivation(result_variable, multiplicative_expression)
18174
+ def handle_multiplicative(expr, lhs_var, rhs_var, result_var)
18175
+ unless expr.operator.type == "%"
18176
+ memorize_rvalue_derivation(result_var, expr)
18177
+ end
18022
18178
  end
18023
18179
 
18024
- def memorize_rvalue_derivation(rvalue_holder, expression)
18025
- @rvalues[rvalue_holder] = expression if @rvalues
18180
+ def memorize_rvalue_derivation(rvalue_holder, expr)
18181
+ @rvalues[rvalue_holder] = expr if @rvalues
18026
18182
  end
18027
18183
 
18028
18184
  def from_type
@@ -18238,131 +18394,140 @@ module CBuiltin #:nodoc:
18238
18394
  interp.on_function_defined += method(:check_object_declaration)
18239
18395
  interp.on_typedef_declared += method(:check_typedef_declaration)
18240
18396
  interp.on_enum_declared += method(:check_enum_declaration)
18241
- interp.on_block_started += method(:start_block)
18242
- interp.on_block_ended += method(:end_block)
18397
+ interp.on_block_started += method(:enter_scope)
18398
+ interp.on_block_ended += method(:leave_scope)
18243
18399
 
18244
- @object_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18245
- @typedef_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18246
- @enumerators_stack = [Hash.new(0)]
18400
+ @obj_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18401
+ @typedef_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18402
+ @enum_names = [Hash.new { |hash, key| hash[key] = [] }]
18247
18403
 
18248
- @object_decls_in_other_scope = Hash.new { |hash, key| hash[key] = [] }
18249
- @typedef_decls_in_other_scope = Hash.new { |hash, key| hash[key] = [] }
18250
- @enumerators_in_other_scope = Hash.new(0)
18404
+ @obj_dcls_in_other_scope = Hash.new { |hash, key| hash[key] = [] }
18405
+ @typedef_dcls_in_other_scope = Hash.new { |hash, key| hash[key] = [] }
18406
+ @enum_names_in_other_scope = Hash.new { |hash, key| hash[key] = [] }
18251
18407
  end
18252
18408
 
18253
18409
  private
18254
- def check_object_declaration(declaration_or_definition, object)
18255
- return unless object.declared_as_extern?
18410
+ def check_object_declaration(obj_dcl, obj)
18411
+ return unless obj.declared_as_extern?
18256
18412
 
18257
- name = declaration_or_definition.identifier.value
18258
- type = declaration_or_definition.type
18413
+ name = obj_dcl.identifier.value
18414
+ type = obj_dcl.type
18259
18415
 
18260
- same_name_object_decls = @object_decls_in_other_scope[name]
18261
- unless same_name_object_decls.all? { |decl| decl.type == type }
18262
- W(:W0787, declaration_or_definition.location, name)
18263
- return
18416
+ same_name_obj_dcls = @obj_dcls_in_other_scope[name]
18417
+ incompatibles = same_name_obj_dcls.select { |dcl| dcl.type != type }
18418
+ unless incompatibles.empty?
18419
+ W(:W0787, obj_dcl.location, name)
18420
+ incompatibles.each do |same_name_dcl|
18421
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18422
+ end
18264
18423
  end
18265
18424
 
18266
- same_name_typedef_decls = @typedef_decls_in_other_scope[name]
18267
- unless same_name_typedef_decls.empty?
18268
- W(:W0787, declaration_or_definition.location, name)
18269
- return
18425
+ same_name_typedef_dcls = @typedef_dcls_in_other_scope[name]
18426
+ unless same_name_typedef_dcls.empty?
18427
+ W(:W0787, obj_dcl.location, name)
18428
+ same_name_typedef_dcls.each do |same_name_dcl|
18429
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18430
+ end
18270
18431
  end
18271
18432
 
18272
- same_name_enumerators = @enumerators_in_other_scope[name]
18273
- unless same_name_enumerators == 0
18274
- W(:W0787, declaration_or_definition.location, name)
18275
- return
18276
- end
18277
- ensure
18278
- unless @object_decls_stack.empty?
18279
- @object_decls_stack.last[name].push(declaration_or_definition)
18433
+ same_name_enums = @enum_names_in_other_scope[name]
18434
+ unless same_name_enums.empty?
18435
+ W(:W0787, obj_dcl.location, name)
18436
+ same_name_enums.each do |same_name_enum|
18437
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18438
+ end
18280
18439
  end
18440
+
18441
+ @obj_dcls.last[name].push(obj_dcl)
18281
18442
  end
18282
18443
 
18283
- def check_typedef_declaration(typedef_declaration)
18284
- name = typedef_declaration.identifier.value
18285
- type = typedef_declaration.type
18444
+ def check_typedef_declaration(typedef_dcl)
18445
+ name = typedef_dcl.identifier.value
18446
+ type = typedef_dcl.type
18286
18447
 
18287
- same_name_object_decls = @object_decls_in_other_scope[name]
18288
- unless same_name_object_decls.empty?
18289
- W(:W0787, typedef_declaration.location, name)
18290
- return
18448
+ same_name_obj_dcls = @obj_dcls_in_other_scope[name]
18449
+ unless same_name_obj_dcls.empty?
18450
+ W(:W0787, typedef_dcl.location, name)
18451
+ same_name_obj_dcls.each do |same_name_dcl|
18452
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18453
+ end
18291
18454
  end
18292
18455
 
18293
- same_name_typedef_decls = @typedef_decls_in_other_scope[name]
18294
- unless same_name_typedef_decls.all? { |decl| decl.type == type }
18295
- W(:W0787, typedef_declaration.location, name)
18296
- return
18456
+ same_name_typedef_dcls = @typedef_dcls_in_other_scope[name]
18457
+ incompatibles = same_name_typedef_dcls.select { |dcl| dcl.type != type }
18458
+ unless incompatibles.empty?
18459
+ W(:W0787, typedef_dcl.location, name)
18460
+ incompatibles.each do |same_name_dcl|
18461
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18462
+ end
18297
18463
  end
18298
18464
 
18299
- same_name_enumerators = @enumerators_in_other_scope[name]
18300
- unless same_name_enumerators == 0
18301
- W(:W0787, typedef_declaration.location, name)
18302
- return
18303
- end
18304
- ensure
18305
- unless @typedef_decls_stack.empty?
18306
- @typedef_decls_stack.last[name].push(typedef_declaration)
18465
+ same_name_enums = @enum_names_in_other_scope[name]
18466
+ unless same_name_enums.empty?
18467
+ W(:W0787, typedef_dcl.location, name)
18468
+ same_name_enums.each do |same_name_enum|
18469
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18470
+ end
18307
18471
  end
18472
+
18473
+ @typedef_dcls.last[name].push(typedef_dcl)
18308
18474
  end
18309
18475
 
18310
- def check_enum_declaration(enum_type_declaration)
18311
- enum_type_declaration.enumerators.each { |enum| check_enumerator(enum) }
18476
+ def check_enum_declaration(enum_dcl)
18477
+ enum_dcl.enumerators.each { |enum| check_enumerator(enum) }
18312
18478
  end
18313
18479
 
18314
- def check_enumerator(enumerator)
18315
- name = enumerator.identifier.value
18480
+ def check_enumerator(enum)
18481
+ name = enum.identifier.value
18316
18482
 
18317
- same_name_object_decls = @object_decls_in_other_scope[name]
18318
- unless same_name_object_decls.empty?
18319
- W(:W0787, enumerator.location, name)
18320
- return
18483
+ same_name_obj_dcls = @obj_dcls_in_other_scope[name]
18484
+ unless same_name_obj_dcls.empty?
18485
+ W(:W0787, enum.location, name)
18486
+ same_name_obj_dcls.each do |same_name_dcl|
18487
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18488
+ end
18321
18489
  end
18322
18490
 
18323
- same_name_typedef_decls = @typedef_decls_in_other_scope[name]
18324
- unless same_name_typedef_decls.empty?
18325
- W(:W0787, enumerator.location, name)
18326
- return
18491
+ same_name_typedef_dcls = @typedef_dcls_in_other_scope[name]
18492
+ unless same_name_typedef_dcls.empty?
18493
+ W(:W0787, enum.location, name)
18494
+ same_name_typedef_dcls.each do |same_name_dcl|
18495
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18496
+ end
18327
18497
  end
18328
18498
 
18329
- same_name_enumerators = @enumerators_in_other_scope[name]
18330
- unless same_name_enumerators == 0
18331
- W(:W0787, enumerator.location, name)
18332
- return
18333
- end
18334
- ensure
18335
- unless @enumerators_stack.empty?
18336
- @enumerators_stack.last[name] += 1
18499
+ same_name_enums = @enum_names_in_other_scope[name]
18500
+ unless same_name_enums.empty?
18501
+ W(:W0787, enum.location, name)
18502
+ same_name_enums.each do |same_name_enum|
18503
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18504
+ end
18337
18505
  end
18506
+
18507
+ @enum_names.last[name].push(enum)
18338
18508
  end
18339
18509
 
18340
- def start_block(compound_statement)
18341
- @object_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18342
- @typedef_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18343
- @enumerators_stack.push(Hash.new(0))
18510
+ def enter_scope(*)
18511
+ @obj_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18512
+ @typedef_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18513
+ @enum_names.push(Hash.new { |hash, key| hash[key] = [] })
18344
18514
  end
18345
18515
 
18346
- def end_block(compound_statement)
18347
- unless @object_decls_stack.empty?
18348
- @object_decls_stack.last.each do |name, decls|
18349
- @object_decls_in_other_scope[name].concat(decls)
18350
- end
18351
- @object_decls_stack.pop
18516
+ def leave_scope(*)
18517
+ @obj_dcls.last.each do |name, dcls|
18518
+ @obj_dcls_in_other_scope[name].concat(dcls)
18352
18519
  end
18520
+ @obj_dcls.pop
18353
18521
 
18354
- unless @typedef_decls_stack.empty?
18355
- @typedef_decls_stack.last.each do |name, decls|
18356
- @typedef_decls_in_other_scope[name].concat(decls)
18357
- end
18358
- @typedef_decls_stack.pop
18522
+ @typedef_dcls.last.each do |name, dcls|
18523
+ @typedef_dcls_in_other_scope[name].concat(dcls)
18359
18524
  end
18525
+ @typedef_dcls.pop
18360
18526
 
18361
- unless @enumerators_stack.empty?
18362
- @enumerators_stack.last.each do |name, decl_num|
18363
- @enumerators_in_other_scope[name] += decl_num
18364
- end
18527
+ @enum_names.last.each do |name, enums|
18528
+ @enum_names_in_other_scope[name].concat(enums)
18365
18529
  end
18530
+ @enum_names.pop
18366
18531
  end
18367
18532
  end
18368
18533
 
@@ -18382,127 +18547,123 @@ module CBuiltin #:nodoc:
18382
18547
  interp.on_function_defined += method(:check_object_declaration)
18383
18548
  interp.on_typedef_declared += method(:check_typedef_declaration)
18384
18549
  interp.on_enum_declared += method(:check_enum_declaration)
18385
- interp.on_block_started += method(:start_block)
18386
- interp.on_block_ended += method(:end_block)
18550
+ interp.on_block_started += method(:enter_scope)
18551
+ interp.on_block_ended += method(:leave_scope)
18387
18552
 
18388
- @object_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18389
- @typedef_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18390
- @enumerators_stack = [Hash.new(0)]
18553
+ @obj_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18554
+ @typedef_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18555
+ @enum_names = [Hash.new { |hash, key| hash[key] = [] }]
18391
18556
  end
18392
18557
 
18393
18558
  private
18394
- def check_object_declaration(declaration_or_definition, *)
18395
- name = declaration_or_definition.identifier.value
18396
- type = declaration_or_definition.type
18559
+ def check_object_declaration(obj_dcl, *)
18560
+ name = obj_dcl.identifier.value
18561
+ type = obj_dcl.type
18397
18562
 
18398
- unless @object_decls_stack.empty?
18399
- same_name_object_decls = @object_decls_stack.last[name]
18400
- unless same_name_object_decls.all? { |decl| decl.type == type }
18401
- W(:W0788, declaration_or_definition.location, name)
18402
- return
18563
+ same_name_obj_dcls = @obj_dcls.last[name]
18564
+ incompatibles = same_name_obj_dcls.select { |dcl| dcl.type != type }
18565
+ unless incompatibles.empty?
18566
+ W(:W0788, obj_dcl.location, name)
18567
+ incompatibles.each do |same_name_dcl|
18568
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18403
18569
  end
18404
18570
  end
18405
18571
 
18406
- unless @typedef_decls_stack.empty?
18407
- same_name_typedef_decls = @typedef_decls_stack.last[name]
18408
- unless same_name_typedef_decls.empty?
18409
- W(:W0788, declaration_or_definition.location, name)
18410
- return
18572
+ same_name_typedef_dcls = @typedef_dcls.last[name]
18573
+ unless same_name_typedef_dcls.empty?
18574
+ W(:W0788, obj_dcl.location, name)
18575
+ same_name_typedef_dcls.each do |same_name_dcl|
18576
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18411
18577
  end
18412
18578
  end
18413
18579
 
18414
- unless @enumerators_stack.empty?
18415
- same_name_enumerators = @enumerators_stack.last[name]
18416
- unless same_name_enumerators == 0
18417
- W(:W0788, declaration_or_definition.location, name)
18418
- return
18580
+ same_name_enums = @enum_names.last[name]
18581
+ unless same_name_enums.empty?
18582
+ W(:W0788, obj_dcl.location, name)
18583
+ same_name_enums.each do |same_name_enum|
18584
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18419
18585
  end
18420
18586
  end
18421
- ensure
18422
- unless @object_decls_stack.empty?
18423
- @object_decls_stack.last[name].push(declaration_or_definition)
18424
- end
18587
+
18588
+ @obj_dcls.last[name].push(obj_dcl)
18425
18589
  end
18426
18590
 
18427
- def check_typedef_declaration(typedef_declaration)
18428
- name = typedef_declaration.identifier.value
18429
- type = typedef_declaration.type
18591
+ def check_typedef_declaration(typedef_dcl)
18592
+ name = typedef_dcl.identifier.value
18593
+ type = typedef_dcl.type
18430
18594
 
18431
- unless @object_decls_stack.empty?
18432
- same_name_object_decls = @object_decls_stack.last[name]
18433
- unless same_name_object_decls.empty?
18434
- W(:W0788, typedef_declaration.location, name)
18435
- return
18595
+ same_name_obj_dcls = @obj_dcls.last[name]
18596
+ unless same_name_obj_dcls.empty?
18597
+ W(:W0788, typedef_dcl.location, name)
18598
+ same_name_obj_dcls.each do |same_name_dcl|
18599
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18436
18600
  end
18437
18601
  end
18438
18602
 
18439
- unless @typedef_decls_stack.empty?
18440
- same_name_typedef_decls = @typedef_decls_stack.last[name]
18441
- unless same_name_typedef_decls.all? { |decl| decl.type == type }
18442
- W(:W0788, typedef_declaration.location, name)
18443
- return
18603
+ same_name_typedef_dcls = @typedef_dcls.last[name]
18604
+ incompatibles = same_name_typedef_dcls.select { |dcl| dcl.type != type }
18605
+ unless incompatibles.empty?
18606
+ W(:W0788, typedef_dcl.location, name)
18607
+ incompatibles.each do |same_name_dcl|
18608
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18444
18609
  end
18445
18610
  end
18446
18611
 
18447
- unless @enumerators_stack.empty?
18448
- same_name_enumerators = @enumerators_stack.last[name]
18449
- unless same_name_enumerators == 0
18450
- W(:W0788, typedef_declaration.location, name)
18451
- return
18612
+ same_name_enums = @enum_names.last[name]
18613
+ unless same_name_enums.empty?
18614
+ W(:W0788, typedef_dcl.location, name)
18615
+ same_name_enums.each do |same_name_enum|
18616
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18452
18617
  end
18453
18618
  end
18454
- ensure
18455
- unless @typedef_decls_stack.empty?
18456
- @typedef_decls_stack.last[name].push(typedef_declaration)
18457
- end
18619
+
18620
+ @typedef_dcls.last[name].push(typedef_dcl)
18458
18621
  end
18459
18622
 
18460
- def check_enum_declaration(enum_type_declaration)
18461
- enum_type_declaration.enumerators.each { |enum| check_enumerator(enum) }
18623
+ def check_enum_declaration(enum_dcl)
18624
+ enum_dcl.enumerators.each { |enum| check_enumerator(enum) }
18462
18625
  end
18463
18626
 
18464
- def check_enumerator(enumerator)
18465
- name = enumerator.identifier.value
18627
+ def check_enumerator(enum)
18628
+ name = enum.identifier.value
18466
18629
 
18467
- unless @object_decls_stack.empty?
18468
- same_name_object_decls = @object_decls_stack.last[name]
18469
- unless same_name_object_decls.empty?
18470
- W(:W0788, enumerator.location, name)
18471
- return
18630
+ same_name_obj_dcls = @obj_dcls.last[name]
18631
+ unless same_name_obj_dcls.empty?
18632
+ W(:W0788, enum.location, name)
18633
+ same_name_obj_dcls.each do |same_name_dcl|
18634
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18472
18635
  end
18473
18636
  end
18474
18637
 
18475
- unless @typedef_decls_stack.empty?
18476
- same_name_typedef_decls = @typedef_decls_stack.last[name]
18477
- unless same_name_typedef_decls.empty?
18478
- W(:W0788, enumerator.location, name)
18479
- return
18638
+ same_name_typedef_dcls = @typedef_dcls.last[name]
18639
+ unless same_name_typedef_dcls.empty?
18640
+ W(:W0788, enum.location, name)
18641
+ same_name_typedef_decls.each do |same_name_dcl|
18642
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18480
18643
  end
18481
18644
  end
18482
18645
 
18483
- unless @enumerators_stack.empty?
18484
- same_name_enumerators = @enumerators_stack.last[name]
18485
- unless same_name_enumerators == 0
18486
- W(:W0788, enumerator.location, name)
18487
- return
18646
+ same_name_enums = @enum_names.last[name]
18647
+ unless same_name_enums.empty?
18648
+ W(:W0788, enum.location, name)
18649
+ same_name_enums.each do |same_name_enum|
18650
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18488
18651
  end
18489
18652
  end
18490
- ensure
18491
- unless @enumerators_stack.empty?
18492
- @enumerators_stack.last[name] += 1
18493
- end
18653
+
18654
+ @enum_names.last[name].push(enum)
18494
18655
  end
18495
18656
 
18496
- def start_block(compound_statement)
18497
- @object_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18498
- @typedef_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18499
- @enumerators_stack.push(Hash.new(0))
18657
+ def enter_scope(*)
18658
+ @obj_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18659
+ @typedef_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18660
+ @enum_names.push(Hash.new { |hash, key| hash[key] = [] })
18500
18661
  end
18501
18662
 
18502
- def end_block(compound_statement)
18503
- @object_decls_stack.pop
18504
- @typedef_decls_stack.pop
18505
- @enumerators_stack.pop
18663
+ def leave_scope(*)
18664
+ @obj_dcls.pop
18665
+ @typedef_dcls.pop
18666
+ @enum_names.pop
18506
18667
  end
18507
18668
  end
18508
18669
 
@@ -18522,130 +18683,127 @@ module CBuiltin #:nodoc:
18522
18683
  interp.on_function_defined += method(:check_object_declaration)
18523
18684
  interp.on_typedef_declared += method(:check_typedef_declaration)
18524
18685
  interp.on_enum_declared += method(:check_enum_declaration)
18525
- interp.on_block_started += method(:start_block)
18526
- interp.on_block_ended += method(:end_block)
18686
+ interp.on_block_started += method(:enter_scope)
18687
+ interp.on_block_ended += method(:leave_scope)
18527
18688
 
18528
- @object_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18529
- @typedef_decls_stack = [Hash.new { |hash, key| hash[key] = [] }]
18530
- @enumerators_stack = [Hash.new(0)]
18689
+ @obj_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18690
+ @typedef_dcls = [Hash.new { |hash, key| hash[key] = [] }]
18691
+ @enum_names = [Hash.new { |hash, key| hash[key] = [] }]
18531
18692
  end
18532
18693
 
18533
18694
  private
18534
- def check_object_declaration(declaration_or_definition, *)
18535
- name = declaration_or_definition.identifier.value
18536
- type = declaration_or_definition.type
18695
+ def check_object_declaration(obj_dcl, *)
18696
+ name = obj_dcl.identifier.value
18697
+ type = obj_dcl.type
18537
18698
 
18538
- same_name_object_decls =
18539
- merge_same_name_object_decls(name, @object_decls_stack[0..-2])
18540
- unless same_name_object_decls.all? { |decl| decl.type == type }
18541
- W(:W0789, declaration_or_definition.location, name)
18542
- return
18699
+ same_name_obj_dcls = merge_upper_scopes(name, @obj_dcls)
18700
+ incompatibles = same_name_obj_dcls.select { |dcl| dcl.type != type }
18701
+ unless incompatibles.empty?
18702
+ W(:W0789, obj_dcl.location, name)
18703
+ incompatibles.each do |same_name_dcl|
18704
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18705
+ end
18543
18706
  end
18544
18707
 
18545
- same_name_typedef_decls =
18546
- merge_same_name_typedef_decls(name, @typedef_decls_stack[0..-2])
18547
- unless same_name_typedef_decls.empty?
18548
- W(:W0789, declaration_or_definition.location, name)
18549
- return
18708
+ same_name_typedef_dcls = merge_upper_scopes(name, @typedef_dcls)
18709
+ unless same_name_typedef_dcls.empty?
18710
+ W(:W0789, obj_dcl.location, name)
18711
+ same_name_typedef_dcls.each do |same_name_dcl|
18712
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18713
+ end
18550
18714
  end
18551
18715
 
18552
- same_name_enumerators =
18553
- merge_same_name_enumerators(name, @enumerators_stack[0..-2])
18554
- unless same_name_enumerators == 0
18555
- W(:W0789, declaration_or_definition.location, name)
18556
- return
18557
- end
18558
- ensure
18559
- unless @object_decls_stack.empty?
18560
- @object_decls_stack.last[name].push(declaration_or_definition)
18716
+ same_name_enums = merge_upper_scopes(name, @enum_names)
18717
+ unless same_name_enums.empty?
18718
+ W(:W0789, obj_dcl.location, name)
18719
+ same_name_enums.each do |same_name_enum|
18720
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18721
+ end
18561
18722
  end
18723
+
18724
+ @obj_dcls.last[name].push(obj_dcl)
18562
18725
  end
18563
18726
 
18564
- def check_typedef_declaration(typedef_declaration)
18565
- name = typedef_declaration.identifier.value
18566
- type = typedef_declaration.type
18727
+ def check_typedef_declaration(typedef_dcl)
18728
+ name = typedef_dcl.identifier.value
18729
+ type = typedef_dcl.type
18567
18730
 
18568
- same_name_object_decls =
18569
- merge_same_name_object_decls(name, @object_decls_stack[0..-2])
18570
- unless same_name_object_decls.empty?
18571
- W(:W0789, typedef_declaration.location, name)
18572
- return
18731
+ same_name_obj_dcls = merge_upper_scopes(name, @obj_dcls)
18732
+ unless same_name_obj_dcls.empty?
18733
+ W(:W0789, typedef_dcl.location, name)
18734
+ same_name_obj_dcls.each do |same_name_dcl|
18735
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18736
+ end
18573
18737
  end
18574
18738
 
18575
- same_name_typedef_decls =
18576
- merge_same_name_typedef_decls(name, @typedef_decls_stack[0..-2])
18577
- unless same_name_typedef_decls.all? { |decl| decl.type == type }
18578
- W(:W0789, typedef_declaration.location, name)
18579
- return
18739
+ same_name_typedef_dcls = merge_upper_scopes(name, @typedef_dcls)
18740
+ incompatibles = same_name_typedef_dcls.select { |dcl| dcl.type != type }
18741
+ unless incompatibles.empty?
18742
+ W(:W0789, typedef_dcl.location, name)
18743
+ incompatibles.each do |same_name_dcl|
18744
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18745
+ end
18580
18746
  end
18581
18747
 
18582
- same_name_enumerators =
18583
- merge_same_name_enumerators(name, @enumerators_stack[0..-2])
18584
- unless same_name_enumerators == 0
18585
- W(:W0789, typedef_declaration.location, name)
18586
- return
18587
- end
18588
- ensure
18589
- unless @typedef_decls_stack.empty?
18590
- @typedef_decls_stack.last[name].push(typedef_declaration)
18748
+ same_name_enums = merge_upper_scopes(name, @enum_names)
18749
+ unless same_name_enums.empty?
18750
+ W(:W0789, typedef_dcl.location, name)
18751
+ same_name_enums.each do |same_name_enum|
18752
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18753
+ end
18591
18754
  end
18755
+
18756
+ @typedef_dcls.last[name].push(typedef_dcl)
18592
18757
  end
18593
18758
 
18594
- def check_enum_declaration(enum_type_declaration)
18595
- enum_type_declaration.enumerators.each { |enum| check_enumerator(enum) }
18759
+ def check_enum_declaration(enum_dcl)
18760
+ enum_dcl.enumerators.each { |enum| check_enumerator(enum) }
18596
18761
  end
18597
18762
 
18598
- def check_enumerator(enumerator)
18599
- name = enumerator.identifier.value
18763
+ def check_enumerator(enum)
18764
+ name = enum.identifier.value
18600
18765
 
18601
- same_name_object_decls =
18602
- merge_same_name_object_decls(name, @object_decls_stack[0..-2])
18603
- unless same_name_object_decls.empty?
18604
- W(:W0789, enumerator.location, name)
18605
- return
18766
+ same_name_obj_dcls = merge_upper_scopes(name, @obj_dcls)
18767
+ unless same_name_obj_dcls.empty?
18768
+ W(:W0789, enum.location, name)
18769
+ same_name_obj_dcls.each do |same_name_dcl|
18770
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18771
+ end
18606
18772
  end
18607
18773
 
18608
- same_name_typedef_decls =
18609
- merge_same_name_typedef_decls(name, @typedef_decls_stack[0..-2])
18610
- unless same_name_typedef_decls.empty?
18611
- W(:W0789, enumerator.location, name)
18612
- return
18774
+ same_name_typedef_dcls = merge_upper_scopes(name, @typedef_dcls)
18775
+ unless same_name_typedef_dcls.empty?
18776
+ W(:W0789, enum.location, name)
18777
+ same_name_typedef_dcls.each do |same_name_dcl|
18778
+ C(:C0001, same_name_dcl.location, same_name_dcl.identifier.value)
18779
+ end
18613
18780
  end
18614
18781
 
18615
- same_name_enumerators =
18616
- merge_same_name_enumerators(name, @enumerators_stack[0..-2])
18617
- unless same_name_enumerators == 0
18618
- W(:W0789, enumerator.location, name)
18619
- return
18620
- end
18621
- ensure
18622
- unless @enumerators_stack.empty?
18623
- @enumerators_stack.last[name] += 1
18782
+ same_name_enums = merge_upper_scopes(name, @enum_names)
18783
+ unless same_name_enums.empty?
18784
+ W(:W0789, enum.location, name)
18785
+ same_name_enums.each do |same_name_enum|
18786
+ C(:C0001, same_name_enum.location, same_name_enum.identifier.value)
18787
+ end
18624
18788
  end
18625
- end
18626
18789
 
18627
- def start_block(compound_statement)
18628
- @object_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18629
- @typedef_decls_stack.push(Hash.new { |hash, key| hash[key] = [] })
18630
- @enumerators_stack.push(Hash.new(0))
18790
+ @enum_names.last[name].push(enum)
18631
18791
  end
18632
18792
 
18633
- def end_block(compound_statement)
18634
- @object_decls_stack.pop
18635
- @typedef_decls_stack.pop
18636
- @enumerators_stack.pop
18793
+ def enter_scope(*)
18794
+ @obj_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18795
+ @typedef_dcls.push(Hash.new { |hash, key| hash[key] = [] })
18796
+ @enum_names.push(Hash.new { |hash, key| hash[key] = [] })
18637
18797
  end
18638
18798
 
18639
- def merge_same_name_object_decls(name, scopes)
18640
- scopes.each_with_object([]) { |hash, result| result.concat(hash[name]) }
18799
+ def leave_scope(*)
18800
+ @obj_dcls.pop
18801
+ @typedef_dcls.pop
18802
+ @enum_names.pop
18641
18803
  end
18642
18804
 
18643
- def merge_same_name_typedef_decls(name, scopes)
18644
- scopes.each_with_object([]) { |hash, result| result.concat(hash[name]) }
18645
- end
18646
-
18647
- def merge_same_name_enumerators(name, scopes)
18648
- scopes.reduce(0) { |result, hash| result + hash[name] }
18805
+ def merge_upper_scopes(name, scoped_hash)
18806
+ scoped_hash[0..-2].reduce([]) { |result, hash| result + hash[name] }
18649
18807
  end
18650
18808
  end
18651
18809
 
@@ -18659,45 +18817,24 @@ module CBuiltin #:nodoc:
18659
18817
  def initialize(context)
18660
18818
  super
18661
18819
  interp = context[:c_interpreter]
18662
- interp.on_variable_defined += method(:check_variable)
18663
- interp.on_function_defined += method(:check_function)
18664
- interp.on_block_started += method(:enter_block)
18665
- interp.on_block_ended += method(:leave_block)
18666
- @global_var_names = Set.new
18667
- @global_fun_names = Set.new
18668
- @block_level = 0
18820
+ interp.on_variable_defined += method(:check)
18821
+ interp.on_function_defined += method(:check)
18822
+ @global_names = Hash.new { |hash, key| hash[key] = [] }
18669
18823
  end
18670
18824
 
18671
18825
  private
18672
- def check_variable(variable_definition, variable)
18673
- return unless @block_level == 0 && variable.declared_as_extern?
18674
-
18675
- name = variable_definition.identifier.value
18676
- if @global_var_names.include?(name) || @global_fun_names.include?(name)
18677
- W(:W0790, variable_definition.location, name)
18678
- else
18679
- @global_var_names.add(name)
18680
- end
18681
- end
18682
-
18683
- def check_function(function_definition, function)
18684
- return unless @block_level == 0 && function.declared_as_extern?
18685
-
18686
- name = function_definition.identifier.value
18687
- if @global_var_names.include?(name) || @global_fun_names.include?(name)
18688
- W(:W0790, function_definition.location, name)
18689
- else
18690
- @global_fun_names.add(name)
18826
+ def check(var_or_func_def, var)
18827
+ if var.declared_as_extern?
18828
+ name = var_or_func_def.identifier
18829
+ if @global_names.include?(name.value)
18830
+ W(:W0790, var_or_func_def.location, name.value)
18831
+ @global_names[name.value].each do |pair_name|
18832
+ C(:C0001, pair_name.location, pair_name.value)
18833
+ end
18834
+ end
18835
+ @global_names[name.value].push(name)
18691
18836
  end
18692
18837
  end
18693
-
18694
- def enter_block(*)
18695
- @block_level += 1
18696
- end
18697
-
18698
- def leave_block(*)
18699
- @block_level -= 1
18700
- end
18701
18838
  end
18702
18839
 
18703
18840
  class W0792 < PassiveCodeCheck