adlint 1.6.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/ChangeLog +389 -37
  2. data/INSTALL +3 -0
  3. data/MANIFEST +7 -0
  4. data/NEWS +50 -10
  5. data/etc/conf.d/i686-mingw/cinit-gcc_4.6.1.erb +1 -1
  6. data/etc/mesg.d/en_US/messages.yml +7 -7
  7. data/etc/mesg.d/ja_JP/messages.yml +4 -4
  8. data/lib/adlint/c/branch.rb +4 -4
  9. data/lib/adlint/c/code.rb +11 -13
  10. data/lib/adlint/c/enum.rb +0 -2
  11. data/lib/adlint/c/environ.rb +13 -7
  12. data/lib/adlint/c/expr.rb +5 -1
  13. data/lib/adlint/c/interp.rb +10 -6
  14. data/lib/adlint/c/mediator.rb +1 -0
  15. data/lib/adlint/c/message.rb +294 -111
  16. data/lib/adlint/c/message_shima.rb +63 -0
  17. data/lib/adlint/c/metric.rb +25 -13
  18. data/lib/adlint/c/object.rb +168 -31
  19. data/lib/adlint/c/parser.rb +3 -3
  20. data/lib/adlint/c/phase.rb +20 -3
  21. data/lib/adlint/c/syntax.rb +175 -17
  22. data/lib/adlint/c/value.rb +199 -126
  23. data/lib/adlint/cpp/asm.rb +4 -4
  24. data/lib/adlint/cpp/constexpr.rb +1 -1
  25. data/lib/adlint/cpp/eval.rb +6 -4
  26. data/lib/adlint/cpp/message.rb +100 -7
  27. data/lib/adlint/cpp/phase.rb +12 -1
  28. data/lib/adlint/cpp/source.rb +2 -2
  29. data/lib/adlint/cpp/subst.rb +2 -4
  30. data/lib/adlint/lang.rb +5 -3
  31. data/lib/adlint/ld/metric.rb +1 -1
  32. data/lib/adlint/version.rb +2 -2
  33. data/share/demo/Makefile +5 -0
  34. data/share/demo/bad_include/bad_include.c +13 -0
  35. data/share/demo/bad_include/test'1'.h +0 -0
  36. data/share/demo/bad_include/test'2'.h +0 -0
  37. data/share/demo/incomplete_ifelse/incomplete_ifelse.c +29 -0
  38. data/share/demo/inline_asm/inline_asm.c +25 -0
  39. data/share/demo/invalid_call/invalid_call.c +12 -4
  40. data/share/demo/logical_expr/logical_expr.c +73 -0
  41. data/share/demo/register_vars/register_vars.c +12 -0
  42. data/share/demo/typedef_each_src/typedef_each_src.c +9 -0
  43. data/share/demo/wrap_around/wrap_around.c +17 -0
  44. data/share/doc/developers_guide_ja.html +3 -3
  45. data/share/doc/developers_guide_ja.texi +1 -1
  46. data/share/doc/users_guide_en.html +137 -102
  47. data/share/doc/users_guide_en.texi +121 -86
  48. data/share/doc/users_guide_ja.html +118 -91
  49. data/share/doc/users_guide_ja.texi +103 -76
  50. metadata +10 -3
@@ -749,15 +749,15 @@ module C #:nodoc:
749
749
  end
750
750
 
751
751
  def exist?
752
- @values.all? { |value| value.exist? }
752
+ @values.empty? ? true : @values.all? { |value| value.exist? }
753
753
  end
754
754
 
755
755
  def undefined?
756
- @values.all? { |value| value.undefined? }
756
+ @values.empty? ? false : @values.all? { |value| value.undefined? }
757
757
  end
758
758
 
759
759
  def ambiguous?
760
- @values.all? { |value| value.ambiguous? }
760
+ @values.empty? ? false : @values.all? { |value| value.ambiguous? }
761
761
  end
762
762
 
763
763
  def overwrite!(value)
@@ -1224,15 +1224,15 @@ module C #:nodoc:
1224
1224
  end
1225
1225
 
1226
1226
  def exist?
1227
- @values.all? { |value| value.exist? }
1227
+ @values.empty? ? true : @values.all? { |value| value.exist? }
1228
1228
  end
