adlint 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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.