adlint 2.6.12 → 2.6.14

Sign up to get free protection for your applications and to get access to all the features.
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