1229
1229
 
1230
1230
  def undefined?
1231
- @values.all? { |value| value.undefined? }
1231
+ @values.empty? ? false : @values.all? { |value| value.undefined? }
1232
1232
  end
1233
1233
 
1234
1234
  def ambiguous?
1235
- @values.all? { |value| value.ambiguous? }
1235
+ @values.empty? ? false : @values.all? { |value| value.ambiguous? }
1236
1236
  end
1237
1237
 
1238
1238
  def overwrite!(value)
@@ -1717,9 +1717,16 @@ module C #:nodoc:
1717
1717
  end
1718
1718
 
1719
1719
  def fork
1720
- descendant = MultipleValue.new(@base_value.dup, self)
1721
- @descendants.push(descendant)
1722
- descendant
1720
+ same_value = @descendants.find { |multi_value|
1721
+ multi_value.eql?(@base_value)
1722
+ }
1723
+ if same_value
1724
+ same_value
1725
+ else
1726
+ new_descendant = MultipleValue.new(@base_value.dup, self)
1727
+ @descendants.push(new_descendant)
1728
+ new_descendant
1729
+ end
1723
1730
  end
1724
1731
 
1725
1732
  def rollback!
@@ -1998,12 +2005,12 @@ module C #:nodoc:
1998
2005
  @version_controller = ValueVersionController.new(self)
1999
2006
  end
2000
2007
 
2001
- def begin_versioning_group
2008
+ def enter_versioning_group
2002
2009
  @version_controller.enter_new_versioning_group
2003
2010
  end
2004
2011
 
2005
- def end_versioning_group(raise_complement_values)
2006
- @version_controller.copy_current_version if raise_complement_values
2012
+ def leave_versioning_group(raise_complement)
2013
+ @version_controller.copy_current_version if raise_complement
2007
2014
  @version_controller.merge_forked_versions
2008
2015
  @version_controller.leave_current_versioning_group
2009
2016
  invalidate_memo!
@@ -2018,58 +2025,44 @@ module C #:nodoc:
2018
2025
  invalidate_memo!
2019
2026
  end
2020
2027
 
2021
- alias :_rollback_latest_version! :rollback!
2022
-
2023
- def rollback!
2028
+ def rollback_latest_version!
2024
2029
  if @version_controller.rollback
2025
2030
  invalidate_memo!
2026
2031
  end
2027
2032
  end
2028
2033
 
2029
- def rollback_to_original!
2034
+ def rollback_all_versions!
2030
2035
  delete_descendants!
2031
- _direct_overwrite!(@version_controller.initial_value)
2036
+ _orig_overwrite!(@version_controller.original_value)
2032
2037
  @version_controller = ValueVersionController.new(self)
2033
2038
  invalidate_memo!
2034
2039
  end
2035
2040
 
2036
- alias :_direct_overwrite! :overwrite!
2041
+ alias :_orig_overwrite! :overwrite!
2037
2042
 
2038
2043
  def overwrite!(value)
2039
- single_value = value.to_single_value
2040
- no_effect = effective_values.all? { |multi_value|
2041
- multi_value.ambiguous? || multi_value.eql?(single_value)
2042
- }
2043
- unless no_effect
2044
- @version_controller.fork_new_version
2045
- super(single_value)
2046
- @version_controller.mark_current_versioning_group_as_sticky
2047
- invalidate_memo!
2048
- end
2044
+ @version_controller.fork_current_version
2045
+ super(value.to_single_value)
2046
+ @version_controller.mark_current_versioning_group_as_sticky
2047
+ invalidate_memo!
2049
2048
  end
2050
2049
 
2051
2050
  def narrow_domain!(operator_symbol, operand_value)
2052
- if effective_values.any? { |multi_value| !multi_value.ambiguous? }
2053
- @version_controller.fork_new_version
2054
- super
2055
- invalidate_memo!
2056
- end
2051
+ @version_controller.fork_current_version
2052
+ super
2053
+ invalidate_memo!
2057
2054
  end
2058
2055
 
2059
2056
  def widen_domain!(operator_symbol, operand_value)
2060
- if effective_values.any? { |multi_value| !multi_value.ambiguous? }
2061
- @version_controller.fork_new_version
2062
- super
2063
- invalidate_memo!
2064
- end
2057
+ @version_controller.fork_current_version
2058
+ super
2059
+ invalidate_memo!
2065
2060
  end
2066
2061
 
2067
2062
  def invert_domain!
2068
- if effective_values.any? { |multi_value| !multi_value.ambiguous? }
2069
- @version_controller.fork_new_version
2070
- super
2071
- invalidate_memo!
2072
- end
2063
+ @version_controller.fork_current_version
2064
+ super
2065
+ invalidate_memo!
2073
2066
  end
2074
2067
 
2075
2068
  def coerce_to(type)
@@ -2097,77 +2090,56 @@ module C #:nodoc:
2097
2090
  end
2098
2091
 
2099
2092
  class ValueVersionController
2100
- VersioningGroup = Struct.new(:sticky, :original_values)
2101
- Version = Struct.new(:group, :state, :values)
2102
-
2103
2093
  def initialize(original_value)
2104
- @versioning_groups = [initial_versioning_group(original_value)]
2105
- @versions = [initial_version(@versioning_groups.first, original_value)]
2094
+ @versioning_group_stack = [RootVersioningGroup.new(original_value)]
2106
2095
  end
2107
2096
 
2108
- def initial_value
2109
- @versioning_groups.first.original_values.first
2097
+ def original_value
2098
+ root_versioning_group.initial_values.first
2110
2099
  end
2111
2100
 
2112
2101
  def current_values
2113
- current_version.values
2102
+ current_versioning_group.current_values
2114
2103
  end
2115
2104
 
2116
2105
  def enter_new_versioning_group
2117
- original_values = current_values.map { |multi_value|
2118
- multi_value.base_value.dup
2119
- }
2120
- VersioningGroup.new(false, original_values).tap do |group|
2121
- @versioning_groups.push(group)
2122
- end
2106
+ new_group = VersioningGroup.new(current_versioning_group.current_version)
2107
+ @versioning_group_stack.push(new_group)
2123
2108
  end
2124
2109
 
2125
2110
  def leave_current_versioning_group
2126
- @versioning_groups.pop
2111
+ @versioning_group_stack.pop
2127
2112
  end
2128
2113
 
2129
2114
  def begin_forking
2130
- @versions.push(Version.new(current_versioning_group,
2131
- :forking, current_version.values))
2115
+ current_versioning_group.begin_new_version
2132
2116
  end
2133
2117
 
2134
2118
  def end_forking
2135
- @versions.pop
2119
+ current_versioning_group.end_current_version
2136
2120
  end
2137
2121
 
2138
- def fork_new_version
2139
- if current_version.state == :forking
2140
- fork_all_base_versions
2141
- current_version.values = current_version.values.map { |multi_value|
2142
- multi_value.fork
2143
- }
2144
- current_version.state = :forked
2145
- end
2122
+ def fork_current_version
2123
+ fork_all_versions
2146
2124
  end
2147
2125
 
2148
2126
  def rollback
2127
+ return false unless current_version.forked?
2128
+
2149
2129
  # NOTE: This method must be called in the forking section.
2150
- if current_version.state == :forked
2151
- end_forking
2152
- current_version.values.each do |multi_value|
2153
- case multi_value
2154
- when VersionedValue
2155
- multi_value._rollback_latest_version!
2156
- else
2157
- multi_value.rollback!
2158
- end
2159
- end
2160
- begin_forking
2161
- mark_current_versioning_group_as_sticky
2162
- true
2163
- else
2164
- false
2130
+ current_versioning_group.delete_current_version
2131
+ current_versioning_group.base_values.each do |multi_value|
2132
+ multi_value.rollback!
2165
2133
  end
2134
+ begin_forking
2135
+ mark_current_versioning_group_as_sticky
2136
+
2137
+ true
2166
2138
  end
2167
2139
 
2168
2140
  def mark_current_versioning_group_as_sticky
2169
- @versioning_groups.reverse_each do |group|
2170
- if group.sticky
2141
+ @versioning_group_stack.reverse_each do |group|
2142
+ if group.sticky?
2171
2143
  break
2172
2144
  else
2173
2145
  group.sticky = true
@@ -2176,69 +2148,170 @@ module C #:nodoc:
2176
2148
  end
2177
2149
 
2178
2150
  def copy_current_version
2151
+ return unless current_versioning_group.sticky?
2152
+
2179
2153
  # NOTE: This method must be called between ending of the forking section
2180
2154
  # and ending of the versioning group.
2181
- if current_versioning_group.sticky
2182
- current_values.each do |multi_value|
2183
- base_value = multi_value.base_value
2184
- already_exist = multi_value.descendants.any? { |desc|
2185
- !desc.equal?(multi_value) && desc.eql?(base_value)
2186
- }
2187
- multi_value.fork unless already_exist
2188
- end
2155
+ current_values.each do |multi_value|
2156
+ base_value = multi_value.base_value
2157
+ already_exist = multi_value.descendants.any? { |desc_multi_value|
2158
+ !desc_multi_value.equal?(multi_value) &&
2159
+ desc_multi_value.eql?(base_value)
2160
+ }
2161
+ multi_value.fork unless already_exist
2189
2162
  end
2190
2163
  end
2191
2164
 
2192
2165
  def merge_forked_versions
2193
2166
  # NOTE: This method must be called between ending of the forking section
2194
2167
  # and ending of the versioning group.
2195
- if current_versioning_group.sticky
2196
- current_version.values = current_values.map { |multi_value|
2197
- multi_value.descendants
2168
+ base_version = current_versioning_group.base_version
2169
+
2170
+ case
2171
+ when current_versioning_group.sticky?
2172
+ fork_all_versions
2173
+ base_version.values = base_version.values.map { |base_multi_value|
2174
+ base_multi_value.descendants
2198
2175
  }.flatten.uniq
2199
- else
2200
- values = current_values.zip(current_versioning_group.original_values)
2201
- values.each do |current_multi_value, original_single_value|
2202
- current_multi_value.delete_descendants!
2203
- case current_multi_value
2204
- when VersionedValue
2205
- current_multi_value._direct_overwrite!(original_single_value)
2176
+ when current_versioning_group.versions_forked?
2177
+ # NOTE: When versions in the current versioning group have been forked,
2178
+ # base_version of the current versioning group has already been
2179
+ # forked. So, it is safe to overwrite the base_version's values
2180
+ # with the current versioning group's initial snapshot values.
2181
+ initial_values = current_versioning_group.initial_values
2182
+ values = base_version.values.zip(initial_values)
2183
+ values.each do |base_multi_value, initial_single_value|
2184
+ base_multi_value.delete_descendants!
2185
+ if base_multi_value.kind_of?(VersionedValue)
2186
+ base_multi_value._orig_overwrite!(initial_single_value)
2206
2187
  else
2207
- current_multi_value.overwrite!(original_single_value)
2188
+ base_multi_value.overwrite!(initial_single_value)
2208
2189
  end
2209
2190
  end
2191
+ else
2192
+ # NOTE: Nothing to be done when base_version of the current versioning
2193
+ # group has not been forked.
2210
2194
  end
2211
2195
  end
2212
2196
 
2213
2197
  private
2214
- def initial_versioning_group(original_value)
2215
- VersioningGroup.new(true, [original_value.base_value.dup])
2198
+ def fork_all_versions
2199
+ parent_group = root_versioning_group
2200
+ active_versioning_groups.each do |active_group|
2201
+ active_group.base_version = parent_group.current_version
2202
+ active_group.fork_all_versions
2203
+ parent_group = active_group
2204
+ end
2216
2205
  end
2217
2206
 
2218
- def initial_version(versioning_group, original_value)
2219
- Version.new(versioning_group, :original, [original_value])
2207
+ def root_versioning_group
2208
+ @versioning_group_stack.first
2220
2209
  end
2221
2210
 
2222
- def fork_all_base_versions
2223
- base_version = @versions.first
2224
- @versions[1..-2].each do |version|
2225
- if version.state == :forking
2226
- version.values = base_version.values.map { |multi_value|
2227
- multi_value.fork
2228
- }
2229
- version.state = :forked
2230
- end
2231
- base_version = version
2232
- end
2211
+ def active_versioning_groups
2212
+ @versioning_group_stack[1..-1]
2233
2213
  end
2234
2214
 
2235
2215
  def current_versioning_group
2236
- @versioning_groups.last
2216
+ @versioning_group_stack.last
2237
2217
  end
2238
2218
 
2239
2219
  def current_version
2240
- @versions.last
2220
+ current_versioning_group.current_version
2221
+ end
2222
+
2223
+ class VersioningGroup
2224
+ def initialize(base_version, sticky = false)
2225
+ @base_version = base_version
2226
+ @sticky = sticky
2227
+
2228
+ @initial_values = base_version.values.map { |multi_value|
2229
+ multi_value.base_value.dup
2230
+ }
2231
+ @version_stack = []
2232
+ @all_versions = []
2233
+ end
2234
+
2235
+ attr_accessor :base_version
2236
+ attr_writer :sticky
2237
+ attr_reader :initial_values
2238
+
2239
+ def sticky?
2240
+ @sticky
2241
+ end
2242
+
2243
+ def versions_forked?
2244
+ @all_versions.any? { |version| version.forked? }
2245
+ end
2246
+
2247
+ def base_values
2248
+ @base_version.values
2249
+ end
2250
+
2251
+ def current_version
2252
+ @version_stack.empty? ? @base_version : @version_stack.last
2253
+ end
2254
+
2255
+ def current_values
2256
+ current_version.values
2257
+ end
2258
+
2259
+ def begin_new_version
2260
+ new_version = Version.new(base_values)
2261
+ @version_stack.push(new_version)
2262
+ @all_versions.push(new_version)
2263
+ end
2264
+
2265
+ def end_current_version
2266
+ @version_stack.pop
2267
+ end
2268
+
2269
+ def delete_current_version
2270
+ end_current_version
2271
+ @all_versions.pop
2272
+ end
2273
+
2274
+ def fork_all_versions
2275
+ @all_versions.each { |version| version.fork_from(@base_version) }
2276
+ end
2277
+ end
2278
+ private_constant :VersioningGroup
2279
+
2280
+ class RootVersioningGroup < VersioningGroup
2281
+ def initialize(original_value)
2282
+ super(Version.new([original_value], true), true)
2283
+ end
2284
+ end
2285
+ private_constant :RootVersioningGroup
2286
+
2287
+ class Version
2288
+ def initialize(values, original = false)
2289
+ @values = values
2290
+ @state = original ? :original : :forking
2291
+ end
2292
+
2293
+ attr_accessor :values
2294
+
2295
+ def original?
2296
+ @state == :original
2297
+ end
2298
+
2299
+ def forking?
2300
+ @state == :forking
2301
+ end
2302
+
2303
+ def forked?
2304
+ @state == :forked
2305
+ end
2306
+
2307
+ def fork_from(base_version)
2308
+ if forking?
2309
+ @values = base_version.values.map { |multi_value| multi_value.fork }
2310
+ @state = :forked
2311
+ end
2312
+ end
2241
2313
  end
2314
+ private_constant :Version
2242
2315
  end
2243
2316
 
2244
2317
  class FrozenValue < Value
@@ -2254,12 +2327,12 @@ module C #:nodoc:
2254
2327
  def_delegator :@versioned_value, :undefined?
2255
2328
  def_delegator :@versioned_value, :exist?
2256
2329
  def_delegator :@versioned_value, :multiple?
2257
- def_delegator :@versioned_value, :begin_versioning_group
2258
- def_delegator :@versioned_value, :end_versioning_group
2330
+ def_delegator :@versioned_value, :enter_versioning_group
2331
+ def_delegator :@versioned_value, :leave_versioning_group
2259
2332
  def_delegator :@versioned_value, :begin_versioning
2260
2333
  def_delegator :@versioned_value, :end_versioning
2261
- def_delegator :@versioned_value, :rollback!
2262
- def_delegator :@versioned_value, :rollback_to_original!
2334
+ def_delegator :@versioned_value, :rollback_latest_version!
2335
+ def_delegator :@versioned_value, :rollback_all_versions!
2263
2336
  def_delegator :@versioned_value, :single_value_unified_with
2264
2337
  def_delegator :@versioned_value, :~
2265
2338
  def_delegator :@versioned_value, :+@
@@ -42,8 +42,8 @@ module Cpp #:nodoc:
42
42
 
43
43
  def create_cxx_asm_definition(source)
44
44
  CodeSubstitution.new("asm(__adlint__any);", "").tap do |subst|
45
- subst.on_substitution += lambda { |location, matched|
46
- source.on_inline_assembly.invoke(location, matched)
45
+ subst.on_substitution += lambda { |matched_tokens|
46
+ source.on_inline_assembly.invoke(matched_tokens)
47
47
  }
48
48
  end
49
49
  end
@@ -61,8 +61,8 @@ module Cpp #:nodoc:
61
61
  "asm __volatile__ (__adlint__any);"
62
62
  ].map do |pattern|
63
63
  CodeSubstitution.new(pattern, "").tap { |subst|
64
- subst.on_substitution += lambda { |location, matched|
65
- source.on_inline_assembly.invoke(location, matched)
64
+ subst.on_substitution += lambda { |matched_tokens|
65
+ source.on_inline_assembly.invoke(matched_tokens)
66
66
  }
67
67
  }
68
68
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.4.7
3
+ # This file is automatically generated by Racc 1.4.8
4
4
  # from Racc grammer file "".
5
5
  #
6
6
 
@@ -648,7 +648,7 @@ module Cpp #:nodoc:
648
648
  if fpath = resolve_next_user_header(basename, current_dpath)
649
649
  include_user_header(fpath, user_include_next_line, context)
650
650
  else
651
- E(:E0010, user_include_line.location, basename)
651
+ E(:E0010, user_include_next_line.location, basename)
652
652
  raise MissingUserHeaderError.new(user_include_next_line.location,
653
653
  basename,
654
654
  context.msg_fpath, context.log_fpath)
@@ -688,7 +688,7 @@ module Cpp #:nodoc:
688
688
  include_system_header(fpath, system_include_next_line, context)
689
689
  else
690
690
  E(:E0009, system_include_line.location, basename)
691
- raise MissingSystemHeaderError.new(system_include_line.location,
691
+ raise MissingSystemHeaderError.new(system_include_next_line.location,
692
692
  basename,
693
693
  context.msg_fpath,
694
694
  context.log_fpath)
@@ -723,7 +723,8 @@ module Cpp #:nodoc:
723
723
  result = []
724
724
  include_paths.each do |dpath|
725
725
  fpath = dpath.join(Pathname.new(basename))
726
- result.push(fpath) if File.readable?(fpath)
726
+ fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
727
+ result.push(fpath) if fpath.readable?
727
728
  break if result.size == max_num
728
729
  end
729
730
  result
@@ -744,7 +745,8 @@ module Cpp #:nodoc:
744
745
  result = []
745
746
  include_paths.each do |dpath|
746
747
  fpath = dpath.join(Pathname.new(basename))
747
- result.push(fpath) if File.readable?(fpath)
748
+ fpath = Pathname.new(fpath.to_s.gsub(/\\\\|\\/, "/"))
749
+ result.push(fpath) if fpath.readable?
748
750
  break if result.size == max_num
749
751
  end
750
752
  result
@@ -258,8 +258,18 @@ module Cpp #:nodoc:
258
258
 
259
259
  def initialize(context)
260
260
  super
261
- context[:c_source].on_language_extension +=
262
- lambda { |location, matched| W(:W0061, location, matched) }
261
+ context[:c_source].on_language_extension += method(:check)
262
+ end
263
+
264
+ private
265
+ def check(matched_tokens)
266
+ W(:W0061, matched_tokens.first.location, tokens_to_str(matched_tokens))
267
+ end
268
+
269
+ def tokens_to_str(tokens)
270
+ tokens.map { |token|
271
+ token.type == :NEW_LINE ? nil : token.value
272
+ }.compact.join(" ")
263
273
  end
264
274
  end
265
275
 
@@ -772,15 +782,20 @@ module Cpp #:nodoc:
772
782
  end
773
783
 
774
784
  class W0541 < PassiveMessageDetection
775
- # NOTE: W0541 may be duplicative when the same header which has the token
776
- # sequence of the compiler specific extension is included twice or
777
- # more.
785
+ # NOTE: W0541 may be duplicative when the same header which causes this
786
+ # warning is included twice or more.
778
787
  ensure_uniqueness_of :W0541
779
788
 
780
789
  def initialize(context)
781
790
  super
782
- context[:c_source].on_inline_assembly +=
783
- lambda { |location, matched| W(:W0541, location) }
791
+ context[:c_source].on_inline_assembly += method(:check)
792
+ end
793
+
794
+ private
795
+ def check(asm_tokens)
796
+ unless asm_tokens.any? { |token| token.replaced? }
797
+ W(:W0541, asm_tokens.first.location)
798
+ end
784
799
  end
785
800
  end
786
801
 
@@ -948,6 +963,68 @@ module Cpp #:nodoc:
948
963
  end
949
964
  end
950
965
 
966
+ class W0632 < PassiveMessageDetection
967
+ # NOTE: W0632 may be duplicative when the same header which has references
968
+ # to the undefined macro is included twice or more.
969
+ ensure_uniqueness_of :W0632
970
+
971
+ def initialize(context)
972
+ super
973
+ visitor = context[:cpp_visitor]
974
+ visitor.enter_system_include_line += method(:check)
975
+ visitor.enter_system_include_next_line += method(:check)
976
+ end
977
+
978
+ private
979
+ def check(include_line)
980
+ if include_line.header_name.value =~ /['"]/
981
+ W(:W0632, include_line.location, include_line.header_name.value)
982
+ end
983
+ end
984
+ end
985
+
986
+ class W0633 < PassiveMessageDetection
987
+ # NOTE: W0633 may be duplicative when the same header which has references
988
+ # to the undefined macro is included twice or more.
989
+ ensure_uniqueness_of :W0633
990
+
991
+ def initialize(context)
992
+ super
993
+ visitor = context[:cpp_visitor]
994
+ visitor.enter_user_include_line += method(:check)
995
+ visitor.enter_user_include_next_line += method(:check)
996
+ end
997
+
998
+ private
999
+ def check(include_line)
1000
+ if include_line.header_name.value =~ /'/
1001
+ W(:W0633, include_line.location, include_line.header_name.value)
1002
+ end
1003
+ end
1004
+ end
1005
+
1006
+ class W0634 < PassiveMessageDetection
1007
+ # NOTE: W0634 may be duplicative when the same header which has references
1008
+ # to the undefined macro is included twice or more.
1009
+ ensure_uniqueness_of :W0634
1010
+
1011
+ def initialize(context)
1012
+ super
1013
+ visitor = context[:cpp_visitor]
1014
+ visitor.enter_user_include_line += method(:check)
1015
+ visitor.enter_user_include_next_line += method(:check)
1016
+ visitor.enter_system_include_line += method(:check)
1017
+ visitor.enter_system_include_next_line += method(:check)
1018
+ end
1019
+
1020
+ private
1021
+ def check(include_line)
1022
+ if include_line.header_name.value.include?("\\")
1023
+ W(:W0634, include_line.location)
1024
+ end
1025
+ end
1026
+ end
1027
+
951
1028
  class W0696 < PassiveMessageDetection
952
1029
  # NOTE: W0696 may be duplicative when the same header which has references
953
1030
  # to the undefined macro is included twice or more.
@@ -990,6 +1067,22 @@ module Cpp #:nodoc:
990
1067
  end
991
1068
  end
992
1069
 
1070
+ class W0832 < PassiveMessageDetection
1071
+ # NOTE: W0832 may be duplicative when the same header which causes this
1072
+ # warning is included twice or more.
1073
+ ensure_uniqueness_of :W0832
1074
+
1075
+ def initialize(context)
1076
+ super
1077
+ context[:c_source].on_inline_assembly += method(:check)
1078
+ end
1079
+
1080
+ private
1081
+ def check(asm_tokens)
1082
+ W(:W0832, asm_tokens.first.location)
1083
+ end
1084
+ end
1085
+
993
1086
  class W9002 < PassiveMessageDetection
994
1087
  # NOTE: W9002 may be duplicative when the same header which has no newline
995
1088
  # at end of the file is included twice or more.