summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvestre Ledru <sylvestre@mozilla.com>2018-04-28 10:18:26 +0200
committerSylvestre Ledru <sylvestre@mozilla.com>2018-04-28 10:18:26 +0200
commit9704082a4f3ce0acdd8ba963645fffc6a3643f41 (patch)
treee181309fada7dfdeeba40f108695e8d838da85ef
parent0a38e794af1feaf5eb7db0eea65aca1a4c7fdda8 (diff)
New upstream version 5.0upstream/5.0
-rw-r--r--.clang-format3
-rw-r--r--.gitignore2
-rw-r--r--.travis.yml35
-rw-r--r--CMakeLists.txt197
-rw-r--r--CONTRIBUTING.md62
-rw-r--r--LICENSE.TXT64
-rw-r--r--README.md167
-rw-r--r--boost-all-private.imp4116
-rw-r--r--boost-all.imp5629
-rw-r--r--debian/changelog125
-rw-r--r--debian/compat1
-rw-r--r--debian/control28
-rw-r--r--debian/copyright35
-rw-r--r--debian/docs1
-rw-r--r--debian/fix_include.1102
-rw-r--r--debian/iwyu.install1
-rw-r--r--debian/iwyu.links2
-rw-r--r--debian/iwyu.manpages4
-rw-r--r--debian/patches/series0
-rwxr-xr-xdebian/rules37
-rw-r--r--debian/source/format1
-rw-r--r--debian/watch2
-rwxr-xr-xdist.sh31
-rw-r--r--docs/IWYUMappings.md116
-rw-r--r--docs/IWYUPragmas.md195
-rw-r--r--docs/WhatIsAUse.md182
-rw-r--r--docs/WhyIWYU.md53
-rw-r--r--docs/WhyIWYUIsDifficult.md164
-rwxr-xr-xfix_includes.py2397
-rwxr-xr-xfix_includes_test.py3552
-rw-r--r--gcc.libc.imp205
-rw-r--r--gcc.stl.headers.imp228
-rw-r--r--gcc.symbols.imp154
-rw-r--r--iwyu.cc3981
-rw-r--r--iwyu.gcc.imp8
-rw-r--r--iwyu_ast_util.cc1384
-rw-r--r--iwyu_ast_util.h805
-rw-r--r--iwyu_cache.cc91
-rw-r--r--iwyu_cache.h171
-rw-r--r--iwyu_driver.cc257
-rw-r--r--iwyu_driver.h25
-rw-r--r--iwyu_getopt.cc220
-rw-r--r--iwyu_getopt.h41
-rw-r--r--iwyu_globals.cc417
-rw-r--r--iwyu_globals.h133
-rw-r--r--iwyu_include_picker.cc1533
-rw-r--r--iwyu_include_picker.h253
-rw-r--r--iwyu_lexer_utils.cc156
-rw-r--r--iwyu_lexer_utils.h87
-rw-r--r--iwyu_location_util.cc173
-rw-r--r--iwyu_location_util.h233
-rw-r--r--iwyu_output.cc2000
-rw-r--r--iwyu_output.h399
-rw-r--r--iwyu_path_util.cc244
-rw-r--r--iwyu_path_util.h97
-rw-r--r--iwyu_preprocessor.cc1085
-rw-r--r--iwyu_preprocessor.h364
-rw-r--r--iwyu_stl_util.h150
-rw-r--r--iwyu_string_util.h204
-rwxr-xr-xiwyu_test_util.py455
-rwxr-xr-xiwyu_tool.py247
-rw-r--r--iwyu_verrs.cc44
-rw-r--r--iwyu_verrs.h52
-rw-r--r--iwyu_version.h15
-rw-r--r--libcxx.imp10
-rw-r--r--more_tests/iwyu_include_picker_test.cc604
-rw-r--r--more_tests/iwyu_lexer_utils_test.cc277
-rw-r--r--more_tests/iwyu_output_test.cc584
-rw-r--r--more_tests/iwyu_string_util_test.cc122
-rw-r--r--port.h90
-rw-r--r--qt4.imp1996
-rw-r--r--qt5_4.imp2473
-rwxr-xr-xrun_iwyu_tests.py264
-rwxr-xr-xscrub-logs.py45
-rw-r--r--stl.c.headers.imp42
-rw-r--r--tests/c/elaborated_struct-d1.h13
-rw-r--r--tests/c/elaborated_struct.c35
-rw-r--r--tests/cxx/alias_template.cc47
-rw-r--r--tests/cxx/anonymous_struct.cc80
-rw-r--r--tests/cxx/array.cc41
-rw-r--r--tests/cxx/associated_h_file_heuristic.cc30
-rw-r--r--tests/cxx/associated_include-i1.h10
-rw-r--r--tests/cxx/associated_include.cc31
-rw-r--r--tests/cxx/associated_include.h27
-rw-r--r--tests/cxx/auto_type_within_template.cc22
-rw-r--r--tests/cxx/avoids_double_specialization.cc40
-rw-r--r--tests/cxx/backwards_includes-d1-inl.h28
-rw-r--r--tests/cxx/backwards_includes-d1.h29
-rw-r--r--tests/cxx/backwards_includes-d2.h21
-rw-r--r--tests/cxx/backwards_includes-d3.h28
-rw-r--r--tests/cxx/backwards_includes.cc46
-rw-r--r--tests/cxx/badinc-d1.h108
-rw-r--r--tests/cxx/badinc-d2.h59
-rw-r--r--tests/cxx/badinc-d3.h26
-rw-r--r--tests/cxx/badinc-d4.h26
-rw-r--r--tests/cxx/badinc-extradef.cc24
-rw-r--r--tests/cxx/badinc-i1.h289
-rw-r--r--tests/cxx/badinc-i2-inl.h74
-rw-r--r--tests/cxx/badinc-i2.h146
-rw-r--r--tests/cxx/badinc-i3.h61
-rw-r--r--tests/cxx/badinc-i4.h15
-rw-r--r--tests/cxx/badinc-i5.h20
-rw-r--r--tests/cxx/badinc-i6.h19
-rw-r--r--tests/cxx/badinc-inl.h32
-rw-r--r--tests/cxx/badinc-private.h18
-rw-r--r--tests/cxx/badinc-private2.h19
-rw-r--r--tests/cxx/badinc.cc1982
-rw-r--r--tests/cxx/badinc.h407
-rw-r--r--tests/cxx/badinc.imp5
-rw-r--r--tests/cxx/badinc2.c12
-rw-r--r--tests/cxx/built_ins_new_included.cc31
-rw-r--r--tests/cxx/built_ins_no_includes.cc24
-rw-r--r--tests/cxx/casts-d1.h12
-rw-r--r--tests/cxx/casts-i1.h14
-rw-r--r--tests/cxx/casts.cc41
-rw-r--r--tests/cxx/catch-byptr.h15
-rw-r--r--tests/cxx/catch-byref.h15
-rw-r--r--tests/cxx/catch-byvalue.h15
-rw-r--r--tests/cxx/catch-elab.h17
-rw-r--r--tests/cxx/catch-exceptions.h25
-rw-r--r--tests/cxx/catch-logex.h18
-rw-r--r--tests/cxx/catch-thrown.h15
-rw-r--r--tests/cxx/catch.cc78
-rw-r--r--tests/cxx/check_also-d1.h33
-rw-r--r--tests/cxx/check_also-i1.h19
-rw-r--r--tests/cxx/check_also-n1.h22
-rw-r--r--tests/cxx/check_also.cc32
-rw-r--r--tests/cxx/clmode.cc31
-rw-r--r--tests/cxx/comment_pragmas-d1.h17
-rw-r--r--tests/cxx/comment_pragmas-d10.h23
-rw-r--r--tests/cxx/comment_pragmas-d11.h20
-rw-r--r--tests/cxx/comment_pragmas-d12.h19
-rw-r--r--tests/cxx/comment_pragmas-d13.h17
-rw-r--r--tests/cxx/comment_pragmas-d14.h19
-rw-r--r--tests/cxx/comment_pragmas-d15.h16
-rw-r--r--tests/cxx/comment_pragmas-d16.h17
-rw-r--r--tests/cxx/comment_pragmas-d17.h19
-rw-r--r--tests/cxx/comment_pragmas-d18.h15
-rw-r--r--tests/cxx/comment_pragmas-d19.h15
-rw-r--r--tests/cxx/comment_pragmas-d2.h20
-rw-r--r--tests/cxx/comment_pragmas-d20.h19
-rw-r--r--tests/cxx/comment_pragmas-d21.h15
-rw-r--r--tests/cxx/comment_pragmas-d22.h15
-rw-r--r--tests/cxx/comment_pragmas-d3.h20
-rw-r--r--tests/cxx/comment_pragmas-d4.h20
-rw-r--r--tests/cxx/comment_pragmas-d5.h16
-rw-r--r--tests/cxx/comment_pragmas-d6.h18
-rw-r--r--tests/cxx/comment_pragmas-d7.h41
-rw-r--r--tests/cxx/comment_pragmas-d8.h22
-rw-r--r--tests/cxx/comment_pragmas-d9.h23
-rw-r--r--tests/cxx/comment_pragmas-i1.h40
-rw-r--r--tests/cxx/comment_pragmas-i10.h19
-rw-r--r--tests/cxx/comment_pragmas-i11.h19
-rw-r--r--tests/cxx/comment_pragmas-i2.h18
-rw-r--r--tests/cxx/comment_pragmas-i3.h17
-rw-r--r--tests/cxx/comment_pragmas-i4.h17
-rw-r--r--tests/cxx/comment_pragmas-i5.h17
-rw-r--r--tests/cxx/comment_pragmas-i6.h20
-rw-r--r--tests/cxx/comment_pragmas-i7.h18
-rw-r--r--tests/cxx/comment_pragmas-i8.h16
-rw-r--r--tests/cxx/comment_pragmas-i9.h16
-rw-r--r--tests/cxx/comment_pragmas.cc251
-rw-r--r--tests/cxx/computed_include.cc46
-rw-r--r--tests/cxx/computed_include.h16
-rw-r--r--tests/cxx/conversion_ctor.cc38
-rw-r--r--tests/cxx/cvr-base.h15
-rw-r--r--tests/cxx/cvr-class.h15
-rw-r--r--tests/cxx/cvr-derived.h17
-rw-r--r--tests/cxx/cvr.cc49
-rw-r--r--tests/cxx/default_template_arg_other_file-d1.h38
-rw-r--r--tests/cxx/default_template_arg_other_file-d2.h10
-rw-r--r--tests/cxx/default_template_arg_other_file-i2.h15
-rw-r--r--tests/cxx/default_template_arg_other_file-o1.h11
-rw-r--r--tests/cxx/default_template_arg_other_file.cc69
-rw-r--r--tests/cxx/deleted_implicit.cc55
-rw-r--r--tests/cxx/depopulated_h_file-i1.h18
-rw-r--r--tests/cxx/depopulated_h_file.cc29
-rw-r--r--tests/cxx/depopulated_h_file.h26
-rw-r--r--tests/cxx/derived_function_tpl_args-d1.h10
-rw-r--r--tests/cxx/derived_function_tpl_args-i1.h16
-rw-r--r--tests/cxx/derived_function_tpl_args.cc141
-rw-r--r--tests/cxx/direct.h30
-rw-r--r--tests/cxx/direct_near.h18
-rw-r--r--tests/cxx/double_include.cc36
-rw-r--r--tests/cxx/double_include.h18
-rw-r--r--tests/cxx/elaborated_type.cc86
-rw-r--r--tests/cxx/elaborated_type_class.h10
-rw-r--r--tests/cxx/elaborated_type_enum1.h13
-rw-r--r--tests/cxx/elaborated_type_enum2.h13
-rw-r--r--tests/cxx/elaborated_type_namespace.h18
-rw-r--r--tests/cxx/elaborated_type_struct.h10
-rw-r--r--tests/cxx/elaborated_type_union.h10
-rw-r--r--tests/cxx/external_including_internal.cc25
-rw-r--r--tests/cxx/forward_declare_in_macro.cc41
-rw-r--r--tests/cxx/forward_declare_in_macro.h17
-rw-r--r--tests/cxx/fullinfo_for_templates-d1.h16
-rw-r--r--tests/cxx/fullinfo_for_templates-d2.h16
-rw-r--r--tests/cxx/fullinfo_for_templates.cc30
-rw-r--r--tests/cxx/funcptrs-d1.h15
-rw-r--r--tests/cxx/funcptrs-i1.h70
-rw-r--r--tests/cxx/funcptrs.cc218
-rw-r--r--tests/cxx/fwd_decl_class_template-i1.h15
-rw-r--r--tests/cxx/fwd_decl_class_template.cc29
-rw-r--r--tests/cxx/fwd_decl_class_template.h34
-rw-r--r--tests/cxx/fwd_decl_nested_class.cc243
-rw-r--r--tests/cxx/fwd_decl_of_nested_class_defined_later.cc40
-rw-r--r--tests/cxx/fwd_decl_static_member.cc31
-rw-r--r--tests/cxx/fwd_decl_then_dfn.cc40
-rw-r--r--tests/cxx/fwd_decl_with_attribute.cc31
-rw-r--r--tests/cxx/fwd_decl_with_instantiation-d1.h10
-rw-r--r--tests/cxx/fwd_decl_with_instantiation.cc26
-rw-r--r--tests/cxx/fwd_decl_with_instantiation.h18
-rw-r--r--tests/cxx/fwd_declare_enum.cc30
-rw-r--r--tests/cxx/header_in_subfolder.cc30
-rw-r--r--tests/cxx/header_in_subfolder_nopath.cc30
-rw-r--r--tests/cxx/header_near.cc27
-rw-r--r--tests/cxx/header_near.h22
-rw-r--r--tests/cxx/implicit_ctor-d1.h35
-rw-r--r--tests/cxx/implicit_ctor-i1.h10
-rw-r--r--tests/cxx/implicit_ctor-i2.h13
-rw-r--r--tests/cxx/implicit_ctor.cc52
-rw-r--r--tests/cxx/include_cycle.cc22
-rw-r--r--tests/cxx/include_with_using-d1.h16
-rw-r--r--tests/cxx/include_with_using-d2.h21
-rw-r--r--tests/cxx/include_with_using-d3.h13
-rw-r--r--tests/cxx/include_with_using-d3b.h10
-rw-r--r--tests/cxx/include_with_using-d4.h16
-rw-r--r--tests/cxx/include_with_using-d5.h16
-rw-r--r--tests/cxx/include_with_using-d5b.h13
-rw-r--r--tests/cxx/include_with_using-i1.h12
-rw-r--r--tests/cxx/include_with_using.cc75
-rw-r--r--tests/cxx/indirect.h27
-rw-r--r--tests/cxx/inheriting_ctor-d1.h15
-rw-r--r--tests/cxx/inheriting_ctor-i1.h20
-rw-r--r--tests/cxx/inheriting_ctor.cc26
-rw-r--r--tests/cxx/integer_template_arg.cc19
-rw-r--r--tests/cxx/internal/associated_h_file_heuristic.h16
-rw-r--r--tests/cxx/internal/include_cycle-d1.h21
-rw-r--r--tests/cxx/internal/include_cycle-i1.h15
-rw-r--r--tests/cxx/internal/internal_files.cc23
-rw-r--r--tests/cxx/internal/private.h12
-rw-r--r--tests/cxx/iterator.cc51
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-autocast.h90
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-autocast2.h16
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-d1.h26
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-d2.h41
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-fnreturn.h93
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-i1.h18
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-i2.h18
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp-typedefs.h76
-rw-r--r--tests/cxx/iwyu_stricter_than_cpp.cc166
-rw-r--r--tests/cxx/keep_mapping-pragma1.h10
-rw-r--r--tests/cxx/keep_mapping-pragma2.h10
-rw-r--r--tests/cxx/keep_mapping-priv.h10
-rw-r--r--tests/cxx/keep_mapping-private.h10
-rw-r--r--tests/cxx/keep_mapping-public.h31
-rw-r--r--tests/cxx/keep_mapping.cc20
-rw-r--r--tests/cxx/keep_mapping.imp5
-rw-r--r--tests/cxx/lambda_fwd_decl.cc32
-rw-r--r--tests/cxx/lateparsed_template-notchecked.h24
-rw-r--r--tests/cxx/lateparsed_template.cc60
-rw-r--r--tests/cxx/macro_defined_by_includer-d1.h12
-rw-r--r--tests/cxx/macro_defined_by_includer-d2.h15
-rw-r--r--tests/cxx/macro_defined_by_includer-d3.h14
-rw-r--r--tests/cxx/macro_defined_by_includer-d4.h12
-rw-r--r--tests/cxx/macro_defined_by_includer-g1.h14
-rw-r--r--tests/cxx/macro_defined_by_includer-g2.h19
-rw-r--r--tests/cxx/macro_defined_by_includer-g3.h17
-rw-r--r--tests/cxx/macro_defined_by_includer-g4.h14
-rw-r--r--tests/cxx/macro_defined_by_includer-g5.h14
-rw-r--r--tests/cxx/macro_defined_by_includer-i1.h11
-rw-r--r--tests/cxx/macro_defined_by_includer-i2.h10
-rw-r--r--tests/cxx/macro_defined_by_includer-i3.h14
-rw-r--r--tests/cxx/macro_defined_by_includer-i4.h16
-rw-r--r--tests/cxx/macro_defined_by_includer-prefix.h11
-rw-r--r--tests/cxx/macro_defined_by_includer-xmacro.h12
-rw-r--r--tests/cxx/macro_defined_by_includer.cc89
-rw-r--r--tests/cxx/macro_location-byteswap.h2
-rw-r--r--tests/cxx/macro_location-d1.h11
-rw-r--r--tests/cxx/macro_location-d2.h44
-rw-r--r--tests/cxx/macro_location-d3.h11
-rw-r--r--tests/cxx/macro_location-d4.h40
-rw-r--r--tests/cxx/macro_location-i3.h12
-rw-r--r--tests/cxx/macro_location-i4.h12
-rw-r--r--tests/cxx/macro_location-i5.h27
-rw-r--r--tests/cxx/macro_location-inet.h12
-rw-r--r--tests/cxx/macro_location.cc42
-rw-r--r--tests/cxx/macro_location.h72
-rw-r--r--tests/cxx/macro_use_expanded_decl-class.h21
-rw-r--r--tests/cxx/macro_use_expanded_decl-macro.h20
-rw-r--r--tests/cxx/macro_use_expanded_decl.cc46
-rw-r--r--tests/cxx/member_expr-d1.h12
-rw-r--r--tests/cxx/member_expr.cc71
-rw-r--r--tests/cxx/ms_inline_asm.cc30
-rw-r--r--tests/cxx/multiple_include_paths.cc44
-rw-r--r--tests/cxx/new_header_path_local.cc31
-rw-r--r--tests/cxx/new_header_path_provided.cc31
-rw-r--r--tests/cxx/no_char_traits.cc38
-rw-r--r--tests/cxx/no_comments.cc29
-rw-r--r--tests/cxx/no_definition.cc29
-rw-r--r--tests/cxx/no_deque.cc24
-rw-r--r--tests/cxx/no_fwd_decl_nested_class-d1.h12
-rw-r--r--tests/cxx/no_fwd_decl_nested_class.cc24
-rw-r--r--tests/cxx/no_fwd_decl_std.cc43
-rw-r--r--tests/cxx/no_h_includes_cc-inc.c20
-rw-r--r--tests/cxx/no_h_includes_cc-inc2.c22
-rw-r--r--tests/cxx/no_h_includes_cc.cc28
-rw-r--r--tests/cxx/no_h_includes_cc.h21
-rw-r--r--tests/cxx/non_transitive_include-d1.h17
-rw-r--r--tests/cxx/non_transitive_include-d2.h21
-rw-r--r--tests/cxx/non_transitive_include.cc25
-rw-r--r--tests/cxx/overloaded_class-d1.h15
-rw-r--r--tests/cxx/overloaded_class-i1.h30
-rw-r--r--tests/cxx/overloaded_class.cc33
-rw-r--r--tests/cxx/pch.h10
-rw-r--r--tests/cxx/pch_in_code.cc50
-rw-r--r--tests/cxx/pointer_arith.cc74
-rw-r--r--tests/cxx/pragma_associated-d1.h19
-rw-r--r--tests/cxx/pragma_associated-d2.h19
-rw-r--r--tests/cxx/pragma_associated.cc27
-rw-r--r--tests/cxx/pragma_associated.h19
-rw-r--r--tests/cxx/precomputed_tpl_args-d1.h24
-rw-r--r--tests/cxx/precomputed_tpl_args-i1.h24
-rw-r--r--tests/cxx/precomputed_tpl_args.cc98
-rw-r--r--tests/cxx/prefix_header_attribution-d1.h16
-rw-r--r--tests/cxx/prefix_header_attribution-i1.h15
-rw-r--r--tests/cxx/prefix_header_attribution.cc35
-rw-r--r--tests/cxx/prefix_header_includes-d1.h15
-rw-r--r--tests/cxx/prefix_header_includes-d2.h17
-rw-r--r--tests/cxx/prefix_header_includes-d3.h15
-rw-r--r--tests/cxx/prefix_header_includes-d4.h15
-rw-r--r--tests/cxx/prefix_header_includes-i1.h15
-rw-r--r--tests/cxx/prefix_header_includes_add.cc56
-rw-r--r--tests/cxx/prefix_header_includes_keep.cc50
-rw-r--r--tests/cxx/prefix_header_includes_remove.cc50
-rw-r--r--tests/cxx/prefix_header_operator_new.cc30
-rw-r--r--tests/cxx/public/pch_in_code.h15
-rw-r--r--tests/cxx/re_fwd_decl-d1.h15
-rw-r--r--tests/cxx/re_fwd_decl.cc40
-rw-r--r--tests/cxx/re_fwd_decl.h18
-rw-r--r--tests/cxx/redecls-d1.h15
-rw-r--r--tests/cxx/redecls-d2.h14
-rw-r--r--tests/cxx/redecls.cc33
-rw-r--r--tests/cxx/redecls.h39
-rw-r--r--tests/cxx/remove_fwd_decl_when_including.cc41
-rw-r--r--tests/cxx/self_include.cc24
-rw-r--r--tests/cxx/sizeof_reference.cc106
-rw-r--r--tests/cxx/specialization_needs_decl-d1.h12
-rw-r--r--tests/cxx/specialization_needs_decl.cc33
-rw-r--r--tests/cxx/stl_container_provides_allocator.cc44
-rw-r--r--tests/cxx/subfolder/direct_subfolder.h17
-rw-r--r--tests/cxx/subfolder/indirect_subfolder.h16
-rw-r--r--tests/cxx/system_namespaces-d1.h14
-rw-r--r--tests/cxx/system_namespaces-d2.h14
-rw-r--r--tests/cxx/system_namespaces-d3.h14
-rw-r--r--tests/cxx/system_namespaces.cc42
-rw-r--r--tests/cxx/template_args.cc163
-rw-r--r--tests/cxx/template_specialization-d1.h11
-rw-r--r--tests/cxx/template_specialization-i1.h10
-rw-r--r--tests/cxx/template_specialization-i2.h10
-rw-r--r--tests/cxx/template_specialization.cc55
-rw-r--r--tests/cxx/templated_constructor.cc44
-rw-r--r--tests/cxx/typedef_chain_class.h21
-rw-r--r--tests/cxx/typedef_chain_in_template-d1.h22
-rw-r--r--tests/cxx/typedef_chain_in_template-d2.h20
-rw-r--r--tests/cxx/typedef_chain_in_template-d3.h21
-rw-r--r--tests/cxx/typedef_chain_in_template-d4.h25
-rw-r--r--tests/cxx/typedef_chain_in_template-i1.h16
-rw-r--r--tests/cxx/typedef_chain_in_template.cc61
-rw-r--r--tests/cxx/typedef_chain_no_follow-d1.h12
-rw-r--r--tests/cxx/typedef_chain_no_follow-d2.h21
-rw-r--r--tests/cxx/typedef_chain_no_follow-d3.h23
-rw-r--r--tests/cxx/typedef_chain_no_follow.cc52
-rw-r--r--tests/cxx/typedef_in_template-d1.h15
-rw-r--r--tests/cxx/typedef_in_template-i1.h22
-rw-r--r--tests/cxx/typedef_in_template.cc57
-rw-r--r--tests/cxx/typedefs_and_resugaring-d1.h12
-rw-r--r--tests/cxx/typedefs_and_resugaring.cc57
-rw-r--r--tests/cxx/unused_class_template_ctor-d1.h28
-rw-r--r--tests/cxx/unused_class_template_ctor.cc25
-rw-r--r--tests/cxx/uses_printf-d1.h15
-rw-r--r--tests/cxx/uses_printf.cc28
-rw-r--r--tests/cxx/using_aliased_symbol-alias.h15
-rw-r--r--tests/cxx/using_aliased_symbol-declare.h13
-rw-r--r--tests/cxx/using_aliased_symbol.cc33
-rw-r--r--tests/cxx/using_aliased_symbol_unused.cc28
-rw-r--r--tests/cxx/using_overload-float.h13
-rw-r--r--tests/cxx/using_overload-int.h13
-rw-r--r--tests/cxx/using_overload_multiple.cc31
-rw-r--r--tests/cxx/using_overload_single.cc35
-rw-r--r--tests/cxx/using_specialization.cc36
-rw-r--r--tests/cxx/using_unused-baseclass.h13
-rw-r--r--tests/cxx/using_unused-declare.h13
-rw-r--r--tests/cxx/using_unused.cc32
-rw-r--r--tests/cxx/varargs_and_references.cc51
-rw-r--r--tests/cxx/virtual_tpl_method.cc95
-rw-r--r--third_party.imp25
397 files changed, 51796 insertions, 339 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..23aa6f5
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,3 @@
+BasedOnStyle: Google
+AllowShortBlocksOnASingleLine: false
+AllowShortIfStatementsOnASingleLine: false
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..20e4302
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.pyc
+__pycache__
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..36bb736
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,35 @@
+
+language: cpp
+
+addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ - llvm-toolchain-trusty-5.0
+ packages:
+ - ninja-build
+ - llvm-5.0-dev
+ - libclang-5.0-dev
+ - clang-5.0
+
+before_install:
+ # Install a supported cmake version (>= 3.4.3)
+ - wget -O cmake.sh https://cmake.org/files/v3.10/cmake-3.10.0-rc1-Linux-x86_64.sh
+ - sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
+
+ # Absolute paths to LLVM's root and bin directory
+ - ROOT_PATH=`llvm-config-5.0 --prefix`
+ - BIN_PATH=`llvm-config-5.0 --bindir`
+
+script:
+# Build IWYU
+ - mkdir build
+ - cd build
+ - cmake -GNinja -DIWYU_LLVM_ROOT_PATH=$ROOT_PATH -DCMAKE_C_COMPILER=$BIN_PATH/clang -DCMAKE_CXX_COMPILER=$BIN_PATH/clang++ -DCMAKE_INSTALL_PREFIX=./ ../
+ - ninja install
+
+# Test IWYU
+ - cd ..
+ - python run_iwyu_tests.py -- build/bin/include-what-you-use
+ - python fix_includes_test.py
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..7aad3bd
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,197 @@
+cmake_minimum_required(VERSION 3.4.3)
+
+if( POLICY CMP0048 )
+ # Silence CMP0048 warning about missing project VERSION.
+ cmake_policy(SET CMP0048 NEW)
+endif()
+
+project(include-what-you-use)
+
+if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
+ message(STATUS "IWYU out-of-tree configuration")
+
+ if( DEFINED LLVM_PATH )
+ set(IWYU_LLVM_ROOT_PATH ${LLVM_PATH})
+ message(WARNING "LLVM_PATH is deprecated, use IWYU_LLVM_ROOT_PATH instead.")
+ endif()
+
+ if( DEFINED IWYU_LLVM_INCLUDE_PATH AND DEFINED IWYU_LLVM_LIB_PATH )
+ # User provided include/lib paths, fall through
+ elseif ( DEFINED IWYU_LLVM_ROOT_PATH )
+ # Synthesize include/lib relative to a root.
+ set(IWYU_LLVM_INCLUDE_PATH ${IWYU_LLVM_ROOT_PATH}/include)
+ set(IWYU_LLVM_LIB_PATH ${IWYU_LLVM_ROOT_PATH}/lib)
+ else()
+ # If none provided, fail.
+ message(FATAL_ERROR
+ "Don't know how to find LLVM headers/libraries. "
+ "Use -DIWYU_LLVM_ROOT_PATH=/xyz or both "
+ "-DIWYU_LLVM_INCLUDE_PATH=/xyz/include and -DIWYU_LLVM_LIB_PATH=/xyz/lib")
+ endif()
+
+ include_directories(${IWYU_LLVM_INCLUDE_PATH})
+ link_directories(${IWYU_LLVM_LIB_PATH})
+
+ add_definitions(
+ -D__STDC_LIMIT_MACROS
+ -D__STDC_CONSTANT_MACROS
+ )
+
+ if( MSVC )
+ # Adjust MSVC warning levels.
+ add_definitions(
+ # Ignore security warnings for standard functions.
+ -D_CRT_SECURE_NO_WARNINGS
+ -D_SCL_SECURE_NO_WARNINGS
+
+ # Disabled warnings.
+ -wd4141 # Suppress ''modifier' : used more than once' (because of __forceinline combined with inline)
+ -wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
+ -wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
+ -wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
+ -wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
+ -wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
+ -wd4355 # Suppress ''this' : used in base member initializer list'
+ -wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
+ -wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
+
+ # Promoted warnings.
+ -w14062 # Promote 'enumerator in switch of enum is not handled' to level 1 warning.
+
+ # Promoted warnings to errors.
+ -we4238 # Promote 'nonstandard extension used : class rvalue used as lvalue' to error.
+ )
+ endif()
+
+ if( APPLE )
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
+ endif()
+else()
+ message(STATUS "IWYU in-tree configuration")
+endif()
+
+# Pick up Git revision so we can report it in version information.
+include(FindGit)
+if( GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git" )
+ execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ OUTPUT_VARIABLE IWYU_GIT_REV
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+else()
+ message(STATUS "Warning: IWYU Git version info not found, DO NOT release "
+ "from this build tree!")
+endif()
+add_definitions(-DIWYU_GIT_REV="${IWYU_GIT_REV}")
+
+add_executable(include-what-you-use
+ iwyu.cc
+ iwyu_ast_util.cc
+ iwyu_cache.cc
+ iwyu_driver.cc
+ iwyu_getopt.cc
+ iwyu_globals.cc
+ iwyu_include_picker.cc
+ iwyu_lexer_utils.cc
+ iwyu_location_util.cc
+ iwyu_output.cc
+ iwyu_path_util.cc
+ iwyu_preprocessor.cc
+ iwyu_verrs.cc
+)
+
+if( MINGW )
+ # Work around 'too many sections' error with MINGW/GCC
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
+endif()
+
+if( MSVC )
+ # Disable warnings for IWYU, and disable exceptions in MSVC's STL.
+ add_definitions(
+ -wd4722 # Suppress ''destructor'' : destructor never returns, potential memory leak
+ -D_HAS_EXCEPTIONS=0
+ )
+
+ # Enable bigobj support and sane C++ exception semantics.
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /EHsc")
+
+ # Put project in solution folder
+ set_target_properties(include-what-you-use
+ PROPERTIES FOLDER "Clang executables"
+ )
+else()
+ # Disable RTTI, use C++11 to be compatible with LLVM/Clang libraries.
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -std=c++11")
+endif()
+
+# Clang dependencies.
+target_link_libraries(include-what-you-use
+ clangFrontend
+ clangSerialization
+ clangDriver
+ clangParse
+ clangSema
+ clangAnalysis
+ clangAST
+ clangBasic
+ clangEdit
+ clangLex
+)
+
+# LLVM dependencies.
+target_link_libraries(include-what-you-use
+ LLVMX86AsmParser # MC, MCParser, Support, X86CodeGen, X86Desc, X86Info
+ LLVMX86CodeGen # Analysis, AsmPrinter, CodeGen, Core, MC, Support, Target,
+ # X86AsmPrinter, X86Desc, X86Info, X86Utils
+ LLVMX86Desc # MC, MCDisassembler, Object, Support, X86AsmPrinter, X86Info
+ LLVMX86AsmPrinter # MC, Support, X86Utils
+ LLVMX86Info # Support
+ LLVMX86Utils # Core, Support
+ LLVMCodeGen # Analysis, Core, MC, Scalar, Support, Target, TransformUtils
+ LLVMipo
+ LLVMScalarOpts
+ LLVMInstCombine
+ LLVMTransformUtils
+ LLVMTarget # Analysis, MC, Core, Support
+ LLVMAnalysis # Core, Support
+ LLVMOption # Support
+ LLVMMCDisassembler # MC, Support
+ LLVMMCParser # MC, Support
+ LLVMMC # Object, Support
+ LLVMProfileData # Core, Support, Object
+ LLVMObject # BitReader, Core, Support
+ LLVMBitReader # Core, Support
+ LLVMCore # BinaryFormat, Support
+ LLVMBinaryFormat # Support
+ LLVMSupport # Demangle
+ LLVMDemangle
+)
+
+# Platform dependencies.
+if( WIN32 )
+ target_link_libraries(include-what-you-use
+ shlwapi
+ version # For clangDriver's MSVCToolchain
+ )
+elseif( UNIX )
+ include(FindCurses)
+ include(FindBacktrace)
+
+ target_link_libraries(include-what-you-use
+ pthread
+ z
+ ${Backtrace_LIBRARIES}
+ ${CURSES_LIBRARIES}
+ ${CMAKE_DL_LIBS}
+ )
+else()
+ message(WARNING
+ "Unknown system: ${CMAKE_SYSTEM_NAME}. "
+ "No platform link-dependencies added.")
+endif()
+
+install(TARGETS include-what-you-use RUNTIME DESTINATION bin)
+install(PROGRAMS fix_includes.py iwyu_tool.py DESTINATION bin)
+
+# Install mapping files
+file(GLOB MAPPING_FILES *.imp)
+install(FILES ${MAPPING_FILES} DESTINATION share/include-what-you-use)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e8aaccc
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,62 @@
+## Instructions for Developers ##
+
+
+### Submitting Patches ###
+
+We welcome patches and rely on your contributions to make IWYU smarter.
+
+Use GitHub's [pull request system](https://github.com/include-what-you-use/include-what-you-use/pulls) to submit change requests to the `include-what-you-use/include-what-you-use` repo.
+
+It's usually a good idea to run ideas by the [IWYU mailing list](http://groups.google.com/group/include-what-you-use) to get general agreement on directions before you start hacking.
+
+
+### Running the Tests ###
+
+If fixing a bug in clang, please add a test to the test suite! You can create a file called `whatever.cc` (_not_ .cpp), and, if necessary, `whatever.h`, and `whatever-<extension>.h`. You may be able to get away without adding any `.h` files, and just including `direct.h` -- see, for instance, `tests/remove_fwd_decl_when_including.cc`.
+
+To run the IWYU tests, run
+
+ python run_iwyu_tests.py
+
+It runs one test for each `.cc` file in the `tests/` directory. (We have additional tests in `more_tests/`, but have not yet gotten the testing framework set up for those tests.) The test runner searches for IWYU in the system `PATH` by default.
+
+The output can be a bit hard to read, but if a test fails, the reason why will be listed after the `ERROR:root:Test failed for xxx` line.
+
+You can select individual tests by listing their filename without extension as arguments
+
+ python run_iwyu_tests.py array macro_location
+
+If you don't want to modify your `PATH` you can specify which IWYU executable to use for testing
+
+ python run_iwyu_tests.py -- ./include-what-you-use
+
+(put any test names before '--' and the IWYU path after.)
+
+When fixing `fix_includes.py`, add a test case to `fix_includes_test.py` and run
+
+ python fix_includes_test.py
+
+
+### Debugging ###
+
+It's possible to run include-what-you-use in `gdb`, to debug that way. Another useful tool -- especially in combination with `gdb` -- is to get the verbose include-what-you-use output. See `iwyu_output.h` for a description of the verbose levels. Level 7 is very verbose -- it dumps basically the entire AST as it's being traversed, along with IWYU decisions made as it goes -- but very useful for that:
+
+ env IWYU_VERBOSE=7 make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use 2>&1 > /tmp/iwyu.verbose
+
+
+### A Quick Tour of the Codebase ###
+
+The codebase is strewn with TODOs of known problems, and also language constructs that aren't adequately tested yet. So there's plenty to do! Here's a brief guide through the codebase:
+
+ * `iwyu.cc`: the main file, it includes the logic for deciding when a symbol has been 'used', and whether it's a full use (definition required) or forward-declare use (only a declaration required). It also includes the logic for following uses through template instantiations.
+ * `iwyu_driver.cc`: responsible for creating and configuring a Clang compiler from command-line arguments.
+ * `iwyu_output.cc`: the file that translates from 'uses' into IWYU violations. This has the logic for deciding if a use is covered by an existing `#include` (or is a built-in). It also, as the name suggests, prints the IWYU output.
+ * `iwyu_preprocessor.cc`: handles the preprocessor directives, the `#includes` and `#ifdefs`, to construct the existing include-tree. This is obviously essential for include-what-you-use analysis. This file also handles the IWYU pragma-comments.
+ * `iwyu_include_picker.cc`: this finds canonical `#includes`, handling private->public mappings (like `bits/stl_vector.h` -> `vector`) and symbols with multiple possible #includes (like `NULL`). Additional mappings are maintained in a set of .imp files separately, for easier per-platform/-toolchain customization.
+ * `iwyu_cache.cc`: holds the cache of instantiated templates (may hold other cached info later). This is data that is expensive to compute and may be used more than once.
+ * `iwyu_globals.cc`: holds various global variables. We used to think globals were bad, until we saw how much having this file simplified the code...
+ * `iwyu_*_util(s).h` and `.cc`: utility functions of various types. The most interesting, perhaps, is `iwyu_ast_util.h`, which has routines that make it easier to navigate and analyze the clang AST. There are also some STL helpers, string helpers, filesystem helpers, etc.
+ * `iwyu_verrs.cc`: debug logging for IWYU.
+ * `port.h`: shim header for various non-portable constructs.
+ * `iwyu_getopt.cc`: portability shim for GNU `getopt(_long)`. Custom `getopt(_long)` implementation for Windows.
+ * `fix_includes.py`: the helper script that edits a file based on the IWYU recommendations.
diff --git a/LICENSE.TXT b/LICENSE.TXT
new file mode 100644
index 0000000..995283f
--- /dev/null
+++ b/LICENSE.TXT
@@ -0,0 +1,64 @@
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2010 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+getopt_port include-what-you-use/iwyu_getopt.*
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c1eebba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,167 @@
+# Include What You Use #
+
+[![Build Status](https://travis-ci.org/include-what-you-use/include-what-you-use.svg?branch=master)](https://travis-ci.org/include-what-you-use/include-what-you-use)
+
+For more in-depth documentation, see http://github.com/include-what-you-use/include-what-you-use/tree/master/docs.
+
+
+## Instructions for Users ##
+
+"Include what you use" means this: for every symbol (type, function, variable, or macro) that you use in `foo.cc` (or `foo.cpp`), either `foo.cc` or `foo.h` should include a .h file that exports the declaration of that symbol. (Similarly, for `foo_test.cc`, either `foo_test.cc` or `foo.h` should do the including.) Obviously symbols defined in `foo.cc` itself are excluded from this requirement.
+
+This puts us in a state where every file includes the headers it needs to declare the symbols that it uses. When every file includes what it uses, then it is possible to edit any file and remove unused headers, without fear of accidentally breaking the upwards dependencies of that file. It also becomes easy to automatically track and update dependencies in the source code.
+
+
+### CAVEAT ###
+
+This is alpha quality software -- at best (as of February 2011). It was written to work specifically in the Google source tree, and may make assumptions, or have gaps, that are immediately and embarrassingly evident in other types of code. For instance, we only run this on C++ code, not C or Objective C. Even for Google code, the tool still makes a lot of mistakes.
+
+While we work to get IWYU quality up, we will be stinting new features, and will prioritize reported bugs along with the many existing, known bugs. The best chance of getting a problem fixed is to submit a patch that fixes it (along with a unittest case that verifies the fix)!
+
+
+### How to Build ###
+
+Include-what-you-use makes heavy use of Clang internals, and will occasionally break when Clang is updated. Usually such discrepancies are detected by build bot and fixed promptly.
+
+We support two build configurations: out-of-tree and in-tree.
+
+
+#### Building out-of-tree ####
+
+In an out-of-tree configuration, we assume you already have compiled LLVM and Clang headers and libs somewhere on your filesystem, such as via the `libclang-dev` package.
+
+ * Create a directory for IWYU development, e.g. `iwyu-trunk`
+
+ * Clone the IWYU Git repo:
+
+ iwyu-trunk$ git clone https://github.com/include-what-you-use/include-what-you-use.git
+
+ * Presumably, you'll be building IWYU with a released version of LLVM and Clang, so check out the corresponding branch. For example if you have Clang 3.2 installed, use the `clang_3.2` branch. IWYU `master` tracks LLVM & Clang trunk:
+
+ iwyu-trunk$ cd include-what-you-use
+ iwyu-trunk/include-what-you-use$ git checkout clang_3.2
+ iwyu-trunk/include-what-you-use$ cd ..
+
+ * Create a build root and use CMake to generate a build system linked with LLVM/Clang prebuilts. Note that CMake settings need to match exactly, so you may need to add `-DCMAKE_BUILD_TYPE=Release` or more to the command-line below:
+
+ # This example uses the Makefile generator, but anything should work.
+ iwyu-trunk$ mkdir build && cd build
+ iwyu-trunk/build$ cmake -G "Unix Makefiles" -DIWYU_LLVM_ROOT_PATH=/usr/lib/llvm-3.4 ../include-what-you-use
+
+ * Once CMake has generated a build system, you can invoke it directly from `build`, e.g.
+
+ iwyu-trunk/build$ make
+
+This configuration is more useful if you want to get IWYU up and running quickly without building Clang and LLVM from scratch.
+
+
+#### Building in-tree ####
+
+You will need the Clang and LLVM trees on your system, such as by [checking out](http://clang.llvm.org/get_started.html) their SVN trees (but don't configure or build before you've done the following.)
+
+ * Clone the IWYU Git repo into the Clang source tree:
+
+ llvm/tools/clang/tools$ git clone https://github.com/include-what-you-use/include-what-you-use.git
+
+ * Edit `tools/clang/tools/CMakeLists.txt` and put in `add_subdirectory(include-what-you-use)`
+ * Once this is done, IWYU is recognized and picked up by CMake workflow as described in the Clang Getting Started guide
+
+This configuration is more useful if you're actively developing IWYU against Clang trunk. It's easier to set up correctly, but it requires that you build all of LLVM and Clang.
+
+
+### How to Install ###
+
+If you're building IWYU out-of-tree or installing pre-built binaries, you need to make sure it can find Clang built-in headers (`stdarg.h` and friends.)
+
+Clang's default policy is to look in `path/to/clang-executable/../lib/clang/<clang ver>/include`. So if Clang 3.5.0 is installed in `/usr/bin`, it will search for built-ins in `/usr/lib/clang/3.5.0/include`.
+
+Clang tools have the same policy by default, so in order for IWYU to analyze any non-trivial code, it needs to find Clang's built-ins in `path/to/iwyu/../lib/clang/3.5.0/include` where `3.5.0` is a stand-in for the version of Clang your IWYU was built against.
+
+So for IWYU to function correctly, you need to copy in the Clang headers at a good location before running.
+
+This weirdness is tracked in [issue 100](https://github.com/include-what-you-use/include-what-you-use/issues/100), hopefully we can make this more transparent over time.
+
+
+### How to Run ###
+
+The original design was built for Make, but a number of alternative run modes have come up over the years.
+
+
+#### Plugging into Make ####
+
+The easiest way to run IWYU over your codebase is to run
+
+ make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use
+
+or
+
+ make -k CXX=/path/to/llvm/Release/bin/include-what-you-use
+
+(include-what-you-use always exits with an error code, so the build system knows it didn't build a .o file. Hence the need for `-k`.)
+
+Include-what-you-use only analyzes .cc (or .cpp) files built by `make`, along with their corresponding .h files. If your project has a .h file with no corresponding .cc file, IWYU will ignore it unless you use the `--check_also` switch to add it for analysis together with a .cc file.
+
+
+#### Using with CMake ####
+
+CMake has grown native support for IWYU as of version 3.3. See [their documentation](https://cmake.org/cmake/help/latest/prop_tgt/LANG_INCLUDE_WHAT_YOU_USE.html) for CMake-side details.
+
+The `CMAKE_CXX_INCLUDE_WHAT_YOU_USE` option enables a mode where CMake first compiles a source file, and then runs IWYU on it.
+
+Use it like this:
+
+ mkdir build && cd build
+ CC="clang" CXX="clang++" cmake -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu any iwyu args" ...
+
+or, on Windows systems:
+
+ mkdir build && cd build
+ cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE="path/to/iwyu any iwyu args" -G Ninja ...
+
+The option appears to be separately supported for both C and C++, so use `CMAKE_C_INCLUDE_WHAT_YOU_USE` for C code.
+
+Note that with Microsoft's Visual C++ compiler, IWYU needs the `--driver-mode=cl` argument to understand the MSVC options from CMake.
+
+
+#### Using with a compilation database ####
+
+The `iwyu_tool.py` script predates the native CMake support, and works off the [compilation database format](https://clang.llvm.org/docs/JSONCompilationDatabase.html). For example, CMake generates such a database named `compile_commands.json` with the `CMAKE_EXPORT_COMPILE_COMMANDS` option enabled.
+
+The script's command-line syntax is designed to mimic Clang's LibTooling, but they are otherwise unrelated. It can be used like this:
+
+ mkdir build && cd build
+ CC="clang" CXX="clang++" cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ...
+ iwyu_tool.py -p .
+
+or, on Windows systems:
+
+ mkdir build && cd build
+ cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" -DCMAKE_C_COMPILER="%VCINSTALLDIR%/VC/bin/cl.exe" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja ...
+ python iwyu_tool.py -p .
+
+Unless a source filename is provided, all files in the project will be analyzed.
+
+See `iwyu_tool.py --help` for more options.
+
+
+#### Applying fixes ####
+
+We also include a tool that automatically fixes up your source files based on the IWYU recommendations. This is also alpha-quality software! Here's how to use it (requires python):
+
+ make -k CXX=/path/to/llvm/Debug+Asserts/bin/include-what-you-use 2> /tmp/iwyu.out
+ python fix_includes.py < /tmp/iwyu.out
+
+If you don't like the way `fix_includes.py` munges your `#include` lines, you can control its behavior via flags. `fix_includes.py --help` will give a full list, but these are some common ones:
+
+ * `-b`: Put blank lines between system and Google includes
+ * `--nocomments`: Don't add the 'why' comments next to includes
+
+
+### How to Correct IWYU Mistakes ###
+
+ * If `fix_includes.py` has removed an `#include` you actually need, add it back in with the comment '`// IWYU pragma: keep`' at the end of the `#include` line. Note that the comment is case-sensitive.
+ * If `fix_includes.py` has added an `#include` you don't need, just take it out. We hope to come up with a more permanent way of fixing later.
+ * If `fix_includes.py` has wrongly added or removed a forward-declare, just fix it up manually.
+ * If `fix_includes.py` has suggested a private header file (such as `<bits/stl_vector.h>`) instead of the proper public header file (`<vector>`), you can fix this by inserting a specially crafted comment near top of the private file (assuming you can write to it): '`// IWYU pragma: private, include "the/public/file.h"`'.
+
+Current IWYU pragmas are described in [IWYUPragmas](docs/IWYUPragmas.md).
diff --git a/boost-all-private.imp b/boost-all-private.imp
new file mode 100644
index 0000000..64ce067
--- /dev/null
+++ b/boost-all-private.imp
@@ -0,0 +1,4116 @@
+[
+#grep -r '^ *# *include' boost/ | grep -e "boost/[^:]*/detail/.*hp*:" -e "boost/[^:]*/impl/.*hp*:" | grep -e "\:.*/detail/" -e "\:.*/impl/" | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep -e \\[\"\<boost/ | sort -u
+#remove circular dependencies
+# boost/fusion/container/set/detail/value_of_data_impl.hpp with itself...
+#
+# { include: ["<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp>", private ] },
+# { include: ["<boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private ] },
+#
+# { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/detail/type_list_impl.hpp>", private ] },
+# { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/detail/type_list_impl_no_pts.hpp>", private ] },
+# { include: ["<boost/python/detail/type_list_impl.hpp>", private, "<boost/python/detail/type_list.hpp>", private ] },
+# { include: ["<boost/python/detail/type_list_impl_no_pts.hpp>", private, "<boost/python/detail/type_list.hpp>", private ] },
+
+ { include: ["<boost/accumulators/numeric/detail/function_n.hpp>", private, "<boost/accumulators/numeric/detail/function2.hpp>", private ] },
+ { include: ["<boost/accumulators/numeric/detail/function_n.hpp>", private, "<boost/accumulators/numeric/detail/function3.hpp>", private ] },
+ { include: ["<boost/accumulators/numeric/detail/function_n.hpp>", private, "<boost/accumulators/numeric/detail/function4.hpp>", private ] },
+ { include: ["<boost/algorithm/searching/detail/debugging.hpp>", private, "<boost/algorithm/searching/detail/bm_traits.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/finder_regex.hpp>", private, "<boost/algorithm/string/detail/formatter_regex.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/find_format_store.hpp>", private, "<boost/algorithm/string/detail/find_format_all.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/find_format_store.hpp>", private, "<boost/algorithm/string/detail/find_format.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/replace_storage.hpp>", private, "<boost/algorithm/string/detail/find_format_all.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/replace_storage.hpp>", private, "<boost/algorithm/string/detail/find_format.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/sequence.hpp>", private, "<boost/algorithm/string/detail/replace_storage.hpp>", private ] },
+ { include: ["<boost/algorithm/string/detail/util.hpp>", private, "<boost/algorithm/string/detail/formatter.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/archive_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_archive_impl.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_pointer_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_pointer_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/basic_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/interface_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/interface_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/polymorphic_iarchive_route.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/detail/polymorphic_oarchive_route.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/archive_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_archive_impl.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_pointer_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_pointer_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/basic_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/interface_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/interface_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/polymorphic_iarchive_route.hpp>", private ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/detail/polymorphic_oarchive_route.hpp>", private ] },
+ { include: ["<boost/archive/detail/archive_serializer_map.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/archive_serializer_map.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/archive_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/basic_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/basic_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/basic_pointer_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/basic_pointer_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/basic_serializer_map.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/interface_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/detail/interface_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/content_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/forward_skeleton_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/ignore_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/detail/text_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_iarchive.hpp>", private, "<boost/archive/detail/common_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_iarchive.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_iserializer.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_oarchive.hpp>", private, "<boost/archive/detail/common_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_oarchive.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_oserializer.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_pointer_iserializer.hpp>", private, "<boost/archive/detail/common_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_pointer_iserializer.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_pointer_oserializer.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_serializer.hpp>", private, "<boost/archive/detail/basic_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_serializer.hpp>", private, "<boost/archive/detail/basic_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_serializer.hpp>", private, "<boost/archive/detail/basic_pointer_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/basic_serializer.hpp>", private, "<boost/archive/detail/basic_pointer_oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/check.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/check.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/common_iarchive.hpp>", private, "<boost/mpi/detail/forward_skeleton_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/mpi/detail/ignore_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/detail/auto_link_archive.hpp>", private ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/detail/auto_link_warchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/detail/basic_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/detail/basic_iserializer.hpp>", private ] },
+ { include: ["<boost/archive/detail/interface_iarchive.hpp>", private, "<boost/archive/detail/common_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/interface_iarchive.hpp>", private, "<boost/mpi/detail/forward_skeleton_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/interface_oarchive.hpp>", private, "<boost/archive/detail/common_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/interface_oarchive.hpp>", private, "<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/iserializer.hpp>", private, "<boost/archive/detail/interface_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/iserializer.hpp>", private, "<boost/mpi/detail/forward_skeleton_iarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/oserializer.hpp>", private, "<boost/archive/detail/interface_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/oserializer.hpp>", private, "<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/oserializer.hpp>", private, "<boost/mpi/detail/ignore_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/oserializer.hpp>", private, "<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/mpi/detail/content_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/mpi/detail/text_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/handler_alloc_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/handler_cont_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/handler_invoke_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/addressof.hpp>", private, "<boost/asio/detail/winrt_utils.hpp>", private ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/detail/buffered_stream_storage.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/detail/std_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/atomic_count.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/atomic_count.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/atomic_count.hpp>", private, "<boost/asio/detail/winrt_async_manager.hpp>", private ] },
+ { include: ["<boost/asio/detail/base_from_completion_cond.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/base_from_completion_cond.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/base_from_completion_cond.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/base_from_completion_cond.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/null_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/ssl/detail/read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/ssl/detail/write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/call_stack.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/call_stack.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/call_stack.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/completion_handler.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/completion_handler.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/completion_handler.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/addressof.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/array_fwd.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/array.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/assert.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/base_from_completion_cond.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/buffered_stream_storage.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/buffer_resize_guard.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/call_stack.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/consuming_buffers.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/cstdint.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/date_time_fwd.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/dependent_type.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/descriptor_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/eventfd_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/event.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/function.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/gcc_arm_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/gcc_hppa_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/gcc_sync_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/gcc_x86_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/handler_alloc_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/handler_cont_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/handler_invoke_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/handler_type_requirements.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/impl/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/impl/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/impl/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/impl/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/io_control.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/keyword_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/limits.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/local_free_on_block_exit.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/macos_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/noncopyable.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/null_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/old_win_sdk_compat.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/pipe_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/posix_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactor_fwd.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactor_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/scoped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/shared_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/signal_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/signal_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/socket_holder.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/socket_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/socket_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/solaris_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/std_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/std_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/std_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/std_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/throw_error.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/throw_exception.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/timer_queue_set.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/timer_scheduler_fwd.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/type_traits.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/variadic_templates.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/wait_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/weak_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_async_manager.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_async_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winrt_utils.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/winsock_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/impl/use_future.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/local/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/buffered_handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/io.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/openssl_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/password_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/shutdown_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/stream_core.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/verify_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/detail/write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/impl/context.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/consuming_buffers.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/consuming_buffers.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/consuming_buffers.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/consuming_buffers.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/consuming_buffers.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/detail/chrono_time_traits.hpp>", private ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/date_time_fwd.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/dependent_type.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/dependent_type.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/dependent_type.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/dependent_type.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_ops.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_ops.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_ops.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_ops.hpp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_read_op.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/descriptor_write_op.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/dev_poll_reactor.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/dev_poll_reactor.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/epoll_reactor.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/epoll_reactor.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/eventfd_select_interrupter.hpp>", private, "<boost/asio/detail/select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/event.hpp>", private, "<boost/asio/detail/task_io_service_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/event.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/fd_set_adapter.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/fenced_block.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/gcc_arm_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/gcc_hppa_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/gcc_sync_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/gcc_x86_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_alloc_helpers.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_cont_helpers.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_invoke_helpers.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_tracking.hpp>", private, "<boost/asio/detail/task_io_service_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_tracking.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/hash_map.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/hash_map.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/buffer_sequence_adapter.ipp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/buffer_sequence_adapter.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/descriptor_ops.ipp>", private, "<boost/asio/detail/descriptor_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/descriptor_ops.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/dev_poll_reactor.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/dev_poll_reactor.ipp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/dev_poll_reactor.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/epoll_reactor.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/epoll_reactor.ipp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/epoll_reactor.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/eventfd_select_interrupter.ipp>", private, "<boost/asio/detail/eventfd_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/eventfd_select_interrupter.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/handler_tracking.ipp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/handler_tracking.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/kqueue_reactor.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/kqueue_reactor.ipp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/kqueue_reactor.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/pipe_select_interrupter.ipp>", private, "<boost/asio/detail/pipe_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/pipe_select_interrupter.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_event.ipp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_event.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_mutex.ipp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_mutex.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_thread.ipp>", private, "<boost/asio/detail/posix_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_thread.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_tss_ptr.ipp>", private, "<boost/asio/detail/posix_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/posix_tss_ptr.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_descriptor_service.ipp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_descriptor_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_serial_port_service.ipp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_serial_port_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_socket_service_base.ipp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/reactive_socket_service_base.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/resolver_service_base.ipp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/resolver_service_base.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/select_reactor.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/select_reactor.ipp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/select_reactor.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/service_registry.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/service_registry.ipp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/service_registry.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/signal_set_service.ipp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/signal_set_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/socket_ops.ipp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/socket_ops.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/socket_select_interrupter.ipp>", private, "<boost/asio/detail/socket_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/socket_select_interrupter.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/strand_service.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/strand_service.ipp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/strand_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/task_io_service.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/task_io_service.ipp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/task_io_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/throw_error.ipp>", private, "<boost/asio/detail/throw_error.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/throw_error.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/timer_queue_ptime.ipp>", private, "<boost/asio/detail/timer_queue_ptime.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/timer_queue_ptime.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/timer_queue_set.ipp>", private, "<boost/asio/detail/timer_queue_set.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/timer_queue_set.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_event.ipp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_event.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_handle_service.ipp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_handle_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_io_service.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_io_service.ipp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_io_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_serial_port_service.ipp>", private, "<boost/asio/detail/win_iocp_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_serial_port_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_socket_service_base.ipp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_iocp_socket_service_base.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_mutex.ipp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_mutex.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_object_handle_service.ipp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_object_handle_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winrt_ssocket_service_base.ipp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winrt_ssocket_service_base.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winrt_timer_scheduler.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winrt_timer_scheduler.ipp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winrt_timer_scheduler.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winsock_init.ipp>", private, "<boost/asio/detail/winsock_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/winsock_init.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_static_mutex.ipp>", private, "<boost/asio/detail/win_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_static_mutex.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_thread.ipp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_thread.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_tss_ptr.ipp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/impl/win_tss_ptr.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/detail/keyword_tss_ptr.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/kqueue_reactor.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/kqueue_reactor.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/buffer_resize_guard.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/consuming_buffers.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/macos_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/mutex.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/call_stack.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/handler_alloc_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/keyword_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/local_free_on_block_exit.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/null_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/null_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/null_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/null_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/null_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/object_pool.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/posix_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/scoped_lock.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/socket_holder.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/std_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/std_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/std_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/std_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/thread_info_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_event.hpp>", private, "<boost/asio/detail/event.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_mutex.hpp>", private, "<boost/asio/detail/mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_reactor.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_signal_blocker.hpp>", private, "<boost/asio/detail/signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_static_mutex.hpp>", private, "<boost/asio/detail/static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_thread.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/null_tss_ptr.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/object_pool.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/object_pool.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/old_win_sdk_compat.hpp>", private, "<boost/asio/detail/socket_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/reactor_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/signal_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/wait_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/operation.hpp>", private, "<boost/asio/detail/winrt_async_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/task_io_service_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/task_io_service_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/op_queue.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pipe_select_interrupter.hpp>", private, "<boost/asio/detail/select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/base_from_completion_cond.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/buffered_stream_storage.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/buffer_resize_guard.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/call_stack.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/chrono_time_traits.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/consuming_buffers.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/dependent_type.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/descriptor_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/eventfd_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/gcc_arm_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/gcc_hppa_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/gcc_sync_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/gcc_x86_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/handler_alloc_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/handler_cont_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/handler_invoke_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/impl/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/io_control.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/keyword_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/local_free_on_block_exit.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/macos_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/noncopyable.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/null_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/object_pool.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/old_win_sdk_compat.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/pipe_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/posix_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactor_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/scoped_lock.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/scoped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/signal_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/signal_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/socket_holder.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/socket_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/socket_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/solaris_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/std_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/std_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/std_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/std_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/task_io_service_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/task_io_service_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/thread_info_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/throw_error.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/timer_queue_ptime.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/timer_queue_set.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/wait_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_iocp_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_async_manager.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_async_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winrt_utils.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/winsock_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/serial_port_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/use_future.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/impl/address.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/impl/address_v4.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/impl/address_v6.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/impl/basic_endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/local/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/buffered_handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/io.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/password_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/shutdown_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/stream_core.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/verify_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/detail/write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/impl/context.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_event.hpp>", private, "<boost/asio/detail/event.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_fd_set_adapter.hpp>", private, "<boost/asio/detail/fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_mutex.hpp>", private, "<boost/asio/detail/mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_signal_blocker.hpp>", private, "<boost/asio/detail/signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_static_mutex.hpp>", private, "<boost/asio/detail/static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_thread.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/posix_tss_ptr.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/base_from_completion_cond.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/bind_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/buffered_stream_storage.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/buffer_resize_guard.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/call_stack.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/chrono_time_traits.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/completion_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/consuming_buffers.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/dependent_type.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/descriptor_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/eventfd_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/gcc_arm_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/gcc_hppa_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/gcc_sync_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/gcc_x86_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/handler_alloc_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/handler_cont_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/handler_invoke_helpers.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/impl/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/io_control.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/keyword_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/local_free_on_block_exit.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/macos_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/noncopyable.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/null_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/object_pool.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/old_win_sdk_compat.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/pipe_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_signal_blocker.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/posix_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactor_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/scoped_lock.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/scoped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/service_registry.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/signal_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/signal_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/socket_holder.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/socket_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/socket_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/solaris_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/std_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/std_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/std_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/std_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/task_io_service_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/task_io_service_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/thread_info_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/throw_error.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/timer_queue_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/timer_queue_ptime.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/timer_queue_set.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/wait_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_handle_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_iocp_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_async_manager.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_async_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winrt_utils.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/winsock_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/detail/wrapped_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/buffered_read_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/buffered_write_stream.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/serial_port_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/use_future.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/impl/address.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/impl/address_v4.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/impl/address_v6.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/impl/basic_endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/local/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/buffered_handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/io.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/password_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/shutdown_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/stream_core.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/verify_callback.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/detail/write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/impl/context.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_descriptor_service.hpp>", private, "<boost/asio/detail/reactive_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_null_buffers_op.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_null_buffers_op.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_null_buffers_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_accept_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_connect_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_connect_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_recv_op.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_send_op.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_sendto_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactive_socket_service_base.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_fwd.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_fwd.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/reactive_descriptor_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/descriptor_read_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/descriptor_write_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/reactor_op_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op_queue.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/reactor_op_queue.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/resolve_endpoint_op.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/resolve_op.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/resolver_service_base.hpp>", private, "<boost/asio/detail/resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/null_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/null_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/posix_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/posix_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/std_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/std_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_lock.hpp>", private, "<boost/asio/detail/win_static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_ptr.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_ptr.hpp>", private, "<boost/asio/detail/strand_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/scoped_ptr.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_interrupter.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_interrupter.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_interrupter.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_interrupter.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_reactor.hpp>", private, "<boost/asio/detail/reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/select_reactor.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/service_registry.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/shared_ptr.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/shared_ptr.hpp>", private, "<boost/asio/impl/spawn.hpp>", private ] },
+ { include: ["<boost/asio/detail/shared_ptr.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/detail/signal_handler.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/signal_op.hpp>", private, "<boost/asio/detail/signal_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/signal_op.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_holder.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_holder.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_holder.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_holder.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_holder.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_sendto_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/resolve_endpoint_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/socket_holder.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/detail/winrt_utils.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_select_interrupter.hpp>", private, "<boost/asio/detail/select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/buffer_sequence_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/descriptor_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/hash_map.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/io_control.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/local_free_on_block_exit.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/posix_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/reactive_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/reactive_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/signal_set_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/socket_select_interrupter.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_event.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_iocp_operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/detail/win_tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/generic/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/local/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ssl/detail/openssl_types.hpp>", private ] },
+ { include: ["<boost/asio/detail/solaris_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/static_mutex.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/static_mutex.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/detail/std_event.hpp>", private, "<boost/asio/detail/event.hpp>", private ] },
+ { include: ["<boost/asio/detail/std_mutex.hpp>", private, "<boost/asio/detail/mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/std_static_mutex.hpp>", private, "<boost/asio/detail/static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/std_thread.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/task_io_service.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/task_io_service_operation.hpp>", private, "<boost/asio/detail/operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/task_io_service_operation.hpp>", private, "<boost/asio/detail/task_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread.hpp>", private, "<boost/asio/detail/resolver_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread_info_base.hpp>", private, "<boost/asio/detail/task_io_service_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/thread_info_base.hpp>", private, "<boost/asio/detail/win_iocp_thread_info.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/detail/null_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/detail/wince_thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/connect.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/read_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/read.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/read_until.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/write_at.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/impl/write.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ip/impl/address.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ip/impl/address_v4.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ip/impl/address_v6.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ip/impl/basic_endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ssl/impl/context.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/ip/detail/socket_option.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/timer_queue_set.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_base.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue.hpp>", private, "<boost/asio/detail/timer_queue_ptime.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_queue_set.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_scheduler_fwd.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/timer_scheduler.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/tss_ptr.hpp>", private, "<boost/asio/detail/call_stack.hpp>", private ] },
+ { include: ["<boost/asio/detail/tss_ptr.hpp>", private, "<boost/asio/detail/handler_tracking.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_handler.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_handler.hpp>", private, "<boost/asio/detail/win_object_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/deadline_timer_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/dev_poll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/epoll_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/kqueue_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/select_reactor.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/timer_queue.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/wait_handler.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/wait_op.hpp>", private, "<boost/asio/detail/winrt_timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/weak_ptr.hpp>", private, "<boost/asio/detail/socket_ops.hpp>", private ] },
+ { include: ["<boost/asio/detail/wince_thread.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_event.hpp>", private, "<boost/asio/detail/event.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_fd_set_adapter.hpp>", private, "<boost/asio/detail/fd_set_adapter.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_fenced_block.hpp>", private, "<boost/asio/detail/fenced_block.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_handle_read_op.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_handle_service.hpp>", private, "<boost/asio/detail/win_iocp_serial_port_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_handle_write_op.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/detail/win_iocp_handle_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_io_service.hpp>", private, "<boost/asio/impl/io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_null_buffers_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_operation.hpp>", private, "<boost/asio/detail/operation.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_operation.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_overlapped_op.hpp>", private, "<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_recvfrom_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_recvmsg_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_recv_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_send_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_send_op.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service_base.hpp>", private, "<boost/asio/detail/win_iocp_socket_accept_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service_base.hpp>", private, "<boost/asio/detail/win_iocp_socket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_iocp_thread_info.hpp>", private, "<boost/asio/detail/win_iocp_io_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_mutex.hpp>", private, "<boost/asio/detail/mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_manager.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_manager.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_op.hpp>", private, "<boost/asio/detail/winrt_async_manager.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_op.hpp>", private, "<boost/asio/detail/winrt_resolve_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_op.hpp>", private, "<boost/asio/detail/winrt_socket_connect_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_op.hpp>", private, "<boost/asio/detail/winrt_socket_recv_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_async_op.hpp>", private, "<boost/asio/detail/winrt_socket_send_op.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_resolve_op.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_socket_connect_op.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_socket_recv_op.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_socket_send_op.hpp>", private, "<boost/asio/detail/winrt_ssocket_service_base.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_ssocket_service_base.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_timer_scheduler.hpp>", private, "<boost/asio/detail/timer_scheduler.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_utils.hpp>", private, "<boost/asio/detail/winrt_resolver_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winrt_utils.hpp>", private, "<boost/asio/detail/winrt_ssocket_service.hpp>", private ] },
+ { include: ["<boost/asio/detail/winsock_init.hpp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_static_mutex.hpp>", private, "<boost/asio/detail/static_mutex.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_thread.hpp>", private, "<boost/asio/detail/thread.hpp>", private ] },
+ { include: ["<boost/asio/detail/win_tss_ptr.hpp>", private, "<boost/asio/detail/tss_ptr.hpp>", private ] },
+ { include: ["<boost/asio/generic/detail/impl/endpoint.ipp>", private, "<boost/asio/generic/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/generic/detail/impl/endpoint.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/impl/error.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/impl/handler_alloc_hook.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/impl/io_service.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/impl/serial_port_base.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ip/detail/impl/endpoint.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ip/detail/impl/endpoint.ipp>", private, "<boost/asio/ip/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/ip/impl/address.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ip/impl/address_v4.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ip/impl/address_v6.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ip/impl/host_name.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/local/detail/impl/endpoint.ipp>", private, "<boost/asio/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/local/detail/impl/endpoint.ipp>", private, "<boost/asio/local/detail/endpoint.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/buffered_handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/handshake_op.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/io.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/read_op.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/shutdown_op.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/stream_core.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/engine.hpp>", private, "<boost/asio/ssl/detail/write_op.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/impl/engine.ipp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/impl/engine.ipp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/impl/openssl_init.ipp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/impl/openssl_init.ipp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_init.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/detail/openssl_init.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/old/detail/openssl_operation.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/stream_core.hpp>", private, "<boost/asio/ssl/detail/io.hpp>", private ] },
+ { include: ["<boost/asio/ssl/detail/verify_callback.hpp>", private, "<boost/asio/ssl/detail/engine.hpp>", private ] },
+ { include: ["<boost/asio/ssl/impl/context.ipp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ssl/impl/error.ipp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ssl/impl/rfc2818_verification.ipp>", private, "<boost/asio/ssl/impl/src.hpp>", private ] },
+ { include: ["<boost/asio/ssl/old/detail/openssl_operation.hpp>", private, "<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/cas128strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/cas32strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/cas32weak.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/cas64strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/cas64strong-ptr.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-alpha.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-armv6plus.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-atomic.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-ppc.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-sparcv9.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/gcc-x86.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/generic-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/linux-arm.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/base.hpp>", private, "<boost/atomic/detail/windows.hpp>", private ] },
+ { include: ["<boost/atomic/detail/builder.hpp>", private, "<boost/atomic/detail/gcc-alpha.hpp>", private ] },
+ { include: ["<boost/atomic/detail/builder.hpp>", private, "<boost/atomic/detail/generic-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas128strong.hpp>", private, "<boost/atomic/detail/gcc-x86.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas32strong.hpp>", private, "<boost/atomic/detail/gcc-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas32weak.hpp>", private, "<boost/atomic/detail/gcc-armv6plus.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas32weak.hpp>", private, "<boost/atomic/detail/linux-arm.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas64strong.hpp>", private, "<boost/atomic/detail/gcc-x86.hpp>", private ] },
+ { include: ["<boost/atomic/detail/cas64strong.hpp>", private, "<boost/atomic/detail/windows.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/base.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/cas128strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/cas32strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/cas32weak.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/cas64strong.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/cas64strong-ptr.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-alpha.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-armv6plus.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-atomic.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-ppc.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-sparcv9.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/gcc-x86.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/generic-cas.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/interlocked.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/link.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/linux-arm.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/lockpool.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/type-classification.hpp>", private ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/detail/windows.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-alpha.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-armv6plus.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-atomic.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-cas.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-ppc.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-sparcv9.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/gcc-x86.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/interlocked.hpp>", private, "<boost/atomic/detail/windows.hpp>", private ] },
+ { include: ["<boost/atomic/detail/link.hpp>", private, "<boost/atomic/detail/lockpool.hpp>", private ] },
+ { include: ["<boost/atomic/detail/linux-arm.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/atomic/detail/lockpool.hpp>", private, "<boost/atomic/detail/base.hpp>", private ] },
+ { include: ["<boost/atomic/detail/windows.hpp>", private, "<boost/atomic/detail/platform.hpp>", private ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/detail/is_set_type_of.hpp>", private ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/detail/map_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/relation/detail/metadata_access_builder.hpp>", private ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/relation/detail/mutant.hpp>", private ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/relation/detail/static_access_builder.hpp>", private ] },
+ { include: ["<boost/bimap/detail/is_set_type_of.hpp>", private, "<boost/bimap/detail/manage_additional_parameters.hpp>", private ] },
+ { include: ["<boost/bimap/detail/is_set_type_of.hpp>", private, "<boost/bimap/detail/manage_bimap_key.hpp>", private ] },
+ { include: ["<boost/bimap/detail/manage_additional_parameters.hpp>", private, "<boost/bimap/detail/bimap_core.hpp>", private ] },
+ { include: ["<boost/bimap/detail/manage_bimap_key.hpp>", private, "<boost/bimap/detail/bimap_core.hpp>", private ] },
+ { include: ["<boost/bimap/detail/map_view_iterator.hpp>", private, "<boost/bimap/detail/bimap_core.hpp>", private ] },
+ { include: ["<boost/bimap/detail/map_view_iterator.hpp>", private, "<boost/bimap/detail/map_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/detail/modifier_adaptor.hpp>", private, "<boost/bimap/detail/map_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/detail/modifier_adaptor.hpp>", private, "<boost/bimap/detail/set_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/detail/set_view_iterator.hpp>", private, "<boost/bimap/detail/bimap_core.hpp>", private ] },
+ { include: ["<boost/bimap/detail/set_view_iterator.hpp>", private, "<boost/bimap/detail/set_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/detail/map_view_iterator.hpp>", private ] },
+ { include: ["<boost/bimap/relation/detail/mutant.hpp>", private, "<boost/bimap/relation/detail/to_mutable_relation_functor.hpp>", private ] },
+ { include: ["<boost/bimap/relation/detail/static_access_builder.hpp>", private, "<boost/bimap/detail/map_view_iterator.hpp>", private ] },
+ { include: ["<boost/bimap/relation/detail/to_mutable_relation_functor.hpp>", private, "<boost/bimap/detail/map_view_base.hpp>", private ] },
+ { include: ["<boost/bimap/relation/detail/to_mutable_relation_functor.hpp>", private, "<boost/bimap/detail/set_view_base.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/mac/chrono.hpp>", private, "<boost/chrono/detail/inlined/chrono.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp>", private, "<boost/chrono/detail/inlined/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/mac/thread_clock.hpp>", private, "<boost/chrono/detail/inlined/thread_clock.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/posix/chrono.hpp>", private, "<boost/chrono/detail/inlined/chrono.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp>", private, "<boost/chrono/detail/inlined/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/posix/thread_clock.hpp>", private, "<boost/chrono/detail/inlined/mac/thread_clock.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/posix/thread_clock.hpp>", private, "<boost/chrono/detail/inlined/thread_clock.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/win/chrono.hpp>", private, "<boost/chrono/detail/inlined/chrono.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/win/process_cpu_clocks.hpp>", private, "<boost/chrono/detail/inlined/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/chrono/detail/inlined/win/thread_clock.hpp>", private, "<boost/chrono/detail/inlined/thread_clock.hpp>", private ] },
+ { include: ["<boost/chrono/detail/system.hpp>", private, "<boost/chrono/detail/inlined/chrono.hpp>", private ] },
+ { include: ["<boost/chrono/detail/system.hpp>", private, "<boost/chrono/detail/inlined/thread_clock.hpp>", private ] },
+ { include: ["<boost/concept/detail/backward_compatibility.hpp>", private, "<boost/concept/detail/borland.hpp>", private ] },
+ { include: ["<boost/concept/detail/backward_compatibility.hpp>", private, "<boost/concept/detail/general.hpp>", private ] },
+ { include: ["<boost/concept/detail/backward_compatibility.hpp>", private, "<boost/concept/detail/has_constraints.hpp>", private ] },
+ { include: ["<boost/concept/detail/backward_compatibility.hpp>", private, "<boost/concept/detail/msvc.hpp>", private ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/icl/detail/concept_check.hpp>", private ] },
+ { include: ["<boost/concept/detail/has_constraints.hpp>", private, "<boost/concept/detail/general.hpp>", private ] },
+ { include: ["<boost/concept/detail/has_constraints.hpp>", private, "<boost/concept/detail/msvc.hpp>", private ] },
+ { include: ["<boost/container/detail/adaptive_node_pool_impl.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/allocation_type.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/allocator_version_traits.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/detail/function_detector.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/detail/workaround.hpp>", private ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/allocation_type.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/destroyers.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/function_detector.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/iterators.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/math_functions.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/multiallocation_chain.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/pair.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/pool_common.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/type_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/utilities.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/value_init.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/detail/workaround.hpp>", private ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/container/detail/destroyers.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/destroyers.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/destroyers.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/destroyers.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/math_functions.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/math_functions.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/memory_util.hpp>", private, "<boost/container/detail/utilities.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/pair.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/utilities.hpp>", private ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/detail/version_type.hpp>", private ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/node_alloc_holder.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/node_pool_impl.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/container/detail/pair.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/pair.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/pool_common.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/pool_common.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/iterators.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/pair.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/container/detail/transform_iterator.hpp>", private, "<boost/container/detail/multiallocation_chain.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/iterators.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/multiallocation_chain.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/pair.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/utilities.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/detail/version_type.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/destroyers.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/multiallocation_chain.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/value_init.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/value_init.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/variadic_templates_tools.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/variadic_templates_tools.hpp>", private, "<boost/container/detail/iterators.hpp>", private ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/detail/destroyers.hpp>", private ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/allocation_type.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/destroyers.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/flat_tree.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/iterators.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/pair.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/value_init.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/container/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/container/detail/workaround.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_arm.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_i386.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_i386_win.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_mips.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_ppc.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_sparc.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_x86_64.hpp>", private ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/detail/fcontext_x86_64_win.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/detail/coroutine_context.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/detail/segmented_stack_allocator.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/detail/stack_tuple.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/detail/standard_stack_allocator.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/arg.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base_resume.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_get.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/detail/coroutine_op.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/detail/holder.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base_resume.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/flags.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/holder.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base_resume.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/holder.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/holder.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/holder.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/holder.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v1/detail/coroutine_get.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/stack_tuple.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/stack_tuple.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/stack_tuple.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/trampoline.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/trampoline.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/detail/trampoline.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/arg.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base_resume.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/arg.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/arg.hpp>", private, "<boost/coroutine/v1/detail/coroutine_op.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_base.hpp>", private, "<boost/coroutine/v1/detail/coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_base.hpp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_base_resume.hpp>", private, "<boost/coroutine/v1/detail/coroutine_base.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_result_0.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_result_1.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_result_arity.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_void_0.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_void_1.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object_void_arity.ipp>", private, "<boost/coroutine/v1/detail/coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private, "<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private ] },
+ { include: ["<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_caller.hpp>", private ] },
+ { include: ["<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private, "<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/auto_space.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/hash_index_node.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/ord_index_node.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/rnd_index_loader.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/rnd_index_node.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/detail/seq_index_node.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/statechart/detail/memory.hpp>", private ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/statechart/detail/state_base.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/asio/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/serialization/detail/shared_ptr_nmt_132.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/statechart/detail/counted_base.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/xpressive/detail/utility/counted_base.hpp>", private ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/xpressive/detail/utility/tracking_ptr.hpp>", private ] },
+ { include: ["<boost/detail/binary_search.hpp>", private, "<boost/python/suite/indexing/detail/indexing_suite_detail.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/lambda/detail/operator_return_type_traits.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/phoenix/stl/algorithm/detail/is_std_list.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/phoenix/stl/algorithm/detail/is_std_map.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/phoenix/stl/algorithm/detail/is_std_set.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/detail/is_std_list.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/detail/is_std_map.hpp>", private ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/detail/is_std_set.hpp>", private ] },
+ { include: ["<boost/detail/endian.hpp>", private, "<boost/math/special_functions/detail/fp_traits.hpp>", private ] },
+ { include: ["<boost/detail/endian.hpp>", private, "<boost/spirit/home/support/detail/endian/endian.hpp>", private ] },
+ { include: ["<boost/detail/endian.hpp>", private, "<boost/spirit/home/support/detail/math/detail/fp_traits.hpp>", private ] },
+ { include: ["<boost/detail/fenv.hpp>", private, "<boost/numeric/interval/detail/c99sub_rounding_control.hpp>", private ] },
+ { include: ["<boost/detail/indirect_traits.hpp>", private, "<boost/iterator/detail/facade_iterator_category.hpp>", private ] },
+ { include: ["<boost/detail/indirect_traits.hpp>", private, "<boost/python/detail/caller.hpp>", private ] },
+ { include: ["<boost/detail/indirect_traits.hpp>", private, "<boost/python/detail/indirect_traits.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/atomic/detail/interlocked.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/interprocess/detail/win32_api.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/log/detail/spin_mutex.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/smart_ptr/detail/atomic_count_win32.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_w32.hpp>", private ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/smart_ptr/detail/spinlock_w32.hpp>", private ] },
+ { include: ["<boost/detail/is_incrementable.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/detail/is_xxx.hpp>", private, "<boost/python/detail/is_xxx.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/algorithm/string/detail/finder.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/algorithm/string/detail/trim.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iostreams/detail/adapter/range_adapter.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/multi_index/detail/safe_mode.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/range/detail/collection_traits_detail.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/qi/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/qi/stream/detail/iterator_source.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/qi/string/detail/tst.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/support/detail/lexer/generate_cpp.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/support/detail/lexer/input.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp>", private ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>", private ] },
+ { include: ["<boost/detail/lightweight_mutex.hpp>", private, "<boost/flyweight/detail/recursive_lw_mutex.hpp>", private ] },
+ { include: ["<boost/detail/lightweight_mutex.hpp>", private, "<boost/multi_index/detail/safe_mode.hpp>", private ] },
+ { include: ["<boost/detail/lightweight_mutex.hpp>", private, "<boost/serialization/detail/shared_count_132.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/adaptive_node_pool_impl.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/advanced_insert_int.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/algorithms.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/allocator_version_traits.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/node_alloc_holder.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/node_pool_impl.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/tree.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/detail/utilities.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/flyweight/detail/flyweight_core.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/geometry/index/detail/varray_detail.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/detail/archive_constructed.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/detail/copy_map.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/detail/scope_guard.hpp>", private ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/detail/seq_index_ops.hpp>", private ] },
+ { include: ["<boost/detail/quick_allocator.hpp>", private, "<boost/serialization/detail/shared_count_132.hpp>", private ] },
+ { include: ["<boost/detail/reference_content.hpp>", private, "<boost/variant/detail/initializer.hpp>", private ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private ] },
+ { include: ["<boost/detail/select_type.hpp>", private, "<boost/unordered/detail/allocate.hpp>", private ] },
+ { include: ["<boost/detail/select_type.hpp>", private, "<boost/unordered/detail/util.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/exception/detail/type_info.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_aix.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_nt.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_pt.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_solaris.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_spin.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_sync.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_w32.hpp>", private ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/spirit/home/support/detail/hold_any.hpp>", private ] },
+ { include: ["<boost/detail/templated_streams.hpp>", private, "<boost/variant/detail/variant_io.hpp>", private ] },
+ { include: ["<boost/detail/utf8_codecvt_facet.hpp>", private, "<boost/archive/detail/utf8_codecvt_facet.hpp>", private ] },
+ { include: ["<boost/detail/utf8_codecvt_facet.hpp>", private, "<boost/filesystem/detail/utf8_codecvt_facet.hpp>", private ] },
+ { include: ["<boost/detail/utf8_codecvt_facet.hpp>", private, "<boost/program_options/detail/utf8_codecvt_facet.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetCurrentProcess.hpp>", private, "<boost/chrono/detail/inlined/win/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetCurrentThread.hpp>", private, "<boost/chrono/detail/inlined/win/thread_clock.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetLastError.hpp>", private, "<boost/chrono/detail/inlined/win/chrono.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetLastError.hpp>", private, "<boost/chrono/detail/inlined/win/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetLastError.hpp>", private, "<boost/chrono/detail/inlined/win/thread_clock.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetProcessTimes.hpp>", private, "<boost/chrono/detail/inlined/win/process_cpu_clocks.hpp>", private ] },
+ { include: ["<boost/detail/winapi/GetThreadTimes.hpp>", private, "<boost/chrono/detail/inlined/win/thread_clock.hpp>", private ] },
+ { include: ["<boost/detail/winapi/time.hpp>", private, "<boost/chrono/detail/inlined/win/chrono.hpp>", private ] },
+ { include: ["<boost/detail/winapi/timers.hpp>", private, "<boost/chrono/detail/inlined/win/chrono.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/archive/detail/iserializer.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/archive/detail/oserializer.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/archive/impl/basic_xml_grammar.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/concept/detail/has_constraints.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/context/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/coroutine/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/flyweight/detail/flyweight_core.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/flyweight/detail/not_placeholder_expr.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/format/detail/config_macros.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/function_types/detail/cv_traits.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/graph/detail/adjacency_list.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/graph/detail/adj_list_edge_iterator.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/graph/detail/read_graphviz_new.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/graph/detail/read_graphviz_spirit.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/adapter/mode_adapter.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/add_facet.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/codecvt_helper.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/config/codecvt.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/config/disable_warnings.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/config/dyn_link.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/config/overload_resolution.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/config/wide_streams.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/default_arg.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/double_object.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/execute.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/forward.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/ios.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/is_dereferenceable.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/is_iterator_range.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iostreams/detail/wrap_unwrap.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iterator/detail/config_def.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/iterator/detail/enable_if.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/lambda/detail/lambda_functors.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/access_specifier.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/base_type.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/msvc_index_specifier.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/node_type.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/prevent_eti.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/safe_ctr_proxy.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/multi_index/detail/unbounded.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/program_options/detail/cmdline.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/program_options/detail/config_file.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/program_options/detail/convert.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/proto/detail/as_expr.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/proto/detail/decltype.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/python/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/python/detail/destroy.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/python/detail/enable_if.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/python/detail/string_literal.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/random/detail/operators.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/range/detail/begin.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/range/detail/end.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/serialization/detail/shared_ptr_132.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/signals2/detail/auto_buffer.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_w32.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/spirit/home/karma/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/spirit/home/karma/numeric/detail/bool_utils.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/spirit/home/support/detail/lexer/parser/tokeniser/num_token.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/spirit/home/support/detail/what_function.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/statechart/detail/rtti_policy.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/statechart/detail/state_base.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/test/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/thread/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/tti/detail/dmem_data.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/tuple/detail/tuple_basic.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/type_traits/detail/cv_traits_impl.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/variant/detail/apply_visitor_binary.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/variant/detail/apply_visitor_unary.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/variant/detail/config.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/variant/detail/move.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/xpressive/detail/core/results_cache.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/xpressive/detail/utility/literals.hpp>", private ] },
+ { include: ["<boost/detail/workaround.hpp>", private, "<boost/xpressive/detail/utility/tracking_ptr.hpp>", private ] },
+ { include: ["<boost/exception/detail/clone_current_exception.hpp>", private, "<boost/exception/detail/exception_ptr.hpp>", private ] },
+ { include: ["<boost/exception/detail/type_info.hpp>", private, "<boost/exception/detail/exception_ptr.hpp>", private ] },
+ { include: ["<boost/exception/detail/type_info.hpp>", private, "<boost/exception/detail/object_hex_dump.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/dyn_perfect_fwd.hpp>", private, "<boost/flyweight/detail/perfect_fwd.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/is_placeholder_expr.hpp>", private, "<boost/flyweight/detail/nested_xxx_if_not_ph.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/perfect_fwd.hpp>", private, "<boost/flyweight/detail/default_value_policy.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/perfect_fwd.hpp>", private, "<boost/flyweight/detail/flyweight_core.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/pp_perfect_fwd.hpp>", private, "<boost/flyweight/detail/perfect_fwd.hpp>", private ] },
+ { include: ["<boost/flyweight/detail/value_tag.hpp>", private, "<boost/flyweight/detail/default_value_policy.hpp>", private ] },
+ { include: ["<boost/format/detail/config_macros.hpp>", private, "<boost/format/detail/compat_workarounds.hpp>", private ] },
+ { include: ["<boost/format/detail/workarounds_gcc-2_95.hpp>", private, "<boost/format/detail/config_macros.hpp>", private ] },
+ { include: ["<boost/format/detail/workarounds_stlport.hpp>", private, "<boost/format/detail/config_macros.hpp>", private ] },
+ { include: ["<boost/functional/hash/detail/float_functions.hpp>", private, "<boost/functional/hash/detail/hash_float.hpp>", private ] },
+ { include: ["<boost/functional/hash/detail/limits.hpp>", private, "<boost/functional/hash/detail/hash_float.hpp>", private ] },
+ { include: ["<boost/function/detail/maybe_include.hpp>", private, "<boost/function/detail/function_iterate.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity10_0.hpp>", private, "<boost/function_types/detail/classifier_impl/arity20_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity10_1.hpp>", private, "<boost/function_types/detail/classifier_impl/arity20_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity20_0.hpp>", private, "<boost/function_types/detail/classifier_impl/arity30_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity20_1.hpp>", private, "<boost/function_types/detail/classifier_impl/arity30_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity30_0.hpp>", private, "<boost/function_types/detail/classifier_impl/arity40_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity30_1.hpp>", private, "<boost/function_types/detail/classifier_impl/arity40_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity40_0.hpp>", private, "<boost/function_types/detail/classifier_impl/arity50_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/classifier_impl/arity40_1.hpp>", private, "<boost/function_types/detail/classifier_impl/arity50_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity10_0.hpp>", private, "<boost/function_types/detail/components_impl/arity20_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity10_1.hpp>", private, "<boost/function_types/detail/components_impl/arity20_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity20_0.hpp>", private, "<boost/function_types/detail/components_impl/arity30_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity20_1.hpp>", private, "<boost/function_types/detail/components_impl/arity30_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity30_0.hpp>", private, "<boost/function_types/detail/components_impl/arity40_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity30_1.hpp>", private, "<boost/function_types/detail/components_impl/arity40_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity40_0.hpp>", private, "<boost/function_types/detail/components_impl/arity50_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/components_impl/arity40_1.hpp>", private, "<boost/function_types/detail/components_impl/arity50_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/cv_traits.hpp>", private, "<boost/function_types/detail/synthesize.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_def.hpp>", private, "<boost/function_types/detail/pp_cc_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_def.hpp>", private, "<boost/function_types/detail/pp_loop.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_def.hpp>", private, "<boost/function_types/detail/pp_retag_default_cc/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_undef.hpp>", private, "<boost/function_types/detail/pp_cc_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_undef.hpp>", private, "<boost/function_types/detail/pp_loop.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/aliases_undef.hpp>", private, "<boost/function_types/detail/pp_retag_default_cc/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/def.hpp>", private, "<boost/function_types/detail/pp_cc_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/def.hpp>", private, "<boost/function_types/detail/pp_loop.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/def.hpp>", private, "<boost/function_types/detail/pp_retag_default_cc/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/def.hpp>", private, "<boost/function_types/detail/pp_tags/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/def.hpp>", private, "<boost/function_types/detail/pp_variate_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/undef.hpp>", private, "<boost/function_types/detail/pp_cc_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/undef.hpp>", private, "<boost/function_types/detail/pp_loop.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/undef.hpp>", private, "<boost/function_types/detail/pp_retag_default_cc/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/encoding/undef.hpp>", private, "<boost/function_types/detail/pp_variate_loop/master.hpp>", private ] },
+ { include: ["<boost/function_types/detail/pp_loop.hpp>", private, "<boost/function_types/detail/classifier.hpp>", private ] },
+ { include: ["<boost/function_types/detail/pp_loop.hpp>", private, "<boost/function_types/detail/synthesize.hpp>", private ] },
+ { include: ["<boost/function_types/detail/pp_retag_default_cc/master.hpp>", private, "<boost/function_types/detail/retag_default_cc.hpp>", private ] },
+ { include: ["<boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp>", private, "<boost/function_types/detail/retag_default_cc.hpp>", private ] },
+ { include: ["<boost/function_types/detail/retag_default_cc.hpp>", private, "<boost/function_types/detail/synthesize.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity10_0.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity20_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity10_1.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity20_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity20_0.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity30_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity20_1.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity30_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity30_0.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity40_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity30_1.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity40_1.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity40_0.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity50_0.hpp>", private ] },
+ { include: ["<boost/function_types/detail/synthesize_impl/arity40_1.hpp>", private, "<boost/function_types/detail/synthesize_impl/arity50_1.hpp>", private ] },
+ { include: ["<boost/fusion/adapted/struct/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/struct/detail/define_struct.hpp>", private ] },
+ { include: ["<boost/fusion/adapted/struct/detail/define_struct.hpp>", private, "<boost/fusion/adapted/struct/detail/define_struct_inline.hpp>", private ] },
+ { include: ["<boost/fusion/adapted/struct/detail/extension.hpp>", private, "<boost/fusion/adapted/adt/detail/extension.hpp>", private ] },
+ { include: ["<boost/fusion/adapted/struct/detail/namespace.hpp>", private, "<boost/fusion/adapted/struct/detail/define_struct.hpp>", private ] },
+ { include: ["<boost/fusion/adapted/struct/detail/namespace.hpp>", private, "<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/query/detail/find_if.hpp>", private, "<boost/fusion/view/filter_view/detail/next_impl.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip10.hpp>", private, "<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip20.hpp>", private, "<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip30.hpp>", private, "<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip40.hpp>", private, "<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip50.hpp>", private, "<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/at_impl.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/begin_impl.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/as_deque.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/build_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque_forward_ctor.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque_initial_size.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque_keyed_values_call.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque_keyed_values.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/limits.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/limits.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/limits.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque10.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque20.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque30.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque40.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque50.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/as_deque.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/as_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque10_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque20_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque30_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque40_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque50_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_fwd.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size10.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size20.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size30.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size40.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size50.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_initial_size.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_initial_size.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values10.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values20.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values30.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values40.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values50.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/preprocessed/deque_keyed_values.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/end_impl.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/is_sequence_impl.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/detail/deque_keyed_values.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/detail/value_at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/deque/detail/value_at_impl.hpp>", private, "<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/deque_tie.hpp>", private, "<boost/fusion/container/generation/detail/pp_deque_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_deque.hpp>", private, "<boost/fusion/container/generation/detail/pp_make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_map.hpp>", private, "<boost/fusion/container/generation/detail/pp_make_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/map_tie.hpp>", private, "<boost/fusion/container/generation/detail/pp_map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie10.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie20.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie30.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie40.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie50.hpp>", private, "<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/build_cons.hpp>", private, "<boost/fusion/container/list/detail/convert_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/list_to_cons_call.hpp>", private, "<boost/fusion/container/list/detail/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list10_fwd.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list10.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list20_fwd.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list20.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list30_fwd.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list30.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list40_fwd.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list40.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list50_fwd.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list50.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons10.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons20.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons30.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons40.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons50.hpp>", private, "<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_to_cons.hpp>", private, "<boost/fusion/container/list/detail/list_to_cons.hpp>", private ] },
+ { include: ["<boost/fusion/container/list/detail/reverse_cons.hpp>", private, "<boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/as_map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/convert.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/as_map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/convert_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/at_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/begin_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/convert_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/convert.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/deref_data_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/deref_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/end_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/key_of_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/limits.hpp>", private, "<boost/fusion/container/generation/detail/pp_map_tie.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/limits.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map_forward_ctor.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/convert.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/convert_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map10.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map20.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map30.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map40.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map50.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/as_map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/as_map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map10_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map10.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map20_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map20.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map30_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map30.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map40_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map40.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map50_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map50.hpp>", private, "<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map_fwd.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/preprocessed/map.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/value_at_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/value_of_data_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/value_of_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/key_of_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/value_of_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/value_of_impl.hpp>", private, "<boost/fusion/container/map/detail/cpp03/value_of_data_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/as_set.hpp>", private, "<boost/fusion/container/set/detail/convert_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/deref_impl.hpp>", private, "<boost/fusion/container/set/detail/deref_data_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set10.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set20.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set30.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set40.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set50.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/as_set.hpp>", private, "<boost/fusion/container/set/detail/as_set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set10_fwd.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set10.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set20_fwd.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set20.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set30_fwd.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set30.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set40_fwd.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set40.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set50_fwd.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set50.hpp>", private, "<boost/fusion/container/set/detail/preprocessed/set.hpp>", private ] },
+ { include: ["<boost/fusion/container/set/detail/value_of_data_impl.hpp>", private, "<boost/fusion/container/set/detail/key_of_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/as_vector.hpp>", private, "<boost/fusion/container/vector/detail/convert_impl.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector10.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector20.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector30.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector40.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector50.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/as_vector.hpp>", private, "<boost/fusion/container/vector/detail/as_vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser10.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser20.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser30.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser40.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser50.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_chooser.hpp>", private, "<boost/fusion/container/vector/detail/vector_n_chooser.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector10_fwd.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector10.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector20_fwd.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector20.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector30_fwd.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector30.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector40_fwd.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector40.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector50_fwd.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vvector50.hpp>", private, "<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/adapt_deref_traits.hpp>", private, "<boost/fusion/view/filter_view/detail/deref_impl.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/adapt_deref_traits.hpp>", private, "<boost/fusion/view/joint_view/detail/deref_impl.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/adapt_value_traits.hpp>", private, "<boost/fusion/view/filter_view/detail/value_of_impl.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/adapt_value_traits.hpp>", private, "<boost/fusion/view/joint_view/detail/value_of_impl.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/segmented_equal_to.hpp>", private, "<boost/fusion/iterator/detail/segmented_iterator.hpp>", private ] },
+ { include: ["<boost/fusion/iterator/detail/segment_sequence.hpp>", private, "<boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp>", private ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp>", private, "<boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp>", private ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_end_impl.hpp>", private, "<boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp>", private ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_end_impl.hpp>", private, "<boost/fusion/sequence/intrinsic/detail/segmented_end.hpp>", private ] },
+ { include: ["<boost/fusion/sequence/io/detail/manip.hpp>", private, "<boost/fusion/sequence/io/detail/in.hpp>", private ] },
+ { include: ["<boost/fusion/sequence/io/detail/manip.hpp>", private, "<boost/fusion/sequence/io/detail/out.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/adapted/std_tuple/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/algorithm/query/detail/count.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/deque/detail/keyed_element.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/list/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/list/detail/value_at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/at_key_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/cpp03/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/cpp03/deref_data_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/cpp03/map.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/map_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/map/detail/value_at_key_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/detail/deref_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/detail/pp_make_deque.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/detail/pp_make_map.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/functional/generation/detail/gen_make_adapter.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/spirit/home/support/detail/make_vector.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/mpl_iterator_category.hpp>", private, "<boost/fusion/adapted/mpl/detail/category_of_impl.hpp>", private ] },
+ { include: ["<boost/fusion/support/detail/segmented_fold_until_impl.hpp>", private, "<boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple10.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple20.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple30.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple40.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple50.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple10_fwd.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple10.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple20_fwd.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple20.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple30_fwd.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple30.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple40_fwd.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple40.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple50_fwd.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple50.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie10.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie20.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie30.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie40.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie50.hpp>", private, "<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp>", private, "<boost/fusion/view/iterator_range/detail/segments_impl.hpp>", private ] },
+ { include: ["<boost/fusion/view/transform_view/detail/apply_transform_result.hpp>", private, "<boost/fusion/view/transform_view/detail/at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/view/transform_view/detail/apply_transform_result.hpp>", private, "<boost/fusion/view/transform_view/detail/deref_impl.hpp>", private ] },
+ { include: ["<boost/fusion/view/transform_view/detail/apply_transform_result.hpp>", private, "<boost/fusion/view/transform_view/detail/value_at_impl.hpp>", private ] },
+ { include: ["<boost/fusion/view/transform_view/detail/apply_transform_result.hpp>", private, "<boost/fusion/view/transform_view/detail/value_of_impl.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_values.hpp>", private, "<boost/geometry/algorithms/detail/assign_box_corners.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_values.hpp>", private, "<boost/geometry/algorithms/detail/assign_indexed_point.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/convert_point_to_point.hpp>", private, "<boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/convert_point_to_point.hpp>", private, "<boost/geometry/algorithms/detail/point_on_border.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/detail/overlay/append_no_duplicates.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/detail/point_on_border.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/for_each_range.hpp>", private, "<boost/geometry/multi/algorithms/detail/for_each_range.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/get_left_turns.hpp>", private, "<boost/geometry/algorithms/detail/occupation_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private, "<boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/add_rings.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/append_no_duplicates.hpp>", private, "<boost/geometry/algorithms/detail/overlay/clip_linestring.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/append_no_duplicates.hpp>", private, "<boost/geometry/algorithms/detail/overlay/follow.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp>", private, "<boost/geometry/algorithms/detail/overlay/copy_segments.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/assign_parents.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/calculate_distance_policy.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/check_enrich.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/clip_linestring.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/convert_ring.hpp>", private, "<boost/geometry/algorithms/detail/overlay/add_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>", private, "<boost/geometry/algorithms/detail/overlay/handle_tangencies.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/copy_segment_point.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segments.hpp>", private, "<boost/geometry/algorithms/detail/overlay/follow.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segments.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/copy_segments.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/copy_segments.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private, "<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/enrichment_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traversal_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/follow.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_relative_order.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_ring.hpp>", private, "<boost/geometry/algorithms/detail/overlay/add_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_ring.hpp>", private, "<boost/geometry/algorithms/detail/overlay/assign_parents.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_ring.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/get_ring.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/handle_tangencies.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/msm_state.hpp>", private, "<boost/geometry/algorithms/detail/overlay/visit_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/overlay_type.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/overlay_type.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/overlay_type.hpp>", private, "<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/ring_properties.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/ring_properties.hpp>", private, "<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traversal_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/traversal_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/follow.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/handle_tangencies.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traversal_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/turn_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traverse.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/visit_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/visit_info.hpp>", private, "<boost/geometry/algorithms/detail/overlay/traversal_info.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/partition.hpp>", private, "<boost/geometry/algorithms/detail/overlay/assign_parents.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/partition.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/partition.hpp>", private, "<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp>", private, "<boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/algorithms/detail/overlay/follow.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/algorithms/detail/overlay/ring_properties.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/multi/algorithms/detail/point_on_border.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/check_enrich.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/convert_ring.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_ring.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/handle_tangencies.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/overlay/select_rings.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/ring_identifier.hpp>", private, "<boost/geometry/algorithms/detail/sections/sectionalize.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/sections/range_by_section.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/sections/range_by_section.hpp>", private, "<boost/geometry/multi/algorithms/detail/sections/range_by_section.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/sections/sectionalize.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/algorithms/detail/sections/sectionalize.hpp>", private, "<boost/geometry/multi/algorithms/detail/sections/sectionalize.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/bounds.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/comparable_distance_centroid.hpp>", private, "<boost/geometry/index/detail/distance_predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/comparable_distance_far.hpp>", private, "<boost/geometry/index/detail/distance_predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/comparable_distance_near.hpp>", private, "<boost/geometry/index/detail/distance_predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/algorithms/intersection_content.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/algorithms/union_content.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/rtree/linear/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/insert.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/content.hpp>", private, "<boost/geometry/index/detail/rtree/visitors/insert.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/diff_abs.hpp>", private, "<boost/geometry/index/detail/algorithms/comparable_distance_centroid.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/diff_abs.hpp>", private, "<boost/geometry/index/detail/algorithms/comparable_distance_far.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/diff_abs.hpp>", private, "<boost/geometry/index/detail/algorithms/minmaxdist.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/intersection_content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/intersection_content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/margin.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/path_intersection.hpp>", private, "<boost/geometry/index/detail/distance_predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/segment_intersection.hpp>", private, "<boost/geometry/index/detail/algorithms/path_intersection.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/smallest_for_indexable.hpp>", private, "<boost/geometry/index/detail/algorithms/minmaxdist.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/sum_for_indexable.hpp>", private, "<boost/geometry/index/detail/algorithms/comparable_distance_centroid.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/sum_for_indexable.hpp>", private, "<boost/geometry/index/detail/algorithms/comparable_distance_far.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/sum_for_indexable.hpp>", private, "<boost/geometry/index/detail/algorithms/comparable_distance_near.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/sum_for_indexable.hpp>", private, "<boost/geometry/index/detail/algorithms/minmaxdist.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/union_content.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/union_content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/algorithms/union_content.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/assert.hpp>", private, "<boost/geometry/index/detail/pushable_array.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/assert.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/linear/redistribute_elements.hpp>", private, "<boost/geometry/index/detail/rtree/linear/linear.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/auto_deallocator.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/concept.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/dynamic_visitor.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/linear/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/detail/rtree/utilities/are_levels_ok.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/pairs.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/static_visitor.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/quadratic.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/rstar.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/rstar/insert.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/rstar.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/rstar.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/destroy.hpp>", private, "<boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/insert.hpp>", private, "<boost/geometry/index/detail/rtree/linear/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/insert.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/insert.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/linear/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/quadratic/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/choose_next_node.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/rstar/redistribute_elements.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>", private, "<boost/geometry/index/detail/rtree/visitors/remove.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/tags.hpp>", private, "<boost/geometry/index/detail/distance_predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/tags.hpp>", private, "<boost/geometry/index/detail/predicates.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/varray_detail.hpp>", private, "<boost/geometry/index/detail/varray.hpp>", private ] },
+ { include: ["<boost/geometry/index/detail/varray.hpp>", private, "<boost/geometry/index/detail/rtree/node/node.hpp>", private ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/algorithms/detail/has_self_intersections.hpp>", private ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/range_by_section.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/sectionalize.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/multi/views/detail/range_type.hpp>", private, "<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/views/detail/range_type.hpp>", private, "<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private ] },
+ { include: ["<boost/geometry/views/detail/range_type.hpp>", private, "<boost/geometry/multi/views/detail/range_type.hpp>", private ] },
+ { include: ["<boost/graph/detail/adj_list_edge_iterator.hpp>", private, "<boost/graph/detail/adjacency_list.hpp>", private ] },
+ { include: ["<boost/graph/detail/histogram_sort.hpp>", private, "<boost/graph/detail/compressed_sparse_row_struct.hpp>", private ] },
+ { include: ["<boost/graph/detail/indexed_properties.hpp>", private, "<boost/graph/detail/compressed_sparse_row_struct.hpp>", private ] },
+ { include: ["<boost/graph/detail/shadow_iterator.hpp>", private, "<boost/graph/detail/permutation.hpp>", private ] },
+ { include: ["<boost/graph/parallel/detail/untracked_pair.hpp>", private, "<boost/graph/parallel/detail/property_holders.hpp>", private ] },
+ { include: ["<boost/heap/detail/ordered_adaptor_iterator.hpp>", private, "<boost/heap/detail/mutable_heap.hpp>", private ] },
+ { include: ["<boost/heap/detail/tree_iterator.hpp>", private, "<boost/heap/detail/ordered_adaptor_iterator.hpp>", private ] },
+ { include: ["<boost/icl/detail/associated_value.hpp>", private, "<boost/icl/detail/interval_set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/detail/associated_value.hpp>", private ] },
+ { include: ["<boost/icl/detail/element_comparer.hpp>", private, "<boost/icl/detail/interval_map_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/element_comparer.hpp>", private, "<boost/icl/detail/interval_set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/interval_subset_comparer.hpp>", private, "<boost/icl/detail/interval_map_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/interval_subset_comparer.hpp>", private, "<boost/icl/detail/interval_set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/mapped_reference.hpp>", private, "<boost/icl/detail/element_iterator.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/element_comparer.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/interval_map_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/interval_morphism.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/interval_set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/interval_subset_comparer.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/map_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/detail/subset_comparer.hpp>", private ] },
+ { include: ["<boost/icl/detail/relation_state.hpp>", private, "<boost/icl/detail/interval_map_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/relation_state.hpp>", private, "<boost/icl/detail/interval_set_algo.hpp>", private ] },
+ { include: ["<boost/icl/detail/relation_state.hpp>", private, "<boost/icl/detail/interval_subset_comparer.hpp>", private ] },
+ { include: ["<boost/icl/detail/relation_state.hpp>", private, "<boost/icl/detail/subset_comparer.hpp>", private ] },
+ { include: ["<boost/icl/detail/set_algo.hpp>", private, "<boost/icl/detail/map_algo.hpp>", private ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/allocators/detail/node_tools.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/cast_tags.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/detail/node_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/cast_tags.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/file_locking_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/in_place_interface.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/managed_global_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/min_max.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/multi_segment_services.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/os_file_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/os_thread_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/pointer_type.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/tmp_dir_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/type_traits.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/win32_api.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/workaround.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/detail/bad_weak_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/detail/locks.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/detail/node_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/cast_tags.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/file_locking_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/in_place_interface.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/managed_global_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/min_max.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/multi_segment_services.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/os_file_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/os_thread_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/pointer_type.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/tmp_dir_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/type_traits.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/win32_api.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/workaround.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/detail/bad_weak_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/detail/locks.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/file_locking_helpers.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/in_place_interface.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/in_place_interface.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/intermodule_singleton_common.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/intermodule_singleton_common.hpp>", private, "<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/intermodule_singleton.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/managed_global_memory.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/detail/managed_global_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/detail/managed_global_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/math_functions.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/math_functions.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/math_functions.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/min_max.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/min_max.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/min_max.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/min_max.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/multi_segment_services.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/multi_segment_services.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/multi_segment_services.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/file_locking_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/tmp_dir_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private, "<boost/interprocess/detail/intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/detail/os_thread_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/preprocessor.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/segment_manager_helper.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/detail/file_locking_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/transform_iterator.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/in_place_interface.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/pointer_type.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/variadic_templates_tools.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/detail/atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/detail/os_file_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/detail/os_thread_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private, "<boost/interprocess/detail/intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private, "<boost/interprocess/detail/tmp_dir_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/allocators/detail/node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/allocators/detail/node_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/cast_tags.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/file_locking_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/in_place_interface.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/intermodule_singleton_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/intersegment_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/managed_global_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/managed_memory_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/managed_multi_shared_memory.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/min_max.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/multi_segment_services.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/named_proxy.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/os_file_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/os_thread_functions.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/pointer_type.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/portable_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/robust_emulation.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/segment_manager_helper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/tmp_dir_helpers.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/utilities.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/variadic_templates_tools.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/win32_api.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_device.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/smart_ptr/detail/bad_weak_ptr.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private ] },
+ { include: ["<boost/interprocess/detail/workaround.hpp>", private, "<boost/interprocess/sync/detail/locks.hpp>", private ] },
+ { include: ["<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private, "<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private ] },
+ { include: ["<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private, "<boost/interprocess/allocators/detail/allocator_common.hpp>", private ] },
+ { include: ["<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private, "<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private, "<boost/interprocess/mem_algo/detail/multi_simple_seq_fit.hpp>", private ] },
+ { include: ["<boost/interprocess/smart_ptr/detail/bad_weak_ptr.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/interprocess/smart_ptr/detail/sp_counted_base.hpp>", private, "<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/interprocess/smart_ptr/detail/sp_counted_impl.hpp>", private, "<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/any_node_and_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/common_slist_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/hashtable_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/list_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/slist_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/any_node_and_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/avltree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/clear_on_destructor_base.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/common_slist_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/ebo_functor_holder.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/function_detector.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/generic_hook.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/hashtable_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/has_member_function_callable_with.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/is_stateful_value_traits.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/list_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/mpl.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/parent_from_member.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/rbtree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/slist_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/tree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/detail/workaround.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/any_node_and_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/avltree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/clear_on_destructor_base.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/common_slist_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/ebo_functor_holder.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/function_detector.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/generic_hook.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/has_member_function_callable_with.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/is_stateful_value_traits.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/list_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/mpl.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/parent_from_member.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/rbtree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/slist_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/tree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/detail/workaround.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/function_detector.hpp>", private, "<boost/intrusive/detail/is_stateful_value_traits.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/has_member_function_callable_with.hpp>", private, "<boost/container/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/has_member_function_callable_with.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/is_stateful_value_traits.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/any_node_and_algorithms.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/avltree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/ebo_functor_holder.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/generic_hook.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/hashtable_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/has_member_function_callable_with.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/is_stateful_value_traits.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/rbtree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/transform_iterator.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/tree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/parent_from_member.hpp>", private, "<boost/intrusive/detail/utilities.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/preprocessor.hpp>", private, "<boost/intrusive/detail/has_member_function_callable_with.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/preprocessor.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/detail/rbtree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/detail/generic_hook.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/detail/hashtable_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/detail/rbtree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/detail/slist_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/detail/tree_node.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/workaround.hpp>", private, "<boost/intrusive/detail/has_member_function_callable_with.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/workaround.hpp>", private, "<boost/intrusive/detail/memory_util.hpp>", private ] },
+ { include: ["<boost/intrusive/detail/workaround.hpp>", private, "<boost/intrusive/detail/preprocessor.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/access_control.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/concept_adapter.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/device_adapter.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/filter_adapter.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/mode_adapter.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/non_blocking_adapter.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/output_iterator_adapter.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/range_adapter.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/adapter/range_adapter.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/bool_trait_def.hpp>", private, "<boost/iostreams/detail/is_iterator_range.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/broken_overload_resolution/forward.hpp>", private, "<boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/broken_overload_resolution/forward.hpp>", private, "<boost/iostreams/detail/broken_overload_resolution/stream.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/detail/current_directory.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/detail/adapter/device_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/detail/adapter/filter_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/detail/counted_array.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/codecvt.hpp>", private, "<boost/iostreams/detail/codecvt_helper.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/codecvt.hpp>", private, "<boost/iostreams/detail/codecvt_holder.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/range_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/current_directory.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/is_iterator_range.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/adapter/range_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/current_directory.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/is_iterator_range.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/gcc.hpp>", private, "<boost/iostreams/detail/config/overload_resolution.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/gcc.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/limits.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/limits.hpp>", private, "<boost/iostreams/detail/execute.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/limits.hpp>", private, "<boost/iostreams/detail/forward.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/overload_resolution.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/unreachable_return.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/char_traits.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/config/codecvt.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/fstream.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/ios.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/iostream.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/path.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/detail/absolute_path.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/detail/config/rtl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/detail/current_directory.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/detail/file_handle.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/detail/system_failure.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/current_directory.hpp>", private, "<boost/iostreams/detail/absolute_path.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/double_object.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/double_object.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/detail/wrap_unwrap.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/detail/adapter/range_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/adapter/device_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/adapter/direct_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/adapter/filter_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/adapter/mode_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/adapter/non_blocking_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/buffer.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/counted_array.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/error.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/functional.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/detail/system_failure.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/is_dereferenceable.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/is_iterator_range.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/optional.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/optional.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/push.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/push_params.hpp>", private, "<boost/iostreams/detail/forward.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/push_params.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/resolve.hpp>", private, "<boost/iostreams/detail/push.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/detail/access_control.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/detail/dispatch.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/detail/restrict_impl.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/detail/adapter/concept_adapter.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/streambuf/linked_streambuf.hpp>", private, "<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/system_failure.hpp>", private, "<boost/iostreams/detail/current_directory.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/template_params.hpp>", private, "<boost/iostreams/detail/bool_trait_def.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/translate_int_type.hpp>", private, "<boost/iostreams/detail/streambuf/chainbuf.hpp>", private ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/detail/resolve.hpp>", private ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/detail/enable_if.hpp>", private ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/detail/facade_iterator_category.hpp>", private ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/detail/enable_if.hpp>", private ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/detail/facade_iterator_category.hpp>", private ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/bimap/detail/map_view_iterator.hpp>", private ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/bimap/detail/set_view_iterator.hpp>", private ] },
+ { include: ["<boost/lambda/detail/is_instance_of.hpp>", private, "<boost/lambda/detail/operator_return_type_traits.hpp>", private ] },
+ { include: ["<boost/lambda/detail/is_instance_of.hpp>", private, "<boost/lambda/detail/operators.hpp>", private ] },
+ { include: ["<boost/lambda/detail/lambda_fwd.hpp>", private, "<boost/lambda/detail/lambda_functor_base.hpp>", private ] },
+ { include: ["<boost/lambda/detail/lambda_traits.hpp>", private, "<boost/lambda/detail/lambda_functor_base.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/auto.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/default.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/inline.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/recursive.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/register.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/return.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/this.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/add.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/void.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/auto.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/default.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/inline.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/recursive.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/register.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/return.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/this.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/void.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/auto.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/const.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/default.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/inline.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/recursive.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/register.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/return.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/this.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/facility/remove.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/void.hpp>", private ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/void.hpp>", private, "<boost/local_function/detail/preprocessor/void_list.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/atomic.hpp>", private, "<boost/lockfree/detail/freelist.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/branch_hints.hpp>", private, "<boost/lockfree/detail/tagged_ptr_dcas.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/branch_hints.hpp>", private, "<boost/lockfree/detail/tagged_ptr_ptrcompression.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/parameter.hpp>", private, "<boost/lockfree/detail/freelist.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/prefix.hpp>", private, "<boost/lockfree/detail/tagged_ptr.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/tagged_ptr_dcas.hpp>", private, "<boost/lockfree/detail/tagged_ptr.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/tagged_ptr.hpp>", private, "<boost/lockfree/detail/freelist.hpp>", private ] },
+ { include: ["<boost/lockfree/detail/tagged_ptr_ptrcompression.hpp>", private, "<boost/lockfree/detail/tagged_ptr.hpp>", private ] },
+ { include: ["<boost/log/detail/attr_output_terminal.hpp>", private, "<boost/log/detail/attr_output_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/cleanup_scope_guard.hpp>", private, "<boost/log/detail/format.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/asio_fwd.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/attachable_sstream_buf.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/attribute_get_value_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/attribute_predicate.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/attr_output_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/attr_output_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/cleanup_scope_guard.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/code_conversion.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/custom_terminal_spec.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/date_time_fmt_gen_traits_fwd.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/date_time_format_parser.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/decomposed_time.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/deduce_char_type.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/default_attribute_names.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/embedded_string_type.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/event.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/fake_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/format.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/function_traits.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/id.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/light_function.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/light_rw_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/locking_ptr.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/locks.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/malloc_aligned.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/native_typeof.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/parameter_tools.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/pp_identity.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/process_id.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/setup_config.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/singleton.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/sink_init_helpers.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/snprintf.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/spin_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/tagged_integer.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/thread_id.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/threadsafe_queue.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/thread_specific.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/timestamp.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/trivial_keyword.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/unary_function_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/unhandled_exception_count.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/value_ref_visitation.hpp>", private ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/detail/visible_type.hpp>", private ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/detail/attr_output_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/detail/unary_function_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/date_time_format_parser.hpp>", private, "<boost/log/detail/decomposed_time.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/attachable_sstream_buf.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/attribute_get_value_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/attribute_predicate.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/attr_output_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/attr_output_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/cleanup_scope_guard.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/code_conversion.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/custom_terminal_spec.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/date_time_format_parser.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/decomposed_time.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/deduce_char_type.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/default_attribute_names.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/embedded_string_type.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/event.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/fake_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/format.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/function_traits.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/id.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/light_function.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/light_rw_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/locking_ptr.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/locks.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/malloc_aligned.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/parameter_tools.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/process_id.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/singleton.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/sink_init_helpers.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/snprintf.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/spin_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/tagged_integer.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/thread_id.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/threadsafe_queue.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/thread_specific.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/timestamp.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/trivial_keyword.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/unary_function_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/value_ref_visitation.hpp>", private ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/detail/visible_type.hpp>", private ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/detail/attr_output_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/attachable_sstream_buf.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/attribute_get_value_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/attribute_predicate.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/attr_output_impl.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/attr_output_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/cleanup_scope_guard.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/code_conversion.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/custom_terminal_spec.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/date_time_format_parser.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/decomposed_time.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/deduce_char_type.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/default_attribute_names.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/embedded_string_type.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/event.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/fake_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/format.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/function_traits.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/id.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/light_function.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/light_rw_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/locking_ptr.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/locks.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/malloc_aligned.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/parameter_tools.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/process_id.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/singleton.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/sink_init_helpers.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/snprintf.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/spin_mutex.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/tagged_integer.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/thread_id.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/threadsafe_queue.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/thread_specific.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/timestamp.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/trivial_keyword.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/unary_function_terminal.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/value_ref_visitation.hpp>", private ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/detail/visible_type.hpp>", private ] },
+ { include: ["<boost/log/detail/id.hpp>", private, "<boost/log/detail/process_id.hpp>", private ] },
+ { include: ["<boost/log/detail/id.hpp>", private, "<boost/log/detail/thread_id.hpp>", private ] },
+ { include: ["<boost/log/detail/unhandled_exception_count.hpp>", private, "<boost/log/detail/format.hpp>", private ] },
+ { include: ["<boost/math/bindings/detail/big_lanczos.hpp>", private, "<boost/multiprecision/detail/big_lanczos.hpp>", private ] },
+ { include: ["<boost/math/distributions/detail/hypergeometric_pdf.hpp>", private, "<boost/math/distributions/detail/hypergeometric_cdf.hpp>", private ] },
+ { include: ["<boost/math/distributions/detail/hypergeometric_pdf.hpp>", private, "<boost/math/distributions/detail/hypergeometric_quantile.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/airy_ai_bi_zero.hpp>", private, "<boost/math/special_functions/detail/bessel_jy_zero.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_j0.hpp>", private, "<boost/math/special_functions/detail/bessel_jn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_j0.hpp>", private, "<boost/math/special_functions/detail/bessel_y0.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_j1.hpp>", private, "<boost/math/special_functions/detail/bessel_jn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_j1.hpp>", private, "<boost/math/special_functions/detail/bessel_y1.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_asym.hpp>", private, "<boost/math/special_functions/detail/bessel_jn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_asym.hpp>", private, "<boost/math/special_functions/detail/bessel_jy.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy.hpp>", private, "<boost/math/special_functions/detail/bessel_jn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_series.hpp>", private, "<boost/math/special_functions/detail/bessel_jn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_series.hpp>", private, "<boost/math/special_functions/detail/bessel_jy.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_series.hpp>", private, "<boost/math/special_functions/detail/bessel_yn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_k0.hpp>", private, "<boost/math/special_functions/detail/bessel_kn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_k1.hpp>", private, "<boost/math/special_functions/detail/bessel_kn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_y0.hpp>", private, "<boost/math/special_functions/detail/bessel_yn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/bessel_y1.hpp>", private, "<boost/math/special_functions/detail/bessel_yn.hpp>", private ] },
+ { include: ["<boost/math/special_functions/detail/t_distribution_inv.hpp>", private, "<boost/math/special_functions/detail/ibeta_inverse.hpp>", private ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/detail/meta_utils.hpp>", private ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/detail/meta_utils.hpp>", private ] },
+ { include: ["<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private, "<boost/mpi/detail/text_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/mpi/detail/ignore_oprimitive.hpp>", private, "<boost/mpi/detail/text_skeleton_oarchive.hpp>", private ] },
+ { include: ["<boost/mpi/detail/ignore_skeleton_oarchive.hpp>", private, "<boost/mpi/detail/content_oarchive.hpp>", private ] },
+ { include: ["<boost/mpi/detail/ignore_skeleton_oarchive.hpp>", private, "<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private ] },
+ { include: ["<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private, "<boost/mpi/detail/mpi_datatype_cache.hpp>", private ] },
+ { include: ["<boost/mpi/detail/mpi_datatype_primitive.hpp>", private, "<boost/mpi/detail/content_oarchive.hpp>", private ] },
+ { include: ["<boost/mpi/detail/mpi_datatype_primitive.hpp>", private, "<boost/mpi/detail/mpi_datatype_oarchive.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/detail/safe_mode.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/adl_swap.hpp>", private, "<boost/multi_index/detail/auto_space.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/bucket_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/copy_map.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/index_loader.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/index_matcher.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/rnd_index_loader.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/copy_map.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/hash_index_node.hpp>", private, "<boost/multi_index/detail/bucket_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/header_holder.hpp>", private, "<boost/multi_index/detail/node_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/index_base.hpp>", private, "<boost/multi_index/detail/base_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/index_loader.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/index_matcher.hpp>", private, "<boost/multi_index/detail/index_saver.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/index_node_base.hpp>", private, "<boost/multi_index/detail/node_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/index_saver.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/is_index_list.hpp>", private, "<boost/multi_index/detail/base_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/is_index_list.hpp>", private, "<boost/multi_index/detail/node_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/iter_adaptor.hpp>", private, "<boost/multi_index/detail/safe_mode.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/msvc_index_specifier.hpp>", private, "<boost/multi_index/detail/base_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/msvc_index_specifier.hpp>", private, "<boost/multi_index/detail/node_type.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/node_type.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/auto_space.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/bucket_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/copy_map.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/hash_index_node.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/iter_adaptor.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/ord_index_node.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/rnd_index_loader.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/rnd_index_node.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/detail/seq_index_node.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/rnd_index_node.hpp>", private, "<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private, "<boost/multi_index/detail/rnd_index_loader.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private, "<boost/multi_index/detail/rnd_index_ops.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index/detail/safe_ctr_proxy.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/signals2/detail/auto_buffer.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/seq_index_node.hpp>", private, "<boost/multi_index/detail/seq_index_ops.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/uintptr_type.hpp>", private, "<boost/multi_index/detail/ord_index_node.hpp>", private ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index/detail/index_base.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/default_ops.hpp>", private, "<boost/multiprecision/detail/generic_interconvert.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/et_ops.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/functions/constants.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/functions/pow.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/functions/trig.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/no_et_ops.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/number_base.hpp>", private, "<boost/multiprecision/detail/default_ops.hpp>", private ] },
+ { include: ["<boost/multiprecision/detail/rebind.hpp>", private, "<boost/multiprecision/detail/dynamic_array.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/conversion_traits.hpp>", private, "<boost/numeric/conversion/detail/converter.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/int_float_mixture.hpp>", private, "<boost/numeric/conversion/detail/conversion_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/int_float_mixture.hpp>", private, "<boost/numeric/conversion/detail/is_subranged.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/is_subranged.hpp>", private, "<boost/numeric/conversion/detail/conversion_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/conversion_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/converter.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/int_float_mixture.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/is_subranged.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/sign_mixture.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/meta.hpp>", private, "<boost/numeric/conversion/detail/udt_builtin_mixture.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp>", private, "<boost/numeric/conversion/detail/numeric_cast_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp>", private, "<boost/numeric/conversion/detail/numeric_cast_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/sign_mixture.hpp>", private, "<boost/numeric/conversion/detail/conversion_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/sign_mixture.hpp>", private, "<boost/numeric/conversion/detail/is_subranged.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/udt_builtin_mixture.hpp>", private, "<boost/numeric/conversion/detail/conversion_traits.hpp>", private ] },
+ { include: ["<boost/numeric/conversion/detail/udt_builtin_mixture.hpp>", private, "<boost/numeric/conversion/detail/is_subranged.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/bcc_rounding_control.hpp>", private, "<boost/numeric/interval/detail/x86_rounding_control.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/detail/division.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/c99sub_rounding_control.hpp>", private, "<boost/numeric/interval/detail/c99_rounding_control.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/c99sub_rounding_control.hpp>", private, "<boost/numeric/interval/detail/x86_rounding_control.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/detail/division.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/detail/test_input.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/msvc_rounding_control.hpp>", private, "<boost/numeric/interval/detail/x86_rounding_control.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/detail/division.hpp>", private ] },
+ { include: ["<boost/numeric/interval/detail/x86gcc_rounding_control.hpp>", private, "<boost/numeric/interval/detail/x86_rounding_control.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_const.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp>", private, "<boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp>", private, "<boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/util/detail/less_with_sign.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/util/detail/less_with_sign.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_const.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/util/detail/less_with_sign.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp>", private ] },
+ { include: ["<boost/numeric/odeint/util/detail/less_with_sign.hpp>", private, "<boost/numeric/odeint/integrate/detail/integrate_times.hpp>", private ] },
+ { include: ["<boost/numeric/ublas/detail/definitions.hpp>", private, "<boost/numeric/ublas/detail/config.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr_10.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr_20.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr_30.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr_40.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr_50.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/function_ptr.hpp>", private, "<boost/phoenix/bind/detail/function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr_10.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr_20.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr_30.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr_40.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr_50.hpp>", private, "<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/bind/detail/preprocessed/member_function_ptr.hpp>", private, "<boost/phoenix/bind/detail/member_function_ptr.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/phx2_result.hpp>", private, "<boost/phoenix/core/detail/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator_10.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator_20.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator_30.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator_40.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator_50.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_operator.hpp>", private, "<boost/phoenix/core/detail/actor_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of_10.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of_20.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of_30.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of_40.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of_50.hpp>", private, "<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/actor_result_of.hpp>", private, "<boost/phoenix/core/detail/actor_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call_10.hpp>", private, "<boost/phoenix/core/detail/preprocessed/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call_20.hpp>", private, "<boost/phoenix/core/detail/preprocessed/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call_30.hpp>", private, "<boost/phoenix/core/detail/preprocessed/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call_40.hpp>", private, "<boost/phoenix/core/detail/preprocessed/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call_50.hpp>", private, "<boost/phoenix/core/detail/preprocessed/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/call.hpp>", private, "<boost/phoenix/core/detail/call.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval_10.hpp>", private, "<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval_20.hpp>", private, "<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval_30.hpp>", private, "<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval_40.hpp>", private, "<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval_50.hpp>", private, "<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/function_eval.hpp>", private, "<boost/phoenix/core/detail/function_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result_10.hpp>", private, "<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result_20.hpp>", private, "<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result_30.hpp>", private, "<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result_40.hpp>", private, "<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result_50.hpp>", private, "<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/core/detail/preprocessed/phx2_result.hpp>", private, "<boost/phoenix/core/detail/phx2_result.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator_10.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator_20.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator_30.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator_40.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator_50.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_operator.hpp>", private, "<boost/phoenix/function/detail/function_operator.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of_10.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of_20.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of_30.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of_40.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of_50.hpp>", private, "<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/function/detail/preprocessed/function_result_of.hpp>", private, "<boost/phoenix/function/detail/function_result_of.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_10.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_20.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_30.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_40.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_50.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval_10.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval_20.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval_30.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval_40.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval_50.hpp>", private, "<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct_eval.hpp>", private, "<boost/phoenix/object/detail/construct_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/construct.hpp>", private, "<boost/phoenix/object/detail/construct.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_10.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_20.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_30.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_40.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_50.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval_10.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval_20.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval_30.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval_40.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval_50.hpp>", private, "<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new_eval.hpp>", private, "<boost/phoenix/object/detail/new_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/object/detail/preprocessed/new.hpp>", private, "<boost/phoenix/object/detail/new.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen_10.hpp>", private, "<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen_20.hpp>", private, "<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen_30.hpp>", private, "<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen_40.hpp>", private, "<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen_50.hpp>", private, "<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/operator/detail/preprocessed/mem_fun_ptr_gen.hpp>", private, "<boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic_10.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic_20.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic_30.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic_40.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic_50.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/dynamic.hpp>", private, "<boost/phoenix/scope/detail/dynamic.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals_10.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals_20.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals_30.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals_40.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals_50.hpp>", private, "<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/scope/detail/preprocessed/make_locals.hpp>", private, "<boost/phoenix/scope/detail/make_locals.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/catch_push_back.hpp>", private, "<boost/phoenix/statement/detail/catch_push_back.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch_10.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch_20.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch_30.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch_40.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch_50.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/switch.hpp>", private, "<boost/phoenix/statement/detail/switch.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_eval.hpp>", private, "<boost/phoenix/statement/detail/try_catch_eval.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression_10.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression_20.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression_30.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression_40.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression_50.hpp>", private, "<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/statement/detail/preprocessed/try_catch_expression.hpp>", private, "<boost/phoenix/statement/detail/try_catch_expression.hpp>", private ] },
+ { include: ["<boost/phoenix/support/detail/iterate_define.hpp>", private, "<boost/phoenix/support/detail/iterate.hpp>", private ] },
+ { include: ["<boost/phoenix/support/detail/iterate_undef.hpp>", private, "<boost/phoenix/support/detail/iterate.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/check.hpp>", private, "<boost/preprocessor/detail/is_binary.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/check.hpp>", private, "<boost/preprocessor/detail/is_nullary.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/check.hpp>", private, "<boost/preprocessor/detail/is_unary.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/dmc/auto_rec.hpp>", private, "<boost/preprocessor/detail/auto_rec.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/is_binary.hpp>", private, "<boost/tti/detail/dvm_template_params.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/local_function/detail/preprocessor/keyword/facility/is.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/proto/detail/remove_typename.hpp>", private ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/range/detail/microsoft.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/lower1.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward1.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/lower2.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward2.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/lower3.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward3.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/lower4.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward4.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/lower5.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward5.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/upper1.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward1.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/upper2.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward2.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/upper3.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward3.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/upper4.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward4.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/bounds/upper5.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward5.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/finish.hpp>", private, "<boost/preprocessor/iteration/detail/local.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/iter/reverse1.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward1.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/iter/reverse2.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward2.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/iter/reverse3.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward3.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/iter/reverse4.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward4.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/iter/reverse5.hpp>", private, "<boost/preprocessor/iteration/detail/iter/forward5.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/rlocal.hpp>", private, "<boost/preprocessor/iteration/detail/local.hpp>", private ] },
+ { include: ["<boost/preprocessor/iteration/detail/start.hpp>", private, "<boost/preprocessor/iteration/detail/local.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/lower1.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/lower2.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/lower3.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/lower4.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/lower5.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/upper1.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/upper2.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/upper3.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/upper4.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/bounds/upper5.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/finish.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/iteration/detail/start.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/counter.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/slot1.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/slot2.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/slot3.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/slot4.hpp>", private ] },
+ { include: ["<boost/preprocessor/slot/detail/shared.hpp>", private, "<boost/preprocessor/slot/detail/slot5.hpp>", private ] },
+ { include: ["<boost/program_options/detail/convert.hpp>", private, "<boost/program_options/detail/config_file.hpp>", private ] },
+ { include: ["<boost/program_options/detail/convert.hpp>", private, "<boost/program_options/detail/parsers.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/file_parser_error.hpp>", private, "<boost/property_tree/detail/info_parser_error.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/file_parser_error.hpp>", private, "<boost/property_tree/detail/json_parser_error.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/file_parser_error.hpp>", private, "<boost/property_tree/detail/xml_parser_error.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/info_parser_error.hpp>", private, "<boost/property_tree/detail/info_parser_read.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/info_parser_utils.hpp>", private, "<boost/property_tree/detail/info_parser_read.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/info_parser_utils.hpp>", private, "<boost/property_tree/detail/info_parser_write.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/json_parser_error.hpp>", private, "<boost/property_tree/detail/json_parser_read.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/detail/json_parser_read.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/detail/xml_parser_utils.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/detail/xml_parser_writer_settings.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/rapidxml.hpp>", private, "<boost/property_tree/detail/xml_parser_read_rapidxml.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_error.hpp>", private, "<boost/property_tree/detail/xml_parser_read_rapidxml.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_error.hpp>", private, "<boost/property_tree/detail/xml_parser_utils.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_flags.hpp>", private, "<boost/property_tree/detail/xml_parser_read_rapidxml.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_utils.hpp>", private, "<boost/property_tree/detail/xml_parser_read_rapidxml.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_utils.hpp>", private, "<boost/property_tree/detail/xml_parser_write.hpp>", private ] },
+ { include: ["<boost/property_tree/detail/xml_parser_writer_settings.hpp>", private, "<boost/property_tree/detail/xml_parser_utils.hpp>", private ] },
+ { include: ["<boost/proto/context/detail/preprocessed/callable_eval.hpp>", private, "<boost/proto/context/detail/callable_eval.hpp>", private ] },
+ { include: ["<boost/proto/context/detail/preprocessed/default_eval.hpp>", private, "<boost/proto/context/detail/default_eval.hpp>", private ] },
+ { include: ["<boost/proto/context/detail/preprocessed/null_eval.hpp>", private, "<boost/proto/context/detail/null_eval.hpp>", private ] },
+ { include: ["<boost/proto/detail/any.hpp>", private, "<boost/proto/detail/decltype.hpp>", private ] },
+ { include: ["<boost/proto/detail/class_member_traits.hpp>", private, "<boost/proto/detail/decltype.hpp>", private ] },
+ { include: ["<boost/proto/detail/decltype.hpp>", private, "<boost/phoenix/bind/detail/member_variable.hpp>", private ] },
+ { include: ["<boost/proto/detail/deduce_domain_n.hpp>", private, "<boost/proto/detail/deduce_domain.hpp>", private ] },
+ { include: ["<boost/proto/detail/ignore_unused.hpp>", private, "<boost/xpressive/detail/utility/ignore_unused.hpp>", private ] },
+ { include: ["<boost/proto/detail/is_noncopyable.hpp>", private, "<boost/proto/detail/poly_function.hpp>", private ] },
+ { include: ["<boost/proto/detail/memfun_funop.hpp>", private, "<boost/proto/detail/decltype.hpp>", private ] },
+ { include: ["<boost/proto/detail/poly_function_funop.hpp>", private, "<boost/proto/detail/poly_function.hpp>", private ] },
+ { include: ["<boost/proto/detail/poly_function_traits.hpp>", private, "<boost/proto/detail/poly_function.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/and_n.hpp>", private, "<boost/proto/detail/and_n.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/args.hpp>", private, "<boost/proto/detail/args.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/basic_expr.hpp>", private, "<boost/proto/detail/basic_expr.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/class_member_traits.hpp>", private, "<boost/proto/detail/class_member_traits.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/deduce_domain_n.hpp>", private, "<boost/proto/detail/deduce_domain_n.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/deep_copy.hpp>", private, "<boost/proto/detail/deep_copy.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/expr.hpp>", private, "<boost/proto/detail/expr.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/expr_variadic.hpp>", private, "<boost/proto/detail/expr.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/extends_funop_const.hpp>", private, "<boost/proto/detail/extends_funop_const.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/extends_funop.hpp>", private, "<boost/proto/detail/extends_funop.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/funop.hpp>", private, "<boost/proto/detail/funop.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/generate_by_value.hpp>", private, "<boost/proto/detail/generate_by_value.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/lambda_matches.hpp>", private, "<boost/proto/detail/lambda_matches.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/make_expr_funop.hpp>", private, "<boost/proto/detail/make_expr_funop.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/make_expr_.hpp>", private, "<boost/proto/detail/make_expr_.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/make_expr.hpp>", private, "<boost/proto/detail/make_expr.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/matches_.hpp>", private, "<boost/proto/detail/matches_.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/memfun_funop.hpp>", private, "<boost/proto/detail/memfun_funop.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/or_n.hpp>", private, "<boost/proto/detail/or_n.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/poly_function_funop.hpp>", private, "<boost/proto/detail/poly_function_funop.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/poly_function_traits.hpp>", private, "<boost/proto/detail/poly_function_traits.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/template_arity_helper.hpp>", private, "<boost/proto/detail/template_arity_helper.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/traits.hpp>", private, "<boost/proto/detail/traits.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/unpack_expr_.hpp>", private, "<boost/proto/detail/unpack_expr_.hpp>", private ] },
+ { include: ["<boost/proto/detail/preprocessed/vararg_matches_impl.hpp>", private, "<boost/proto/detail/vararg_matches_impl.hpp>", private ] },
+ { include: ["<boost/proto/detail/template_arity_helper.hpp>", private, "<boost/proto/detail/template_arity.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/expand_pack.hpp>", private, "<boost/proto/transform/detail/pack.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/pack_impl.hpp>", private, "<boost/proto/transform/detail/pack.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/call.hpp>", private, "<boost/proto/transform/detail/call.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/construct_funop.hpp>", private, "<boost/proto/transform/detail/construct_funop.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/construct_pod_funop.hpp>", private, "<boost/proto/transform/detail/construct_pod_funop.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/default_function_impl.hpp>", private, "<boost/proto/transform/detail/default_function_impl.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/expand_pack.hpp>", private, "<boost/proto/transform/detail/expand_pack.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/fold_impl.hpp>", private, "<boost/proto/transform/detail/fold_impl.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/lazy.hpp>", private, "<boost/proto/transform/detail/lazy.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/make_gcc_workaround.hpp>", private, "<boost/proto/transform/detail/make_gcc_workaround.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/make.hpp>", private, "<boost/proto/transform/detail/make.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/pack_impl.hpp>", private, "<boost/proto/transform/detail/pack_impl.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/pass_through_impl.hpp>", private, "<boost/proto/transform/detail/pass_through_impl.hpp>", private ] },
+ { include: ["<boost/proto/transform/detail/preprocessed/when.hpp>", private, "<boost/proto/transform/detail/when.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/default_deleter.hpp>", private, "<boost/ptr_container/detail/static_move_ptr.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/is_convertible.hpp>", private, "<boost/ptr_container/detail/static_move_ptr.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/move.hpp>", private, "<boost/ptr_container/detail/static_move_ptr.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/reversible_ptr_container.hpp>", private, "<boost/ptr_container/detail/associative_ptr_container.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/reversible_ptr_container.hpp>", private, "<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/scoped_deleter.hpp>", private, "<boost/ptr_container/detail/reversible_ptr_container.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/serialize_xml_names.hpp>", private, "<boost/ptr_container/detail/serialize_ptr_map_adapter.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/serialize_xml_names.hpp>", private, "<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/static_move_ptr.hpp>", private, "<boost/ptr_container/detail/reversible_ptr_container.hpp>", private ] },
+ { include: ["<boost/ptr_container/detail/throw_exception.hpp>", private, "<boost/ptr_container/detail/reversible_ptr_container.hpp>", private ] },
+ { include: ["<boost/python/detail/config.hpp>", private, "<boost/python/detail/exception_handler.hpp>", private ] },
+ { include: ["<boost/python/detail/config.hpp>", private, "<boost/python/detail/prefix.hpp>", private ] },
+ { include: ["<boost/python/detail/config.hpp>", private, "<boost/python/detail/scope.hpp>", private ] },
+ { include: ["<boost/python/detail/copy_ctor_mutates_rhs.hpp>", private, "<boost/python/detail/value_arg.hpp>", private ] },
+ { include: ["<boost/python/detail/cv_category.hpp>", private, "<boost/python/detail/unwind_type.hpp>", private ] },
+ { include: ["<boost/python/detail/defaults_gen.hpp>", private, "<boost/python/detail/defaults_def.hpp>", private ] },
+ { include: ["<boost/python/detail/def_helper_fwd.hpp>", private, "<boost/python/detail/def_helper.hpp>", private ] },
+ { include: ["<boost/python/detail/exception_handler.hpp>", private, "<boost/python/detail/translate_exception.hpp>", private ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/detail/decorated_type_id.hpp>", private ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/detail/def_helper.hpp>", private ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/detail/signature.hpp>", private ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/detail/unwind_type.hpp>", private ] },
+ { include: ["<boost/python/detail/invoke.hpp>", private, "<boost/python/detail/caller.hpp>", private ] },
+ { include: ["<boost/python/detail/is_auto_ptr.hpp>", private, "<boost/python/detail/copy_ctor_mutates_rhs.hpp>", private ] },
+ { include: ["<boost/python/detail/is_wrapper.hpp>", private, "<boost/python/detail/unwrap_wrapper.hpp>", private ] },
+ { include: ["<boost/python/detail/is_xxx.hpp>", private, "<boost/python/detail/is_auto_ptr.hpp>", private ] },
+ { include: ["<boost/python/detail/is_xxx.hpp>", private, "<boost/python/detail/is_shared_ptr.hpp>", private ] },
+ { include: ["<boost/python/detail/is_xxx.hpp>", private, "<boost/python/detail/value_is_xxx.hpp>", private ] },
+ { include: ["<boost/python/detail/make_keyword_range_fn.hpp>", private, "<boost/python/detail/defaults_def.hpp>", private ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/detail/invoke.hpp>", private ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/detail/def_helper_fwd.hpp>", private ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/detail/def_helper.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/aix_init_module.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/invoke.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/is_wrapper.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/none.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/nullary_function_adaptor.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/sfinae.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/unwrap_wrapper.hpp>", private ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/detail/wrapper_base.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/caller.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/defaults_gen.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/invoke.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/result.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/signature.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/target.hpp>", private ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/detail/type_list.hpp>", private ] },
+ { include: ["<boost/python/detail/python22_fixed.h>", private, "<boost/python/detail/wrap_python.hpp>", private ] },
+ { include: ["<boost/python/detail/scope.hpp>", private, "<boost/python/detail/defaults_def.hpp>", private ] },
+ { include: ["<boost/python/detail/sfinae.hpp>", private, "<boost/python/detail/enable_if.hpp>", private ] },
+ { include: ["<boost/python/detail/signature.hpp>", private, "<boost/python/detail/caller.hpp>", private ] },
+ { include: ["<boost/python/detail/value_is_xxx.hpp>", private, "<boost/python/detail/value_is_shared_ptr.hpp>", private ] },
+ { include: ["<boost/python/detail/wrap_python.hpp>", private, "<boost/python/detail/prefix.hpp>", private ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/detail/operators.hpp>", private ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/detail/uniform_int_float.hpp>", private ] },
+ { include: ["<boost/random/detail/const_mod.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/detail/const_mod.hpp>", private ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/detail/large_arithmetic.hpp>", private ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/detail/uniform_int_float.hpp>", private ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/detail/const_mod.hpp>", private ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/detail/large_arithmetic.hpp>", private ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/detail/uniform_int_float.hpp>", private ] },
+ { include: ["<boost/random/detail/generator_bits.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/random/detail/generator_bits.hpp>", private, "<boost/random/detail/uniform_int_float.hpp>", private ] },
+ { include: ["<boost/random/detail/integer_log2.hpp>", private, "<boost/random/detail/large_arithmetic.hpp>", private ] },
+ { include: ["<boost/random/detail/integer_log2.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/random/detail/large_arithmetic.hpp>", private, "<boost/random/detail/const_mod.hpp>", private ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/detail/seed_impl.hpp>", private ] },
+ { include: ["<boost/range/detail/any_iterator_buffer.hpp>", private, "<boost/range/detail/any_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/any_iterator_buffer.hpp>", private, "<boost/range/detail/any_iterator_interface.hpp>", private ] },
+ { include: ["<boost/range/detail/any_iterator_interface.hpp>", private, "<boost/range/detail/any_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/any_iterator_interface.hpp>", private, "<boost/range/detail/any_iterator_wrapper.hpp>", private ] },
+ { include: ["<boost/range/detail/any_iterator_wrapper.hpp>", private, "<boost/range/detail/any_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/begin.hpp>", private, "<boost/range/detail/detail_str.hpp>", private ] },
+ { include: ["<boost/range/detail/collection_traits_detail.hpp>", private, "<boost/range/detail/collection_traits.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/begin.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/const_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/detail_str.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/difference_type.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/empty.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/end.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/implementation_help.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/size_type.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/value_type.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/vc6/end.hpp>", private ] },
+ { include: ["<boost/range/detail/common.hpp>", private, "<boost/range/detail/vc6/size.hpp>", private ] },
+ { include: ["<boost/range/detail/demote_iterator_traversal_tag.hpp>", private, "<boost/range/detail/join_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/detail_str.hpp>", private, "<boost/range/detail/as_literal.hpp>", private ] },
+ { include: ["<boost/range/detail/end.hpp>", private, "<boost/range/detail/detail_str.hpp>", private ] },
+ { include: ["<boost/range/detail/implementation_help.hpp>", private, "<boost/range/detail/end.hpp>", private ] },
+ { include: ["<boost/range/detail/implementation_help.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/range/detail/implementation_help.hpp>", private, "<boost/range/detail/vc6/end.hpp>", private ] },
+ { include: ["<boost/range/detail/implementation_help.hpp>", private, "<boost/range/detail/vc6/size.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/const_iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/end.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/iterator.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/value_type.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/vc6/end.hpp>", private ] },
+ { include: ["<boost/range/detail/remove_extent.hpp>", private, "<boost/range/detail/vc6/size.hpp>", private ] },
+ { include: ["<boost/range/detail/sfinae.hpp>", private, "<boost/range/detail/common.hpp>", private ] },
+ { include: ["<boost/range/detail/size_type.hpp>", private, "<boost/range/detail/detail_str.hpp>", private ] },
+ { include: ["<boost/range/detail/size_type.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/range/detail/size_type.hpp>", private, "<boost/range/detail/vc6/size.hpp>", private ] },
+ { include: ["<boost/range/detail/value_type.hpp>", private, "<boost/range/detail/detail_str.hpp>", private ] },
+ { include: ["<boost/range/detail/vc6/end.hpp>", private, "<boost/range/detail/end.hpp>", private ] },
+ { include: ["<boost/range/detail/vc6/size.hpp>", private, "<boost/range/detail/size.hpp>", private ] },
+ { include: ["<boost/ratio/detail/mpl/abs.hpp>", private, "<boost/ratio/detail/mpl/gcd.hpp>", private ] },
+ { include: ["<boost/ratio/detail/mpl/abs.hpp>", private, "<boost/ratio/detail/mpl/lcm.hpp>", private ] },
+ { include: ["<boost/ratio/detail/mpl/abs.hpp>", private, "<boost/ratio/detail/overflow_helpers.hpp>", private ] },
+ { include: ["<boost/ratio/detail/mpl/sign.hpp>", private, "<boost/ratio/detail/overflow_helpers.hpp>", private ] },
+ { include: ["<boost/ratio/detail/overflow_helpers.hpp>", private, "<boost/chrono/detail/is_evenly_divisible_by.hpp>", private ] },
+ { include: ["<boost/serialization/detail/get_data.hpp>", private, "<boost/mpi/detail/mpi_datatype_primitive.hpp>", private ] },
+ { include: ["<boost/serialization/detail/get_data.hpp>", private, "<boost/mpi/detail/packed_iprimitive.hpp>", private ] },
+ { include: ["<boost/serialization/detail/get_data.hpp>", private, "<boost/mpi/detail/packed_oprimitive.hpp>", private ] },
+ { include: ["<boost/serialization/detail/shared_count_132.hpp>", private, "<boost/serialization/detail/shared_ptr_132.hpp>", private ] },
+ { include: ["<boost/serialization/detail/shared_ptr_nmt_132.hpp>", private, "<boost/serialization/detail/shared_ptr_132.hpp>", private ] },
+ { include: ["<boost/signals2/detail/auto_buffer.hpp>", private, "<boost/signals2/detail/slot_call_iterator.hpp>", private ] },
+ { include: ["<boost/signals2/detail/signals_common.hpp>", private, "<boost/signals2/detail/tracked_objects_visitor.hpp>", private ] },
+ { include: ["<boost/signals2/detail/signals_common_macros.hpp>", private, "<boost/signals2/detail/preprocessed_arg_type.hpp>", private ] },
+ { include: ["<boost/signals2/detail/unique_lock.hpp>", private, "<boost/signals2/detail/slot_call_iterator.hpp>", private ] },
+ { include: ["<boost/signals2/detail/variadic_arg_type.hpp>", private, "<boost/signals2/detail/variadic_slot_invoker.hpp>", private ] },
+ { include: ["<boost/signals/detail/config.hpp>", private, "<boost/signals/detail/named_slot_map.hpp>", private ] },
+ { include: ["<boost/signals/detail/config.hpp>", private, "<boost/signals/detail/signal_base.hpp>", private ] },
+ { include: ["<boost/signals/detail/config.hpp>", private, "<boost/signals/detail/signals_common.hpp>", private ] },
+ { include: ["<boost/signals/detail/config.hpp>", private, "<boost/signals/detail/slot_call_iterator.hpp>", private ] },
+ { include: ["<boost/signals/detail/named_slot_map.hpp>", private, "<boost/signals/detail/signal_base.hpp>", private ] },
+ { include: ["<boost/signals/detail/signals_common.hpp>", private, "<boost/signals/detail/named_slot_map.hpp>", private ] },
+ { include: ["<boost/signals/detail/signals_common.hpp>", private, "<boost/signals/detail/signal_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/array_utility.hpp>", private, "<boost/smart_ptr/detail/array_deleter.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count_gcc.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count.hpp>", private, "<boost/smart_ptr/detail/shared_array_nmt.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count.hpp>", private, "<boost/smart_ptr/detail/shared_ptr_nmt.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count_pthreads.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count_sync.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count_win32.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/lightweight_mutex.hpp>", private, "<boost/atomic/detail/lockpool.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/lightweight_mutex.hpp>", private, "<boost/smart_ptr/detail/quick_allocator.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/lwm_nop.hpp>", private, "<boost/smart_ptr/detail/lightweight_mutex.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/lwm_pthreads.hpp>", private, "<boost/smart_ptr/detail/lightweight_mutex.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/lwm_win32_cs.hpp>", private, "<boost/smart_ptr/detail/lightweight_mutex.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/quick_allocator.hpp>", private, "<boost/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_aix.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base.hpp>", private, "<boost/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base.hpp>", private, "<boost/smart_ptr/detail/sp_counted_impl.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_nt.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_pt.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_spin.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_sync.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_base_w32.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_counted_impl.hpp>", private, "<boost/smart_ptr/detail/shared_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_forward.hpp>", private, "<boost/smart_ptr/detail/array_deleter.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_has_sync.hpp>", private, "<boost/smart_ptr/detail/atomic_count.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_has_sync.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/sp_has_sync.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_gcc_arm.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock.hpp>", private, "<boost/smart_ptr/detail/spinlock_pool.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_nt.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_pool.hpp>", private, "<boost/smart_ptr/detail/sp_counted_base_spin.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_pt.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_sync.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_w32.hpp>", private, "<boost/smart_ptr/detail/spinlock.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/yield_k.hpp>", private, "<boost/smart_ptr/detail/spinlock_gcc_arm.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/yield_k.hpp>", private, "<boost/smart_ptr/detail/spinlock_sync.hpp>", private ] },
+ { include: ["<boost/smart_ptr/detail/yield_k.hpp>", private, "<boost/smart_ptr/detail/spinlock_w32.hpp>", private ] },
+ { include: ["<boost/spirit/fusion/detail/access.hpp>", private, "<boost/xpressive/detail/utility/cons.hpp>", private ] },
+ { include: ["<boost/spirit/fusion/detail/config.hpp>", private, "<boost/xpressive/detail/utility/cons.hpp>", private ] },
+ { include: ["<boost/spirit/fusion/iterator/detail/iterator_base.hpp>", private, "<boost/xpressive/detail/utility/cons.hpp>", private ] },
+ { include: ["<boost/spirit/fusion/sequence/detail/sequence_base.hpp>", private, "<boost/xpressive/detail/utility/cons.hpp>", private ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/basic_chset.ipp>", private, "<boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>", private ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/range_run.hpp>", private, "<boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>", private ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/range_run.ipp>", private, "<boost/spirit/home/classic/utility/impl/chset/range_run.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/detail/extract_from.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/detail/pass_container.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/detail/string_compare.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/detail/string_generate.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/numeric/detail/bool_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/stream/detail/iterator_sink.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/detail/generate.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/detail/generate_to.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/string_generate.hpp>", private, "<boost/spirit/home/karma/numeric/detail/bool_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/string_generate.hpp>", private, "<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/detail/string_generate.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/karma/numeric/detail/bool_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/karma/stream/detail/format_manip.hpp>", private, "<boost/spirit/home/karma/stream/detail/format_manip_auto.hpp>", private ] },
+ { include: ["<boost/spirit/home/phoenix/detail/local_reference.hpp>", private, "<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>", private ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_return.hpp>", private, "<boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_eval.hpp>", private ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/switch_eval.ipp>", private, "<boost/spirit/home/phoenix/statement/detail/switch_eval.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/detail/string_parse.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/detail/assign_to.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/detail/pass_container.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/numeric/detail/real_impl.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/detail/construct.hpp>", private, "<boost/spirit/home/qi/detail/assign_to.hpp>", private ] },
+ { include: ["<boost/spirit/home/qi/stream/detail/match_manip.hpp>", private, "<boost/spirit/home/qi/stream/detail/match_manip_auto.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/endian/cover_operators.hpp>", private, "<boost/spirit/home/support/detail/endian/endian.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/endian/endian.hpp>", private, "<boost/spirit/home/support/detail/endian.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/karma/detail/alternative_function.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/karma/detail/pass_container.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/math/detail/fp_traits.hpp>", private, "<boost/spirit/home/support/detail/math/fpclassify.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/math/detail/fp_traits.hpp>", private, "<boost/spirit/home/support/detail/math/signbit.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/math/fpclassify.hpp>", private, "<boost/spirit/home/support/detail/sign.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/math/signbit.hpp>", private, "<boost/spirit/home/support/detail/sign.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/pow10.hpp>", private, "<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/pow10.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/pow10.hpp>", private, "<boost/spirit/home/qi/numeric/detail/real_impl.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/support/detail/endian/endian.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/sign.hpp>", private, "<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/sign.hpp>", private, "<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/detail/sign.hpp>", private, "<boost/spirit/home/qi/numeric/detail/real_impl.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/fixed_size_queue.hpp>", private, "<boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>", private, "<boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/first_owner_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/istream_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/lex_input_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/no_check_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp>", private ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>", private ] },
+ { include: ["<boost/statechart/detail/avoid_unused_warning.hpp>", private, "<boost/statechart/detail/memory.hpp>", private ] },
+ { include: ["<boost/statechart/detail/counted_base.hpp>", private, "<boost/statechart/detail/state_base.hpp>", private ] },
+ { include: ["<boost/statechart/detail/state_base.hpp>", private, "<boost/statechart/detail/leaf_state.hpp>", private ] },
+ { include: ["<boost/statechart/detail/state_base.hpp>", private, "<boost/statechart/detail/node_state.hpp>", private ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/detail/global_typedef.hpp>", private ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/detail/unit_test_parameters.hpp>", private ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/detail/workaround.hpp>", private ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/detail/unit_test_parameters.hpp>", private ] },
+ { include: ["<boost/test/detail/log_level.hpp>", private, "<boost/test/detail/unit_test_parameters.hpp>", private ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/detail/global_typedef.hpp>", private ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/detail/unit_test_parameters.hpp>", private ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/detail/workaround.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/log/detail/config.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/counter.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/force_cast.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/lockable_wrapper.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/log.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/move.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/singleton.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/thread_interruption.hpp>", private ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/detail/tss_hooks.hpp>", private ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/detail/counter.hpp>", private ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/detail/move.hpp>", private ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/detail/thread_interruption.hpp>", private ] },
+ { include: ["<boost/thread/detail/invoke.hpp>", private, "<boost/thread/detail/async_func.hpp>", private ] },
+ { include: ["<boost/thread/detail/invoke.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/thread/detail/is_convertible.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/thread/detail/make_tuple_indices.hpp>", private, "<boost/thread/detail/async_func.hpp>", private ] },
+ { include: ["<boost/thread/detail/make_tuple_indices.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/detail/async_func.hpp>", private ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/detail/invoke.hpp>", private ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/detail/is_convertible.hpp>", private ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/detail/config.hpp>", private ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/detail/thread_heap_alloc.hpp>", private ] },
+ { include: ["<boost/thread/detail/thread_heap_alloc.hpp>", private, "<boost/thread/detail/thread.hpp>", private ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/detail/config_all.hpp>", private ] },
+ { include: ["<boost/tti/detail/dcomp_mem_fun.hpp>", private, "<boost/tti/detail/dmem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/detail/dmem_data.hpp>", private ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/detail/dmem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/detail/dtype.hpp>", private ] },
+ { include: ["<boost/tti/detail/dftclass.hpp>", private, "<boost/tti/detail/dcomp_mem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dftclass.hpp>", private, "<boost/tti/detail/dmem_data.hpp>", private ] },
+ { include: ["<boost/tti/detail/dlambda.hpp>", private, "<boost/tti/detail/dtype.hpp>", private ] },
+ { include: ["<boost/tti/detail/dmem_data.hpp>", private, "<boost/tti/detail/ddata.hpp>", private ] },
+ { include: ["<boost/tti/detail/dmem_fun.hpp>", private, "<boost/tti/detail/dfunction.hpp>", private ] },
+ { include: ["<boost/tti/detail/dmem_fun.hpp>", private, "<boost/tti/detail/dmem_data.hpp>", private ] },
+ { include: ["<boost/tti/detail/dmetafunc.hpp>", private, "<boost/tti/detail/dlambda.hpp>", private ] },
+ { include: ["<boost/tti/detail/dnullptr.hpp>", private, "<boost/tti/detail/dcomp_mem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dnullptr.hpp>", private, "<boost/tti/detail/dcomp_static_mem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dnullptr.hpp>", private, "<boost/tti/detail/dmem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dnullptr.hpp>", private, "<boost/tti/detail/dstatic_mem_data.hpp>", private ] },
+ { include: ["<boost/tti/detail/dnullptr.hpp>", private, "<boost/tti/detail/dstatic_mem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dplaceholder.hpp>", private, "<boost/tti/detail/dlambda.hpp>", private ] },
+ { include: ["<boost/tti/detail/dptmf.hpp>", private, "<boost/tti/detail/dmem_fun.hpp>", private ] },
+ { include: ["<boost/tti/detail/dstatic_mem_data.hpp>", private, "<boost/tti/detail/ddata.hpp>", private ] },
+ { include: ["<boost/tti/detail/dstatic_mem_fun.hpp>", private, "<boost/tti/detail/dfunction.hpp>", private ] },
+ { include: ["<boost/tti/detail/dtemplate.hpp>", private, "<boost/tti/detail/dvm_template_params.hpp>", private ] },
+ { include: ["<boost/tti/detail/dtemplate_params.hpp>", private, "<boost/tti/detail/dvm_template_params.hpp>", private ] },
+ { include: ["<boost/tti/detail/dtfunction.hpp>", private, "<boost/tti/detail/dstatic_mem_fun.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/any_base.hpp>", private, "<boost/type_erasure/detail/access.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/get_placeholders.hpp>", private, "<boost/type_erasure/detail/check_map.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/get_placeholders.hpp>", private, "<boost/type_erasure/detail/normalize.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/get_signature.hpp>", private, "<boost/type_erasure/detail/adapt_to_vtable.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/normalize_deduced.hpp>", private, "<boost/type_erasure/detail/normalize.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/normalize.hpp>", private, "<boost/type_erasure/detail/instantiate.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/rebind_placeholders.hpp>", private, "<boost/type_erasure/detail/instantiate.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/rebind_placeholders.hpp>", private, "<boost/type_erasure/detail/normalize.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/rebind_placeholders.hpp>", private, "<boost/type_erasure/detail/vtable.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/detail/access.hpp>", private ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/detail/adapt_to_vtable.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/iostreams/detail/is_dereferenceable.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/detail/has_binary_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/detail/has_postfix_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/detail/has_prefix_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/variant/detail/bool_trait_def.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/detail/has_binary_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/detail/has_postfix_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/detail/has_prefix_operator.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/variant/detail/bool_trait_undef.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/range/detail/common.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/iostreams/detail/is_dereferenceable.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/type_traits/detail/bool_trait_def.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/type_traits/detail/size_t_trait_def.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/type_traits/detail/type_trait_def.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/iostreams/detail/bool_trait_def.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/range/detail/sfinae.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dcomp_mem_fun.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dcomp_static_mem_fun.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dmem_data.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dmem_fun.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dstatic_mem_data.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/tti/detail/dstatic_mem_fun.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/detail/cv_traits_impl.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/detail/is_function_ptr_tester.hpp>", private ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>", private ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/detail/conversion_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/detail/dimension_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/detail/linear_algebra.hpp>", private ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/detail/sort.hpp>", private ] },
+ { include: ["<boost/units/detail/heterogeneous_conversion.hpp>", private, "<boost/units/detail/conversion_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/linear_algebra.hpp>", private, "<boost/units/detail/heterogeneous_conversion.hpp>", private ] },
+ { include: ["<boost/units/detail/one.hpp>", private, "<boost/units/detail/conversion_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/one.hpp>", private, "<boost/units/detail/static_rational_power.hpp>", private ] },
+ { include: ["<boost/units/detail/one.hpp>", private, "<boost/units/detail/unscale.hpp>", private ] },
+ { include: ["<boost/units/detail/one.hpp>", private, "<boost/units/systems/detail/constants.hpp>", private ] },
+ { include: ["<boost/units/detail/push_front_if.hpp>", private, "<boost/units/detail/dimension_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/push_front_if.hpp>", private, "<boost/units/detail/push_front_or_add.hpp>", private ] },
+ { include: ["<boost/units/detail/push_front_or_add.hpp>", private, "<boost/units/detail/dimension_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/sort.hpp>", private, "<boost/units/detail/linear_algebra.hpp>", private ] },
+ { include: ["<boost/units/detail/static_rational_power.hpp>", private, "<boost/units/detail/conversion_impl.hpp>", private ] },
+ { include: ["<boost/units/detail/unscale.hpp>", private, "<boost/units/detail/conversion_impl.hpp>", private ] },
+ { include: ["<boost/unordered/detail/allocate.hpp>", private, "<boost/unordered/detail/buckets.hpp>", private ] },
+ { include: ["<boost/unordered/detail/buckets.hpp>", private, "<boost/unordered/detail/table.hpp>", private ] },
+ { include: ["<boost/unordered/detail/extract_key.hpp>", private, "<boost/unordered/detail/equivalent.hpp>", private ] },
+ { include: ["<boost/unordered/detail/extract_key.hpp>", private, "<boost/unordered/detail/unique.hpp>", private ] },
+ { include: ["<boost/unordered/detail/fwd.hpp>", private, "<boost/unordered/detail/allocate.hpp>", private ] },
+ { include: ["<boost/unordered/detail/table.hpp>", private, "<boost/unordered/detail/equivalent.hpp>", private ] },
+ { include: ["<boost/unordered/detail/table.hpp>", private, "<boost/unordered/detail/extract_key.hpp>", private ] },
+ { include: ["<boost/unordered/detail/table.hpp>", private, "<boost/unordered/detail/unique.hpp>", private ] },
+ { include: ["<boost/unordered/detail/util.hpp>", private, "<boost/unordered/detail/buckets.hpp>", private ] },
+ { include: ["<boost/unordered/detail/util.hpp>", private, "<boost/unordered/detail/table.hpp>", private ] },
+ { include: ["<boost/variant/detail/apply_visitor_binary.hpp>", private, "<boost/variant/detail/apply_visitor_delayed.hpp>", private ] },
+ { include: ["<boost/variant/detail/apply_visitor_unary.hpp>", private, "<boost/variant/detail/apply_visitor_binary.hpp>", private ] },
+ { include: ["<boost/variant/detail/apply_visitor_unary.hpp>", private, "<boost/variant/detail/apply_visitor_delayed.hpp>", private ] },
+ { include: ["<boost/variant/detail/backup_holder.hpp>", private, "<boost/variant/detail/visitation_impl.hpp>", private ] },
+ { include: ["<boost/variant/detail/cast_storage.hpp>", private, "<boost/variant/detail/visitation_impl.hpp>", private ] },
+ { include: ["<boost/variant/detail/enable_recursive_fwd.hpp>", private, "<boost/variant/detail/enable_recursive.hpp>", private ] },
+ { include: ["<boost/variant/detail/forced_return.hpp>", private, "<boost/variant/detail/visitation_impl.hpp>", private ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/detail/apply_visitor_binary.hpp>", private ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/detail/apply_visitor_delayed.hpp>", private ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/detail/apply_visitor_unary.hpp>", private ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/detail/forced_return.hpp>", private ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/detail/visitation_impl.hpp>", private ] },
+ { include: ["<boost/variant/detail/move.hpp>", private, "<boost/variant/detail/initializer.hpp>", private ] },
+ { include: ["<boost/variant/detail/substitute_fwd.hpp>", private, "<boost/variant/detail/substitute.hpp>", private ] },
+ { include: ["<boost/variant/detail/substitute.hpp>", private, "<boost/variant/detail/enable_recursive.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/access.hpp>", private, "<boost/xpressive/detail/core/results_cache.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/access.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/action.hpp>", private, "<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/action.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/adaptor.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/adaptor.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/adaptor.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/finder.hpp>", private, "<boost/xpressive/detail/core/optimize.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/flow_control.hpp>", private, "<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/icase.hpp>", private, "<boost/xpressive/detail/dynamic/dynamic.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/linker.hpp>", private, "<boost/xpressive/detail/core/icase.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/linker.hpp>", private, "<boost/xpressive/detail/core/optimize.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/linker.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/linker.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/list.hpp>", private, "<boost/xpressive/detail/core/results_cache.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private, "<boost/xpressive/detail/core/matcher/predicate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/alternate_end_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private, "<boost/xpressive/detail/static/transforms/as_alternate.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/any_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_bol_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_bos_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_eol_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_eos_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_line_base.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_line_base.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/assert_word_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/attr_end_matcher.hpp>", private, "<boost/xpressive/detail/static/transforms/as_action.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/charset_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/epsilon_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/keeper_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/literal_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/logical_newline_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>", private, "<boost/xpressive/detail/static/visitor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/mark_end_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/mark_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/optional_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/posix_charset_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/range_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/repeat_begin_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/repeat_end_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/set_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matchers.hpp>", private, "<boost/xpressive/detail/core/linker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matchers.hpp>", private, "<boost/xpressive/detail/core/peeker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matchers.hpp>", private, "<boost/xpressive/detail/dynamic/parser.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matchers.hpp>", private, "<boost/xpressive/detail/static/transmogrify.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/simple_repeat_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/matcher/true_matcher.hpp>", private, "<boost/xpressive/detail/core/matchers.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/optimize.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/peeker.hpp>", private, "<boost/xpressive/detail/core/linker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/peeker.hpp>", private, "<boost/xpressive/detail/core/optimize.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/peeker.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/any_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_line_base.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_word_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/epsilon_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/keeper_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/literal_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/logical_newline_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/optional_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/posix_charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/predicate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/range_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/set_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/simple_repeat_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/core/matcher/true_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/dynamic/dynamic.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/dynamic/matchable.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/quant_style.hpp>", private, "<boost/xpressive/detail/static/placeholders.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/finder.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/flow_control.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/optimize.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/static/placeholders.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/detail/static/visitor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/flow_control.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/any_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_line_base.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_word_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/epsilon_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/keeper_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/literal_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/logical_newline_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/optional_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/posix_charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/predicate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/range_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/set_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/simple_repeat_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/core/matcher/true_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/sub_match_impl.hpp>", private, "<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/sub_match_impl.hpp>", private, "<boost/xpressive/detail/core/sub_match_vector.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/core/sub_match_vector.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/access.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/action.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/adaptor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/finder.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/flow_control.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/icase.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/linker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/any_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_bos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eol_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_eos_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_line_base.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_word_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/epsilon_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/keeper_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/literal_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/logical_newline_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/optional_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/posix_charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/predicate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/range_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/regex_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_begin_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/repeat_end_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/set_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/simple_repeat_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/matcher/true_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/peeker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/quant_style.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/regex_impl.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/results_cache.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/core/sub_match_vector.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/dynamic.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/matchable.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/parse_charset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/parser.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/parser_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/dynamic/sequence.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/is_pure.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/modifier.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_action.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_alternate.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_independent.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_inverse.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_marker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_modifier.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_quantifier.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_sequence.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transforms/as_set.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/transmogrify.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/type_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/visitor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/static/width_of.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/utility/boyer_moore.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/detail/utility/chset/chset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/traits/detail/c_ctype.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/dynamic.hpp>", private, "<boost/xpressive/detail/dynamic/parser.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/core/access.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/core/adaptor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/core/linker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/core/regex_impl.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/dynamic/dynamic.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/matchable.hpp>", private, "<boost/xpressive/detail/dynamic/parser_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/parser_enum.hpp>", private, "<boost/xpressive/detail/dynamic/parse_charset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/parser_enum.hpp>", private, "<boost/xpressive/detail/dynamic/parser_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/sequence.hpp>", private, "<boost/xpressive/detail/dynamic/dynamic.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/dynamic/sequence.hpp>", private, "<boost/xpressive/detail/dynamic/matchable.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/grammar.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/is_pure.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/modifier.hpp>", private, "<boost/xpressive/detail/core/icase.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/placeholders.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/placeholders.hpp>", private, "<boost/xpressive/detail/static/transmogrify.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_action.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_alternate.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_independent.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_inverse.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_marker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_modifier.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_quantifier.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_sequence.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/static.hpp>", private, "<boost/xpressive/detail/static/transforms/as_set.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_action.hpp>", private, "<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_action.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_alternate.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_independent.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_inverse.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_marker.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_matcher.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_modifier.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_quantifier.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_quantifier.hpp>", private, "<boost/xpressive/detail/static/transforms/as_action.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_sequence.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transforms/as_set.hpp>", private, "<boost/xpressive/detail/static/grammar.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/transmogrify.hpp>", private, "<boost/xpressive/detail/static/visitor.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/type_traits.hpp>", private, "<boost/xpressive/detail/core/matcher/simple_repeat_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/type_traits.hpp>", private, "<boost/xpressive/detail/static/width_of.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/visitor.hpp>", private, "<boost/xpressive/detail/static/compile.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/static/width_of.hpp>", private, "<boost/xpressive/detail/static/is_pure.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/core/peeker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/dynamic/parser_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/utility/chset/chset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/detail/utility/traits_utils.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/any.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/boyer_moore.hpp>", private, "<boost/xpressive/detail/core/finder.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/chset/basic_chset.ipp>", private, "<boost/xpressive/detail/utility/chset/chset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/chset/basic_chset.ipp>", private, "<boost/xpressive/detail/utility/hash_peek_bitset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/chset/chset.hpp>", private, "<boost/xpressive/detail/dynamic/parse_charset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/chset/chset.hpp>", private, "<boost/xpressive/detail/static/transforms/as_set.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/chset/range_run.ipp>", private, "<boost/xpressive/detail/utility/chset/basic_chset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/cons.hpp>", private, "<boost/xpressive/detail/static/transforms/as_alternate.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/counted_base.hpp>", private, "<boost/xpressive/detail/core/regex_impl.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/counted_base.hpp>", private, "<boost/xpressive/detail/dynamic/matchable.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/dont_care.hpp>", private, "<boost/xpressive/detail/static/transmogrify.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/hash_peek_bitset.hpp>", private, "<boost/xpressive/detail/core/finder.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/hash_peek_bitset.hpp>", private, "<boost/xpressive/detail/core/matcher/alternate_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/hash_peek_bitset.hpp>", private, "<boost/xpressive/detail/core/peeker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/core/flow_control.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/core/icase.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/core/matcher/assert_word_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/dynamic/parser.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/detail/utility/algorithm.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/literals.hpp>", private, "<boost/xpressive/detail/dynamic/parse_charset.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/literals.hpp>", private, "<boost/xpressive/detail/dynamic/parser_traits.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/never_true.hpp>", private, "<boost/xpressive/detail/core/linker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/never_true.hpp>", private, "<boost/xpressive/detail/core/peeker.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/save_restore.hpp>", private, "<boost/xpressive/detail/core/matcher/lookahead_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/save_restore.hpp>", private, "<boost/xpressive/detail/core/matcher/lookbehind_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/sequence_stack.hpp>", private, "<boost/xpressive/detail/core/state.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/symbols.hpp>", private, "<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/tracking_ptr.hpp>", private, "<boost/xpressive/detail/core/regex_impl.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/core/matcher/literal_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/core/matcher/mark_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/core/matcher/posix_charset_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/core/matcher/string_matcher.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/static/transforms/as_set.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/traits_utils.hpp>", private, "<boost/xpressive/detail/static/transmogrify.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/width.hpp>", private, "<boost/xpressive/detail/core/quant_style.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/width.hpp>", private, "<boost/xpressive/detail/dynamic/sequence.hpp>", private ] },
+ { include: ["<boost/xpressive/detail/utility/width.hpp>", private, "<boost/xpressive/detail/static/static.hpp>", private ] }
+]
diff --git a/boost-all.imp b/boost-all.imp
new file mode 100644
index 0000000..d0d87a8
--- /dev/null
+++ b/boost-all.imp
@@ -0,0 +1,5629 @@
+[
+# cd /usr/include && grep -r --exclude-dir={detail,impl} '^ *# *include' boost/ | perl -nle 'm/^([^:]+).*["<]([^>]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e \/detail\/ -e \/impl\/ | grep -e \\[\"\<boost/ | sort -u
+#manually include:
+{ include: ["@<boost/bind/.*>", private, "<boost/bind.hpp>", public ] },
+{ include: ["@<boost/format/.*>", private, "<boost/format.hpp>", public ] },
+{ include: ["@<boost/filesystem/.*>", private, "<boost/filesystem.hpp>", public ] },
+{ include: ["@<boost/function/.*>", private, "<boost/function.hpp>", public ] },
+#manually delete $ sed '/workarounds*\.hpp/d' -i boost-all.imp
+#also good idea to remove all lines refering to folders above (e.g., sed '/\/format\//d' -i boost-all.imp)
+#programatically include:
+ { include: ["<boost/accumulators/numeric/detail/function1.hpp>", private, "<boost/accumulators/numeric/functional.hpp>", public ] },
+ { include: ["<boost/accumulators/numeric/detail/function2.hpp>", private, "<boost/accumulators/numeric/functional.hpp>", public ] },
+ { include: ["<boost/accumulators/numeric/detail/pod_singleton.hpp>", private, "<boost/accumulators/numeric/functional.hpp>", public ] },
+ { include: ["<boost/algorithm/searching/detail/bm_traits.hpp>", private, "<boost/algorithm/searching/boyer_moore_horspool.hpp>", public ] },
+ { include: ["<boost/algorithm/searching/detail/bm_traits.hpp>", private, "<boost/algorithm/searching/boyer_moore.hpp>", public ] },
+ { include: ["<boost/algorithm/searching/detail/debugging.hpp>", private, "<boost/algorithm/searching/boyer_moore_horspool.hpp>", public ] },
+ { include: ["<boost/algorithm/searching/detail/debugging.hpp>", private, "<boost/algorithm/searching/boyer_moore.hpp>", public ] },
+ { include: ["<boost/algorithm/searching/detail/debugging.hpp>", private, "<boost/algorithm/searching/knuth_morris_pratt.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/case_conv.hpp>", private, "<boost/algorithm/string/case_conv.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/classification.hpp>", private, "<boost/algorithm/string/classification.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/finder.hpp>", private, "<boost/algorithm/string/finder.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/finder_regex.hpp>", private, "<boost/algorithm/string/regex_find_format.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/find_format_all.hpp>", private, "<boost/algorithm/string/find_format.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/find_format.hpp>", private, "<boost/algorithm/string/find_format.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/find_iterator.hpp>", private, "<boost/algorithm/string/find_iterator.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/formatter.hpp>", private, "<boost/algorithm/string/formatter.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/formatter_regex.hpp>", private, "<boost/algorithm/string/regex_find_format.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/predicate.hpp>", private, "<boost/algorithm/string/predicate.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/sequence.hpp>", private, "<boost/algorithm/string/join.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/trim.hpp>", private, "<boost/algorithm/string/trim.hpp>", public ] },
+ { include: ["<boost/algorithm/string/detail/util.hpp>", private, "<boost/algorithm/string/iter_find.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_binary_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_binary_iprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_binary_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_binary_oprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_text_iprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_text_oprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_xml_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/basic_xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/codecvt_null.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/shared_ptr_helper.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/text_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/text_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/xml_archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/xml_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_prefix.hpp>", private, "<boost/archive/xml_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_binary_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_binary_iprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_binary_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_binary_oprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_text_iprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_text_oprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_xml_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/basic_xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/codecvt_null.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/shared_ptr_helper.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/text_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/text_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/xml_archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/xml_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/abi_suffix.hpp>", private, "<boost/archive/xml_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/basic_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/basic_binary_iprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/basic_binary_oprimitive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/basic_xml_archive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/codecvt_null.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/archive/xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/packed_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/packed_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_archive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_warchive.hpp>", private, "<boost/archive/text_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_warchive.hpp>", private, "<boost/archive/text_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_warchive.hpp>", private, "<boost/archive/xml_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/auto_link_warchive.hpp>", private, "<boost/archive/xml_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/basic_iarchive.hpp>", private, "<boost/serialization/collections_load_imp.hpp>", public ] },
+ { include: ["<boost/archive/detail/basic_iarchive.hpp>", private, "<boost/serialization/hash_collections_load_imp.hpp>", public ] },
+ { include: ["<boost/archive/detail/basic_iarchive.hpp>", private, "<boost/serialization/optional.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_iarchive.hpp>", private, "<boost/archive/basic_binary_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_iarchive.hpp>", private, "<boost/archive/basic_text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_iarchive.hpp>", private, "<boost/archive/basic_xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_iarchive.hpp>", private, "<boost/mpi/packed_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/archive/basic_binary_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/archive/basic_text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/archive/basic_xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/common_oarchive.hpp>", private, "<boost/mpi/packed_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/shared_ptr_helper.hpp>", public ] },
+ { include: ["<boost/archive/detail/decl.hpp>", private, "<boost/archive/xml_archive_exception.hpp>", public ] },
+ { include: ["<boost/archive/detail/interface_iarchive.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/interface_oarchive.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/iserializer.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/oserializer.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_iarchive_route.hpp>", private, "<boost/archive/polymorphic_binary_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_iarchive_route.hpp>", private, "<boost/archive/polymorphic_text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_iarchive_route.hpp>", private, "<boost/archive/polymorphic_text_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_iarchive_route.hpp>", private, "<boost/archive/polymorphic_xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_iarchive_route.hpp>", private, "<boost/archive/polymorphic_xml_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_oarchive_route.hpp>", private, "<boost/archive/polymorphic_binary_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_oarchive_route.hpp>", private, "<boost/archive/polymorphic_text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_oarchive_route.hpp>", private, "<boost/archive/polymorphic_text_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_oarchive_route.hpp>", private, "<boost/archive/polymorphic_xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/polymorphic_oarchive_route.hpp>", private, "<boost/archive/polymorphic_xml_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/binary_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/binary_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/binary_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/binary_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/polymorphic_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/polymorphic_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/text_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/text_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/text_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/text_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/xml_iarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/xml_oarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/xml_wiarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/archive/xml_woarchive.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/archive/detail/register_archive.hpp>", private, "<boost/serialization/export.hpp>", public ] },
+ { include: ["<boost/asio/detail/array_fwd.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/array.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/array.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/array.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/assert.hpp>", private, "<boost/asio/buffers_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/bind_handler.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/buffered_stream_storage.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/buffered_stream_storage.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/buffer_resize_guard.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/buffer_sequence_adapter.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/chrono_time_traits.hpp>", private, "<boost/asio/waitable_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/async_result.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_io_object.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_seq_packet_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_socket_iostream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_streambuf_fwd.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_stream_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/basic_waitable_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/buffered_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/buffers_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/completion_condition.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/connect.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/deadline_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/raw_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/seq_packet_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/generic/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/handler_alloc_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/handler_continuation_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/handler_invoke_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/handler_type.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/high_resolution_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/address.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/basic_resolver_entry.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/basic_resolver.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/basic_resolver_query.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/host_name.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/icmp.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/multicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/resolver_query_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/resolver_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/tcp.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/udp.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/unicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ip/v6_only.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/is_read_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/is_write_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/local/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/local/connect_pair.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/local/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/local/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/placeholders.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/posix/basic_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/posix/basic_stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/posix/descriptor_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/posix/stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/posix/stream_descriptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/read_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/read.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/serial_port_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/signal_set_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/context_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/old/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/rfc2818_verification.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/stream_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/verify_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/ssl/verify_mode.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/steady_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/system_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/use_future.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/waitable_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/basic_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/basic_object_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/basic_random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/basic_stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/object_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/object_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/overlapped_ptr.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/random_access_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/windows/stream_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/write_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/config.hpp>", private, "<boost/asio/write.hpp>", public ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/read_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/windows/random_access_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/cstdint.hpp>", private, "<boost/asio/write_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/deadline_timer_service.hpp>", private, "<boost/asio/deadline_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/deadline_timer_service.hpp>", private, "<boost/asio/waitable_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/function.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_seq_packet_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_stream_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/basic_waitable_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/ip/basic_resolver.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/posix/basic_stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/windows/basic_random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/handler_type_requirements.hpp>", private, "<boost/asio/windows/basic_stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/io_control.hpp>", private, "<boost/asio/posix/descriptor_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/io_control.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/limits.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/buffered_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/ssl/verify_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/noncopyable.hpp>", private, "<boost/asio/windows/overlapped_ptr.hpp>", public ] },
+ { include: ["<boost/asio/detail/null_socket_service.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/null_socket_service.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/null_socket_service.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/null_socket_service.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/async_result.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_io_object.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_seq_packet_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_socket_iostream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_stream_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/basic_waitable_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/buffered_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/buffers_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/completion_condition.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/connect.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/deadline_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/raw_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/seq_packet_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/generic/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/handler_alloc_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/handler_continuation_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/handler_invoke_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/handler_type.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/address.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/basic_resolver_entry.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/basic_resolver.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/basic_resolver_query.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/host_name.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/icmp.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/multicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/resolver_query_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/resolver_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/tcp.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/udp.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/unicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ip/v6_only.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/is_read_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/is_write_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/local/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/local/connect_pair.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/local/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/local/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/placeholders.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/posix/basic_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/posix/basic_stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/posix/descriptor_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/posix/stream_descriptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/read_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/read.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/serial_port_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/signal_set_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/context_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/old/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/rfc2818_verification.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/stream_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/verify_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/ssl/verify_mode.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/time_traits.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/use_future.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/waitable_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/wait_traits.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/basic_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/basic_object_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/basic_random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/basic_stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/object_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/overlapped_ptr.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/random_access_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/windows/stream_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/write_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/pop_options.hpp>", private, "<boost/asio/write.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/async_result.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_io_object.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_seq_packet_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_socket_iostream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_stream_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/basic_waitable_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/buffered_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/buffers_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/completion_condition.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/connect.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/deadline_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/raw_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/seq_packet_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/generic/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/handler_alloc_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/handler_continuation_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/handler_invoke_hook.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/handler_type.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/address.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/basic_resolver_entry.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/basic_resolver.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/basic_resolver_query.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/host_name.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/icmp.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/multicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/resolver_query_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/resolver_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/tcp.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/udp.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/unicast.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ip/v6_only.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/is_read_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/is_write_buffered.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/local/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/local/connect_pair.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/local/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/local/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/placeholders.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/posix/basic_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/posix/basic_stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/posix/descriptor_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/posix/stream_descriptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/read_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/read.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/serial_port_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/signal_set_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/context_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/error.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/context_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/old/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/rfc2818_verification.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/stream_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/stream_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/verify_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/ssl/verify_mode.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/time_traits.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/use_future.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/waitable_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/wait_traits.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/basic_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/basic_object_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/basic_random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/basic_stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/object_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/overlapped_ptr.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/random_access_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/windows/stream_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/write_at.hpp>", public ] },
+ { include: ["<boost/asio/detail/push_options.hpp>", private, "<boost/asio/write.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_descriptor_service.hpp>", private, "<boost/asio/posix/stream_descriptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_serial_port_service.hpp>", private, "<boost/asio/serial_port_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_socket_service.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_socket_service.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_socket_service.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_socket_service.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/reactive_socket_service.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/regex_fwd.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/detail/resolver_service.hpp>", private, "<boost/asio/ip/resolver_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/shared_ptr.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/signal_init.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/signal_set_service.hpp>", private, "<boost/asio/signal_set_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/ip/basic_resolver_query.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_ops.hpp>", private, "<boost/asio/local/connect_pair.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_option.hpp>", private, "<boost/asio/ip/tcp.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_option.hpp>", private, "<boost/asio/ip/v6_only.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_option.hpp>", private, "<boost/asio/posix/descriptor_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_option.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/generic/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/generic/raw_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/generic/seq_packet_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/generic/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/icmp.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/resolver_query_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/tcp.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/ip/udp.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/local/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/local/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/socket_base.hpp>", public ] },
+ { include: ["<boost/asio/detail/socket_types.hpp>", private, "<boost/asio/time_traits.hpp>", public ] },
+ { include: ["<boost/asio/detail/strand_service.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_deadline_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_seq_packet_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_serial_port.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_signal_set.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_stream_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/basic_waitable_timer.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ip/basic_resolver.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/local/connect_pair.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/posix/basic_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/posix/basic_stream_descriptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ssl/old/basic_context.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/ssl/old/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/windows/basic_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/windows/basic_object_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/windows/basic_random_access_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_error.hpp>", private, "<boost/asio/windows/basic_stream_handle.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/basic_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/generic/datagram_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/generic/raw_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/generic/seq_packet_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/throw_exception.hpp>", private, "<boost/asio/generic/stream_protocol.hpp>", public ] },
+ { include: ["<boost/asio/detail/timer_queue_ptime.hpp>", private, "<boost/asio/deadline_timer_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/basic_datagram_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/basic_raw_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/basic_socket_acceptor.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/basic_socket.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/buffer.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/buffers_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/ssl/old/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/detail/type_traits.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/variadic_templates.hpp>", private, "<boost/asio/basic_socket_iostream.hpp>", public ] },
+ { include: ["<boost/asio/detail/variadic_templates.hpp>", private, "<boost/asio/basic_socket_streambuf.hpp>", public ] },
+ { include: ["<boost/asio/detail/weak_ptr.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_handle_service.hpp>", private, "<boost/asio/windows/random_access_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_handle_service.hpp>", private, "<boost/asio/windows/stream_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_overlapped_ptr.hpp>", private, "<boost/asio/windows/overlapped_ptr.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_serial_port_service.hpp>", private, "<boost/asio/serial_port_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service.hpp>", private, "<boost/asio/datagram_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service.hpp>", private, "<boost/asio/raw_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service.hpp>", private, "<boost/asio/seq_packet_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service.hpp>", private, "<boost/asio/socket_acceptor_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_iocp_socket_service.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/win_object_handle_service.hpp>", private, "<boost/asio/windows/object_handle_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/winrt_resolver_service.hpp>", private, "<boost/asio/ip/resolver_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/winrt_ssocket_service.hpp>", private, "<boost/asio/stream_socket_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/winrt_utils.hpp>", private, "<boost/asio/ip/basic_resolver_iterator.hpp>", public ] },
+ { include: ["<boost/asio/detail/winsock_init.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/winsock_init.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/detail/winsock_init.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/detail/wrapped_handler.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/detail/wrapped_handler.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/detail/wrapped_handler.hpp>", private, "<boost/asio/strand.hpp>", public ] },
+ { include: ["<boost/asio/generic/detail/endpoint.hpp>", private, "<boost/asio/generic/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/impl/buffered_read_stream.hpp>", private, "<boost/asio/buffered_read_stream.hpp>", public ] },
+ { include: ["<boost/asio/impl/buffered_write_stream.hpp>", private, "<boost/asio/buffered_write_stream.hpp>", public ] },
+ { include: ["<boost/asio/impl/connect.hpp>", private, "<boost/asio/connect.hpp>", public ] },
+ { include: ["<boost/asio/impl/error.ipp>", private, "<boost/asio/error.hpp>", public ] },
+ { include: ["<boost/asio/impl/handler_alloc_hook.ipp>", private, "<boost/asio/handler_alloc_hook.hpp>", public ] },
+ { include: ["<boost/asio/impl/io_service.hpp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/impl/io_service.ipp>", private, "<boost/asio/io_service.hpp>", public ] },
+ { include: ["<boost/asio/impl/read_at.hpp>", private, "<boost/asio/read_at.hpp>", public ] },
+ { include: ["<boost/asio/impl/read.hpp>", private, "<boost/asio/read.hpp>", public ] },
+ { include: ["<boost/asio/impl/read_until.hpp>", private, "<boost/asio/read_until.hpp>", public ] },
+ { include: ["<boost/asio/impl/serial_port_base.hpp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/impl/serial_port_base.ipp>", private, "<boost/asio/serial_port_base.hpp>", public ] },
+ { include: ["<boost/asio/impl/spawn.hpp>", private, "<boost/asio/spawn.hpp>", public ] },
+ { include: ["<boost/asio/impl/use_future.hpp>", private, "<boost/asio/use_future.hpp>", public ] },
+ { include: ["<boost/asio/impl/write_at.hpp>", private, "<boost/asio/write_at.hpp>", public ] },
+ { include: ["<boost/asio/impl/write.hpp>", private, "<boost/asio/write.hpp>", public ] },
+ { include: ["<boost/asio/ip/detail/endpoint.hpp>", private, "<boost/asio/ip/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/ip/detail/socket_option.hpp>", private, "<boost/asio/ip/multicast.hpp>", public ] },
+ { include: ["<boost/asio/ip/detail/socket_option.hpp>", private, "<boost/asio/ip/unicast.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address.hpp>", private, "<boost/asio/ip/address.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address.ipp>", private, "<boost/asio/ip/address.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address_v4.hpp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address_v4.ipp>", private, "<boost/asio/ip/address_v4.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address_v6.hpp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/address_v6.ipp>", private, "<boost/asio/ip/address_v6.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/basic_endpoint.hpp>", private, "<boost/asio/ip/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/ip/impl/host_name.ipp>", private, "<boost/asio/ip/host_name.hpp>", public ] },
+ { include: ["<boost/asio/local/detail/endpoint.hpp>", private, "<boost/asio/local/basic_endpoint.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/buffered_handshake_op.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/handshake_op.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/io.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_init.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/context_base.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/rfc2818_verification.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/verify_context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/openssl_types.hpp>", private, "<boost/asio/ssl/verify_mode.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/password_callback.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/read_op.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/shutdown_op.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/stream_core.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/verify_callback.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/detail/write_op.hpp>", private, "<boost/asio/ssl/stream.hpp>", public ] },
+ { include: ["<boost/asio/ssl/impl/context.hpp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/impl/context.ipp>", private, "<boost/asio/ssl/context.hpp>", public ] },
+ { include: ["<boost/asio/ssl/impl/error.ipp>", private, "<boost/asio/ssl/error.hpp>", public ] },
+ { include: ["<boost/asio/ssl/impl/rfc2818_verification.ipp>", private, "<boost/asio/ssl/rfc2818_verification.hpp>", public ] },
+ { include: ["<boost/asio/ssl/old/detail/openssl_context_service.hpp>", private, "<boost/asio/ssl/old/context_service.hpp>", public ] },
+ { include: ["<boost/asio/ssl/old/detail/openssl_stream_service.hpp>", private, "<boost/asio/ssl/old/stream_service.hpp>", public ] },
+ { include: ["<boost/atomic/detail/config.hpp>", private, "<boost/atomic/atomic.hpp>", public ] },
+ { include: ["<boost/atomic/detail/platform.hpp>", private, "<boost/atomic/atomic.hpp>", public ] },
+ { include: ["<boost/atomic/detail/type-classification.hpp>", private, "<boost/atomic/atomic.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/container_adaptor/list_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/container_adaptor/list_map_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/views/multiset_view.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/views/vector_map_view.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>", private, "<boost/bimap/views/vector_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/functor_bag.hpp>", private, "<boost/bimap/container_adaptor/container_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/identity_converters.hpp>", private, "<boost/bimap/container_adaptor/associative_container_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/identity_converters.hpp>", private, "<boost/bimap/container_adaptor/container_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/identity_converters.hpp>", private, "<boost/bimap/container_adaptor/list_map_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/identity_converters.hpp>", private, "<boost/bimap/container_adaptor/sequence_container_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/identity_converters.hpp>", private, "<boost/bimap/container_adaptor/vector_map_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/key_extractor.hpp>", private, "<boost/bimap/container_adaptor/list_map_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp>", private, "<boost/bimap/container_adaptor/multimap_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp>", private, "<boost/bimap/container_adaptor/multiset_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp>", private, "<boost/bimap/container_adaptor/unordered_multimap_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp>", private, "<boost/bimap/container_adaptor/unordered_multiset_adaptor.hpp>", public ] },
+ { include: ["<boost/bimap/detail/bimap_core.hpp>", private, "<boost/bimap/bimap.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/list_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/unconstrained_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/unordered_multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/unordered_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/concept_tags.hpp>", private, "<boost/bimap/vector_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/relation/structured_pair.hpp>", public ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/relation/support/member_with_tag.hpp>", public ] },
+ { include: ["<boost/bimap/detail/debug/static_error.hpp>", private, "<boost/bimap/tags/support/tag_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/list_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/unconstrained_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/unordered_multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/unordered_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_index_binder.hpp>", private, "<boost/bimap/vector_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/list_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/unconstrained_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/unordered_multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/unordered_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_relation_binder.hpp>", private, "<boost/bimap/vector_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/list_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/unconstrained_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/unordered_multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/unordered_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/generate_view_binder.hpp>", private, "<boost/bimap/vector_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/bimap.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/list_map_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/list_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/map_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/multimap_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/unordered_map_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/unordered_multimap_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/vector_map_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/map_view_base.hpp>", private, "<boost/bimap/views/vector_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/modifier_adaptor.hpp>", private, "<boost/bimap/bimap.hpp>", public ] },
+ { include: ["<boost/bimap/detail/non_unique_views_helper.hpp>", private, "<boost/bimap/views/multimap_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/non_unique_views_helper.hpp>", private, "<boost/bimap/views/multiset_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/non_unique_views_helper.hpp>", private, "<boost/bimap/views/unordered_multimap_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/non_unique_views_helper.hpp>", private, "<boost/bimap/views/unordered_multiset_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/list_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/multiset_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/unordered_multiset_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/unordered_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/set_view_base.hpp>", private, "<boost/bimap/views/vector_set_view.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/bimap.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/list_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/unconstrained_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/unordered_multiset_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/unordered_set_of.hpp>", public ] },
+ { include: ["<boost/bimap/detail/user_interface_config.hpp>", private, "<boost/bimap/vector_of.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/access_builder.hpp>", private, "<boost/bimap/relation/support/get.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/access_builder.hpp>", private, "<boost/bimap/relation/support/pair_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/access_builder.hpp>", private, "<boost/bimap/support/map_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/relation/support/data_extractor.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/relation/support/opposite_tag.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/relation/support/pair_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/relation/support/value_type_of.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/support/data_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/support/iterator_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/support/key_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/support/map_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/metadata_access_builder.hpp>", private, "<boost/bimap/support/value_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/mutant.hpp>", private, "<boost/bimap/relation/mutant_relation.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/static_access_builder.hpp>", private, "<boost/bimap/support/iterator_type_by.hpp>", public ] },
+ { include: ["<boost/bimap/relation/detail/to_mutable_relation_functor.hpp>", private, "<boost/bimap/views/list_map_view.hpp>", public ] },
+ { include: ["<boost/chrono/detail/inlined/chrono.hpp>", private, "<boost/chrono/system_clocks.hpp>", public ] },
+ { include: ["<boost/chrono/detail/inlined/process_cpu_clocks.hpp>", private, "<boost/chrono/process_cpu_clocks.hpp>", public ] },
+ { include: ["<boost/chrono/detail/inlined/thread_clock.hpp>", private, "<boost/chrono/thread_clock.hpp>", public ] },
+ { include: ["<boost/chrono/detail/is_evenly_divisible_by.hpp>", private, "<boost/chrono/duration.hpp>", public ] },
+ { include: ["<boost/chrono/detail/no_warning/signed_unsigned_cmp.hpp>", private, "<boost/chrono/io/duration_get.hpp>", public ] },
+ { include: ["<boost/chrono/detail/no_warning/signed_unsigned_cmp.hpp>", private, "<boost/chrono/io_v1/chrono_io.hpp>", public ] },
+ { include: ["<boost/chrono/detail/scan_keyword.hpp>", private, "<boost/chrono/io/duration_get.hpp>", public ] },
+ { include: ["<boost/chrono/detail/scan_keyword.hpp>", private, "<boost/chrono/io/time_point_get.hpp>", public ] },
+ { include: ["<boost/chrono/detail/scan_keyword.hpp>", private, "<boost/chrono/io/time_point_io.hpp>", public ] },
+ { include: ["<boost/chrono/detail/scan_keyword.hpp>", private, "<boost/chrono/io_v1/chrono_io.hpp>", public ] },
+ { include: ["<boost/chrono/detail/static_assert.hpp>", private, "<boost/chrono/duration.hpp>", public ] },
+ { include: ["<boost/chrono/detail/system.hpp>", private, "<boost/chrono/process_cpu_clocks.hpp>", public ] },
+ { include: ["<boost/chrono/detail/system.hpp>", private, "<boost/chrono/system_clocks.hpp>", public ] },
+ { include: ["<boost/chrono/detail/system.hpp>", private, "<boost/chrono/thread_clock.hpp>", public ] },
+ { include: ["<boost/concept/detail/backward_compatibility.hpp>", private, "<boost/concept/usage.hpp>", public ] },
+ { include: ["<boost/concept/detail/borland.hpp>", private, "<boost/concept/assert.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/concept_check.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/graph/bron_kerbosch_all_cliques.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/graph/buffer_concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/graph/distributed/concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/graph/graph_concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/graph/tiernan_all_cycles.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_def.hpp>", private, "<boost/iterator/iterator_concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/concept_check.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/graph/bron_kerbosch_all_cliques.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/graph/distributed/concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/graph/graph_concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/graph/tiernan_all_cycles.hpp>", public ] },
+ { include: ["<boost/concept/detail/concept_undef.hpp>", private, "<boost/iterator/iterator_concepts.hpp>", public ] },
+ { include: ["<boost/concept/detail/general.hpp>", private, "<boost/concept/assert.hpp>", public ] },
+ { include: ["<boost/concept/detail/msvc.hpp>", private, "<boost/concept/assert.hpp>", public ] },
+ { include: ["<boost/container/detail/advanced_insert_int.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/advanced_insert_int.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/algorithms.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/allocation_type.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/allocation_type.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/allocation_type.hpp>", private, "<boost/interprocess/containers/allocation_type.hpp>", public ] },
+ { include: ["<boost/container/detail/allocator_version_traits.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/allocator_version_traits.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/allocator_version_traits.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/flat_set.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/scoped_allocator_fwd.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/static_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/throw_exception.hpp>", public ] },
+ { include: ["<boost/container/detail/config_begin.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/flat_set.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/scoped_allocator_fwd.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/static_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/throw_exception.hpp>", public ] },
+ { include: ["<boost/container/detail/config_end.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/destroyers.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/flat_tree.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/container/detail/flat_tree.hpp>", private, "<boost/container/flat_set.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/iterators.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/memory_util.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/flat_set.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/mpl.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/private_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/allocators/private_node_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/multiallocation_chain.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/container/detail/node_alloc_holder.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/node_alloc_holder.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/pair.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/pair.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/pair.hpp>", private, "<boost/interprocess/containers/pair.hpp>", public ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/scoped_allocator_fwd.hpp>", public ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/container/detail/preprocessor.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/tree.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/tree.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/scoped_allocator_fwd.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/type_traits.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/utilities.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/value_init.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/container/detail/version_type.hpp>", private, "<boost/interprocess/containers/version_type.hpp>", public ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/config.hpp>", private, "<boost/coroutine/stack_allocator.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_arm.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_i386.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_i386_win.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_mips.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_ppc.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_sparc.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_x86_64.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/context/detail/fcontext_x86_64_win.hpp>", private, "<boost/context/fcontext.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/exceptions.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/stack_context.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/config.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/coroutine_context.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/param.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/segmented_stack_allocator.hpp>", private, "<boost/coroutine/stack_allocator.hpp>", public ] },
+ { include: ["<boost/coroutine/detail/standard_stack_allocator.hpp>", private, "<boost/coroutine/stack_allocator.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/arg.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_base.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_caller.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_get.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_object.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v1/detail/coroutine_op.hpp>", private, "<boost/coroutine/v1/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/pull_coroutine_base.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/pull_coroutine_caller.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/pull_coroutine_object.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/push_coroutine_base.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/push_coroutine_caller.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/coroutine/v2/detail/push_coroutine_object.hpp>", private, "<boost/coroutine/v2/coroutine.hpp>", public ] },
+ { include: ["<boost/detail/algorithm.hpp>", private, "<boost/graph/graph_utility.hpp>", public ] },
+ { include: ["<boost/detail/algorithm.hpp>", private, "<boost/graph/isomorphism.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/flyweight/set_factory.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/statechart/fifo_worker.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/statechart/processor_container.hpp>", public ] },
+ { include: ["<boost/detail/allocator_utilities.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/flyweight/refcounted.hpp>", public ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/log/attributes/counter.hpp>", public ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/log/core/record_view.hpp>", public ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/wave/cpplexer/cpp_lex_token.hpp>", public ] },
+ { include: ["<boost/detail/atomic_count.hpp>", private, "<boost/wave/util/macro_definition.hpp>", public ] },
+ { include: ["<boost/detail/atomic_redef_macros.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/detail/atomic_undef_macros.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/detail/binary_search.hpp>", private, "<boost/test/utils/fixed_mapping.hpp>", public ] },
+ { include: ["<boost/detail/call_traits.hpp>", private, "<boost/call_traits.hpp>", public ] },
+ { include: ["<boost/detail/compressed_pair.hpp>", private, "<boost/compressed_pair.hpp>", public ] },
+ { include: ["<boost/detail/container_fwd.hpp>", private, "<boost/functional/hash/extensions.hpp>", public ] },
+ { include: ["<boost/detail/dynamic_bitset.hpp>", private, "<boost/dynamic_bitset/dynamic_bitset.hpp>", public ] },
+ { include: ["<boost/detail/endian.hpp>", private, "<boost/mpl/string.hpp>", public ] },
+ { include: ["<boost/detail/endian.hpp>", private, "<boost/multiprecision/cpp_int.hpp>", public ] },
+ { include: ["<boost/detail/fenv.hpp>", private, "<boost/math/tools/config.hpp>", public ] },
+ { include: ["<boost/detail/indirect_traits.hpp>", private, "<boost/iterator/indirect_iterator.hpp>", public ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/thread/win32/basic_timed_mutex.hpp>", public ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/thread/win32/interlocked_read.hpp>", public ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/thread/win32/once.hpp>", public ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/thread/win32/shared_mutex.hpp>", public ] },
+ { include: ["<boost/detail/interlocked.hpp>", private, "<boost/thread/win32/thread_primitives.hpp>", public ] },
+ { include: ["<boost/detail/is_incrementable.hpp>", private, "<boost/icl/type_traits/is_discrete.hpp>", public ] },
+ { include: ["<boost/detail/is_incrementable.hpp>", private, "<boost/indirect_reference.hpp>", public ] },
+ { include: ["<boost/detail/is_incrementable.hpp>", private, "<boost/iterator/new_iterator_tests.hpp>", public ] },
+ { include: ["<boost/detail/is_incrementable.hpp>", private, "<boost/pointee.hpp>", public ] },
+ { include: ["<boost/detail/is_sorted.hpp>", private, "<boost/graph/distributed/connected_components.hpp>", public ] },
+ { include: ["<boost/detail/is_sorted.hpp>", private, "<boost/range/algorithm_ext/is_sorted.hpp>", public ] },
+ { include: ["<boost/detail/is_xxx.hpp>", private, "<boost/parameter/parameters.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/algorithm/string/find_format.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/algorithm/string/formatter.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/array.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/circular_buffer.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/concept_check.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/dynamic_bitset/dynamic_bitset.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/graph/incremental_components.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/indirect_iterator.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/is_readable_iterator.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/iterator_adaptor.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/iterator_categories.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/iterator_concepts.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/iterator_traits.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/new_iterator_tests.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/iterator/zip_iterator.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/property_map/property_map.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/python/object/iterator.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/classic/core/scanner/scanner.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/classic/iterator/multi_pass.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/classic/iterator/position_iterator_fwd.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/classic/tree/common.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/classic/utility/regex.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/lexer.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/functor.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/position_token.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/token.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/lex/lexer/token_def.hpp>", public ] },
+ { include: ["<boost/detail/iterator.hpp>", private, "<boost/spirit/home/support/container.hpp>", public ] },
+ { include: ["<boost/detail/lcast_precision.hpp>", private, "<boost/lexical_cast.hpp>", public ] },
+ { include: ["<boost/detail/lightweight_test.hpp>", private, "<boost/iterator/new_iterator_tests.hpp>", public ] },
+ { include: ["<boost/detail/lightweight_test.hpp>", private, "<boost/mpl/aux_/test.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/chrono/io/duration_io.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/chrono/io/time_point_io.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/circular_buffer/details.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/scoped_allocator.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/string.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/managed_heap_memory.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/interprocess/smart_ptr/weak_ptr.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/move/algorithm.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/msm/back/state_machine.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/serialization/state_saver.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/thread/pthread/once_atomic.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/thread/pthread/once.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/thread/win32/once.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/thread/win32/thread_heap_alloc.hpp>", public ] },
+ { include: ["<boost/detail/no_exceptions_support.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/detail/numeric_traits.hpp>", private, "<boost/graph/bandwidth.hpp>", public ] },
+ { include: ["<boost/detail/numeric_traits.hpp>", private, "<boost/graph/minimum_degree_ordering.hpp>", public ] },
+ { include: ["<boost/detail/numeric_traits.hpp>", private, "<boost/graph/profile.hpp>", public ] },
+ { include: ["<boost/detail/numeric_traits.hpp>", private, "<boost/graph/wavefront.hpp>", public ] },
+ { include: ["<boost/detail/numeric_traits.hpp>", private, "<boost/iterator/counting_iterator.hpp>", public ] },
+ { include: ["<boost/detail/ob_call_traits.hpp>", private, "<boost/call_traits.hpp>", public ] },
+ { include: ["<boost/detail/ob_compressed_pair.hpp>", private, "<boost/compressed_pair.hpp>", public ] },
+ { include: ["<boost/detail/reference_content.hpp>", private, "<boost/optional/optional.hpp>", public ] },
+ { include: ["<boost/detail/reference_content.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/chrono/io/duration_style.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/chrono/io/timezone.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/coroutine/exceptions.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/thread/cv_status.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/thread/future_error_code.hpp>", public ] },
+ { include: ["<boost/detail/scoped_enum_emulation.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/detail/select_type.hpp>", private, "<boost/cast.hpp>", public ] },
+ { include: ["<boost/detail/sp_typeinfo.hpp>", private, "<boost/proto/debug.hpp>", public ] },
+ { include: ["<boost/detail/templated_streams.hpp>", private, "<boost/blank.hpp>", public ] },
+ { include: ["<boost/detail/templated_streams.hpp>", private, "<boost/flyweight/flyweight_fwd.hpp>", public ] },
+ { include: ["<boost/exception/detail/attribute_noreturn.hpp>", private, "<boost/throw_exception.hpp>", public ] },
+ { include: ["<boost/exception/detail/error_info_impl.hpp>", private, "<boost/exception/get_error_info.hpp>", public ] },
+ { include: ["<boost/exception/detail/error_info_impl.hpp>", private, "<boost/exception/info.hpp>", public ] },
+ { include: ["<boost/exception/detail/exception_ptr.hpp>", private, "<boost/exception_ptr.hpp>", public ] },
+ { include: ["<boost/exception/detail/is_output_streamable.hpp>", private, "<boost/exception/to_string.hpp>", public ] },
+ { include: ["<boost/exception/detail/object_hex_dump.hpp>", private, "<boost/exception/to_string_stub.hpp>", public ] },
+ { include: ["<boost/exception/detail/type_info.hpp>", private, "<boost/exception/get_error_info.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/default_value_policy.hpp>", private, "<boost/flyweight/flyweight.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/flyweight_core.hpp>", private, "<boost/flyweight/flyweight.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/is_placeholder_expr.hpp>", private, "<boost/flyweight/assoc_container_factory.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/nested_xxx_if_not_ph.hpp>", private, "<boost/flyweight/assoc_container_factory.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/not_placeholder_expr.hpp>", private, "<boost/flyweight/assoc_container_factory_fwd.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/not_placeholder_expr.hpp>", private, "<boost/flyweight/hashed_factory_fwd.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/not_placeholder_expr.hpp>", private, "<boost/flyweight/set_factory_fwd.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/perfect_fwd.hpp>", private, "<boost/flyweight/flyweight.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/perfect_fwd.hpp>", private, "<boost/flyweight/key_value.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/recursive_lw_mutex.hpp>", private, "<boost/flyweight/simple_locking.hpp>", public ] },
+ { include: ["<boost/flyweight/detail/value_tag.hpp>", private, "<boost/flyweight/key_value.hpp>", public ] },
+ { include: ["<boost/functional/hash/detail/hash_float.hpp>", private, "<boost/functional/hash/hash.hpp>", public ] },
+ { include: ["<boost/functional/overloaded_function/detail/base.hpp>", private, "<boost/functional/overloaded_function.hpp>", public ] },
+ { include: ["<boost/functional/overloaded_function/detail/function_type.hpp>", private, "<boost/functional/overloaded_function.hpp>", public ] },
+ { include: ["<boost/function_types/detail/classifier.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/function_types/detail/class_transform.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/function_types/detail/components_as_mpl_sequence.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/function_types/detail/pp_loop.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/function_types/detail/pp_loop.hpp>", private, "<boost/function_types/property_tags.hpp>", public ] },
+ { include: ["<boost/function_types/detail/pp_tags/preprocessed.hpp>", private, "<boost/function_types/property_tags.hpp>", public ] },
+ { include: ["<boost/function_types/detail/retag_default_cc.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/function_types/detail/synthesize.hpp>", private, "<boost/function_types/function_type.hpp>", public ] },
+ { include: ["<boost/function_types/detail/synthesize.hpp>", private, "<boost/function_types/member_function_pointer.hpp>", public ] },
+ { include: ["<boost/function_types/detail/synthesize.hpp>", private, "<boost/function_types/member_object_pointer.hpp>", public ] },
+ { include: ["<boost/function_types/detail/to_sequence.hpp>", private, "<boost/function_types/function_type.hpp>", public ] },
+ { include: ["<boost/function_types/detail/to_sequence.hpp>", private, "<boost/function_types/member_function_pointer.hpp>", public ] },
+ { include: ["<boost/function_types/detail/to_sequence.hpp>", private, "<boost/function_types/member_object_pointer.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/adt/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/adt/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/adt/detail/extension.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/adt/detail/extension.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/at_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/end_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/size_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_array/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/boost_array.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/at_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/end_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/size_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/boost_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/at_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/begin_impl.hpp>", private, "<boost/fusion/mpl/begin.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/empty_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/end_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/end_impl.hpp>", private, "<boost/fusion/mpl/end.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/has_key_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/size_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/mpl/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/mpl.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/at_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/end_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/size_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/std_tuple/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/std_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/adapt_base.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/at_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/at_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/at_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/at_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/begin_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/category_of_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/define_struct.hpp>", private, "<boost/fusion/adapted/struct/define_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/define_struct.hpp>", private, "<boost/fusion/adapted/struct/define_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/define_struct_inline.hpp>", private, "<boost/fusion/adapted/struct/define_struct_inline.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_data_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_data_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/deref_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/end_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/end_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/end_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/end_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/extension.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/extension.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/extension.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/extension.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_sequence_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/is_view_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/key_of_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/key_of_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt_named.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt_named.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct_named.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/proxy_type.hpp>", private, "<boost/fusion/include/proxy_type.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/size_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/size_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/size_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/size_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_at_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_data_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_data_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_impl.hpp>", private, "<boost/fusion/adapted/adt/adapt_assoc_adt.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_assoc_struct.hpp>", public ] },
+ { include: ["<boost/fusion/adapted/struct/detail/value_of_impl.hpp>", private, "<boost/fusion/adapted/struct/adapt_struct.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/fold.hpp>", private, "<boost/fusion/algorithm/iteration/fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/fold.hpp>", private, "<boost/fusion/algorithm/iteration/iter_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/fold.hpp>", private, "<boost/fusion/algorithm/iteration/reverse_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/fold.hpp>", private, "<boost/fusion/algorithm/iteration/reverse_iter_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/for_each.hpp>", private, "<boost/fusion/algorithm/iteration/for_each.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp>", private, "<boost/fusion/algorithm/iteration/fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp>", private, "<boost/fusion/algorithm/iteration/iter_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp>", private, "<boost/fusion/algorithm/iteration/reverse_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp>", private, "<boost/fusion/algorithm/iteration/reverse_iter_fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/segmented_fold.hpp>", private, "<boost/fusion/algorithm/iteration/fold.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/iteration/detail/segmented_for_each.hpp>", private, "<boost/fusion/algorithm/iteration/for_each.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/all.hpp>", private, "<boost/fusion/algorithm/query/all.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/any.hpp>", private, "<boost/fusion/algorithm/query/any.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/count.hpp>", private, "<boost/fusion/algorithm/query/count.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/count_if.hpp>", private, "<boost/fusion/algorithm/query/count_if.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/find_if.hpp>", private, "<boost/fusion/algorithm/query/find.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/find_if.hpp>", private, "<boost/fusion/algorithm/query/find_if.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/find_if.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/segmented_find.hpp>", private, "<boost/fusion/algorithm/query/find.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/query/detail/segmented_find_if.hpp>", private, "<boost/fusion/algorithm/query/find_if.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/preprocessed/zip.hpp>", private, "<boost/fusion/algorithm/transformation/zip.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/replace.hpp>", private, "<boost/fusion/algorithm/transformation/replace.hpp>", public ] },
+ { include: ["<boost/fusion/algorithm/transformation/detail/replace_if.hpp>", private, "<boost/fusion/algorithm/transformation/replace_if.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/at_impl.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/begin_impl.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/build_deque.hpp>", private, "<boost/fusion/container/deque/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/convert_impl.hpp>", private, "<boost/fusion/container/deque/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/build_deque.hpp>", private, "<boost/fusion/container/deque/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque_fwd.hpp>", private, "<boost/fusion/container/deque/deque_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/cpp03/deque.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/deque_keyed_values.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/end_impl.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/is_sequence_impl.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/back_extended_deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/deque_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/keyed_element.hpp>", private, "<boost/fusion/container/deque/front_extended_deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/deque/detail/value_at_impl.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/pp_deque_tie.hpp>", private, "<boost/fusion/container/generation/deque_tie.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/pp_make_deque.hpp>", private, "<boost/fusion/container/generation/make_deque.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/pp_make_map.hpp>", private, "<boost/fusion/container/generation/make_map.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/pp_map_tie.hpp>", private, "<boost/fusion/container/generation/map_tie.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/list_tie.hpp>", private, "<boost/fusion/container/generation/list_tie.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_list.hpp>", private, "<boost/fusion/container/generation/make_list.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_set.hpp>", private, "<boost/fusion/container/generation/make_set.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/make_vector.hpp>", private, "<boost/fusion/container/generation/make_vector.hpp>", public ] },
+ { include: ["<boost/fusion/container/generation/detail/preprocessed/vector_tie.hpp>", private, "<boost/fusion/container/generation/vector_tie.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/at_impl.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/begin_impl.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/build_cons.hpp>", private, "<boost/fusion/container/list/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/convert_impl.hpp>", private, "<boost/fusion/container/list/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/deref_impl.hpp>", private, "<boost/fusion/container/list/cons_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/empty_impl.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/end_impl.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/equal_to_impl.hpp>", private, "<boost/fusion/container/list/cons_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/list_forward_ctor.hpp>", private, "<boost/fusion/container/list/list.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/list_to_cons.hpp>", private, "<boost/fusion/container/list/list.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/next_impl.hpp>", private, "<boost/fusion/container/list/cons_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list_fwd.hpp>", private, "<boost/fusion/container/list/list_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/preprocessed/list.hpp>", private, "<boost/fusion/container/list/list.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/value_at_impl.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/container/list/detail/value_of_impl.hpp>", private, "<boost/fusion/container/list/cons_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/at_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/at_key_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/begin_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/build_map.hpp>", private, "<boost/fusion/container/map/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/convert.hpp>", private, "<boost/fusion/container/map/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map_fwd.hpp>", private, "<boost/fusion/container/map/map_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/cpp03/map.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/end_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/map_impl.hpp>", private, "<boost/fusion/container/map/map_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/map_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/value_at_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/map/detail/value_at_key_impl.hpp>", private, "<boost/fusion/container/map/map.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/as_set.hpp>", private, "<boost/fusion/container/set/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/begin_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/convert_impl.hpp>", private, "<boost/fusion/container/set/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/deref_data_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/deref_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/end_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/key_of_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set_fwd.hpp>", private, "<boost/fusion/container/set/set_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/preprocessed/set.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/set_forward_ctor.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/value_of_data_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/set/detail/value_of_impl.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/advance_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/as_vector.hpp>", private, "<boost/fusion/container/vector/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/at_impl.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/at_impl.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/at_impl.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/at_impl.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/at_impl.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/begin_impl.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/begin_impl.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/begin_impl.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/begin_impl.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/begin_impl.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/convert_impl.hpp>", private, "<boost/fusion/container/vector/convert.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/deref_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/distance_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/end_impl.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/end_impl.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/end_impl.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/end_impl.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/end_impl.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/equal_to_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/next_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector10_fwd.hpp>", private, "<boost/fusion/container/vector/vector10_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector10.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector20_fwd.hpp>", private, "<boost/fusion/container/vector/vector20_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector20.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector30_fwd.hpp>", private, "<boost/fusion/container/vector/vector30_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector30.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector40_fwd.hpp>", private, "<boost/fusion/container/vector/vector40_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector40.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector50_fwd.hpp>", private, "<boost/fusion/container/vector/vector50_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector50.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector_fwd.hpp>", private, "<boost/fusion/container/vector/vector_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/preprocessed/vector.hpp>", private, "<boost/fusion/container/vector/vector.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/prior_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_at_impl.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_at_impl.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_at_impl.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_at_impl.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_at_impl.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/value_of_impl.hpp>", private, "<boost/fusion/container/vector/vector_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/vector_forward_ctor.hpp>", private, "<boost/fusion/container/vector/vector.hpp>", public ] },
+ { include: ["<boost/fusion/container/vector/detail/vector_n_chooser.hpp>", private, "<boost/fusion/container/vector/vector.hpp>", public ] },
+ { include: ["<boost/fusion/functional/adapter/detail/access.hpp>", private, "<boost/fusion/functional/adapter/fused_function_object.hpp>", public ] },
+ { include: ["<boost/fusion/functional/adapter/detail/access.hpp>", private, "<boost/fusion/functional/adapter/fused.hpp>", public ] },
+ { include: ["<boost/fusion/functional/adapter/detail/access.hpp>", private, "<boost/fusion/functional/adapter/fused_procedure.hpp>", public ] },
+ { include: ["<boost/fusion/functional/adapter/detail/access.hpp>", private, "<boost/fusion/functional/adapter/unfused.hpp>", public ] },
+ { include: ["<boost/fusion/functional/adapter/detail/access.hpp>", private, "<boost/fusion/functional/adapter/unfused_typed.hpp>", public ] },
+ { include: ["<boost/fusion/functional/generation/detail/gen_make_adapter.hpp>", private, "<boost/fusion/functional/generation/make_fused_function_object.hpp>", public ] },
+ { include: ["<boost/fusion/functional/generation/detail/gen_make_adapter.hpp>", private, "<boost/fusion/functional/generation/make_fused.hpp>", public ] },
+ { include: ["<boost/fusion/functional/generation/detail/gen_make_adapter.hpp>", private, "<boost/fusion/functional/generation/make_fused_procedure.hpp>", public ] },
+ { include: ["<boost/fusion/functional/generation/detail/gen_make_adapter.hpp>", private, "<boost/fusion/functional/generation/make_unfused.hpp>", public ] },
+ { include: ["<boost/fusion/functional/invocation/detail/that_ptr.hpp>", private, "<boost/fusion/functional/invocation/invoke.hpp>", public ] },
+ { include: ["<boost/fusion/functional/invocation/detail/that_ptr.hpp>", private, "<boost/fusion/functional/invocation/invoke_procedure.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/advance.hpp>", private, "<boost/fusion/iterator/advance.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/advance.hpp>", private, "<boost/fusion/iterator/iterator_adapter.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/advance.hpp>", private, "<boost/fusion/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/distance.hpp>", private, "<boost/fusion/iterator/distance.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/distance.hpp>", private, "<boost/fusion/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/segmented_iterator.hpp>", private, "<boost/fusion/iterator/segmented_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/iterator/detail/segmented_next_impl.hpp>", private, "<boost/fusion/iterator/segmented_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/mpl/detail/clear.hpp>", private, "<boost/fusion/mpl/clear.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/equal_to.hpp>", private, "<boost/fusion/algorithm/auxiliary/copy.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/equal_to.hpp>", private, "<boost/fusion/algorithm/auxiliary/move.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/equal_to.hpp>", private, "<boost/fusion/sequence/comparison/equal_to.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/greater_equal.hpp>", private, "<boost/fusion/sequence/comparison/greater_equal.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/greater.hpp>", private, "<boost/fusion/sequence/comparison/greater.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/less_equal.hpp>", private, "<boost/fusion/sequence/comparison/less_equal.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/less.hpp>", private, "<boost/fusion/sequence/comparison/less.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/comparison/detail/not_equal_to.hpp>", private, "<boost/fusion/sequence/comparison/not_equal_to.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp>", private, "<boost/fusion/sequence/intrinsic/begin.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_end.hpp>", private, "<boost/fusion/sequence/intrinsic/end.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/intrinsic/detail/segmented_size.hpp>", private, "<boost/fusion/sequence/intrinsic/size.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/io/detail/in.hpp>", private, "<boost/fusion/sequence/io/in.hpp>", public ] },
+ { include: ["<boost/fusion/sequence/io/detail/out.hpp>", private, "<boost/fusion/sequence/io/out.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/adapted/std_tuple/std_tuple_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/deque/deque.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/list/cons.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/set/set.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/vector10.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/vector20.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/vector30.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/vector40.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/container/vector/vector50.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/functional/adapter/unfused_typed.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/sequence/intrinsic/at.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/sequence/intrinsic/at_key.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/support/pair.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/filter_view/filter_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/joint_view/joint_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/access.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/algorithm/transformation/erase.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/algorithm/transformation/insert.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/algorithm/transformation/insert_range.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/algorithm/transformation/push_back.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/algorithm/transformation/push_front.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/deque_tie.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_cons.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_deque.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_list.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_map.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_set.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/container/generation/make_vector.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/support/pair.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/tuple/make_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/as_fusion_element.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/category_of.hpp>", private, "<boost/fusion/support/category_of.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/is_mpl_sequence.hpp>", private, "<boost/fusion/support/tag_of.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/is_view.hpp>", private, "<boost/fusion/support/is_view.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/mpl_iterator_category.hpp>", private, "<boost/fusion/adapted/mpl/mpl_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/pp_round.hpp>", private, "<boost/fusion/algorithm/transformation/zip.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/pp_round.hpp>", private, "<boost/fusion/container/vector/limits.hpp>", public ] },
+ { include: ["<boost/fusion/support/detail/segmented_fold_until_impl.hpp>", private, "<boost/fusion/support/segmented_fold_until.hpp>", public ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/make_tuple.hpp>", private, "<boost/fusion/tuple/make_tuple.hpp>", public ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_fwd.hpp>", private, "<boost/fusion/tuple/tuple_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple.hpp>", private, "<boost/fusion/tuple/tuple.hpp>", public ] },
+ { include: ["<boost/fusion/tuple/detail/preprocessed/tuple_tie.hpp>", private, "<boost/fusion/tuple/tuple_tie.hpp>", public ] },
+ { include: ["<boost/fusion/tuple/detail/tuple_expand.hpp>", private, "<boost/fusion/tuple/tuple.hpp>", public ] },
+ { include: ["<boost/fusion/view/detail/strictest_traversal.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/detail/strictest_traversal.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/detail/strictest_traversal.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/deref_data_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/end_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/equal_to_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/key_of_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/next_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/size_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/value_of_data_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/filter_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/filter_view/filter_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/at_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/begin_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/end_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/is_segmented_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/segments_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/size_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/iterator_range/detail/value_at_impl.hpp>", private, "<boost/fusion/view/iterator_range/iterator_range.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/deref_data_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/end_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/key_of_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/next_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/value_of_data_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/joint_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/joint_view/joint_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/advance_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/at_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/begin_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/deref_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/distance_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/end_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/equal_to_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/next_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/nview_impl.hpp>", private, "<boost/fusion/view/nview/nview.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/prior_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/size_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/value_at_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/nview/detail/value_of_impl.hpp>", private, "<boost/fusion/view/nview/nview_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/repetitive_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/repetitive_view/repetitive_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/repetitive_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/repetitive_view/detail/end_impl.hpp>", private, "<boost/fusion/view/repetitive_view/repetitive_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/repetitive_view/detail/next_impl.hpp>", private, "<boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/repetitive_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/advance_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/at_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/deref_data_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/distance_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/end_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/key_of_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/next_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/prior_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/value_at_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/value_of_data_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/reverse_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/reverse_view/reverse_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/advance_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/at_impl.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/distance_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/end_impl.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/equal_to_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/next_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/prior_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/size_impl.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/value_at_impl.hpp>", private, "<boost/fusion/view/single_view/single_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/single_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/single_view/single_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/advance_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/at_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/distance_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/end_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/equal_to_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/next_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/prior_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/value_at_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/transform_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/transform_view/transform_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/advance_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/at_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/begin_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/deref_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/distance_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/end_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/equal_to_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/next_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/prior_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/size_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/value_at_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view.hpp>", public ] },
+ { include: ["<boost/fusion/view/zip_view/detail/value_of_impl.hpp>", private, "<boost/fusion/view/zip_view/zip_view_iterator.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/as_range.hpp>", private, "<boost/geometry/algorithms/convex_hull.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_box_corners.hpp>", private, "<boost/geometry/algorithms/assign.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_box_corners.hpp>", private, "<boost/geometry/algorithms/convert.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_box_corners.hpp>", private, "<boost/geometry/algorithms/convex_hull.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_indexed_point.hpp>", private, "<boost/geometry/algorithms/assign.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_indexed_point.hpp>", private, "<boost/geometry/algorithms/convert.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_values.hpp>", private, "<boost/geometry/algorithms/assign.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_values.hpp>", private, "<boost/geometry/algorithms/convert.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/assign_values.hpp>", private, "<boost/geometry/strategies/cartesian/cart_intersect.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/calculate_null.hpp>", private, "<boost/geometry/algorithms/area.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/calculate_null.hpp>", private, "<boost/geometry/algorithms/length.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/calculate_null.hpp>", private, "<boost/geometry/algorithms/perimeter.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/calculate_sum.hpp>", private, "<boost/geometry/algorithms/area.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/calculate_sum.hpp>", private, "<boost/geometry/algorithms/perimeter.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/convert_indexed_to_indexed.hpp>", private, "<boost/geometry/algorithms/convert.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/convert_point_to_point.hpp>", private, "<boost/geometry/algorithms/append.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/convert_point_to_point.hpp>", private, "<boost/geometry/algorithms/convert.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/buffer.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/disjoint.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/disjoint.hpp>", private, "<boost/geometry/algorithms/equals.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/equals/collect_vectors.hpp>", private, "<boost/geometry/algorithms/equals.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/for_each_range.hpp>", private, "<boost/geometry/algorithms/disjoint.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/for_each_range.hpp>", private, "<boost/geometry/strategies/agnostic/hull_graham_andrew.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/not.hpp>", private, "<boost/geometry/algorithms/equals.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/disjoint.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/algorithms/touches.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private, "<boost/geometry/algorithms/difference.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>", private, "<boost/geometry/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/overlay.hpp>", private, "<boost/geometry/algorithms/union.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/algorithms/intersects.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/algorithms/touches.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/point_on_border.hpp>", private, "<boost/geometry/algorithms/disjoint.hpp>", public ] },
+ { include: ["<boost/geometry/algorithms/detail/throw_on_empty_input.hpp>", private, "<boost/geometry/algorithms/distance.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/algorithms/is_valid.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/assert.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/config_begin.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/config_end.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/distance_predicates.hpp>", private, "<boost/geometry/index/distance_predicates.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/exception.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/meta.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/predicates.hpp>", private, "<boost/geometry/index/predicates.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/adaptors.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/linear/linear.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/node/node.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/options.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/pack_create.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/quadratic/quadratic.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/query_iterators.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/rstar/rstar.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/utilities/view.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/children_box.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/copy.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/count.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/destroy.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/distance_query.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/insert.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/remove.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/rtree/visitors/spatial_query.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/serialization.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/translator.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/tuples.hpp>", private, "<boost/geometry/index/predicates.hpp>", public ] },
+ { include: ["<boost/geometry/index/detail/utilities.hpp>", private, "<boost/geometry/index/rtree.hpp>", public ] },
+ { include: ["<boost/geometry/io/wkt/detail/prefix.hpp>", private, "<boost/geometry/io/wkt/read.hpp>", public ] },
+ { include: ["<boost/geometry/io/wkt/detail/prefix.hpp>", private, "<boost/geometry/io/wkt/write.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/for_each_range.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/modify.hpp>", private, "<boost/geometry/multi/algorithms/correct.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/modify.hpp>", private, "<boost/geometry/multi/algorithms/reverse.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/modify_with_predicate.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/multi_sum.hpp>", private, "<boost/geometry/multi/algorithms/area.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/multi_sum.hpp>", private, "<boost/geometry/multi/algorithms/length.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/multi_sum.hpp>", private, "<boost/geometry/multi/algorithms/perimeter.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/multi_sum.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/copy_segment_point.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/copy_segment_point.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/copy_segments.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/copy_segments.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/get_ring.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/get_ring.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/range_by_section.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/range_by_section.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/sectionalize.hpp>", private, "<boost/geometry/multi/algorithms/intersection.hpp>", public ] },
+ { include: ["<boost/geometry/multi/algorithms/detail/sections/sectionalize.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/multi/io/wkt/detail/prefix.hpp>", private, "<boost/geometry/multi/io/wkt/read.hpp>", public ] },
+ { include: ["<boost/geometry/multi/io/wkt/detail/prefix.hpp>", private, "<boost/geometry/multi/io/wkt/write.hpp>", public ] },
+ { include: ["<boost/geometry/multi/views/detail/range_type.hpp>", private, "<boost/geometry/multi/multi.hpp>", public ] },
+ { include: ["<boost/geometry/views/detail/points_view.hpp>", private, "<boost/geometry/views/box_view.hpp>", public ] },
+ { include: ["<boost/geometry/views/detail/points_view.hpp>", private, "<boost/geometry/views/segment_view.hpp>", public ] },
+ { include: ["<boost/geometry/views/detail/range_type.hpp>", private, "<boost/geometry/algorithms/convex_hull.hpp>", public ] },
+ { include: ["<boost/geometry/views/detail/range_type.hpp>", private, "<boost/geometry/strategies/agnostic/hull_graham_andrew.hpp>", public ] },
+ { include: ["<boost/graph/detail/adjacency_list.hpp>", private, "<boost/graph/adjacency_list.hpp>", public ] },
+ { include: ["<boost/graph/detail/array_binary_tree.hpp>", private, "<boost/pending/mutable_queue.hpp>", public ] },
+ { include: ["<boost/graph/detail/augment.hpp>", private, "<boost/graph/cycle_canceling.hpp>", public ] },
+ { include: ["<boost/graph/detail/augment.hpp>", private, "<boost/graph/successive_shortest_path_nonnegative_weights.hpp>", public ] },
+ { include: ["<boost/graph/detail/compressed_sparse_row_struct.hpp>", private, "<boost/graph/compressed_sparse_row_graph.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/astar_search.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/core_numbers.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/dijkstra_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/dijkstra_shortest_paths_no_color_map.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/named_function_params.hpp>", public ] },
+ { include: ["<boost/graph/detail/d_ary_heap.hpp>", private, "<boost/graph/stoer_wagner_min_cut.hpp>", public ] },
+ { include: ["<boost/graph/detail/edge.hpp>", private, "<boost/graph/adjacency_list.hpp>", public ] },
+ { include: ["<boost/graph/detail/edge.hpp>", private, "<boost/graph/adjacency_matrix.hpp>", public ] },
+ { include: ["<boost/graph/detail/edge.hpp>", private, "<boost/property_map/parallel/distributed_property_map.hpp>", public ] },
+ { include: ["<boost/graph/detail/geodesic.hpp>", private, "<boost/graph/closeness_centrality.hpp>", public ] },
+ { include: ["<boost/graph/detail/geodesic.hpp>", private, "<boost/graph/eccentricity.hpp>", public ] },
+ { include: ["<boost/graph/detail/geodesic.hpp>", private, "<boost/graph/geodesic_distance.hpp>", public ] },
+ { include: ["<boost/graph/detail/incremental_components.hpp>", private, "<boost/graph/incremental_components.hpp>", public ] },
+ { include: ["<boost/graph/detail/indexed_properties.hpp>", private, "<boost/graph/compressed_sparse_row_graph.hpp>", public ] },
+ { include: ["<boost/graph/detail/index.hpp>", private, "<boost/graph/property_maps/container_property_map.hpp>", public ] },
+ { include: ["<boost/graph/detail/is_distributed_selector.hpp>", private, "<boost/graph/compressed_sparse_row_graph.hpp>", public ] },
+ { include: ["<boost/graph/detail/is_distributed_selector.hpp>", private, "<boost/graph/distributed/selector.hpp>", public ] },
+ { include: ["<boost/graph/detail/labeled_graph_traits.hpp>", private, "<boost/graph/labeled_graph.hpp>", public ] },
+ { include: ["<boost/graph/detail/read_graphviz_new.hpp>", private, "<boost/graph/graphviz.hpp>", public ] },
+ { include: ["<boost/graph/detail/read_graphviz_spirit.hpp>", private, "<boost/graph/graphviz.hpp>", public ] },
+ { include: ["<boost/graph/detail/set_adaptor.hpp>", private, "<boost/graph/filtered_graph.hpp>", public ] },
+ { include: ["<boost/graph/detail/sparse_ordering.hpp>", private, "<boost/graph/cuthill_mckee_ordering.hpp>", public ] },
+ { include: ["<boost/graph/detail/sparse_ordering.hpp>", private, "<boost/graph/king_ordering.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>", private, "<boost/graph/distributed/betweenness_centrality.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>", private, "<boost/graph/distributed/crauser_et_al_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>", private, "<boost/graph/distributed/delta_stepping_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>", private, "<boost/graph/distributed/eager_dijkstra_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/filtered_queue.hpp>", private, "<boost/graph/distributed/breadth_first_search.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/filtered_queue.hpp>", private, "<boost/graph/distributed/strong_components.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/mpi_process_group.ipp>", private, "<boost/graph/distributed/mpi_process_group.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/queue.ipp>", private, "<boost/graph/distributed/queue.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/remote_update_set.hpp>", private, "<boost/graph/distributed/crauser_et_al_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/distributed/detail/remote_update_set.hpp>", private, "<boost/graph/distributed/eager_dijkstra_shortest_paths.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/inplace_all_to_all.hpp>", private, "<boost/graph/parallel/algorithm.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/property_holders.hpp>", private, "<boost/graph/distributed/adjacency_list.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/property_holders.hpp>", private, "<boost/graph/distributed/named_graph.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/untracked_pair.hpp>", private, "<boost/graph/distributed/adjlist/handlers.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/untracked_pair.hpp>", private, "<boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp>", public ] },
+ { include: ["<boost/graph/parallel/detail/untracked_pair.hpp>", private, "<boost/property_map/parallel/distributed_property_map.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/binomial_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/d_ary_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/fibonacci_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/pairing_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/priority_queue.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_comparison.hpp>", private, "<boost/heap/skew_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_node.hpp>", private, "<boost/heap/binomial_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_node.hpp>", private, "<boost/heap/fibonacci_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_node.hpp>", private, "<boost/heap/pairing_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/heap_node.hpp>", private, "<boost/heap/skew_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/mutable_heap.hpp>", private, "<boost/heap/d_ary_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/ordered_adaptor_iterator.hpp>", private, "<boost/heap/d_ary_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/binomial_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/d_ary_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/fibonacci_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/pairing_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/priority_queue.hpp>", public ] },
+ { include: ["<boost/heap/detail/stable_heap.hpp>", private, "<boost/heap/skew_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/tree_iterator.hpp>", private, "<boost/heap/binomial_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/tree_iterator.hpp>", private, "<boost/heap/fibonacci_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/tree_iterator.hpp>", private, "<boost/heap/pairing_heap.hpp>", public ] },
+ { include: ["<boost/heap/detail/tree_iterator.hpp>", private, "<boost/heap/skew_heap.hpp>", public ] },
+ { include: ["<boost/icl/detail/boost_config.hpp>", private, "<boost/icl/gregorian.hpp>", public ] },
+ { include: ["<boost/icl/detail/boost_config.hpp>", private, "<boost/icl/impl_config.hpp>", public ] },
+ { include: ["<boost/icl/detail/boost_config.hpp>", private, "<boost/icl/ptime.hpp>", public ] },
+ { include: ["<boost/icl/detail/concept_check.hpp>", private, "<boost/icl/continuous_interval.hpp>", public ] },
+ { include: ["<boost/icl/detail/concept_check.hpp>", private, "<boost/icl/discrete_interval.hpp>", public ] },
+ { include: ["<boost/icl/detail/concept_check.hpp>", private, "<boost/icl/map.hpp>", public ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/concept/interval.hpp>", public ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/interval_base_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/interval_bounds.hpp>", public ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/map.hpp>", public ] },
+ { include: ["<boost/icl/detail/design_config.hpp>", private, "<boost/icl/type_traits/interval_type_default.hpp>", public ] },
+ { include: ["<boost/icl/detail/element_iterator.hpp>", private, "<boost/icl/interval_base_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/exclusive_less_than.hpp>", private, "<boost/icl/interval_base_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_map_algo.hpp>", private, "<boost/icl/concept/interval_associator.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_map_algo.hpp>", private, "<boost/icl/concept/interval_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_map_algo.hpp>", private, "<boost/icl/interval_base_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_set_algo.hpp>", private, "<boost/icl/concept/interval_associator.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_set_algo.hpp>", private, "<boost/icl/concept/interval_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/interval_set_algo.hpp>", private, "<boost/icl/interval_base_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/map_algo.hpp>", private, "<boost/icl/associative_element_container.hpp>", public ] },
+ { include: ["<boost/icl/detail/map_algo.hpp>", private, "<boost/icl/concept/element_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/map_algo.hpp>", private, "<boost/icl/concept/interval_associator.hpp>", public ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/interval_base_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/interval_base_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/notate.hpp>", private, "<boost/icl/map.hpp>", public ] },
+ { include: ["<boost/icl/detail/on_absorbtion.hpp>", private, "<boost/icl/concept/element_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/on_absorbtion.hpp>", private, "<boost/icl/interval_base_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/on_absorbtion.hpp>", private, "<boost/icl/map.hpp>", public ] },
+ { include: ["<boost/icl/detail/set_algo.hpp>", private, "<boost/icl/concept/element_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/set_algo.hpp>", private, "<boost/icl/concept/interval_associator.hpp>", public ] },
+ { include: ["<boost/icl/detail/set_algo.hpp>", private, "<boost/icl/concept/interval_map.hpp>", public ] },
+ { include: ["<boost/icl/detail/set_algo.hpp>", private, "<boost/icl/concept/interval_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/std_set.hpp>", private, "<boost/icl/concept/element_set.hpp>", public ] },
+ { include: ["<boost/icl/detail/subset_comparer.hpp>", private, "<boost/icl/concept/element_associator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/adaptive_node_pool.hpp>", private, "<boost/interprocess/allocators/private_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/allocator_common.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/node_pool.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/node_pool.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/node_pool.hpp>", private, "<boost/interprocess/allocators/private_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/node_tools.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/allocators/detail/node_tools.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/sync/spin/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/sync/spin/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/sync/spin/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/atomic.hpp>", private, "<boost/interprocess/sync/spin/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/cast_tags.hpp>", private, "<boost/interprocess/offset_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/cast_tags.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/private_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/allocators/private_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/anonymous_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/allocation_type.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/containers_fwd.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/deque.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/flat_map.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/flat_set.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/list.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/map.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/pair.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/set.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/slist.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/stable_vector.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/string.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/vector.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/containers/version_type.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/creation_tags.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/errors.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/exceptions.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/file_mapping.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/flat_map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/iset_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/iunordered_set_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/null_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/indexes/unordered_map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/interprocess_fwd.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_external_buffer.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_heap_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_mapped_file.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/managed_xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/mem_algo/simple_seq_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/offset_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/permissions.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/shared_memory_object.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/deleter.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/enable_shared_from_this.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/smart_ptr/weak_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/streams/bufferstream.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/streams/vectorstream.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/file_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/interprocess_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/lock_options.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/mutex_family.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/null_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/pthread_helpers.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/posix/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/scoped_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/sharable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/shm/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/spin/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/spin/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/spin/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/spin/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/spin/wait.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/upgradable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/named_sync.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/sync_utils.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/sync/xsi/xsi_named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/xsi_key.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_begin.hpp>", private, "<boost/interprocess/xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/private_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/allocators/private_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/anonymous_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/allocation_type.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/containers_fwd.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/deque.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/flat_map.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/flat_set.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/list.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/map.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/pair.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/set.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/slist.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/stable_vector.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/string.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/vector.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/containers/version_type.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/creation_tags.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/errors.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/exceptions.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/file_mapping.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/flat_map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/iset_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/iunordered_set_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/null_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/indexes/unordered_map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/interprocess_fwd.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_external_buffer.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_heap_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_mapped_file.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/managed_xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/mem_algo/simple_seq_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/offset_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/permissions.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/shared_memory_object.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/deleter.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/enable_shared_from_this.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/smart_ptr/weak_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/streams/bufferstream.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/streams/vectorstream.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/file_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/interprocess_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/lock_options.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/mutex_family.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/null_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/pthread_helpers.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/posix/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/scoped_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/sharable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/shm/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/spin/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/spin/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/spin/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/spin/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/spin/wait.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/upgradable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/named_sync.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/sync_utils.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/sync/xsi/xsi_named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/xsi_key.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_end.hpp>", private, "<boost/interprocess/xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_external_begin.hpp>", private, "<boost/interprocess/sync/windows/sync_utils.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/config_external_end.hpp>", private, "<boost/interprocess/sync/windows/sync_utils.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/file_wrapper.hpp>", private, "<boost/interprocess/managed_mapped_file.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/intermodule_singleton.hpp>", private, "<boost/flyweight/intermodule_holder.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/posix/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/shm/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/shm/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/windows/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/windows/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/interprocess_tester.hpp>", private, "<boost/interprocess/sync/windows/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_external_buffer.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_heap_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_mapped_file.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_memory_impl.hpp>", private, "<boost/interprocess/managed_xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/managed_mapped_file.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/managed_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/managed_windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/managed_xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/named_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/managed_open_or_create_impl.hpp>", private, "<boost/interprocess/sync/shm/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/math_functions.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/min_max.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/offset_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/sync/scoped_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/sync/sharable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/sync/shm/named_creation_functor.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/mpl.hpp>", private, "<boost/interprocess/sync/upgradable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/named_proxy.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/file_mapping.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/shared_memory_object.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/sync/file_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/sync/posix/semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/sync/xsi/xsi_named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/xsi_key.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_file_functions.hpp>", private, "<boost/interprocess/xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/file_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/posix/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/posix/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/posix/semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/spin/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/spin/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/spin/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/spin/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/os_thread_functions.hpp>", private, "<boost/interprocess/sync/spin/wait.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/pointer_type.hpp>", private, "<boost/interprocess/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/pointer_type.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/file_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/interprocess_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_sharable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/ptime_to_timespec.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/posix/semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/scoped_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/sharable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/shm/named_upgradable_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/spin/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/spin/interprocess_barrier.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/spin/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/spin/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/spin/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/upgradable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/named_semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/posix_time_types_wrk.hpp>", private, "<boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/segment_manager_helper.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/shared_memory_object.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/sync/posix/semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/tmp_dir_helpers.hpp>", private, "<boost/interprocess/sync/windows/named_sync.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/transform_iterator.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/scoped_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/sharable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/shm/named_creation_functor.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/type_traits.hpp>", private, "<boost/interprocess/sync/upgradable_lock.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/cached_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/cached_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/private_adaptive_pool.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/allocators/private_node_allocator.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/file_mapping.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/indexes/iset_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/indexes/iunordered_set_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/indexes/unordered_map_index.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/ipc/message_queue.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/offset_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/segment_manager.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/deleter.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/smart_ptr/unique_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/sync/xsi/xsi_named_mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/xsi_key.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/utilities.hpp>", private, "<boost/interprocess/xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/errors.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/permissions.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/sync/windows/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/sync/windows/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/sync/windows/sync_utils.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/sync/windows/winapi_mutex_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/sync/windows/winapi_semaphore_wrapper.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/win32_api.hpp>", private, "<boost/interprocess/windows_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private, "<boost/interprocess/mapped_region.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private, "<boost/interprocess/sync/windows/mutex.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/windows_intermodule_singleton.hpp>", private, "<boost/interprocess/sync/windows/semaphore.hpp>", public ] },
+ { include: ["<boost/interprocess/detail/xsi_shared_memory_file_wrapper.hpp>", private, "<boost/interprocess/managed_xsi_shared_memory.hpp>", public ] },
+ { include: ["<boost/interprocess/mem_algo/detail/mem_algo_common.hpp>", private, "<boost/interprocess/mem_algo/rbtree_best_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/mem_algo/detail/simple_seq_fit_impl.hpp>", private, "<boost/interprocess/mem_algo/simple_seq_fit.hpp>", public ] },
+ { include: ["<boost/interprocess/smart_ptr/detail/shared_count.hpp>", private, "<boost/interprocess/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private, "<boost/interprocess/sync/windows/condition.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/condition_algorithm_8a.hpp>", private, "<boost/interprocess/sync/windows/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private, "<boost/interprocess/sync/interprocess_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private, "<boost/interprocess/sync/shm/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/condition_any_algorithm.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/interprocess_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/named_condition_any.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/named_condition.hpp>", public ] },
+ { include: ["<boost/interprocess/sync/detail/locks.hpp>", private, "<boost/interprocess/sync/shm/named_condition.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/any_node_and_algorithms.hpp>", private, "<boost/intrusive/any_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/avltree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/bstree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/circular_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/pointer_plus_bits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/rbtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/sgtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/slist.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/splaytree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/treap_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/assert.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/avltree_node.hpp>", private, "<boost/intrusive/avl_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/avltree_node.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/clear_on_destructor_base.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/clear_on_destructor_base.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/clear_on_destructor_base.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/clear_on_destructor_base.hpp>", private, "<boost/intrusive/slist.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/common_slist_algorithms.hpp>", private, "<boost/intrusive/circular_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/common_slist_algorithms.hpp>", private, "<boost/intrusive/linear_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/any_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/avl_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/avl_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/avltree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/bs_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/bs_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/bstree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/circular_list_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/circular_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/linear_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/list_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/options.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/parent_from_member.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/pointer_traits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/priority_compare.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/rbtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/sg_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/sgtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/slist_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/slist.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/splay_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/splay_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/splaytree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/treap_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/treap_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/unordered_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_begin.hpp>", private, "<boost/intrusive/unordered_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/any_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/avl_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/avl_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/avltree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/bs_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/bs_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/bstree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/circular_list_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/circular_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/linear_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/list_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/options.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/parent_from_member.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/pointer_traits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/priority_compare.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/rbtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/sg_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/sgtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/slist_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/slist.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/splay_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/splay_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/splaytree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/treap_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/treap_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/unordered_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/config_end.hpp>", private, "<boost/intrusive/unordered_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/ebo_functor_holder.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/function_detector.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/function_detector.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/function_detector.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/any_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/avl_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/bs_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/list_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/slist_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/generic_hook.hpp>", private, "<boost/intrusive/unordered_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/hashtable_node.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/list_node.hpp>", private, "<boost/intrusive/list_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/memory_util.hpp>", private, "<boost/container/allocator_traits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/memory_util.hpp>", private, "<boost/intrusive/pointer_traits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/avl_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/bs_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/options.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/pointer_plus_bits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/sg_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/splay_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/mpl.hpp>", private, "<boost/intrusive/treap_set.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/parent_from_member.hpp>", private, "<boost/intrusive/member_value_traits.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/parent_from_member.hpp>", private, "<boost/intrusive/parent_from_member.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/rbtree_node.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/rbtree_node.hpp>", private, "<boost/intrusive/set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/slist_node.hpp>", private, "<boost/intrusive/slist_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/transform_iterator.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/bs_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/tree_node.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/any_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/avl_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/avltree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/avltree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/bs_set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/bstree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/bstree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/circular_list_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/circular_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/hashtable.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/linear_slist_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/list_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/list.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/options.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/rbtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/rbtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/set_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/sgtree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/sgtree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/slist_hook.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/slist.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/splaytree_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/splaytree.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/treap_algorithms.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/treap.hpp>", public ] },
+ { include: ["<boost/intrusive/detail/utilities.hpp>", private, "<boost/intrusive/unordered_set_hook.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/access_control.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/access_control.hpp>", private, "<boost/iostreams/filtering_streambuf.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/access_control.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/concept_adapter.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/device_adapter.hpp>", private, "<boost/iostreams/tee.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/direct_adapter.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/direct_adapter.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/filter_adapter.hpp>", private, "<boost/iostreams/tee.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/non_blocking_adapter.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/non_blocking_adapter.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/non_blocking_adapter.hpp>", private, "<boost/iostreams/filter/gzip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/adapter/range_adapter.hpp>", private, "<boost/iostreams/filter/gzip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/bool_trait_def.hpp>", private, "<boost/iostreams/filter/test.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/bool_trait_def.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/broken_overload_resolution/stream.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/buffer.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/call_traits.hpp>", private, "<boost/iostreams/tee.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/char_traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filter/aggregate.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filter/gzip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filtering_streambuf.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filter/newline.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filter/stdio.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/char_traits.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/codecvt_helper.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/codecvt_holder.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/auto_link.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/auto_link.hpp>", private, "<boost/iostreams/device/mapped_file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/auto_link.hpp>", private, "<boost/iostreams/filter/bzip2.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/auto_link.hpp>", private, "<boost/iostreams/filter/zlib.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/bzip2.hpp>", private, "<boost/iostreams/filter/bzip2.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/codecvt.hpp>", private, "<boost/iostreams/positioning.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/checked_operations.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/combine.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/device/file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filter/aggregate.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filter/counter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filter/line.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filter/newline.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/flush.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/imbue.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/input_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/optimal_buffer_size.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/output_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/positioning.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/disable_warnings.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/dyn_link.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/dyn_link.hpp>", private, "<boost/iostreams/device/mapped_file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/dyn_link.hpp>", private, "<boost/iostreams/filter/bzip2.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/dyn_link.hpp>", private, "<boost/iostreams/filter/zlib.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/checked_operations.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/combine.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/device/file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filter/aggregate.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filter/counter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filter/line.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filter/newline.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/flush.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/imbue.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/input_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/optimal_buffer_size.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/output_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/positioning.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/enable_warnings.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/fpos.hpp>", private, "<boost/iostreams/positioning.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/limits.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/overload_resolution.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/overload_resolution.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/unreachable_return.hpp>", private, "<boost/iostreams/checked_operations.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/char_traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/device/file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/device/mapped_file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/filter/bzip2.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/filter/stdio.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/filter/zlib.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/wide_streams.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/windows_posix.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/config/zlib.hpp>", private, "<boost/iostreams/filter/zlib.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/counted_array.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/default_arg.hpp>", private, "<boost/iostreams/concepts.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/checked_operations.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/flush.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/imbue.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/optimal_buffer_size.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/dispatch.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/double_object.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/enable_if_stream.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/checked_operations.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/error.hpp>", private, "<boost/iostreams/filter/gzip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/execute.hpp>", private, "<boost/iostreams/tee.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/file_handle.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/forward.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/forward.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/forward.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/fstream.hpp>", private, "<boost/iostreams/device/file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/compose.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/invert.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/functional.hpp>", private, "<boost/iostreams/tee.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/combine.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/concepts.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/constants.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/device/back_inserter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/device/file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/device/mapped_file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/device/null.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/aggregate.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/bzip2.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/gzip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/line.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/newline.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/stdio.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/test.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/filter/zlib.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/positioning.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/skip.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/ios.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/iostream.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/iostream.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/is_iterator_range.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/optional.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/path.hpp>", private, "<boost/iostreams/device/file_descriptor.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/path.hpp>", private, "<boost/iostreams/device/mapped_file.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/push.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/push.hpp>", private, "<boost/iostreams/filtering_streambuf.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/push.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/resolve.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/restrict_impl.hpp>", private, "<boost/iostreams/restrict.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/restrict_impl.hpp>", private, "<boost/iostreams/slice.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select_by_size.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/code_converter.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/select.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf/chainbuf.hpp>", private, "<boost/iostreams/filtering_streambuf.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf/direct_streambuf.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/filtering_streambuf.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/filtering_stream.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/flush.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/imbue.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/streambuf/indirect_streambuf.hpp>", private, "<boost/iostreams/stream_buffer.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/template_params.hpp>", private, "<boost/iostreams/filter/symmetric.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/template_params.hpp>", private, "<boost/iostreams/pipeline.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/vc6/close.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/vc6/read.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/vc6/write.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/chain.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/close.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/combine.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/copy.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/flush.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/imbue.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/input_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/optimal_buffer_size.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/output_sequence.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/read.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/seek.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/traits.hpp>", public ] },
+ { include: ["<boost/iostreams/detail/wrap_unwrap.hpp>", private, "<boost/iostreams/write.hpp>", public ] },
+ { include: ["<boost/iterator/detail/any_conversion_eater.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/any_conversion_eater.hpp>", private, "<boost/iterator/is_readable_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/indirect_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/interoperable.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/is_readable_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/iterator_adaptor.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/iterator_categories.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/new_iterator_tests.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/iterator/transform_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_def.hpp>", private, "<boost/python/object_operators.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/indirect_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/interoperable.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/is_readable_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/iterator_adaptor.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/iterator_categories.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/new_iterator_tests.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/iterator/transform_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/config_undef.hpp>", private, "<boost/python/object_operators.hpp>", public ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/iterator/iterator_adaptor.hpp>", public ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/iterator/transform_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/enable_if.hpp>", private, "<boost/python/object_operators.hpp>", public ] },
+ { include: ["<boost/iterator/detail/facade_iterator_category.hpp>", private, "<boost/iterator/iterator_archetypes.hpp>", public ] },
+ { include: ["<boost/iterator/detail/facade_iterator_category.hpp>", private, "<boost/iterator/iterator_facade.hpp>", public ] },
+ { include: ["<boost/iterator/detail/minimum_category.hpp>", private, "<boost/iterator/zip_iterator.hpp>", public ] },
+ { include: ["<boost/iterator/detail/minimum_category.hpp>", private, "<boost/token_iterator.hpp>", public ] },
+ { include: ["<boost/lambda/detail/actions.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/arity_code.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/bind_functions.hpp>", private, "<boost/lambda/bind.hpp>", public ] },
+ { include: ["<boost/lambda/detail/control_constructs_common.hpp>", private, "<boost/lambda/exceptions.hpp>", public ] },
+ { include: ["<boost/lambda/detail/control_constructs_common.hpp>", private, "<boost/lambda/switch.hpp>", public ] },
+ { include: ["<boost/lambda/detail/function_adaptors.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/lambda_config.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/lambda_functor_base.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/lambda_functors.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/lambda_fwd.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/lambda_traits.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/member_ptr.hpp>", private, "<boost/lambda/lambda.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_actions.hpp>", private, "<boost/lambda/control_structures.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_actions.hpp>", private, "<boost/lambda/if.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_actions.hpp>", private, "<boost/lambda/lambda.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_lambda_func_base.hpp>", private, "<boost/lambda/lambda.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_return_type_traits.hpp>", private, "<boost/lambda/control_structures.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_return_type_traits.hpp>", private, "<boost/lambda/if.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operator_return_type_traits.hpp>", private, "<boost/lambda/lambda.hpp>", public ] },
+ { include: ["<boost/lambda/detail/operators.hpp>", private, "<boost/lambda/lambda.hpp>", public ] },
+ { include: ["<boost/lambda/detail/ret.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/return_type_traits.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/select_functions.hpp>", private, "<boost/lambda/core.hpp>", public ] },
+ { include: ["<boost/lambda/detail/suppress_unused.hpp>", private, "<boost/lambda/casts.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/auto.hpp>", private, "<boost/local_function/aux_/macro/code_/functor.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/sign.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/defaults.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/this.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/any_bind_type.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/sign.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/defaults.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const_bind.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/this.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/const.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/this.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/default.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_params.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/default.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/sign.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/default.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/defaults.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/inline.hpp>", private, "<boost/local_function/aux_/macro/name.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/recursive.hpp>", private, "<boost/local_function/aux_/macro/name.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/register.hpp>", private, "<boost/local_function/aux_/macro/code_/functor.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/return.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_/append.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/return.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/sign.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/this.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/any_bind_type.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/this.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/validate_/this.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private, "<boost/local_function/aux_/macro/code_/functor.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/sign.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/keyword/thisunderscore.hpp>", private, "<boost/scope_exit.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/line_counter.hpp>", private, "<boost/local_function.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/line_counter.hpp>", private, "<boost/scope_exit.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/void_list.hpp>", private, "<boost/local_function.hpp>", public ] },
+ { include: ["<boost/local_function/detail/preprocessor/void_list.hpp>", private, "<boost/scope_exit.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/atomic.hpp>", private, "<boost/lockfree/queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/atomic.hpp>", private, "<boost/lockfree/spsc_queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/atomic.hpp>", private, "<boost/lockfree/stack.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/branch_hints.hpp>", private, "<boost/lockfree/spsc_queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/copy_payload.hpp>", private, "<boost/lockfree/queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/copy_payload.hpp>", private, "<boost/lockfree/stack.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/freelist.hpp>", private, "<boost/lockfree/queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/freelist.hpp>", private, "<boost/lockfree/stack.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/parameter.hpp>", private, "<boost/lockfree/queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/parameter.hpp>", private, "<boost/lockfree/spsc_queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/parameter.hpp>", private, "<boost/lockfree/stack.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/prefix.hpp>", private, "<boost/lockfree/spsc_queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/tagged_ptr.hpp>", private, "<boost/lockfree/queue.hpp>", public ] },
+ { include: ["<boost/lockfree/detail/tagged_ptr.hpp>", private, "<boost/lockfree/stack.hpp>", public ] },
+ { include: ["<boost/log/detail/asio_fwd.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/attachable_sstream_buf.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/attachable_sstream_buf.hpp>", private, "<boost/log/utility/formatting_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_get_value_impl.hpp>", private, "<boost/log/attributes/attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_get_value_impl.hpp>", private, "<boost/log/attributes/attribute_value.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_predicate.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_predicate.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_predicate.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_predicate.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/attribute_predicate.hpp>", private, "<boost/log/expressions/predicates/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/attr_output_impl.hpp>", private, "<boost/log/expressions/attr.hpp>", public ] },
+ { include: ["<boost/log/detail/attr_output_impl.hpp>", private, "<boost/log/expressions/formatters/stream.hpp>", public ] },
+ { include: ["<boost/log/detail/attr_output_terminal.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/attr_output_terminal.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/cleanup_scope_guard.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/cleanup_scope_guard.hpp>", private, "<boost/log/sinks/text_multifile_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/code_conversion.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/code_conversion.hpp>", private, "<boost/log/utility/formatting_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/code_conversion.hpp>", private, "<boost/log/utility/setup/filter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_cast.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_name.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_set.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_value.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_value_impl.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/attribute_value_set.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/clock.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/constant.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/counter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/current_process_id.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/current_process_name.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/current_thread_id.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/fallback_policy_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/fallback_policy.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/function.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/mutable_constant.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/scoped_attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/timer.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/time_traits.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/value_extraction_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/value_extraction.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/value_visitation_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/attributes/value_visitation.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/common.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/core/core.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/core.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/core/record.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/core/record_view.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/exceptions.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/attr_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/attr.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/filter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/c_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/csv_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/format.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/if.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/stream.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/formatters/xml_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/is_keyword_descriptor.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/keyword_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/keyword.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/message.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/channel_severity_filter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/has_attr.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/is_debugger_present.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/predicates/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/expressions/record.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/auto_flush.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/channel.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/delimiter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/depth.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/facility.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/file_name.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/filter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/format.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/ident.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/ip_version.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/iteration.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/log_name.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/log_source.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/max_size.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/message_file.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/min_free_space.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/open_mode.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/order.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/ordering_window.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/registration.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/rotation_size.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/scan_method.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/severity.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/start_thread.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/target.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/time_based_rotation.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/keywords/use_impl.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/async_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/attribute_mapping.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/basic_sink_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/block_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/bounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/bounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/debug_output_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/drop_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/event_log_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/event_log_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/frontend_requirements.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/sink.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/sync_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/syslog_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/text_file_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/text_multifile_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/text_ostream_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/unbounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/unbounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sinks/unlocked_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/basic_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/channel_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/exception_handler_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/features.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/global_logger_storage.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/logger.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/record_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/severity_channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/severity_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/severity_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/sources/threading_models.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/exception.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/regex.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/spirit_classic.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/spirit_qi.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/support/xpressive.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/trivial.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/empty_deleter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/exception_handler.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/explicit_operator_bool.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/formatting_ostream_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/formatting_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/as_action.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/bind_assign.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/bind.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/bind_output.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/bind_to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/fun_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/logical.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/nop.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/functional/save_result.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/intrusive_ref_counter.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/manipulators/add_value.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/manipulators/dump.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/manipulators.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/manipulators/to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/once_block.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/record_ordering.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/setup/common_attributes.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/setup/console.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/setup/file.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/strictest_lock.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/string_literal_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/string_literal.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_dispatch/date_time_types.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_dispatch/standard_types.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_dispatch/static_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_dispatch/type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/type_info_wrapper.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/unique_identifier_name.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/unused_variable.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/value_ref_fwd.hpp>", public ] },
+ { include: ["<boost/log/detail/config.hpp>", private, "<boost/log/utility/value_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/attr.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/format.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/if.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/keyword.hpp>", public ] },
+ { include: ["<boost/log/detail/custom_terminal_spec.hpp>", private, "<boost/log/expressions/predicates/channel_severity_filter.hpp>", public ] },
+ { include: ["<boost/log/detail/date_time_fmt_gen_traits_fwd.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/date_time_fmt_gen_traits_fwd.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/date_time_format_parser.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/decomposed_time.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/deduce_char_type.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/deduce_char_type.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/default_attribute_names.hpp>", private, "<boost/log/expressions/message.hpp>", public ] },
+ { include: ["<boost/log/detail/default_attribute_names.hpp>", private, "<boost/log/sources/channel_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/default_attribute_names.hpp>", private, "<boost/log/sources/severity_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/default_attribute_names.hpp>", private, "<boost/log/utility/setup/common_attributes.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/attributes/constant.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/embedded_string_type.hpp>", private, "<boost/log/utility/manipulators/add_value.hpp>", public ] },
+ { include: ["<boost/log/detail/event.hpp>", private, "<boost/log/sinks/unbounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/fake_mutex.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/fake_mutex.hpp>", private, "<boost/log/sinks/unlocked_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_cast.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_name.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_set.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_value.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_value_impl.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/attribute_value_set.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/clock.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/constant.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/counter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/current_process_id.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/current_process_name.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/current_thread_id.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/fallback_policy.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/function.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/mutable_constant.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/scoped_attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/timer.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/time_traits.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/value_extraction.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/attributes/value_visitation.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/core/core.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/core/record.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/core/record_view.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/exceptions.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/attr.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/filter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/c_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/csv_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/format.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/if.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/stream.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/formatters/xml_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/is_keyword_descriptor.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/keyword.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/message.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/channel_severity_filter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/has_attr.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/is_debugger_present.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/predicates/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/expressions/record.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/async_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/attribute_mapping.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/basic_sink_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/block_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/bounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/bounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/debug_output_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/drop_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/event_log_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/event_log_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/frontend_requirements.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/sink.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/sync_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/syslog_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/text_file_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/text_multifile_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/text_ostream_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/unbounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/unbounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sinks/unlocked_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/basic_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/channel_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/exception_handler_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/features.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/global_logger_storage.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/logger.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/record_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/severity_channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/severity_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/severity_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/sources/threading_models.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/exception.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/regex.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/spirit_classic.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/spirit_qi.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/support/xpressive.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/trivial.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/exception_handler.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/formatting_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/as_action.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/bind_assign.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/bind.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/bind_output.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/bind_to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/fun_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/logical.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/nop.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/functional/save_result.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/intrusive_ref_counter.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/manipulators/add_value.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/manipulators/dump.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/manipulators/to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/once_block.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/record_ordering.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/common_attributes.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/console.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/file.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/filter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/formatter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/from_settings.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/from_stream.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/settings.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/setup/settings_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/strictest_lock.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/string_literal.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_dispatch/date_time_types.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_dispatch/standard_types.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_dispatch/static_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_dispatch/type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/type_info_wrapper.hpp>", public ] },
+ { include: ["<boost/log/detail/footer.hpp>", private, "<boost/log/utility/value_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/format.hpp>", private, "<boost/log/expressions/formatters/format.hpp>", public ] },
+ { include: ["<boost/log/detail/function_traits.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/function_traits.hpp>", private, "<boost/log/utility/record_ordering.hpp>", public ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/expressions/formatters/if.hpp>", public ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/generate_overloads.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_cast.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_name.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_set.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_value.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_value_impl.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/attribute_value_set.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/clock.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/constant.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/counter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/current_process_id.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/current_process_name.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/current_thread_id.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/fallback_policy.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/function.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/mutable_constant.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/scoped_attribute.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/timer.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/time_traits.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/value_extraction.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/attributes/value_visitation.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/core/core.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/core/record.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/core/record_view.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/exceptions.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/attr.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/filter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/c_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/char_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/csv_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/format.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/if.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/stream.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/wrap_formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/formatters/xml_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/is_keyword_descriptor.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/keyword.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/message.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/channel_severity_filter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/has_attr.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/is_debugger_present.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/predicates/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/expressions/record.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/async_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/attribute_mapping.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/basic_sink_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/block_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/bounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/bounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/debug_output_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/drop_on_overflow.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/event_log_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/event_log_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/frontend_requirements.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/sink.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/sync_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/syslog_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/text_file_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/text_multifile_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/text_ostream_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/unbounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/unbounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sinks/unlocked_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/basic_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/channel_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/exception_handler_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/features.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/global_logger_storage.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/logger.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/record_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/severity_channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/severity_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/severity_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/sources/threading_models.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/exception.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/regex.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/spirit_classic.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/spirit_qi.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/support/xpressive.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/trivial.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/exception_handler.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/formatting_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/as_action.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/bind_assign.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/bind.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/bind_output.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/bind_to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/fun_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/logical.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/nop.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/functional/save_result.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/intrusive_ref_counter.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/manipulators/add_value.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/manipulators/dump.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/manipulators/to_log.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/once_block.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/record_ordering.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/common_attributes.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/console.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/file.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/filter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/formatter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/from_settings.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/from_stream.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/settings.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/setup/settings_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/strictest_lock.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/string_literal.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_dispatch/date_time_types.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_dispatch/standard_types.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_dispatch/static_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_dispatch/type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/type_info_wrapper.hpp>", public ] },
+ { include: ["<boost/log/detail/header.hpp>", private, "<boost/log/utility/value_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/core/core.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/expressions/filter.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/expressions/formatter.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/expressions/formatters/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sinks/event_log_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sinks/sink.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sinks/text_file_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sinks/text_multifile_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/sources/exception_handler_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/light_function.hpp>", private, "<boost/log/support/date_time.hpp>", public ] },
+ { include: ["<boost/log/detail/light_rw_mutex.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/light_rw_mutex.hpp>", private, "<boost/log/sources/channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/light_rw_mutex.hpp>", private, "<boost/log/sources/logger.hpp>", public ] },
+ { include: ["<boost/log/detail/light_rw_mutex.hpp>", private, "<boost/log/sources/severity_channel_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/light_rw_mutex.hpp>", private, "<boost/log/sources/severity_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/locking_ptr.hpp>", private, "<boost/log/sinks/async_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/locking_ptr.hpp>", private, "<boost/log/sinks/sync_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/attributes/mutable_constant.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/sinks/basic_sink_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/sources/channel_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/sources/exception_handler_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/sources/severity_feature.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/sources/threading_models.hpp>", public ] },
+ { include: ["<boost/log/detail/locks.hpp>", private, "<boost/log/utility/strictest_lock.hpp>", public ] },
+ { include: ["<boost/log/detail/native_typeof.hpp>", private, "<boost/log/sources/record_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/native_typeof.hpp>", private, "<boost/log/utility/setup/settings.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/expressions/formatters/named_scope.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/async_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/event_log_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/sync_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/syslog_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/text_file_backend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sinks/unlocked_frontend.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/sources/basic_logger.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/utility/setup/file.hpp>", public ] },
+ { include: ["<boost/log/detail/parameter_tools.hpp>", private, "<boost/log/utility/value_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/pp_identity.hpp>", private, "<boost/log/utility/strictest_lock.hpp>", public ] },
+ { include: ["<boost/log/detail/process_id.hpp>", private, "<boost/log/attributes/current_process_id.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/filter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/formatter_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/from_settings.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/from_stream.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/settings.hpp>", public ] },
+ { include: ["<boost/log/detail/setup_config.hpp>", private, "<boost/log/utility/setup/settings_parser.hpp>", public ] },
+ { include: ["<boost/log/detail/singleton.hpp>", private, "<boost/log/sources/global_logger_storage.hpp>", public ] },
+ { include: ["<boost/log/detail/sink_init_helpers.hpp>", private, "<boost/log/utility/setup/console.hpp>", public ] },
+ { include: ["<boost/log/detail/sink_init_helpers.hpp>", private, "<boost/log/utility/setup/file.hpp>", public ] },
+ { include: ["<boost/log/detail/snprintf.hpp>", private, "<boost/log/expressions/formatters/c_decorator.hpp>", public ] },
+ { include: ["<boost/log/detail/tagged_integer.hpp>", private, "<boost/log/sinks/attribute_mapping.hpp>", public ] },
+ { include: ["<boost/log/detail/tagged_integer.hpp>", private, "<boost/log/sinks/event_log_constants.hpp>", public ] },
+ { include: ["<boost/log/detail/thread_id.hpp>", private, "<boost/log/attributes/current_thread_id.hpp>", public ] },
+ { include: ["<boost/log/detail/threadsafe_queue.hpp>", private, "<boost/log/sinks/unbounded_fifo_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/timestamp.hpp>", private, "<boost/log/sinks/bounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/timestamp.hpp>", private, "<boost/log/sinks/unbounded_ordering_queue.hpp>", public ] },
+ { include: ["<boost/log/detail/trivial_keyword.hpp>", private, "<boost/log/expressions/keyword.hpp>", public ] },
+ { include: ["<boost/log/detail/trivial_keyword.hpp>", private, "<boost/log/trivial.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/begins_with.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/contains.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/ends_with.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/has_attr.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/is_in_range.hpp>", public ] },
+ { include: ["<boost/log/detail/unary_function_terminal.hpp>", private, "<boost/log/expressions/predicates/matches.hpp>", public ] },
+ { include: ["<boost/log/detail/unhandled_exception_count.hpp>", private, "<boost/log/sources/record_ostream.hpp>", public ] },
+ { include: ["<boost/log/detail/value_ref_visitation.hpp>", private, "<boost/log/utility/value_ref.hpp>", public ] },
+ { include: ["<boost/log/detail/visible_type.hpp>", private, "<boost/log/sources/global_logger_storage.hpp>", public ] },
+ { include: ["<boost/log/detail/visible_type.hpp>", private, "<boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/visible_type.hpp>", private, "<boost/log/utility/type_dispatch/static_type_dispatcher.hpp>", public ] },
+ { include: ["<boost/log/detail/visible_type.hpp>", private, "<boost/log/utility/type_dispatch/type_dispatcher.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_digamma.hpp>", private, "<boost/math/bindings/e_float.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_digamma.hpp>", private, "<boost/math/bindings/mpfr.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_digamma.hpp>", private, "<boost/math/bindings/mpreal.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_digamma.hpp>", private, "<boost/math/bindings/rr.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_lanczos.hpp>", private, "<boost/math/bindings/e_float.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_lanczos.hpp>", private, "<boost/math/bindings/mpfr.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_lanczos.hpp>", private, "<boost/math/bindings/mpreal.hpp>", public ] },
+ { include: ["<boost/math/bindings/detail/big_lanczos.hpp>", private, "<boost/math/bindings/rr.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/bernoulli.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/beta.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/cauchy.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/exponential.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/extreme_value.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/fisher_f.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/gamma.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/geometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/hypergeometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/inverse_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/inverse_gamma.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/inverse_gaussian.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/laplace.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/logistic.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/lognormal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/negative_binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/non_central_beta.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/non_central_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/normal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/pareto.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/poisson.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/rayleigh.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/skew_normal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/students_t.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/triangular.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/uniform.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/common_error_handling.hpp>", private, "<boost/math/distributions/weibull.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/bernoulli.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/beta.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/cauchy.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/exponential.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/extreme_value.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/fisher_f.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/gamma.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/geometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/hypergeometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/inverse_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/inverse_gamma.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/inverse_gaussian.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/laplace.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/logistic.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/lognormal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/negative_binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/non_central_beta.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/non_central_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/non_central_f.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/non_central_t.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/normal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/pareto.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/poisson.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/rayleigh.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/skew_normal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/students_t.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/triangular.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/uniform.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/derived_accessors.hpp>", private, "<boost/math/distributions/weibull.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_mode.hpp>", private, "<boost/math/distributions/non_central_beta.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_mode.hpp>", private, "<boost/math/distributions/non_central_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_mode.hpp>", private, "<boost/math/distributions/non_central_f.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_mode.hpp>", private, "<boost/math/distributions/skew_normal.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_quantile.hpp>", private, "<boost/math/distributions/non_central_chi_squared.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/generic_quantile.hpp>", private, "<boost/math/distributions/non_central_t.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/hypergeometric_cdf.hpp>", private, "<boost/math/distributions/hypergeometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/hypergeometric_pdf.hpp>", private, "<boost/math/distributions/hypergeometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/hypergeometric_quantile.hpp>", private, "<boost/math/distributions/hypergeometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/inv_discrete_quantile.hpp>", private, "<boost/math/distributions/binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/inv_discrete_quantile.hpp>", private, "<boost/math/distributions/geometric.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/inv_discrete_quantile.hpp>", private, "<boost/math/distributions/negative_binomial.hpp>", public ] },
+ { include: ["<boost/math/distributions/detail/inv_discrete_quantile.hpp>", private, "<boost/math/distributions/poisson.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/airy_ai_bi_zero.hpp>", private, "<boost/math/special_functions/airy.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_i0.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_i1.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_ik.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jn.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_jy_zero.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_kn.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/bessel_yn.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/erf_inv.hpp>", private, "<boost/math/special_functions/erf.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/fp_traits.hpp>", private, "<boost/math/special_functions/fpclassify.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/fp_traits.hpp>", private, "<boost/math/special_functions/sign.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/gamma_inva.hpp>", private, "<boost/math/special_functions/gamma.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/ibeta_inv_ab.hpp>", private, "<boost/math/special_functions/beta.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/ibeta_inverse.hpp>", private, "<boost/math/special_functions/beta.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/iconv.hpp>", private, "<boost/math/special_functions/bessel.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/igamma_inverse.hpp>", private, "<boost/math/special_functions/gamma.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/igamma_large.hpp>", private, "<boost/math/special_functions/gamma.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/lanczos_sse2.hpp>", private, "<boost/math/special_functions/lanczos.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/lgamma_small.hpp>", private, "<boost/math/special_functions/gamma.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/round_fwd.hpp>", private, "<boost/math/special_functions/math_fwd.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/unchecked_factorial.hpp>", private, "<boost/math/special_functions/factorials.hpp>", public ] },
+ { include: ["<boost/math/special_functions/detail/unchecked_factorial.hpp>", private, "<boost/math/special_functions/gamma.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner1_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner2_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/polynomial_horner3_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner1_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner2_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_10.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_11.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_12.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_13.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_14.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_15.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_16.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_17.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_18.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_19.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_20.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_2.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_3.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_4.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_5.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_6.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_7.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_8.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/math/tools/detail/rational_horner3_9.hpp>", private, "<boost/math/tools/rational.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/algorithm.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/core.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/iterator.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/move.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/traits.hpp>", public ] },
+ { include: ["<boost/move/detail/config_begin.hpp>", private, "<boost/move/utility.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/algorithm.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/core.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/iterator.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/move.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/traits.hpp>", public ] },
+ { include: ["<boost/move/detail/config_end.hpp>", private, "<boost/move/utility.hpp>", public ] },
+ { include: ["<boost/move/detail/meta_utils.hpp>", private, "<boost/move/core.hpp>", public ] },
+ { include: ["<boost/move/detail/meta_utils.hpp>", private, "<boost/move/traits.hpp>", public ] },
+ { include: ["<boost/move/detail/meta_utils.hpp>", private, "<boost/move/utility.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/deque.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/flat_map.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/flat_set.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/list.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/map.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/set.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/slist.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/stable_vector.hpp>", public ] },
+ { include: ["<boost/move/detail/move_helpers.hpp>", private, "<boost/container/vector.hpp>", public ] },
+ { include: ["<boost/mpi/detail/binary_buffer_iprimitive.hpp>", private, "<boost/mpi/packed_iarchive.hpp>", public ] },
+ { include: ["<boost/mpi/detail/binary_buffer_oprimitive.hpp>", private, "<boost/mpi/packed_oarchive.hpp>", public ] },
+ { include: ["<boost/mpi/detail/broadcast_sc.hpp>", private, "<boost/mpi/collectives/broadcast.hpp>", public ] },
+ { include: ["<boost/mpi/detail/broadcast_sc.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/communicator_sc.hpp>", private, "<boost/mpi/communicator.hpp>", public ] },
+ { include: ["<boost/mpi/detail/communicator_sc.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/computation_tree.hpp>", private, "<boost/mpi/collectives/reduce.hpp>", public ] },
+ { include: ["<boost/mpi/detail/computation_tree.hpp>", private, "<boost/mpi/collectives/scan.hpp>", public ] },
+ { include: ["<boost/mpi/detail/content_oarchive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/forward_skeleton_iarchive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/forward_skeleton_oarchive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/ignore_iprimitive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/ignore_oprimitive.hpp>", private, "<boost/mpi/skeleton_and_content.hpp>", public ] },
+ { include: ["<boost/mpi/detail/mpi_datatype_cache.hpp>", private, "<boost/mpi/datatype.hpp>", public ] },
+ { include: ["<boost/mpi/detail/packed_iprimitive.hpp>", private, "<boost/mpi/packed_iarchive.hpp>", public ] },
+ { include: ["<boost/mpi/detail/packed_oprimitive.hpp>", private, "<boost/mpi/packed_oarchive.hpp>", public ] },
+ { include: ["<boost/mpi/detail/point_to_point.hpp>", private, "<boost/mpi/collectives/gather.hpp>", public ] },
+ { include: ["<boost/mpi/detail/point_to_point.hpp>", private, "<boost/mpi/collectives/reduce.hpp>", public ] },
+ { include: ["<boost/mpi/detail/point_to_point.hpp>", private, "<boost/mpi/collectives/scan.hpp>", public ] },
+ { include: ["<boost/mpi/detail/point_to_point.hpp>", private, "<boost/mpi/collectives/scatter.hpp>", public ] },
+ { include: ["<boost/mpi/detail/point_to_point.hpp>", private, "<boost/mpi/communicator.hpp>", public ] },
+ { include: ["<boost/msm/front/detail/common_states.hpp>", private, "<boost/msm/front/common_states.hpp>", public ] },
+ { include: ["<boost/msm/front/detail/row2_helper.hpp>", private, "<boost/msm/front/internal_row.hpp>", public ] },
+ { include: ["<boost/msm/front/detail/row2_helper.hpp>", private, "<boost/msm/front/row2.hpp>", public ] },
+ { include: ["<boost/msm/mpl_graph/detail/adjacency_list_graph.ipp>", private, "<boost/msm/mpl_graph/adjacency_list_graph.hpp>", public ] },
+ { include: ["<boost/msm/mpl_graph/detail/graph_implementation_interface.ipp>", private, "<boost/msm/mpl_graph/mpl_graph.hpp>", public ] },
+ { include: ["<boost/msm/mpl_graph/detail/incidence_list_graph.ipp>", private, "<boost/msm/mpl_graph/incidence_list_graph.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/composite_key.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/access_specifier.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/adl_swap.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/archive_constructed.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/auto_space.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/base_type.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/bidir_node_iterator.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/bidir_node_iterator.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/bucket_array.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/converter.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/do_not_copy_elements_tag.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/duplicates_iterator.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/hash_index_args.hpp>", private, "<boost/multi_index/hashed_index_fwd.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/hash_index_iterator.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/has_tag.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/header_holder.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/index_node_base.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/index_node_base.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/index_node_base.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/index_node_base.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/invariant_assert.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/modify_key_adaptor.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/modify_key_adaptor.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/no_duplicate_tags.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/no_duplicate_tags.hpp>", private, "<boost/multi_index/tag.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/ord_index_args.hpp>", private, "<boost/multi_index/ordered_index_fwd.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/ord_index_node.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/ord_index_ops.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index/composite_key.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/prevent_eti.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/rnd_index_loader.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/rnd_index_node.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/rnd_index_ops.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/rnd_index_ptr_array.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/rnd_node_iterator.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_ctr_proxy.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_ctr_proxy.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_ctr_proxy.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_ctr_proxy.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/safe_mode.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/scope_guard.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/seq_index_node.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/seq_index_ops.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/serialization_version.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/unbounded.hpp>", private, "<boost/bimap/bimap.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/unbounded.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/value_compare.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index_container.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index/hashed_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index/ordered_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index/random_access_index.hpp>", public ] },
+ { include: ["<boost/multi_index/detail/vartempl_support.hpp>", private, "<boost/multi_index/sequenced_index.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/big_lanczos.hpp>", private, "<boost/multiprecision/cpp_dec_float.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/big_lanczos.hpp>", private, "<boost/multiprecision/gmp.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/big_lanczos.hpp>", private, "<boost/multiprecision/mpfi.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/big_lanczos.hpp>", private, "<boost/multiprecision/mpfr.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/bitscan.hpp>", private, "<boost/multiprecision/cpp_int/misc.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/bitscan.hpp>", private, "<boost/multiprecision/integer.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/digits.hpp>", private, "<boost/multiprecision/gmp.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/digits.hpp>", private, "<boost/multiprecision/mpfi.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/digits.hpp>", private, "<boost/multiprecision/mpfr.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/dynamic_array.hpp>", private, "<boost/multiprecision/cpp_dec_float.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/float_string_cvt.hpp>", private, "<boost/multiprecision/float128.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/generic_interconvert.hpp>", private, "<boost/multiprecision/number.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/integer_ops.hpp>", private, "<boost/multiprecision/cpp_int.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/integer_ops.hpp>", private, "<boost/multiprecision/debug_adaptor.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/integer_ops.hpp>", private, "<boost/multiprecision/gmp.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/integer_ops.hpp>", private, "<boost/multiprecision/logged_adaptor.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/integer_ops.hpp>", private, "<boost/multiprecision/tommath.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/number_base.hpp>", private, "<boost/multiprecision/traits/is_restricted_conversion.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/number_compare.hpp>", private, "<boost/multiprecision/number.hpp>", public ] },
+ { include: ["<boost/multiprecision/detail/ublas_interop.hpp>", private, "<boost/multiprecision/number.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/bounds.hpp>", private, "<boost/numeric/conversion/bounds.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/conversion_traits.hpp>", private, "<boost/numeric/conversion/conversion_traits.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/converter.hpp>", private, "<boost/numeric/conversion/converter.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/int_float_mixture.hpp>", private, "<boost/numeric/conversion/int_float_mixture.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/is_subranged.hpp>", private, "<boost/numeric/conversion/is_subranged.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/numeric_cast_traits.hpp>", private, "<boost/numeric/conversion/numeric_cast_traits.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/old_numeric_cast.hpp>", private, "<boost/numeric/conversion/cast.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/sign_mixture.hpp>", private, "<boost/numeric/conversion/sign_mixture.hpp>", public ] },
+ { include: ["<boost/numeric/conversion/detail/udt_builtin_mixture.hpp>", private, "<boost/numeric/conversion/udt_builtin_mixture.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/alpha_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/arith2.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/arith.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/rounded_arith.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/rounded_transc.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/transc.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/bugs.hpp>", private, "<boost/numeric/interval/utility.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/c99_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/division.hpp>", private, "<boost/numeric/interval/arith2.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/division.hpp>", private, "<boost/numeric/interval/arith.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/ia64_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/arith2.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/arith3.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/certain.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/explicit.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/lexicographic.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/possible.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/set.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/compare/tribool.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/ext/integer.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/interval.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/limits.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/transc.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/interval_prototype.hpp>", private, "<boost/numeric/interval/utility.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/ppc_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/sparc_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/arith2.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/arith3.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/arith.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/compare/certain.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/compare/lexicographic.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/compare/possible.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/compare/set.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/compare/tribool.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/ext/integer.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/transc.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/test_input.hpp>", private, "<boost/numeric/interval/utility.hpp>", public ] },
+ { include: ["<boost/numeric/interval/detail/x86_rounding_control.hpp>", private, "<boost/numeric/interval/hw_rounding.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/algebra/detail/for_each.hpp>", private, "<boost/numeric/odeint/algebra/range_algebra.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/algebra/detail/macros.hpp>", private, "<boost/numeric/odeint/algebra/range_algebra.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/algebra/detail/reduce.hpp>", private, "<boost/numeric/odeint/algebra/range_algebra.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private, "<boost/numeric/odeint/integrate/integrate_adaptive.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>", private, "<boost/numeric/odeint/integrate/integrate_const.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_const.hpp>", private, "<boost/numeric/odeint/integrate/integrate_const.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp>", private, "<boost/numeric/odeint/integrate/integrate_n_steps.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/integrate/detail/integrate_times.hpp>", private, "<boost/numeric/odeint/integrate/integrate_times.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/adams_bashforth_call_algebra.hpp>", private, "<boost/numeric/odeint/stepper/adams_bashforth.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/adams_bashforth_coefficients.hpp>", private, "<boost/numeric/odeint/stepper/adams_bashforth.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/adams_moulton_call_algebra.hpp>", private, "<boost/numeric/odeint/stepper/adams_moulton.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/adams_moulton_coefficients.hpp>", private, "<boost/numeric/odeint/stepper/adams_moulton.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp>", private, "<boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_algorithm.hpp>", private, "<boost/numeric/odeint/stepper/explicit_generic_rk.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp>", private, "<boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp>", private, "<boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/rotating_buffer.hpp>", private, "<boost/numeric/odeint/stepper/adams_bashforth.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/stepper/detail/rotating_buffer.hpp>", private, "<boost/numeric/odeint/stepper/adams_moulton.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/util/detail/is_range.hpp>", private, "<boost/numeric/odeint/util/copy.hpp>", public ] },
+ { include: ["<boost/numeric/odeint/util/detail/less_with_sign.hpp>", private, "<boost/numeric/odeint/stepper/bulirsch_stoer.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/config.hpp>", private, "<boost/numeric/ublas/exception.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/config.hpp>", private, "<boost/numeric/ublas/operation/num_columns.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/config.hpp>", private, "<boost/numeric/ublas/operation/num_rows.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/config.hpp>", private, "<boost/numeric/ublas/operation/size.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/config.hpp>", private, "<boost/numeric/ublas/traits.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/definitions.hpp>", private, "<boost/numeric/ublas/functional.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/duff.hpp>", private, "<boost/numeric/ublas/functional.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/iterator.hpp>", private, "<boost/numeric/ublas/storage.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/iterator.hpp>", private, "<boost/numeric/ublas/traits.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/matrix_assign.hpp>", private, "<boost/numeric/ublas/experimental/sparse_view.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/matrix_assign.hpp>", private, "<boost/numeric/ublas/matrix.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/matrix_assign.hpp>", private, "<boost/numeric/ublas/matrix_proxy.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/matrix_assign.hpp>", private, "<boost/numeric/ublas/matrix_sparse.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/matrix_assign.hpp>", private, "<boost/numeric/ublas/operation_blocked.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/raw.hpp>", private, "<boost/numeric/ublas/functional.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/returntype_deduction.hpp>", private, "<boost/numeric/ublas/traits.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/banded.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/hermitian.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/matrix_proxy.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/symmetric.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/triangular.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/temporary.hpp>", private, "<boost/numeric/ublas/vector_proxy.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/vector_assign.hpp>", private, "<boost/numeric/ublas/matrix_proxy.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/vector_assign.hpp>", private, "<boost/numeric/ublas/operation_blocked.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/vector_assign.hpp>", private, "<boost/numeric/ublas/vector.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/vector_assign.hpp>", private, "<boost/numeric/ublas/vector_proxy.hpp>", public ] },
+ { include: ["<boost/numeric/ublas/detail/vector_assign.hpp>", private, "<boost/numeric/ublas/vector_sparse.hpp>", public ] },
+ { include: ["<boost/pending/detail/disjoint_sets.hpp>", private, "<boost/pending/disjoint_sets.hpp>", public ] },
+ { include: ["<boost/pending/detail/int_iterator.hpp>", private, "<boost/graph/matrix_as_graph.hpp>", public ] },
+ { include: ["<boost/pending/detail/property.hpp>", private, "<boost/pending/property.hpp>", public ] },
+ { include: ["<boost/phoenix/core/detail/actor_operator.hpp>", private, "<boost/phoenix/core/actor.hpp>", public ] },
+ { include: ["<boost/phoenix/core/detail/actor_result_of.hpp>", private, "<boost/phoenix/core/actor.hpp>", public ] },
+ { include: ["<boost/phoenix/core/detail/argument.hpp>", private, "<boost/phoenix/core/argument.hpp>", public ] },
+ { include: ["<boost/phoenix/core/detail/call.hpp>", private, "<boost/phoenix/core/call.hpp>", public ] },
+ { include: ["<boost/phoenix/core/detail/expression.hpp>", private, "<boost/phoenix/core/expression.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/construct_eval.hpp>", private, "<boost/phoenix/object/construct.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/construct.hpp>", private, "<boost/phoenix/object/construct.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/new_eval.hpp>", private, "<boost/phoenix/object/new.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/new.hpp>", private, "<boost/phoenix/object/new.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/const_cast.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/construct.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/dynamic_cast.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/new.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/reinterpret_cast.hpp>", public ] },
+ { include: ["<boost/phoenix/object/detail/target.hpp>", private, "<boost/phoenix/object/static_cast.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/member.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/define_operator.hpp>", private, "<boost/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/mem_fun_ptr_eval_result_of.hpp>", private, "<boost/phoenix/operator/member.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/mem_fun_ptr_gen.hpp>", private, "<boost/phoenix/operator/member.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/member.hpp>", public ] },
+ { include: ["<boost/phoenix/operator/detail/undef_operator.hpp>", private, "<boost/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/phoenix/scope/detail/dynamic.hpp>", private, "<boost/phoenix/scope/dynamic.hpp>", public ] },
+ { include: ["<boost/phoenix/scope/detail/local_gen.hpp>", private, "<boost/phoenix/scope/lambda.hpp>", public ] },
+ { include: ["<boost/phoenix/scope/detail/local_gen.hpp>", private, "<boost/phoenix/scope/let.hpp>", public ] },
+ { include: ["<boost/phoenix/scope/detail/local_variable.hpp>", private, "<boost/phoenix/scope/local_variable.hpp>", public ] },
+ { include: ["<boost/phoenix/statement/detail/catch_push_back.hpp>", private, "<boost/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/phoenix/statement/detail/switch.hpp>", private, "<boost/phoenix/statement/switch.hpp>", public ] },
+ { include: ["<boost/phoenix/statement/detail/try_catch_eval.hpp>", private, "<boost/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/phoenix/statement/detail/try_catch_expression.hpp>", private, "<boost/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/phoenix/stl/algorithm/iteration.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/decay_array.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/decay_array.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/phoenix/stl/algorithm/iteration.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_equal_range.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_find.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_lower_bound.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_remove.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_remove_if.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_reverse.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_sort.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_unique.hpp>", private, "<boost/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/algorithm/detail/has_upper_bound.hpp>", private, "<boost/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/phoenix/stl/container/detail/container.hpp>", private, "<boost/phoenix/stl/container/container.hpp>", public ] },
+ { include: ["<boost/phoenix/support/detail/iterate_define.hpp>", private, "<boost/phoenix/support/iterate.hpp>", public ] },
+ { include: ["<boost/pool/detail/guard.hpp>", private, "<boost/pool/singleton_pool.hpp>", public ] },
+ { include: ["<boost/pool/detail/mutex.hpp>", private, "<boost/pool/poolfwd.hpp>", public ] },
+ { include: ["<boost/pool/detail/pool_construct.ipp>", private, "<boost/pool/object_pool.hpp>", public ] },
+ { include: ["<boost/pool/detail/pool_construct_simple.ipp>", private, "<boost/pool/object_pool.hpp>", public ] },
+ { include: ["<boost/predef/detail/_cassert.h>", private, "<boost/predef/library/c/_prefix.h>", public ] },
+ { include: ["<boost/predef/detail/_exception.h>", private, "<boost/predef/library/std/_prefix.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/aix.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/amigaos.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/android.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/beos.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd/bsdi.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd/dragonfly.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd/free.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd/net.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/bsd/open.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/cygwin.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/hpux.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/irix.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/linux.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/macos.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/os400.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/qnxnto.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/solaris.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/unix.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/vms.h>", public ] },
+ { include: ["<boost/predef/detail/os_detected.h>", private, "<boost/predef/os/windows.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/alpha.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/arm.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/blackfin.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/convex.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/ia64.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/m68k.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/mips.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/parisc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/ppc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/pyramid.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/rs6k.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/sparc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/superh.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/sys370.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/sys390.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/x86/32.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/x86/64.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/x86.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/architecture/z.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/borland.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/clang.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/comeau.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/compaq.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/diab.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/digitalmars.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/dignus.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/edg.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/ekopath.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/gcc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/gcc_xml.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/greenhills.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/hp_acc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/iar.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/ibm.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/intel.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/kai.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/llvm.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/metaware.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/metrowerks.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/microtec.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/mpw.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/palm.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/pgi.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/sgi_mipspro.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/sunpro.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/tendra.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/visualc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/compiler/watcom.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/language/objc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/language/stdc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/language/stdcpp.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/c/gnu.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/c/uc.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/c/vms.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/c/zos.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/cxx.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/dinkumware.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/libcomo.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/modena.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/msl.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/roguewave.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/sgi.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/stdcpp3.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/stlport.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/library/std/vacpp.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/make.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/aix.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/amigaos.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/android.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/beos.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd/bsdi.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd/dragonfly.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd/free.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd/net.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/bsd/open.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/cygwin.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/hpux.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/irix.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/linux.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/macos.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/os400.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/qnxnto.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/solaris.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/unix.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/vms.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/os/windows.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/other/endian.h>", public ] },
+ { include: ["<boost/predef/detail/test.h>", private, "<boost/predef/platform/mingw.h>", public ] },
+ { include: ["<boost/preprocessor/arithmetic/detail/div_base.hpp>", private, "<boost/preprocessor/arithmetic/div.hpp>", public ] },
+ { include: ["<boost/preprocessor/arithmetic/detail/div_base.hpp>", private, "<boost/preprocessor/arithmetic/mod.hpp>", public ] },
+ { include: ["<boost/preprocessor/control/detail/dmc/while.hpp>", private, "<boost/preprocessor/control/while.hpp>", public ] },
+ { include: ["<boost/preprocessor/control/detail/edg/while.hpp>", private, "<boost/preprocessor/control/while.hpp>", public ] },
+ { include: ["<boost/preprocessor/control/detail/msvc/while.hpp>", private, "<boost/preprocessor/control/while.hpp>", public ] },
+ { include: ["<boost/preprocessor/control/detail/while.hpp>", private, "<boost/preprocessor/control/while.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/control/deduce_d.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/control/while.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/list/fold_left.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/list/fold_right.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/deduce_r.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/deduce_z.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/enum.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/enum_shifted.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/enum_trailing.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/for.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/repeat_from_to.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/repetition/repeat.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/seq/fold_left.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/auto_rec.hpp>", private, "<boost/preprocessor/seq/fold_right.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_binary.hpp>", private, "<boost/parameter/name.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_binary.hpp>", private, "<boost/preprocessor/list/adt.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_binary.hpp>", private, "<boost/spirit/home/classic/utility/rule_parser.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_binary.hpp>", private, "<boost/tti/has_template.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_nullary.hpp>", private, "<boost/parameter/preprocessor.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/local_function/aux_/preprocessor/traits/decl_sign_/any_bind_type.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/preprocessor/facilities/apply.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/spirit/home/classic/utility/rule_parser.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/is_unary.hpp>", private, "<boost/typeof/template_encoding.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/split.hpp>", private, "<boost/parameter/aux_/preprocessor/for_each.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/split.hpp>", private, "<boost/parameter/name.hpp>", public ] },
+ { include: ["<boost/preprocessor/detail/split.hpp>", private, "<boost/preprocessor/facilities/is_empty.hpp>", public ] },
+ { include: ["<boost/preprocessor/list/detail/dmc/fold_left.hpp>", private, "<boost/preprocessor/list/fold_left.hpp>", public ] },
+ { include: ["<boost/preprocessor/list/detail/edg/fold_left.hpp>", private, "<boost/preprocessor/list/fold_left.hpp>", public ] },
+ { include: ["<boost/preprocessor/list/detail/edg/fold_right.hpp>", private, "<boost/preprocessor/list/fold_right.hpp>", public ] },
+ { include: ["<boost/preprocessor/list/detail/fold_left.hpp>", private, "<boost/preprocessor/list/fold_left.hpp>", public ] },
+ { include: ["<boost/preprocessor/list/detail/fold_right.hpp>", private, "<boost/preprocessor/list/fold_right.hpp>", public ] },
+ { include: ["<boost/preprocessor/repetition/detail/dmc/for.hpp>", private, "<boost/preprocessor/repetition/for.hpp>", public ] },
+ { include: ["<boost/preprocessor/repetition/detail/edg/for.hpp>", private, "<boost/preprocessor/repetition/for.hpp>", public ] },
+ { include: ["<boost/preprocessor/repetition/detail/for.hpp>", private, "<boost/preprocessor/repetition/for.hpp>", public ] },
+ { include: ["<boost/preprocessor/repetition/detail/msvc/for.hpp>", private, "<boost/preprocessor/repetition/for.hpp>", public ] },
+ { include: ["<boost/preprocessor/seq/detail/binary_transform.hpp>", private, "<boost/preprocessor/seq/to_list.hpp>", public ] },
+ { include: ["<boost/preprocessor/seq/detail/split.hpp>", private, "<boost/preprocessor/seq/first_n.hpp>", public ] },
+ { include: ["<boost/preprocessor/seq/detail/split.hpp>", private, "<boost/preprocessor/seq/rest_n.hpp>", public ] },
+ { include: ["<boost/preprocessor/slot/detail/def.hpp>", private, "<boost/preprocessor/slot/counter.hpp>", public ] },
+ { include: ["<boost/preprocessor/slot/detail/def.hpp>", private, "<boost/preprocessor/slot/slot.hpp>", public ] },
+ { include: ["<boost/program_options/detail/cmdline.hpp>", private, "<boost/program_options/parsers.hpp>", public ] },
+ { include: ["<boost/program_options/detail/parsers.hpp>", private, "<boost/program_options/parsers.hpp>", public ] },
+ { include: ["<boost/program_options/detail/value_semantic.hpp>", private, "<boost/program_options/value_semantic.hpp>", public ] },
+ { include: ["<boost/property_map/parallel/impl/distributed_property_map.ipp>", private, "<boost/property_map/parallel/distributed_property_map.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/exception_implementation.hpp>", private, "<boost/property_tree/exceptions.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/file_parser_error.hpp>", private, "<boost/property_tree/ini_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/info_parser_error.hpp>", private, "<boost/property_tree/info_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/info_parser_read.hpp>", private, "<boost/property_tree/info_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/info_parser_write.hpp>", private, "<boost/property_tree/info_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/info_parser_writer_settings.hpp>", private, "<boost/property_tree/info_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/json_parser_error.hpp>", private, "<boost/property_tree/json_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/json_parser_read.hpp>", private, "<boost/property_tree/json_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/json_parser_write.hpp>", private, "<boost/property_tree/json_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/ptree_implementation.hpp>", private, "<boost/property_tree/ptree.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/ini_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/ptree.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/ptree_utils.hpp>", private, "<boost/property_tree/string_path.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_error.hpp>", private, "<boost/property_tree/xml_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_flags.hpp>", private, "<boost/property_tree/xml_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_read_rapidxml.hpp>", private, "<boost/property_tree/xml_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_utils.hpp>", private, "<boost/graph/graphml.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_write.hpp>", private, "<boost/property_tree/xml_parser.hpp>", public ] },
+ { include: ["<boost/property_tree/detail/xml_parser_writer_settings.hpp>", private, "<boost/property_tree/xml_parser.hpp>", public ] },
+ { include: ["<boost/proto/context/detail/callable_eval.hpp>", private, "<boost/proto/context/callable.hpp>", public ] },
+ { include: ["<boost/proto/context/detail/default_eval.hpp>", private, "<boost/proto/context/default.hpp>", public ] },
+ { include: ["<boost/proto/context/detail/null_eval.hpp>", private, "<boost/proto/context/null.hpp>", public ] },
+ { include: ["<boost/proto/detail/and_n.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/detail/any.hpp>", private, "<boost/proto/transform/impl.hpp>", public ] },
+ { include: ["<boost/proto/detail/args.hpp>", private, "<boost/proto/args.hpp>", public ] },
+ { include: ["<boost/proto/detail/as_expr.hpp>", private, "<boost/proto/domain.hpp>", public ] },
+ { include: ["<boost/proto/detail/as_lvalue.hpp>", private, "<boost/proto/transform/call.hpp>", public ] },
+ { include: ["<boost/proto/detail/as_lvalue.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/detail/basic_expr.hpp>", private, "<boost/proto/expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/decltype.hpp>", private, "<boost/proto/context/default.hpp>", public ] },
+ { include: ["<boost/proto/detail/decltype.hpp>", private, "<boost/proto/transform/default.hpp>", public ] },
+ { include: ["<boost/proto/detail/deduce_domain.hpp>", private, "<boost/proto/domain.hpp>", public ] },
+ { include: ["<boost/proto/detail/deep_copy.hpp>", private, "<boost/proto/deep_copy.hpp>", public ] },
+ { include: ["<boost/proto/detail/deprecated.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/expr.hpp>", private, "<boost/proto/expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/extends_funop_const.hpp>", private, "<boost/proto/extends.hpp>", public ] },
+ { include: ["<boost/proto/detail/extends_funop.hpp>", private, "<boost/proto/extends.hpp>", public ] },
+ { include: ["<boost/proto/detail/funop.hpp>", private, "<boost/proto/expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/generate_by_value.hpp>", private, "<boost/proto/generate.hpp>", public ] },
+ { include: ["<boost/proto/detail/ignore_unused.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/detail/ignore_unused.hpp>", private, "<boost/proto/transform/pass_through.hpp>", public ] },
+ { include: ["<boost/proto/detail/is_noncopyable.hpp>", private, "<boost/proto/args.hpp>", public ] },
+ { include: ["<boost/proto/detail/is_noncopyable.hpp>", private, "<boost/proto/transform/env.hpp>", public ] },
+ { include: ["<boost/proto/detail/lambda_matches.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/detail/make_expr_funop.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/make_expr_.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/make_expr.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/matches_.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/detail/or_n.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/detail/poly_function.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/poly_function.hpp>", private, "<boost/proto/transform/call.hpp>", public ] },
+ { include: ["<boost/proto/detail/poly_function.hpp>", private, "<boost/proto/transform/env.hpp>", public ] },
+ { include: ["<boost/proto/detail/remove_typename.hpp>", private, "<boost/proto/extends.hpp>", public ] },
+ { include: ["<boost/proto/detail/static_const.hpp>", private, "<boost/proto/transform/impl.hpp>", public ] },
+ { include: ["<boost/proto/detail/template_arity.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/detail/template_arity.hpp>", private, "<boost/proto/traits.hpp>", public ] },
+ { include: ["<boost/proto/detail/template_arity.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/detail/traits.hpp>", private, "<boost/proto/traits.hpp>", public ] },
+ { include: ["<boost/proto/detail/unpack_expr_.hpp>", private, "<boost/proto/make_expr.hpp>", public ] },
+ { include: ["<boost/proto/detail/vararg_matches_impl.hpp>", private, "<boost/proto/matches.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/call.hpp>", private, "<boost/proto/transform/call.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/construct_funop.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/construct_pod_funop.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/default_function_impl.hpp>", private, "<boost/proto/transform/default.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/fold_impl.hpp>", private, "<boost/proto/transform/fold.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/lazy.hpp>", private, "<boost/proto/transform/lazy.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/make.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/pack.hpp>", private, "<boost/proto/transform/call.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/pack.hpp>", private, "<boost/proto/transform/lazy.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/pack.hpp>", private, "<boost/proto/transform/make.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/pass_through_impl.hpp>", private, "<boost/proto/transform/pass_through.hpp>", public ] },
+ { include: ["<boost/proto/transform/detail/when.hpp>", private, "<boost/proto/transform/when.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/associative_ptr_container.hpp>", private, "<boost/ptr_container/ptr_map_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/associative_ptr_container.hpp>", private, "<boost/ptr_container/ptr_set_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/map_iterator.hpp>", private, "<boost/ptr_container/ptr_map_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/meta_functions.hpp>", private, "<boost/ptr_container/ptr_map_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/meta_functions.hpp>", private, "<boost/ptr_container/ptr_set_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/reversible_ptr_container.hpp>", private, "<boost/ptr_container/ptr_sequence_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_ptr_map_adapter.hpp>", private, "<boost/ptr_container/serialize_ptr_map.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_ptr_map_adapter.hpp>", private, "<boost/ptr_container/serialize_ptr_unordered_map.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_array.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_circular_buffer.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_deque.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_list.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_set.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_unordered_set.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/serialize_reversible_cont.hpp>", private, "<boost/ptr_container/serialize_ptr_vector.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/void_ptr_iterator.hpp>", private, "<boost/ptr_container/ptr_sequence_adapter.hpp>", public ] },
+ { include: ["<boost/ptr_container/detail/void_ptr_iterator.hpp>", private, "<boost/ptr_container/ptr_set_adapter.hpp>", public ] },
+ { include: ["<boost/python/detail/borrowed_ptr.hpp>", private, "<boost/python/borrowed.hpp>", public ] },
+ { include: ["<boost/python/detail/caller.hpp>", private, "<boost/python/make_constructor.hpp>", public ] },
+ { include: ["<boost/python/detail/caller.hpp>", private, "<boost/python/make_function.hpp>", public ] },
+ { include: ["<boost/python/detail/caller.hpp>", private, "<boost/python/object/function_handle.hpp>", public ] },
+ { include: ["<boost/python/detail/construct.hpp>", private, "<boost/python/converter/obj_mgr_arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/convertible.hpp>", private, "<boost/python/cast.hpp>", public ] },
+ { include: ["<boost/python/detail/convertible.hpp>", private, "<boost/python/converter/arg_to_python.hpp>", public ] },
+ { include: ["<boost/python/detail/copy_ctor_mutates_rhs.hpp>", private, "<boost/python/extract.hpp>", public ] },
+ { include: ["<boost/python/detail/copy_ctor_mutates_rhs.hpp>", private, "<boost/python/object/forward.hpp>", public ] },
+ { include: ["<boost/python/detail/dealloc.hpp>", private, "<boost/python/opaque_pointer_converter.hpp>", public ] },
+ { include: ["<boost/python/detail/decref_guard.hpp>", private, "<boost/python/object/make_instance.hpp>", public ] },
+ { include: ["<boost/python/detail/defaults_def.hpp>", private, "<boost/python/overloads.hpp>", public ] },
+ { include: ["<boost/python/detail/def_helper_fwd.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/def_helper.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/def_helper.hpp>", private, "<boost/python/def.hpp>", public ] },
+ { include: ["<boost/python/detail/dependent.hpp>", private, "<boost/python/back_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/dependent.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/destroy.hpp>", private, "<boost/python/converter/obj_mgr_arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/destroy.hpp>", private, "<boost/python/converter/rvalue_from_python_data.hpp>", public ] },
+ { include: ["<boost/python/detail/exception_handler.hpp>", private, "<boost/python/exception_translator.hpp>", public ] },
+ { include: ["<boost/python/detail/force_instantiate.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/force_instantiate.hpp>", private, "<boost/python/object/class_metadata.hpp>", public ] },
+ { include: ["<boost/python/detail/force_instantiate.hpp>", private, "<boost/python/object/pointer_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/force_instantiate.hpp>", private, "<boost/python/object/value_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/force_instantiate.hpp>", private, "<boost/python/return_opaque_pointer.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/converter/arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/converter/arg_to_python.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/converter/object_manager.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/copy_const_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/copy_non_const_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/data_members.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/manage_new_object.hpp>", public ] },
+ { include: ["<boost/python/detail/indirect_traits.hpp>", private, "<boost/python/reference_existing_object.hpp>", public ] },
+ { include: ["<boost/python/detail/is_xxx.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/make_keyword_range_fn.hpp>", private, "<boost/python/init.hpp>", public ] },
+ { include: ["<boost/python/detail/mpl_lambda.hpp>", private, "<boost/python/args.hpp>", public ] },
+ { include: ["<boost/python/detail/msvc_typeinfo.hpp>", private, "<boost/python/type_id.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/converter/builtin_converters.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/make_constructor.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/object/make_instance.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/opaque_pointer_converter.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/return_arg.hpp>", public ] },
+ { include: ["<boost/python/detail/none.hpp>", private, "<boost/python/to_python_indirect.hpp>", public ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/class_fwd.hpp>", public ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/data_members.hpp>", public ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/object/class_metadata.hpp>", public ] },
+ { include: ["<boost/python/detail/not_specified.hpp>", private, "<boost/python/operators.hpp>", public ] },
+ { include: ["<boost/python/detail/nullary_function_adaptor.hpp>", private, "<boost/python/pure_virtual.hpp>", public ] },
+ { include: ["<boost/python/detail/operator_id.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/operator_id.hpp>", private, "<boost/python/operators.hpp>", public ] },
+ { include: ["<boost/python/detail/overloads_fwd.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/overloads_fwd.hpp>", private, "<boost/python/def.hpp>", public ] },
+ { include: ["<boost/python/detail/overloads_fwd.hpp>", private, "<boost/python/overloads.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/args_fwd.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/args.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/back_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/bases.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/base_type_traits.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/borrowed.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/call.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/call_method.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/cast.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/class_fwd.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/builtin_converters.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/obj_mgr_arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/pyobject_traits.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/pytype_function.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/pytype_object_mgr_traits.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/registrations.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/converter/to_python_function_type.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/copy_const_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/copy_non_const_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/data_members.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/default_call_policies.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/def.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/def_visitor.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/dict.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/enum.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/errors.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/exception_translator.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/extract.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/handle_fwd.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/handle.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/has_back_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/implicit.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/init.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/instance_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/iterator.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/list.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/long.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/lvalue_from_pytype.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/make_constructor.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/make_function.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/manage_new_object.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/module.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/module_init.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/numeric.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_attributes.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/class.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/function.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/function_object.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_fwd.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/instance.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_items.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/iterator.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/life_support.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/make_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/make_instance.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_operators.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object/pickle_support.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_protocol_core.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_protocol.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/object_slices.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/opaque_pointer_converter.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/operators.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/other.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/overloads.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/override.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/pointee.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/proxy.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/ptr.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/raw_function.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/refcount.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/reference_existing_object.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/return_by_value.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/return_internal_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/return_opaque_pointer.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/return_value_policy.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/scope.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/self.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/signature.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/slice.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/slice_nil.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/ssize_t.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/stl_iterator.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/str.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/tag.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/to_python_converter.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/to_python_indirect.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/to_python_value.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/tuple.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/type_id.hpp>", public ] },
+ { include: ["<boost/python/detail/prefix.hpp>", private, "<boost/python/with_custodian_and_ward.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/args.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/call.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/call_method.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/object/make_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/object/pointer_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/object/value_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/preprocessor.hpp>", private, "<boost/python/signature.hpp>", public ] },
+ { include: ["<boost/python/detail/python_type.hpp>", private, "<boost/python/object/make_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/back_reference.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/converter/obj_mgr_arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/converter/pytype_object_mgr_traits.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/handle.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/raw_pyobject.hpp>", private, "<boost/python/object/iterator.hpp>", public ] },
+ { include: ["<boost/python/detail/referent_storage.hpp>", private, "<boost/python/converter/arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/referent_storage.hpp>", private, "<boost/python/converter/obj_mgr_arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/referent_storage.hpp>", private, "<boost/python/converter/rvalue_from_python_data.hpp>", public ] },
+ { include: ["<boost/python/detail/scope.hpp>", private, "<boost/python/def.hpp>", public ] },
+ { include: ["<boost/python/detail/sfinae.hpp>", private, "<boost/python/wrapper.hpp>", public ] },
+ { include: ["<boost/python/detail/signature.hpp>", private, "<boost/python/object/function_doc_signature.hpp>", public ] },
+ { include: ["<boost/python/detail/signature.hpp>", private, "<boost/python/object/py_function.hpp>", public ] },
+ { include: ["<boost/python/detail/string_literal.hpp>", private, "<boost/python/converter/arg_to_python.hpp>", public ] },
+ { include: ["<boost/python/detail/string_literal.hpp>", private, "<boost/python/object_core.hpp>", public ] },
+ { include: ["<boost/python/detail/target.hpp>", private, "<boost/python/iterator.hpp>", public ] },
+ { include: ["<boost/python/detail/translate_exception.hpp>", private, "<boost/python/exception_translator.hpp>", public ] },
+ { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/args.hpp>", public ] },
+ { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/bases.hpp>", public ] },
+ { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/init.hpp>", public ] },
+ { include: ["<boost/python/detail/type_list.hpp>", private, "<boost/python/signature.hpp>", public ] },
+ { include: ["<boost/python/detail/unwind_type.hpp>", private, "<boost/python/converter/pytype_function.hpp>", public ] },
+ { include: ["<boost/python/detail/unwrap_type_id.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/unwrap_wrapper.hpp>", private, "<boost/python/class.hpp>", public ] },
+ { include: ["<boost/python/detail/unwrap_wrapper.hpp>", private, "<boost/python/operators.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/data_members.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/default_call_policies.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/object/forward.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/return_arg.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/return_by_value.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/return_opaque_pointer.hpp>", public ] },
+ { include: ["<boost/python/detail/value_arg.hpp>", private, "<boost/python/to_python_value.hpp>", public ] },
+ { include: ["<boost/python/detail/value_is_shared_ptr.hpp>", private, "<boost/python/converter/arg_to_python.hpp>", public ] },
+ { include: ["<boost/python/detail/value_is_shared_ptr.hpp>", private, "<boost/python/to_python_value.hpp>", public ] },
+ { include: ["<boost/python/detail/void_ptr.hpp>", private, "<boost/python/converter/arg_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/void_ptr.hpp>", private, "<boost/python/converter/return_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/void_ptr.hpp>", private, "<boost/python/extract.hpp>", public ] },
+ { include: ["<boost/python/detail/void_ptr.hpp>", private, "<boost/python/lvalue_from_pytype.hpp>", public ] },
+ { include: ["<boost/python/detail/void_return.hpp>", private, "<boost/python/call.hpp>", public ] },
+ { include: ["<boost/python/detail/void_return.hpp>", private, "<boost/python/call_method.hpp>", public ] },
+ { include: ["<boost/python/detail/void_return.hpp>", private, "<boost/python/converter/return_from_python.hpp>", public ] },
+ { include: ["<boost/python/detail/void_return.hpp>", private, "<boost/python/extract.hpp>", public ] },
+ { include: ["<boost/python/detail/wrapper_base.hpp>", private, "<boost/python/object/pointer_holder.hpp>", public ] },
+ { include: ["<boost/python/detail/wrapper_base.hpp>", private, "<boost/python/wrapper.hpp>", public ] },
+ { include: ["<boost/python/suite/indexing/detail/indexing_suite_detail.hpp>", private, "<boost/python/suite/indexing/indexing_suite.hpp>", public ] },
+ { include: ["<boost/random/detail/auto_link.hpp>", private, "<boost/random/random_device.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/additive_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/bernoulli_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/binomial_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/cauchy_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/chi_squared_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/discard_block.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/discrete_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/exponential_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/gamma_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/geometric_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/lagged_fibonacci.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/linear_feedback_shift.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/lognormal_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/mersenne_twister.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/negative_binomial_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/normal_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/piecewise_constant_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/piecewise_linear_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/poisson_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/subtract_with_carry.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/triangle_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/uniform_01.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/uniform_int_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/uniform_on_sphere.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/uniform_real_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/uniform_smallint.hpp>", public ] },
+ { include: ["<boost/random/detail/config.hpp>", private, "<boost/random/xor_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/const_mod.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/const_mod.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/binomial_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/discrete_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/poisson_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/random_number_generator.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/shuffle_order.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/uniform_01.hpp>", public ] },
+ { include: ["<boost/random/detail/disable_warnings.hpp>", private, "<boost/random/variate_generator.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/binomial_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/discrete_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/poisson_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/random_number_generator.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/shuffle_order.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/uniform_01.hpp>", public ] },
+ { include: ["<boost/random/detail/enable_warnings.hpp>", private, "<boost/random/variate_generator.hpp>", public ] },
+ { include: ["<boost/random/detail/generator_bits.hpp>", private, "<boost/random/generate_canonical.hpp>", public ] },
+ { include: ["<boost/random/detail/generator_seed_seq.hpp>", private, "<boost/random/lagged_fibonacci.hpp>", public ] },
+ { include: ["<boost/random/detail/generator_seed_seq.hpp>", private, "<boost/random/mersenne_twister.hpp>", public ] },
+ { include: ["<boost/random/detail/generator_seed_seq.hpp>", private, "<boost/random/subtract_with_carry.hpp>", public ] },
+ { include: ["<boost/random/detail/integer_log2.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/additive_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/bernoulli_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/cauchy_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/discrete_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/exponential_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/extreme_value_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/fisher_f_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/geometric_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/lagged_fibonacci.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/linear_feedback_shift.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/lognormal_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/normal_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/piecewise_constant_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/piecewise_linear_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/shuffle_order.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/student_t_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/subtract_with_carry.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/triangle_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/uniform_int_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/uniform_on_sphere.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/uniform_real_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/uniform_smallint.hpp>", public ] },
+ { include: ["<boost/random/detail/operators.hpp>", private, "<boost/random/weibull_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/ptr_helper.hpp>", private, "<boost/random/mersenne_twister.hpp>", public ] },
+ { include: ["<boost/random/detail/ptr_helper.hpp>", private, "<boost/random/uniform_01.hpp>", public ] },
+ { include: ["<boost/random/detail/ptr_helper.hpp>", private, "<boost/random/variate_generator.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/additive_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/discard_block.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/lagged_fibonacci.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/linear_feedback_shift.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/mersenne_twister.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/shuffle_order.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/subtract_with_carry.hpp>", public ] },
+ { include: ["<boost/random/detail/seed.hpp>", private, "<boost/random/xor_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/inversive_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/linear_congruential.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/linear_feedback_shift.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/mersenne_twister.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/subtract_with_carry.hpp>", public ] },
+ { include: ["<boost/random/detail/seed_impl.hpp>", private, "<boost/random/xor_combine.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/generate_canonical.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/independent_bits.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/shuffle_order.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/uniform_int_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/uniform_real_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/signed_unsigned_tools.hpp>", private, "<boost/random/uniform_smallint.hpp>", public ] },
+ { include: ["<boost/random/detail/uniform_int_float.hpp>", private, "<boost/random/uniform_int_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/vector_io.hpp>", private, "<boost/random/discrete_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/vector_io.hpp>", private, "<boost/random/piecewise_constant_distribution.hpp>", public ] },
+ { include: ["<boost/random/detail/vector_io.hpp>", private, "<boost/random/piecewise_linear_distribution.hpp>", public ] },
+ { include: ["<boost/range/detail/any_iterator.hpp>", private, "<boost/range/any_range.hpp>", public ] },
+ { include: ["<boost/range/detail/as_literal.hpp>", private, "<boost/range/as_literal.hpp>", public ] },
+ { include: ["<boost/range/detail/begin.hpp>", private, "<boost/range/begin.hpp>", public ] },
+ { include: ["<boost/range/detail/collection_traits.hpp>", private, "<boost/range.hpp>", public ] },
+ { include: ["<boost/range/detail/const_iterator.hpp>", private, "<boost/range/const_iterator.hpp>", public ] },
+ { include: ["<boost/range/detail/end.hpp>", private, "<boost/range/end.hpp>", public ] },
+ { include: ["<boost/range/detail/extract_optional_type.hpp>", private, "<boost/range/const_iterator.hpp>", public ] },
+ { include: ["<boost/range/detail/extract_optional_type.hpp>", private, "<boost/range/mutable_iterator.hpp>", public ] },
+ { include: ["<boost/range/detail/implementation_help.hpp>", private, "<boost/range/end.hpp>", public ] },
+ { include: ["<boost/range/detail/iterator.hpp>", private, "<boost/range/mutable_iterator.hpp>", public ] },
+ { include: ["<boost/range/detail/join_iterator.hpp>", private, "<boost/range/join.hpp>", public ] },
+ { include: ["<boost/range/detail/microsoft.hpp>", private, "<boost/range/atl.hpp>", public ] },
+ { include: ["<boost/range/detail/microsoft.hpp>", private, "<boost/range/mfc.hpp>", public ] },
+ { include: ["<boost/range/detail/misc_concept.hpp>", private, "<boost/range/concepts.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/adjacent_find.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/find_end.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/find_first_of.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/find.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/find_if.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/lower_bound.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/max_element.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/min_element.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/partition.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/remove.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/remove_if.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/reverse.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/search.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/search_n.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/stable_partition.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/unique.hpp>", public ] },
+ { include: ["<boost/range/detail/range_return.hpp>", private, "<boost/range/algorithm/upper_bound.hpp>", public ] },
+ { include: ["<boost/range/detail/safe_bool.hpp>", private, "<boost/range/iterator_range_core.hpp>", public ] },
+ { include: ["<boost/range/detail/size_type.hpp>", private, "<boost/range/size_type.hpp>", public ] },
+ { include: ["<boost/range/detail/str_types.hpp>", private, "<boost/range/as_array.hpp>", public ] },
+ { include: ["<boost/range/detail/str_types.hpp>", private, "<boost/range/as_literal.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/abs.hpp>", private, "<boost/ratio/mpl/abs.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/abs.hpp>", private, "<boost/ratio/ratio.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/gcd.hpp>", private, "<boost/ratio/mpl/gcd.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/gcd.hpp>", private, "<boost/ratio/ratio.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/lcm.hpp>", private, "<boost/ratio/mpl/lcm.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/lcm.hpp>", private, "<boost/ratio/ratio.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/sign.hpp>", private, "<boost/ratio/mpl/sign.hpp>", public ] },
+ { include: ["<boost/ratio/detail/mpl/sign.hpp>", private, "<boost/ratio/ratio.hpp>", public ] },
+ { include: ["<boost/ratio/detail/overflow_helpers.hpp>", private, "<boost/ratio/ratio.hpp>", public ] },
+ { include: ["<boost/ratio/detail/ratio_io.hpp>", private, "<boost/ratio/ratio_io.hpp>", public ] },
+ { include: ["<boost/serialization/detail/get_data.hpp>", private, "<boost/serialization/valarray.hpp>", public ] },
+ { include: ["<boost/serialization/detail/get_data.hpp>", private, "<boost/serialization/vector.hpp>", public ] },
+ { include: ["<boost/serialization/detail/shared_ptr_132.hpp>", private, "<boost/serialization/shared_ptr_132.hpp>", public ] },
+ { include: ["<boost/serialization/detail/stack_constructor.hpp>", private, "<boost/serialization/collections_load_imp.hpp>", public ] },
+ { include: ["<boost/serialization/detail/stack_constructor.hpp>", private, "<boost/serialization/optional.hpp>", public ] },
+ { include: ["<boost/signals2/detail/foreign_ptr.hpp>", private, "<boost/signals2/slot_base.hpp>", public ] },
+ { include: ["<boost/signals2/detail/lwm_nop.hpp>", private, "<boost/signals2/mutex.hpp>", public ] },
+ { include: ["<boost/signals2/detail/lwm_pthreads.hpp>", private, "<boost/signals2/mutex.hpp>", public ] },
+ { include: ["<boost/signals2/detail/lwm_win32_cs.hpp>", private, "<boost/signals2/mutex.hpp>", public ] },
+ { include: ["<boost/signals2/detail/null_output_iterator.hpp>", private, "<boost/signals2/connection.hpp>", public ] },
+ { include: ["<boost/signals2/detail/preprocessed_arg_type.hpp>", private, "<boost/signals2/preprocessed_signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/preprocessed_arg_type.hpp>", private, "<boost/signals2/preprocessed_slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/replace_slot_function.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/result_type_wrapper.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/signals_common.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/signals_common.hpp>", private, "<boost/signals2/slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/signals_common_macros.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/signals_common_macros.hpp>", private, "<boost/signals2/slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/signal_template.hpp>", private, "<boost/signals2/variadic_signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/slot_call_iterator.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/slot_groups.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/slot_template.hpp>", private, "<boost/signals2/variadic_slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/tracked_objects_visitor.hpp>", private, "<boost/signals2/slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/unique_lock.hpp>", private, "<boost/signals2/connection.hpp>", public ] },
+ { include: ["<boost/signals2/detail/unique_lock.hpp>", private, "<boost/signals2/signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/variadic_arg_type.hpp>", private, "<boost/signals2/variadic_signal.hpp>", public ] },
+ { include: ["<boost/signals2/detail/variadic_arg_type.hpp>", private, "<boost/signals2/variadic_slot.hpp>", public ] },
+ { include: ["<boost/signals2/detail/variadic_slot_invoker.hpp>", private, "<boost/signals2/variadic_signal.hpp>", public ] },
+ { include: ["<boost/signals/detail/signal_base.hpp>", private, "<boost/signals/signal_template.hpp>", public ] },
+ { include: ["<boost/signals/detail/signals_common.hpp>", private, "<boost/signals/connection.hpp>", public ] },
+ { include: ["<boost/signals/detail/signals_common.hpp>", private, "<boost/signals/slot.hpp>", public ] },
+ { include: ["<boost/signals/detail/slot_call_iterator.hpp>", private, "<boost/signals/signal_template.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/allocate_array_helper.hpp>", private, "<boost/smart_ptr/allocate_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/array_deleter.hpp>", private, "<boost/smart_ptr/allocate_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/array_deleter.hpp>", private, "<boost/smart_ptr/make_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/array_traits.hpp>", private, "<boost/smart_ptr/allocate_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/array_traits.hpp>", private, "<boost/smart_ptr/make_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/atomic_count.hpp>", private, "<boost/smart_ptr/intrusive_ref_counter.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/make_array_helper.hpp>", private, "<boost/smart_ptr/make_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/operator_bool.hpp>", private, "<boost/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/operator_bool.hpp>", private, "<boost/smart_ptr/scoped_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/operator_bool.hpp>", private, "<boost/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/operator_bool.hpp>", private, "<boost/smart_ptr/shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/operator_bool.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/shared_array_nmt.hpp>", private, "<boost/smart_ptr/shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/shared_count.hpp>", private, "<boost/smart_ptr/shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/shared_count.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/shared_count.hpp>", private, "<boost/smart_ptr/weak_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/shared_ptr_nmt.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_convertible.hpp>", private, "<boost/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_convertible.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_forward.hpp>", private, "<boost/smart_ptr/make_shared_object.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_if_array.hpp>", private, "<boost/smart_ptr/allocate_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_if_array.hpp>", private, "<boost/smart_ptr/make_shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/spinlock_pool.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_nullptr_t.hpp>", private, "<boost/smart_ptr/intrusive_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_nullptr_t.hpp>", private, "<boost/smart_ptr/scoped_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_nullptr_t.hpp>", private, "<boost/smart_ptr/scoped_ptr.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_nullptr_t.hpp>", private, "<boost/smart_ptr/shared_array.hpp>", public ] },
+ { include: ["<boost/smart_ptr/detail/sp_nullptr_t.hpp>", private, "<boost/smart_ptr/shared_ptr.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/alternative.ipp>", private, "<boost/spirit/home/classic/core/composite/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/difference.ipp>", private, "<boost/spirit/home/classic/core/composite/difference.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/directives.ipp>", private, "<boost/spirit/home/classic/core/composite/directives.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/directives.ipp>", private, "<boost/spirit/home/classic/core/primitives/primitives.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/exclusive_or.ipp>", private, "<boost/spirit/home/classic/core/composite/exclusive_or.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/intersection.ipp>", private, "<boost/spirit/home/classic/core/composite/intersection.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/kleene_star.ipp>", private, "<boost/spirit/home/classic/core/composite/kleene_star.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/list.ipp>", private, "<boost/spirit/home/classic/core/composite/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/optional.ipp>", private, "<boost/spirit/home/classic/core/composite/optional.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/positive.ipp>", private, "<boost/spirit/home/classic/core/composite/positive.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/sequence.ipp>", private, "<boost/spirit/home/classic/core/composite/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/sequential_and.ipp>", private, "<boost/spirit/home/classic/core/composite/sequential_and.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/composite/impl/sequential_or.ipp>", private, "<boost/spirit/home/classic/core/composite/sequential_or.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/impl/match_attr_traits.ipp>", private, "<boost/spirit/home/classic/core/match.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/impl/match.ipp>", private, "<boost/spirit/home/classic/core/match.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/impl/parser.ipp>", private, "<boost/spirit/home/classic/core/parser.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp>", private, "<boost/spirit/home/classic/core/non_terminal/grammar.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/non_terminal/impl/rule.ipp>", private, "<boost/spirit/home/classic/core/non_terminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/non_terminal/impl/rule.ipp>", private, "<boost/spirit/home/classic/dynamic/stored_rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/non_terminal/impl/static.hpp>", private, "<boost/spirit/include/classic_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/non_terminal/impl/subrule.ipp>", private, "<boost/spirit/home/classic/core/non_terminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/primitives/impl/numerics.ipp>", private, "<boost/spirit/home/classic/core/primitives/numerics.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/primitives/impl/primitives.ipp>", private, "<boost/spirit/home/classic/core/primitives/primitives.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/primitives/impl/primitives.ipp>", private, "<boost/spirit/home/classic/core/scanner/skipper.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/core/scanner/impl/skipper.ipp>", private, "<boost/spirit/home/classic/core/scanner/skipper.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/debug/impl/parser_names.ipp>", private, "<boost/spirit/home/classic/debug/parser_names.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/dynamic/impl/conditions.ipp>", private, "<boost/spirit/home/classic/dynamic/for.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/dynamic/impl/conditions.ipp>", private, "<boost/spirit/home/classic/dynamic/if.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/dynamic/impl/conditions.ipp>", private, "<boost/spirit/home/classic/dynamic/while.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/dynamic/impl/select.ipp>", private, "<boost/spirit/home/classic/dynamic/select.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/dynamic/impl/switch.ipp>", private, "<boost/spirit/home/classic/dynamic/switch.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/error_handling/impl/exceptions.ipp>", private, "<boost/spirit/home/classic/error_handling/exceptions.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/iterator/impl/file_iterator.ipp>", private, "<boost/spirit/home/classic/iterator/file_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/iterator/impl/position_iterator.ipp>", private, "<boost/spirit/home/classic/iterator/position_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/meta/impl/fundamental.ipp>", private, "<boost/spirit/home/classic/meta/fundamental.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/meta/impl/parser_traits.ipp>", private, "<boost/spirit/home/classic/meta/parser_traits.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/meta/impl/refactoring.ipp>", private, "<boost/spirit/home/classic/meta/refactoring.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/meta/impl/traverse.ipp>", private, "<boost/spirit/home/classic/meta/traverse.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/symbols/impl/symbols.ipp>", private, "<boost/spirit/home/classic/symbols/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/tree/impl/parse_tree_utils.ipp>", private, "<boost/spirit/home/classic/tree/parse_tree_utils.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/tree/impl/tree_to_xml.ipp>", private, "<boost/spirit/home/classic/tree/tree_to_xml.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>", private, "<boost/spirit/home/classic/utility/chset.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/basic_chset.hpp>", private, "<boost/spirit/include/classic_basic_chset.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset.ipp>", private, "<boost/spirit/home/classic/utility/chset.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset_operators.ipp>", private, "<boost/spirit/home/classic/utility/chset_operators.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/chset/range_run.hpp>", private, "<boost/spirit/include/classic_range_run.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/confix.ipp>", private, "<boost/spirit/home/classic/utility/confix.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/escape_char.ipp>", private, "<boost/spirit/home/classic/utility/escape_char.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/lists.ipp>", private, "<boost/spirit/home/classic/utility/lists.hpp>", public ] },
+ { include: ["<boost/spirit/home/classic/utility/impl/regex.ipp>", private, "<boost/spirit/home/classic/utility/regex.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/alternative_function.hpp>", private, "<boost/spirit/home/karma/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/as.hpp>", private, "<boost/spirit/home/karma/directive/as.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/action/action.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/auxiliary/attr_cast.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/auxiliary/eol.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/auxiliary/lazy.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/as.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/buffer.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/center_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/columns.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/delimit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/duplicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/left_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/maxwidth.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/no_delimit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/omit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/right_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/directive/verbatim.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/and_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/not_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/optional.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/phoenix_attributes.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/home/karma/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/repository/home/karma/directive/confix.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/attributes.hpp>", private, "<boost/spirit/repository/home/karma/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/default_width.hpp>", private, "<boost/spirit/home/karma/directive/center_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/default_width.hpp>", private, "<boost/spirit/home/karma/directive/columns.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/default_width.hpp>", private, "<boost/spirit/home/karma/directive/left_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/default_width.hpp>", private, "<boost/spirit/home/karma/directive/maxwidth.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/default_width.hpp>", private, "<boost/spirit/home/karma/directive/right_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/numeric/bool.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/enable_lit.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/char/char_generator.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/numeric/bool.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/extract_from.hpp>", private, "<boost/spirit/home/karma/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/fail_function.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/fail_function.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/fail_function.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/fail_function.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_auto.hpp>", private, "<boost/spirit/home/karma/auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_auto.hpp>", private, "<boost/spirit/include/karma_generate_auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate.hpp>", private, "<boost/spirit/home/karma/generate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/auxiliary/eol.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/binary/padding.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/char/char_class.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/char/char_generator.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/generate_to.hpp>", private, "<boost/spirit/home/karma/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/char/char_class.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/numeric/bool.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_casetag.hpp>", private, "<boost/spirit/home/karma/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/get_stricttag.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/indirect_iterator.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/indirect_iterator.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/indirect_iterator.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/indirect_iterator.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/indirect_iterator.hpp>", private, "<boost/spirit/home/karma/phoenix_attributes.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/as.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/buffer.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/center_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/left_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/maxwidth.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/directive/right_alignment.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/operator/and_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/operator/not_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/output_iterator.hpp>", private, "<boost/spirit/home/karma/stream/format_manip.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/pass_container.hpp>", private, "<boost/spirit/home/karma/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/pass_container.hpp>", private, "<boost/spirit/home/karma/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/pass_container.hpp>", private, "<boost/spirit/home/karma/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/pass_container.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/string_compare.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/string_generate.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/string_generate.hpp>", private, "<boost/spirit/home/karma/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/unused_delimiter.hpp>", private, "<boost/spirit/home/karma/delimit_out.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/unused_delimiter.hpp>", private, "<boost/spirit/home/karma/directive/delimit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/unused_delimiter.hpp>", private, "<boost/spirit/home/karma/directive/no_delimit.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/detail/unused_delimiter.hpp>", private, "<boost/spirit/home/karma/directive/verbatim.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/home/karma/nonterminal/grammar.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/home/karma/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/repository/home/karma/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp>", private, "<boost/spirit/home/karma/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/generator_binder.hpp>", private, "<boost/spirit/repository/home/karma/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/parameterized.hpp>", private, "<boost/spirit/home/karma/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/nonterminal/detail/parameterized.hpp>", private, "<boost/spirit/repository/home/karma/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/bool_utils.hpp>", private, "<boost/spirit/home/karma/numeric/bool.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/karma/numeric/bool_policies.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private, "<boost/spirit/home/karma/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/numeric/detail/real_utils.hpp>", private, "<boost/spirit/home/karma/numeric/real_policies.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/stream/detail/format_manip_auto.hpp>", private, "<boost/spirit/home/karma/format_auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/stream/detail/format_manip.hpp>", private, "<boost/spirit/home/karma/stream/format_manip.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/stream/detail/format_manip.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/karma/stream/detail/iterator_sink.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/lex/detail/sequence_function.hpp>", private, "<boost/spirit/home/lex/lexer/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/core/detail/actor.hpp>", private, "<boost/spirit/home/phoenix/core/actor.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/core/detail/basic_environment.hpp>", private, "<boost/spirit/home/phoenix/core/basic_environment.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/core/detail/compose.hpp>", private, "<boost/spirit/home/phoenix/core/compose.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/core/detail/composite_eval.hpp>", private, "<boost/spirit/home/phoenix/core/composite.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/core/detail/composite.hpp>", private, "<boost/spirit/home/phoenix/core/composite.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/local_reference.hpp>", private, "<boost/spirit/home/phoenix/scope/lambda.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/local_reference.hpp>", private, "<boost/spirit/home/phoenix/scope/let.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/local_reference.hpp>", private, "<boost/spirit/home/phoenix/scope/local_variable.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/if_else.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/detail/type_deduction.hpp>", private, "<boost/spirit/home/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/object/detail/construct_eval.hpp>", private, "<boost/spirit/home/phoenix/object/construct.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/object/detail/construct.hpp>", private, "<boost/spirit/home/phoenix/object/construct.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/object/detail/new_eval.hpp>", private, "<boost/spirit/home/phoenix/object/new.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/object/detail/new.hpp>", private, "<boost/spirit/home/phoenix/object/new.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/binary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/io.hpp>", private, "<boost/spirit/home/phoenix/operator/io.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/mem_fun_ptr_gen.hpp>", private, "<boost/spirit/home/phoenix/operator/member.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_compose.hpp>", private, "<boost/spirit/home/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/arithmetic.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/bitwise.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/comparison.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/logical.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/operator/detail/unary_eval.hpp>", private, "<boost/spirit/home/phoenix/operator/self.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/scope/detail/local_gen.hpp>", private, "<boost/spirit/home/phoenix/scope/lambda.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/scope/detail/local_gen.hpp>", private, "<boost/spirit/home/phoenix/scope/let.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/scope/detail/local_variable.hpp>", private, "<boost/spirit/home/phoenix/scope/lambda.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/scope/detail/local_variable.hpp>", private, "<boost/spirit/home/phoenix/scope/let.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/scope/detail/local_variable.hpp>", private, "<boost/spirit/home/phoenix/scope/local_variable.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp>", private, "<boost/spirit/home/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/catch_composite.hpp>", private, "<boost/spirit/home/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/catch_eval.hpp>", private, "<boost/spirit/home/phoenix/statement/try_catch.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/switch_eval.hpp>", private, "<boost/spirit/home/phoenix/statement/switch.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/statement/detail/switch.hpp>", private, "<boost/spirit/home/phoenix/statement/switch.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/begin.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/decay_array.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/iteration.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/end.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_equal_range.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_find.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_lower_bound.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_remove.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_remove_if.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_reverse.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_sort.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_unique.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/transformation.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/algorithm/detail/has_upper_bound.hpp>", private, "<boost/spirit/home/phoenix/stl/algorithm/querying.hpp>", public ] },
+ { include: ["<boost/spirit/home/phoenix/stl/container/detail/container.hpp>", private, "<boost/spirit/home/phoenix/stl/container/container.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/alternative_function.hpp>", private, "<boost/spirit/home/qi/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/lexer/lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/position_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/lexer/token_def.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/qi/plain_raw_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/qi/plain_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/qi/plain_tokenid.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/lex/qi/plain_tokenid_mask.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/auxiliary/attr.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/char/char_parser.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/directive/as.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/directive/matches.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/directive/raw.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/numeric/bool_policies.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/numeric/numeric_utils.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/operator/optional.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/assign_to.hpp>", private, "<boost/spirit/home/qi/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/lex/qi/plain_raw_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/lex/qi/plain_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/lex/qi/plain_tokenid.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/lex/qi/plain_tokenid_mask.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/lex/qi/state_switcher.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/action/action.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/auxiliary/attr_cast.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/auxiliary/lazy.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/directive/lexeme.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/directive/skip.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/and_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/difference.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/not_predicate.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/optional.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/permutation.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/sequence_base.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/home/qi/operator/sequential_or.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/directive/confix.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/directive/distinct.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/directive/kwd.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/directive/seek.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/attributes.hpp>", private, "<boost/spirit/repository/home/qi/operator/keywords.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/construct.hpp>", private, "<boost/spirit/home/lex/lexer/token_def.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/numeric/bool.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/enable_lit.hpp>", private, "<boost/spirit/home/qi/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/expect_function.hpp>", private, "<boost/spirit/home/qi/operator/expect.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/home/qi/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/home/qi/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/home/qi/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/home/qi/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/home/qi/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/fail_function.hpp>", private, "<boost/spirit/repository/home/qi/directive/kwd.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/parse_auto.hpp>", private, "<boost/spirit/home/qi/auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/parse_auto.hpp>", private, "<boost/spirit/include/qi_parse_auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/parse.hpp>", private, "<boost/spirit/home/qi/parse.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_container.hpp>", private, "<boost/spirit/home/qi/directive/repeat.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_container.hpp>", private, "<boost/spirit/home/qi/operator/kleene.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_container.hpp>", private, "<boost/spirit/home/qi/operator/list.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_container.hpp>", private, "<boost/spirit/home/qi/operator/plus.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_container.hpp>", private, "<boost/spirit/home/qi/operator/sequence_base.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/pass_function.hpp>", private, "<boost/spirit/home/qi/operator/sequential_or.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/permute_function.hpp>", private, "<boost/spirit/home/qi/operator/permutation.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/permute_function.hpp>", private, "<boost/spirit/repository/home/qi/operator/keywords.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/string_parse.hpp>", private, "<boost/spirit/home/qi/numeric/bool_policies.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/string_parse.hpp>", private, "<boost/spirit/home/qi/numeric/real_policies.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/string_parse.hpp>", private, "<boost/spirit/home/qi/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/string_parse.hpp>", private, "<boost/spirit/home/qi/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/unused_skipper.hpp>", private, "<boost/spirit/home/qi/directive/lexeme.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/unused_skipper.hpp>", private, "<boost/spirit/home/qi/directive/no_skip.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/unused_skipper.hpp>", private, "<boost/spirit/home/qi/directive/skip.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/unused_skipper.hpp>", private, "<boost/spirit/home/qi/skip_over.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/detail/unused_skipper.hpp>", private, "<boost/spirit/repository/home/qi/directive/distinct.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/home/qi/nonterminal/grammar.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/home/qi/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/fcall.hpp>", private, "<boost/spirit/repository/home/qi/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/parameterized.hpp>", private, "<boost/spirit/home/qi/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/parameterized.hpp>", private, "<boost/spirit/repository/home/qi/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp>", private, "<boost/spirit/home/qi/nonterminal/rule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp>", private, "<boost/spirit/repository/home/qi/nonterminal/subrule.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/numeric/detail/numeric_utils.hpp>", private, "<boost/spirit/home/qi/numeric/numeric_utils.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/numeric/detail/real_impl.hpp>", private, "<boost/spirit/home/qi/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/stream/detail/iterator_source.hpp>", private, "<boost/spirit/home/qi/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/stream/detail/match_manip_auto.hpp>", private, "<boost/spirit/home/qi/match_auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/stream/detail/match_manip.hpp>", private, "<boost/spirit/home/qi/stream/match_manip.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/stream/detail/match_manip.hpp>", private, "<boost/spirit/home/qi/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/string/detail/tst.hpp>", private, "<boost/spirit/home/qi/string/tst.hpp>", public ] },
+ { include: ["<boost/spirit/home/qi/string/detail/tst.hpp>", private, "<boost/spirit/home/qi/string/tst_map.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/as_variant.hpp>", private, "<boost/spirit/home/support/attributes.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/endian.hpp>", private, "<boost/spirit/home/karma/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/endian.hpp>", private, "<boost/spirit/home/qi/binary/binary.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/char/char_class.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/numeric/real.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/karma/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/qi/char/char_class.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/qi/char/char.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/qi/string/lit.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/get_encoding.hpp>", private, "<boost/spirit/home/qi/string/symbols.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/karma/auto/auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/qi/auto/auto.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/qi/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/hold_any.hpp>", private, "<boost/spirit/home/support/attributes.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/karma/numeric/int.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/karma/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/karma/stream/stream.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/qi/numeric/uint.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/support/char_class.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/support/lazy.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/is_spirit_tag.hpp>", private, "<boost/spirit/home/support/terminal.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/char_traits.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/char_traits.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/consts.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/consts.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/consts.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/consts.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/position_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/consts.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/debug.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/debug.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/debug.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/static_lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/generator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/generator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/generator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/position_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/generator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/generator.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/lexer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/position_token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/rules.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/token.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/size_t.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/size_t.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/state_machine.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/state_machine.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/generate_static.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/state_machine.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator_tokenizer.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/lexer/state_machine.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/static_functor_data.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/make_cons.hpp>", private, "<boost/spirit/home/support/make_component.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/make_cons.hpp>", private, "<boost/spirit/home/support/meta_compiler.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/make_vector.hpp>", private, "<boost/spirit/home/support/terminal.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/karma/delimit_flag.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/lex/lexer/pass_flags.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/lex/lexer/support_functions.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/qi/skip_flag.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/scoped_enum_emulation.hpp>", private, "<boost/spirit/home/support/multi_pass_wrapper.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/karma/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/karma/operator/sequence.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/qi/operator/alternative.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/qi/operator/permutation.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/qi/operator/sequence_base.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/home/qi/operator/sequential_or.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/detail/what_function.hpp>", private, "<boost/spirit/repository/home/qi/operator/keywords.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/buffering_input_iterator_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/buf_id_check_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/combine_policies.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/combine_policies.hpp>", private, "<boost/spirit/home/support/iterators/look_ahead.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/combine_policies.hpp>", private, "<boost/spirit/home/support/iterators/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/combine_policies.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/first_owner_policy.hpp>", private, "<boost/spirit/home/support/iterators/look_ahead.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/first_owner_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>", private, "<boost/spirit/home/support/iterators/look_ahead.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/fixed_size_queue_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>", private, "<boost/spirit/home/support/iterators/look_ahead.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/input_iterator_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/istream_policy.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/istream_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/lex_input_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/iterators/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/multi_pass.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/no_check_policy.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/no_check_policy.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/no_check_policy.hpp>", private, "<boost/spirit/home/support/iterators/look_ahead.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/no_check_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/ref_counted_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>", private, "<boost/spirit/home/lex/lexer/lexertl/iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>", private, "<boost/spirit/home/support/iterators/istream_iterator.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp>", private, "<boost/spirit/home/support/multi_pass.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/utree/detail/utree_detail1.hpp>", private, "<boost/spirit/home/support/utree/utree.hpp>", public ] },
+ { include: ["<boost/spirit/home/support/utree/detail/utree_detail2.hpp>", private, "<boost/spirit/home/support/utree.hpp>", public ] },
+ { include: ["<boost/spirit/repository/home/qi/operator/detail/keywords.hpp>", private, "<boost/spirit/repository/home/qi/operator/keywords.hpp>", public ] },
+ { include: ["<boost/statechart/detail/avoid_unused_warning.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/statechart/detail/constructor.hpp>", private, "<boost/statechart/simple_state.hpp>", public ] },
+ { include: ["<boost/statechart/detail/constructor.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/statechart/detail/counted_base.hpp>", private, "<boost/statechart/event_base.hpp>", public ] },
+ { include: ["<boost/statechart/detail/leaf_state.hpp>", private, "<boost/statechart/simple_state.hpp>", public ] },
+ { include: ["<boost/statechart/detail/leaf_state.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/statechart/detail/memory.hpp>", private, "<boost/statechart/event.hpp>", public ] },
+ { include: ["<boost/statechart/detail/memory.hpp>", private, "<boost/statechart/simple_state.hpp>", public ] },
+ { include: ["<boost/statechart/detail/node_state.hpp>", private, "<boost/statechart/simple_state.hpp>", public ] },
+ { include: ["<boost/statechart/detail/node_state.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/statechart/detail/reaction_dispatcher.hpp>", private, "<boost/statechart/in_state_reaction.hpp>", public ] },
+ { include: ["<boost/statechart/detail/reaction_dispatcher.hpp>", private, "<boost/statechart/transition.hpp>", public ] },
+ { include: ["<boost/statechart/detail/rtti_policy.hpp>", private, "<boost/statechart/event_base.hpp>", public ] },
+ { include: ["<boost/statechart/detail/rtti_policy.hpp>", private, "<boost/statechart/event.hpp>", public ] },
+ { include: ["<boost/statechart/detail/rtti_policy.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/statechart/detail/state_base.hpp>", private, "<boost/statechart/state_machine.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/debug.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/exception_safety.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/interaction_based.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/logged_expectations.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/mock_object.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/prg_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/test_observer.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/test_tools.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/unit_test_suite_impl.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/basic_cstring/bcs_char_traits.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/class_properties.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/foreach.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/lazy_ostream.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/runtime/config.hpp>", public ] },
+ { include: ["<boost/test/detail/config.hpp>", private, "<boost/test/utils/wrap_stringstream.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/debug.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/exception_safety.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/execution_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/floating_point_comparison.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/framework.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/interaction_based.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/logged_expectations.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/minimal.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/mock_object.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/output/compiler_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/output/plain_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/output_test_stream.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/output/xml_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/output/xml_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/parameterized_test.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/predicate_result.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/progress_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/results_collector.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/results_reporter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/test_observer.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/test_tools.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/unit_test_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/unit_test_log.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/unit_test_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/unit_test_suite_impl.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/algorithm.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/basic_cstring/basic_cstring.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/basic_cstring/bcs_char_traits.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/basic_cstring/compare.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/basic_cstring/io.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/callback.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/class_properties.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/custom_manip.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/fixed_mapping.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/foreach.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/iterator/ifstream_line_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/iterator/input_iterator_facade.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/iterator/istream_line_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/iterator/token_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/lazy_ostream.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/named_params.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/nullstream.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/trivial_singleton.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/wrap_stringstream.hpp>", public ] },
+ { include: ["<boost/test/detail/enable_warnings.hpp>", private, "<boost/test/utils/xml_printer.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/execution_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/framework.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/results_collector.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/results_reporter.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/test_observer.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/unit_test_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/unit_test_log.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/unit_test_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/fwd_decl.hpp>", private, "<boost/test/unit_test_suite_impl.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/execution_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/floating_point_comparison.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/framework.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/interaction_based.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/minimal.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/output/compiler_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/output/plain_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/output_test_stream.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/output/xml_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/output/xml_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/results_collector.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/results_reporter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/test_observer.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/test_tools.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/unit_test_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/unit_test_log.hpp>", public ] },
+ { include: ["<boost/test/detail/global_typedef.hpp>", private, "<boost/test/unit_test_suite_impl.hpp>", public ] },
+ { include: ["<boost/test/detail/log_level.hpp>", private, "<boost/test/unit_test_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/log_level.hpp>", private, "<boost/test/unit_test_log.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/debug.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/exception_safety.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/execution_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/floating_point_comparison.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/framework.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/interaction_based.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/logged_expectations.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/minimal.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/mock_object.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/output/compiler_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/output/plain_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/output_test_stream.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/output/xml_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/output/xml_report_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/parameterized_test.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/predicate_result.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/progress_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/results_collector.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/results_reporter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/test_observer.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/test_tools.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/unit_test_log_formatter.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/unit_test_log.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/unit_test_monitor.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/unit_test_suite_impl.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/algorithm.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/basic_cstring/basic_cstring.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/basic_cstring/bcs_char_traits.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/basic_cstring/compare.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/basic_cstring/io.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/callback.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/class_properties.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/custom_manip.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/fixed_mapping.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/foreach.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/iterator/ifstream_line_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/iterator/input_iterator_facade.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/iterator/istream_line_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/iterator/token_iterator.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/lazy_ostream.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/named_params.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/nullstream.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/trivial_singleton.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/wrap_stringstream.hpp>", public ] },
+ { include: ["<boost/test/detail/suppress_warnings.hpp>", private, "<boost/test/utils/xml_printer.hpp>", public ] },
+ { include: ["<boost/test/detail/unit_test_parameters.hpp>", private, "<boost/test/logged_expectations.hpp>", public ] },
+ { include: ["<boost/test/impl/compiler_log_formatter.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/compiler_log_formatter.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/cpp_main.ipp>", private, "<boost/test/included/prg_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/debug.ipp>", private, "<boost/test/included/prg_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/debug.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/debug.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/debug.ipp>", private, "<boost/test/minimal.hpp>", public ] },
+ { include: ["<boost/test/impl/exception_safety.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/execution_monitor.ipp>", private, "<boost/test/included/prg_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/execution_monitor.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/execution_monitor.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/execution_monitor.ipp>", private, "<boost/test/minimal.hpp>", public ] },
+ { include: ["<boost/test/impl/framework.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/framework.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/interaction_based.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/logged_expectations.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/plain_report_formatter.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/plain_report_formatter.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/progress_monitor.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/progress_monitor.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/results_collector.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/results_collector.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/results_reporter.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/results_reporter.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/test_main.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/test_tools.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/test_tools.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_log.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_log.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_main.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_main.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_monitor.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_monitor.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_parameters.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_parameters.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_suite.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/unit_test_suite.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/xml_log_formatter.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/xml_log_formatter.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/impl/xml_report_formatter.ipp>", private, "<boost/test/included/test_exec_monitor.hpp>", public ] },
+ { include: ["<boost/test/impl/xml_report_formatter.ipp>", private, "<boost/test/included/unit_test.hpp>", public ] },
+ { include: ["<boost/test/utils/runtime/cla/detail/argument_value_usage.hpp>", private, "<boost/test/utils/runtime/cla/argument_factory.hpp>", public ] },
+ { include: ["<boost/thread/detail/async_func.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/barrier.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/completion_latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/condition.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/exceptions.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/externally_locked.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/externally_locked_stream.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/future_error_code.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/is_locked_by_this_thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/lockable_traits.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/lock_algorithms.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/lock_traits.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/lock_types.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/null_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/pthread/mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/pthread/once_atomic.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/pthread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/pthread/thread_data.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/pthread/timespec.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/reverse_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/scoped_thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/shared_lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/shared_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/strict_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/sync_bounded_queue.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/synchronized_value.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/sync_queue.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/testable_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/thread_functors.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/tss.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/v2/shared_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/v2/thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/win32/interlocked_read.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/win32/thread_data.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/win32/thread_heap_alloc.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/win32/thread_primitives.hpp>", public ] },
+ { include: ["<boost/thread/detail/config.hpp>", private, "<boost/thread/xtime.hpp>", public ] },
+ { include: ["<boost/thread/detail/counter.hpp>", private, "<boost/thread/completion_latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/counter.hpp>", private, "<boost/thread/latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/barrier.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/completion_latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/externally_locked_stream.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/latch.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/lockable_adapter.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/null_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/poly_lockable.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/condition_variable_fwd.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/condition_variable.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/shared_mutex_assert.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/pthread/shared_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/reverse_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/scoped_thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/shared_lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/strict_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/thread_functors.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/thread_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/win32/mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/win32/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/delete.hpp>", private, "<boost/thread/win32/shared_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/invoke.hpp>", private, "<boost/thread/pthread/once_atomic.hpp>", public ] },
+ { include: ["<boost/thread/detail/invoke.hpp>", private, "<boost/thread/pthread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/invoke.hpp>", private, "<boost/thread/win32/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/is_convertible.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/thread/detail/lockable_wrapper.hpp>", private, "<boost/thread/lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/lockable_wrapper.hpp>", private, "<boost/thread/strict_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/memory.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/externally_locked_stream.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/future.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/lock_concepts.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/lock_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/lock_types.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/pthread/once_atomic.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/pthread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/reverse_lock.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/scoped_thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/sync_bounded_queue.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/synchronized_value.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/sync_queue.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/thread_functors.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/thread_guard.hpp>", public ] },
+ { include: ["<boost/thread/detail/move.hpp>", private, "<boost/thread/win32/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/condition_variable.hpp>", public ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/once.hpp>", public ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/recursive_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/platform.hpp>", private, "<boost/thread/thread_only.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread_group.hpp>", private, "<boost/thread/thread.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread_heap_alloc.hpp>", private, "<boost/thread/tss.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread.hpp>", private, "<boost/thread/thread_only.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread_interruption.hpp>", private, "<boost/thread/pthread/shared_mutex_assert.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread_interruption.hpp>", private, "<boost/thread/pthread/shared_mutex.hpp>", public ] },
+ { include: ["<boost/thread/detail/thread_interruption.hpp>", private, "<boost/thread/thread_only.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/array.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/cmath.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/complex.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/functional.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/memory.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/random.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/regex.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/algorithm>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/array>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/bitset>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/cmath>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/complex>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/deque>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/exception>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/fstream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/functional>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/iomanip>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/ios>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/iostream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/istream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/iterator>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/limits>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/list>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/locale>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/map>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/memory>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/new>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/numeric>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/ostream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/queue>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/random>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/regex>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/set>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/sstream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/stack>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/stdexcept>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/streambuf>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/string>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/strstream>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/tuple>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/typeinfo>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/type_traits>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/unordered_map>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/unordered_set>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/utility>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/valarray>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tr1/vector>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/tuple.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/type_traits.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/unordered_map.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/unordered_set.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config_all.hpp>", private, "<boost/tr1/utility.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/math/tools/tuple.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/array.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/cmath.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/complex.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/functional.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/memory.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/random.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/regex.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/tuple.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/type_traits.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/unordered_map.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/unordered_set.hpp>", public ] },
+ { include: ["<boost/tr1/detail/config.hpp>", private, "<boost/tr1/utility.hpp>", public ] },
+ { include: ["<boost/tr1/detail/functor2iterator.hpp>", private, "<boost/tr1/random.hpp>", public ] },
+ { include: ["<boost/tr1/detail/math_overloads.hpp>", private, "<boost/tr1/complex.hpp>", public ] },
+ { include: ["<boost/tti/detail/ddata.hpp>", private, "<boost/tti/has_data.hpp>", public ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/has_member_data.hpp>", public ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/has_member_function.hpp>", public ] },
+ { include: ["<boost/tti/detail/ddeftype.hpp>", private, "<boost/tti/has_type.hpp>", public ] },
+ { include: ["<boost/tti/detail/dfunction.hpp>", private, "<boost/tti/has_function.hpp>", public ] },
+ { include: ["<boost/tti/detail/dmem_data.hpp>", private, "<boost/tti/has_member_data.hpp>", public ] },
+ { include: ["<boost/tti/detail/dmem_fun.hpp>", private, "<boost/tti/has_member_function.hpp>", public ] },
+ { include: ["<boost/tti/detail/dmem_type.hpp>", private, "<boost/tti/member_type.hpp>", public ] },
+ { include: ["<boost/tti/detail/dnotype.hpp>", private, "<boost/tti/member_type.hpp>", public ] },
+ { include: ["<boost/tti/detail/dstatic_mem_data.hpp>", private, "<boost/tti/has_static_member_data.hpp>", public ] },
+ { include: ["<boost/tti/detail/dstatic_mem_fun.hpp>", private, "<boost/tti/has_static_member_function.hpp>", public ] },
+ { include: ["<boost/tti/detail/dtemplate.hpp>", private, "<boost/tti/has_template.hpp>", public ] },
+ { include: ["<boost/tti/detail/dtemplate_params.hpp>", private, "<boost/tti/has_template.hpp>", public ] },
+ { include: ["<boost/tti/detail/dtype.hpp>", private, "<boost/tti/has_type.hpp>", public ] },
+ { include: ["<boost/tti/detail/dvm_template_params.hpp>", private, "<boost/tti/has_template.hpp>", public ] },
+ { include: ["<boost/tuple/detail/tuple_basic.hpp>", private, "<boost/tuple/tuple.hpp>", public ] },
+ { include: ["<boost/tuple/detail/tuple_basic_no_partial_spec.hpp>", private, "<boost/tuple/tuple.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/any_cast.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/binding_of.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/call.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/check_match.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/is_empty.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/param.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/access.hpp>", private, "<boost/type_erasure/typeid_of.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/adapt_to_vtable.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/adapt_to_vtable.hpp>", private, "<boost/type_erasure/call.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/any_base.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/check_call.hpp>", private, "<boost/type_erasure/call.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/check_map.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/const.hpp>", private, "<boost/type_erasure/free.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/const.hpp>", private, "<boost/type_erasure/member.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/const.hpp>", private, "<boost/type_erasure/operators.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/construct.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/extract_concept.hpp>", private, "<boost/type_erasure/call.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/extract_concept.hpp>", private, "<boost/type_erasure/check_match.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/extract_concept.hpp>", private, "<boost/type_erasure/require_match.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/get_placeholders.hpp>", private, "<boost/type_erasure/deduced.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/get_signature.hpp>", private, "<boost/type_erasure/call.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/instantiate.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/instantiate.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/macro.hpp>", private, "<boost/type_erasure/free.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/macro.hpp>", private, "<boost/type_erasure/member.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/normalize.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/normalize.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/normalize.hpp>", private, "<boost/type_erasure/is_subconcept.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/null.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/rebind_placeholders.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/rebind_placeholders.hpp>", private, "<boost/type_erasure/is_subconcept.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/any.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/builtin.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/constructible.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/storage.hpp>", private, "<boost/type_erasure/param.hpp>", public ] },
+ { include: ["<boost/type_erasure/detail/vtable.hpp>", private, "<boost/type_erasure/binding.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/aligned_storage.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/iterator/is_readable_iterator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/math/tools/traits.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/mpl/empty_base.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_new_operator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_nothrow_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_nothrow_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_nothrow_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_nothrow_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_move_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_trivial_move_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/has_virtual_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_abstract.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_arithmetic.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_array.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_base_and_derived.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_base_of_tr1.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_class.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_complex.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_compound.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_convertible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_copy_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_empty.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_enum.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_float.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_floating_point.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_fundamental.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_integral.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_nothrow_move_assignable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_nothrow_move_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_object.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_pod.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_polymorphic.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_rvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_same.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_scalar.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_stateless.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_union.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_virtual_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_void.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/is_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/type_traits/type_with_alignment.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/variant/recursive_wrapper_fwd.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_def.hpp>", private, "<boost/variant/static_visitor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/aligned_storage.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/iterator/is_lvalue_iterator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/mpl/empty_base.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_new_operator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_nothrow_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_nothrow_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_nothrow_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_nothrow_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_move_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_trivial_move_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/has_virtual_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_abstract.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_arithmetic.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_array.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_base_and_derived.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_base_of_tr1.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_class.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_complex.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_compound.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_convertible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_copy_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_empty.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_enum.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_float.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_floating_point.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_fundamental.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_integral.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_nothrow_move_assignable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_nothrow_move_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_object.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_pod.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_polymorphic.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_rvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_same.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_scalar.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_stateless.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_union.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_virtual_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_void.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/is_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/type_traits/type_with_alignment.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/variant/recursive_wrapper_fwd.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/bool_trait_undef.hpp>", private, "<boost/variant/static_visitor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/common_type_imp.hpp>", private, "<boost/type_traits/common_type.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/cv_traits_impl.hpp>", private, "<boost/type_traits/is_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/cv_traits_impl.hpp>", private, "<boost/type_traits/is_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/cv_traits_impl.hpp>", private, "<boost/type_traits/remove_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/cv_traits_impl.hpp>", private, "<boost/type_traits/remove_cv.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/cv_traits_impl.hpp>", private, "<boost/type_traits/remove_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/false_result.hpp>", private, "<boost/type_traits/is_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_and_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_and.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_or_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_or.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_xor_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_bit_xor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_divides_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_divides.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_equal_to.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_greater_equal.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_greater.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_left_shift_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_left_shift.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_less_equal.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_less.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_logical_and.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_logical_or.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_minus_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_minus.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_modulus_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_modulus.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_multiplies_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_multiplies.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_not_equal_to.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_plus_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_plus.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_right_shift_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_binary_operator.hpp>", private, "<boost/type_traits/has_right_shift.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_postfix_operator.hpp>", private, "<boost/type_traits/has_post_decrement.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_postfix_operator.hpp>", private, "<boost/type_traits/has_post_increment.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_complement.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_dereference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_logical_not.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_negate.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_pre_decrement.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_pre_increment.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_unary_minus.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/has_prefix_operator.hpp>", private, "<boost/type_traits/has_unary_plus.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/has_trivial_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/has_trivial_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/has_trivial_move_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/has_trivial_move_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/ice.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_abstract.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_base_and_derived.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_class.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_empty.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_nothrow_move_assignable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_nothrow_move_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_object.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_same.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/is_stateless.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/make_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/type_traits/make_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_and.hpp>", private, "<boost/units/scaled_base_unit.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_eq.hpp>", private, "<boost/type_traits/ice.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/has_trivial_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/has_trivial_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/has_trivial_move_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/has_trivial_move_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/ice.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_class.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_compound.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_empty.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_nothrow_move_assignable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_object.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/make_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_not.hpp>", private, "<boost/type_traits/make_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/has_new_operator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/has_trivial_assign.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/has_trivial_constructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/has_trivial_copy.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/has_trivial_destructor.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/ice.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_arithmetic.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_base_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_base_of_tr1.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_empty.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_fundamental.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_nothrow_move_assignable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_nothrow_move_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_pod.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_scalar.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/is_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/make_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/type_traits/make_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/ice_or.hpp>", private, "<boost/units/scaled_base_unit.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_function_ptr_helper.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_function_ptr_tester.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_function_ptr_tester.hpp>", private, "<boost/type_traits/is_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_mem_fun_pointer_impl.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_def.hpp>", private, "<boost/type_traits/alignment_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_def.hpp>", private, "<boost/type_traits/extent.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_def.hpp>", private, "<boost/type_traits/rank.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_undef.hpp>", private, "<boost/type_traits/alignment_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_undef.hpp>", private, "<boost/type_traits/extent.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/size_t_trait_undef.hpp>", private, "<boost/type_traits/rank.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/components.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/function_arity.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/function_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_callable_builtin.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_function_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/is_nonmember_callable_builtin.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/member_object_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/parameter_types.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/template_arity_spec.hpp>", private, "<boost/function_types/result_type.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_cv.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_rvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/add_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/floating_point_promotion.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/integral_promotion.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/make_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/make_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/promote.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_all_extents.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_bounds.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_cv.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_extent.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_def.hpp>", private, "<boost/type_traits/remove_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_cv.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_rvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/add_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/broken_compiler_spec.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/floating_point_promotion.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/integral_promotion.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/make_signed.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/make_unsigned.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/promote.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_all_extents.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_bounds.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_cv.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_extent.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/type_trait_undef.hpp>", private, "<boost/type_traits/remove_volatile.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/wrap.hpp>", private, "<boost/type_traits/is_array.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/wrap.hpp>", private, "<boost/type_traits/is_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/assign/list_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/assign/ptr_list_of.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/ptr_container/nullable.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/has_new_operator.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/ice.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_abstract.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_array.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_class.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_const.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_convertible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_copy_constructible.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_function.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_lvalue_reference.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_member_function_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_member_pointer.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_same.hpp>", public ] },
+ { include: ["<boost/type_traits/detail/yes_no_type.hpp>", private, "<boost/type_traits/is_volatile.hpp>", public ] },
+ { include: ["<boost/units/detail/absolute_impl.hpp>", private, "<boost/units/absolute.hpp>", public ] },
+ { include: ["<boost/units/detail/cmath_impl.hpp>", private, "<boost/units/cmath.hpp>", public ] },
+ { include: ["<boost/units/detail/conversion_impl.hpp>", private, "<boost/units/conversion.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_impl.hpp>", private, "<boost/units/dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/dimensionless_unit.hpp>", private, "<boost/units/cmath.hpp>", public ] },
+ { include: ["<boost/units/detail/dimensionless_unit.hpp>", private, "<boost/units/lambda.hpp>", public ] },
+ { include: ["<boost/units/detail/dimensionless_unit.hpp>", private, "<boost/units/quantity.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/base_dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/base_unit.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/derived_dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/dimension_list.hpp>", private, "<boost/units/make_system.hpp>", public ] },
+ { include: ["<boost/units/detail/dim_impl.hpp>", private, "<boost/units/dim.hpp>", public ] },
+ { include: ["<boost/units/detail/linear_algebra.hpp>", private, "<boost/units/heterogeneous_system.hpp>", public ] },
+ { include: ["<boost/units/detail/linear_algebra.hpp>", private, "<boost/units/homogeneous_system.hpp>", public ] },
+ { include: ["<boost/units/detail/one.hpp>", private, "<boost/units/scale.hpp>", public ] },
+ { include: ["<boost/units/detail/ordinal.hpp>", private, "<boost/units/base_dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/ordinal.hpp>", private, "<boost/units/base_unit.hpp>", public ] },
+ { include: ["<boost/units/detail/prevent_redefinition.hpp>", private, "<boost/units/base_dimension.hpp>", public ] },
+ { include: ["<boost/units/detail/prevent_redefinition.hpp>", private, "<boost/units/base_unit.hpp>", public ] },
+ { include: ["<boost/units/detail/push_front_if.hpp>", private, "<boost/units/heterogeneous_system.hpp>", public ] },
+ { include: ["<boost/units/detail/push_front_or_add.hpp>", private, "<boost/units/heterogeneous_system.hpp>", public ] },
+ { include: ["<boost/units/detail/sort.hpp>", private, "<boost/units/make_system.hpp>", public ] },
+ { include: ["<boost/units/detail/static_rational_power.hpp>", private, "<boost/units/pow.hpp>", public ] },
+ { include: ["<boost/units/detail/static_rational_power.hpp>", private, "<boost/units/scale.hpp>", public ] },
+ { include: ["<boost/units/detail/unscale.hpp>", private, "<boost/units/heterogeneous_system.hpp>", public ] },
+ { include: ["<boost/units/detail/utility.hpp>", private, "<boost/units/io.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/alpha_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/deuteron_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/electromagnetic_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/electron_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/helion_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/muon_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/neutron_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/physico-chemical_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/proton_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/tau_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/triton_constants.hpp>", public ] },
+ { include: ["<boost/units/systems/detail/constants.hpp>", private, "<boost/units/systems/si/codata/universal_constants.hpp>", public ] },
+ { include: ["<boost/unordered/detail/equivalent.hpp>", private, "<boost/unordered/unordered_map.hpp>", public ] },
+ { include: ["<boost/unordered/detail/equivalent.hpp>", private, "<boost/unordered/unordered_set.hpp>", public ] },
+ { include: ["<boost/unordered/detail/fwd.hpp>", private, "<boost/unordered/unordered_map_fwd.hpp>", public ] },
+ { include: ["<boost/unordered/detail/fwd.hpp>", private, "<boost/unordered/unordered_set_fwd.hpp>", public ] },
+ { include: ["<boost/unordered/detail/unique.hpp>", private, "<boost/unordered/unordered_map.hpp>", public ] },
+ { include: ["<boost/unordered/detail/unique.hpp>", private, "<boost/unordered/unordered_set.hpp>", public ] },
+ { include: ["<boost/unordered/detail/util.hpp>", private, "<boost/unordered/unordered_map.hpp>", public ] },
+ { include: ["<boost/unordered/detail/util.hpp>", private, "<boost/unordered/unordered_set.hpp>", public ] },
+ { include: ["<boost/utility/detail/in_place_factory_prefix.hpp>", private, "<boost/utility/in_place_factory.hpp>", public ] },
+ { include: ["<boost/utility/detail/in_place_factory_prefix.hpp>", private, "<boost/utility/typed_in_place_factory.hpp>", public ] },
+ { include: ["<boost/utility/detail/in_place_factory_suffix.hpp>", private, "<boost/utility/in_place_factory.hpp>", public ] },
+ { include: ["<boost/utility/detail/in_place_factory_suffix.hpp>", private, "<boost/utility/typed_in_place_factory.hpp>", public ] },
+ { include: ["<boost/variant/detail/apply_visitor_binary.hpp>", private, "<boost/variant/apply_visitor.hpp>", public ] },
+ { include: ["<boost/variant/detail/apply_visitor_delayed.hpp>", private, "<boost/variant/apply_visitor.hpp>", public ] },
+ { include: ["<boost/variant/detail/apply_visitor_unary.hpp>", private, "<boost/variant/apply_visitor.hpp>", public ] },
+ { include: ["<boost/variant/detail/backup_holder.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/config.hpp>", private, "<boost/variant/variant_fwd.hpp>", public ] },
+ { include: ["<boost/variant/detail/config.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/enable_recursive_fwd.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/enable_recursive.hpp>", private, "<boost/variant/recursive_variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/forced_return.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/generic_result_type.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/hash_variant.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/initializer.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/make_variant_list.hpp>", private, "<boost/variant/recursive_variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/make_variant_list.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/move.hpp>", private, "<boost/variant/recursive_wrapper.hpp>", public ] },
+ { include: ["<boost/variant/detail/move.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/over_sequence.hpp>", private, "<boost/variant/recursive_variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/over_sequence.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/substitute_fwd.hpp>", private, "<boost/variant/recursive_variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/substitute_fwd.hpp>", private, "<boost/variant/variant_fwd.hpp>", public ] },
+ { include: ["<boost/variant/detail/variant_io.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/variant/detail/visitation_impl.hpp>", private, "<boost/variant/variant.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/access.hpp>", private, "<boost/xpressive/regex_iterator.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/icase.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/linker.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matcher/action_matcher.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matcher/attr_begin_matcher.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matcher/attr_end_matcher.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matcher/attr_matcher.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matcher/predicate_matcher.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/matchers.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/optimize.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/regex_domain.hpp>", private, "<boost/xpressive/basic_regex.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/regex_domain.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/basic_regex.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/regex_impl.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/results_cache.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/state.hpp>", private, "<boost/xpressive/regex_algorithms.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/core/sub_match_vector.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/basic_regex.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/regex_algorithms.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/regex_iterator.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/sub_match.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/traits/cpp_regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/traits/null_regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/detail_fwd.hpp>", private, "<boost/xpressive/xpressive_typeof.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/dynamic/parse_charset.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/dynamic/parser_enum.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/dynamic/parser.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/dynamic/parser_traits.hpp>", private, "<boost/xpressive/regex_compiler.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/static/compile.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/static/grammar.hpp>", private, "<boost/xpressive/basic_regex.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/static/modifier.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/static/type_traits.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/algorithm.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/counted_base.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/counted_base.hpp>", private, "<boost/xpressive/regex_iterator.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/regex_actions.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/regex_primitives.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/ignore_unused.hpp>", private, "<boost/xpressive/traits/null_regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/literals.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/literals.hpp>", private, "<boost/xpressive/traits/cpp_regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/never_true.hpp>", private, "<boost/xpressive/traits/null_regex_traits.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/save_restore.hpp>", private, "<boost/xpressive/regex_algorithms.hpp>", public ] },
+ { include: ["<boost/xpressive/detail/utility/sequence_stack.hpp>", private, "<boost/xpressive/match_results.hpp>", public ] },
+ { include: ["<boost/xpressive/traits/detail/c_ctype.hpp>", private, "<boost/xpressive/traits/c_regex_traits.hpp>", public ] }
+]
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 01275a0..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,125 +0,0 @@
-iwyu (5.0-1) unstable; urgency=medium
-
- * New upstream release
- * Switch to llvm/clang 5
- * Add clang-7 as part of the options
- * Standards-Version updated to 4.1.3
-
- -- Sylvestre Ledru <sylvestre@debian.org> Wed, 07 Feb 2018 20:56:47 +0100
-
-iwyu (4.0-2) unstable; urgency=medium
-
- * Cleanup the list of dependencies to add clang and remove
- old clang versionc
- * Standards-Version updated to 4.1.1
- * fix priority-extra-is-replaced-by-priority-optional
-
- -- Sylvestre Ledru <sylvestre@debian.org> Tue, 21 Nov 2017 12:03:26 +0100
-
-iwyu (4.0-1) unstable; urgency=medium
-
- * New upstream release
- * Standards-Version updated to 4.0.0
- * bump llvm deps to 4.0
-
- -- Sylvestre Ledru <sylvestre@debian.org> Thu, 03 Aug 2017 11:10:20 +0200
-
-iwyu (3.9-2) unstable; urgency=medium
-
- * Rebuild to manage clang 3.9.1 (Closes: #849402)
- yes, this needs to be properly fixed and managed at runtime
- * Remove usr/bin/fix_includes.py to fix script-with-language-extension
- (was already shipped under fix_includes anyway)
- * Rename usr/bin/iwyu_tool.py to usr/bin/iwyu_tool
-
- -- Sylvestre Ledru <sylvestre@debian.org> Mon, 26 Dec 2016 18:49:23 +0100
-
-iwyu (3.9-1) unstable; urgency=medium
-
- * New upstream release
- (Closes: #828734)
- * Fix FTBFS on mips64el (Closes: #775435)
- Thanks to James Cowgill
-
- -- Sylvestre Ledru <sylvestre@debian.org> Thu, 10 Nov 2016 12:49:29 +0100
-
-iwyu (3.8-1) unstable; urgency=medium
-
- * New upstream release
- * Switch to clang 3.8
- * Standards-Version to 3.9.8
-
- -- Sylvestre Ledru <sylvestre@debian.org> Sat, 25 Jun 2016 20:16:19 +0200
-
-iwyu (3.7-1) unstable; urgency=medium
-
- * New upstream release
- * Remove old dep from the list (clang-3.3 | clang-3.4)
-
- -- Sylvestre Ledru <sylvestre@debian.org> Sat, 26 Dec 2015 23:56:01 +0100
-
-iwyu (3.6-2) unstable; urgency=medium
-
- * Fix the FTBFS under kfreebsd
- Thanks to Steven Chamberlain for the patch
- (Closes: #794563)
-
- -- Sylvestre Ledru <sylvestre@debian.org> Tue, 08 Sep 2015 08:48:51 +0200
-
-iwyu (3.6-1) unstable; urgency=low
-
- * Team upload (Sylvestre prepared the upload)
- * New upstream release (Closes: #795499)
-
- -- Michael Vogt <mvo@debian.org> Fri, 14 Aug 2015 20:00:47 +0200
-
-ciwyu (3.5-1) unstable; urgency=medium
-
- * Upload to unstable
-
- -- Sylvestre Ledru <sylvestre@debian.org> Tue, 16 Jun 2015 11:14:00 +0200
-
-iwyu (3.5-1~exp1) experimental; urgency=medium
-
- * New upstream release
- * Switch to llvm/clang 3.5
- * Standards-Version updated to 3.9.6
-
- -- Sylvestre Ledru <sylvestre@debian.org> Tue, 30 Dec 2014 14:32:11 +0100
-
-iwyu (3.4-1) unstable; urgency=medium
-
- * New upstream release
- * Add libncurses5-dev as a build deps
- * Add a watch file
-
- -- Sylvestre Ledru <sylvestre@debian.org> Tue, 06 May 2014 17:11:05 +0200
-
-iwyu (3.3-4) unstable; urgency=medium
-
- * Make iwyu co-installable with clang 3.5 (Closes: #734900)
- * Standards-Version updated to 3.9.5
- * Switch the default clang to 3.4
-
- -- Sylvestre Ledru <sylvestre@debian.org> Wed, 15 Jan 2014 10:14:58 +0100
-
-iwyu (3.3-3) unstable; urgency=low
-
- * Remove the trailing debian/ from debian/control
- * Also ship fix_include in iwyu. It applies the changes (Closes: #728590)
- * Fix the clean of the package
- * Remove the "SEE ALSO" section from the manpage (Closes: #722225)
-
- -- Sylvestre Ledru <sylvestre@debian.org> Mon, 04 Nov 2013 09:02:17 +0100
-
-iwyu (3.3-2) unstable; urgency=low
-
- * clang is a mandatory dependency (Closes: #722132)
-
- -- Sylvestre Ledru <sylvestre@debian.org> Sun, 08 Sep 2013 12:33:59 +0200
-
-iwyu (3.3-1) unstable; urgency=low
-
- * Initial release (Closes: #721267)
-
- -- Sylvestre Ledru <sylvestre@debian.org> Thu, 29 Aug 2013 17:16:23 +0200
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index f599e28..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 3798798..0000000
--- a/debian/control
+++ /dev/null
@@ -1,28 +0,0 @@
-Source: iwyu
-Section: devel
-Priority: optional
-Maintainer: LLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
-Uploaders: Sylvestre Ledru <sylvestre@debian.org>
-Build-Depends: debhelper (>= 10.0.0), cmake, libclang-5.0-dev, llvm-5.0-dev,
- help2man, libncurses5-dev, zlib1g-dev
-Standards-Version: 4.1.3
-Homepage: http://include-what-you-use.org/
-Vcs-Svn: svn://svn.debian.org/svn/pkg-llvm/iwyu/trunk/
-Vcs-Browser: http://svn.debian.org/viewsvn/pkg-llvm/iwyu/trunk/
-
-Package: iwyu
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, clang | clang-4.0 | clang-5.0 | clang-6.0 | clang-7,
- python
-Description: Analyze #includes in C and C++ source files
- "Include what you use" means this: for every symbol (type, function variable,
- or macro) that you use in foo.cc, either foo.cc or foo.h should #include a .h
- file that exports the declaration of that symbol. The include-what-you-use
- tool is a program that can be built with the clang libraries in order to
- analyze #includes of source files to find include-what-you-use violations,
- and suggest fixes for them.
- .
- The main goal of include-what-you-use is to remove superfluous #includes.
- It does this both by figuring out what #includes are not actually needed for
- this file (for both .cc and .h files), and replacing #includes with
- forward-declares when possible.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 28e0bf0..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,35 +0,0 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: iwyu (include what you use)
-Upstream-Contact: https://groups.google.com/forum/#!forum/include-what-you-use
-Source: https://github.com/include-what-you-use/include-what-you-use
-
-Files: *
-Copyright: Google and others 2010 - 2013
-License: University of Illinois/NCSA Open Source License
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal with
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
- .
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
- .
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
- .
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
- .
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
- SOFTWARE.
-
diff --git a/debian/docs b/debian/docs
deleted file mode 100644
index b43bf86..0000000
--- a/debian/docs
+++ /dev/null
@@ -1 +0,0 @@
-README.md
diff --git a/debian/fix_include.1 b/debian/fix_include.1
deleted file mode 100644
index 4753880..0000000
--- a/debian/fix_include.1
+++ /dev/null
@@ -1,102 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.43.2.
-.TH FIX_INCLUDE "1" "November 2013" "fix_include 3.3" "User Commands"
-.SH NAME
-fix_include \- Update the source code with iwyu output
-.SH SYNOPSIS
-.B fix_include
-[\fIoptions\fR] [\fIfilename\fR] ... \fI< <output from include-what-you-use script>\fR
-OR
-.B fix_include
-\fB\-s\fR [other options] <filename> ...
-.SH DESCRIPTION
-.PP
-fix_include reads the output from the include\-what\-you\-use
-script on stdin \fB\-\-\fR run with \fB\-\-v\fR=\fI1\fR (default) verbose or above \fB\-\-\fR and,
-unless \fB\-\-sort_only\fR or \fB\-\-dry_run\fR is specified,
-modifies the files mentioned in the output, removing their old
-#include lines and replacing them with the lines given by the
-include_what_you_use script. It also sorts the #include and
-forward\-declare lines.
-.PP
-Only writable files (those opened for p4 edit) are modified (unless
-\fB\-\-checkout_command\fR is specified). All files mentioned in the
-include\-what\-you\-use script are modified, unless filenames are
-specified on the commandline, in which case only those files are
-modified.
-.PP
-The exit code is the number of files that were modified (or that would
-be modified if \fB\-\-dry_run\fR was specified) unless that number exceeds 100,
-in which case 100 is returned.
-.SH OPTIONS
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-b\fR, \fB\-\-blank_lines\fR
-Put a blank line between primary header file and C/C++
-system #includes, and another blank line between
-system #includes and google #includes [default]
-.HP
-\fB\-\-noblank_lines\fR
-.TP
-\fB\-\-comments\fR
-Put comments after the #include lines
-.HP
-\fB\-\-nocomments\fR
-.TP
-\fB\-\-safe_headers\fR
-Do not remove unused #includes/fwd\-declares from
-header files; just add new ones [default]
-.HP
-\fB\-\-nosafe_headers\fR
-.TP
-\fB\-s\fR, \fB\-\-sort_only\fR
-Just sort #includes of files listed on cmdline; do not
-add or remove any #includes
-.TP
-\fB\-n\fR, \fB\-\-dry_run\fR
-Do not actually edit any files; just print diffs.
-Return code is 0 if no changes are needed, else
-min(the number of files that would be modified, 100)
-.TP
-\fB\-\-ignore_re\fR=\fIIGNORE_RE\fR
-fix_includes.py will skip editing any file whose name
-matches this regular expression.
-.TP
-\fB\-\-checkout_command\fR=\fICHECKOUT_COMMAND\fR
-A command, such as "p4 edit", to run on all the nonwriteable files before modifying them. The filenames
-will be appended to the command after a space. The
-command will not be run on any file that does not need
-to change.
-.TP
-\fB\-\-create_cl_if_possible\fR
-If \fB\-\-checkout_command\fR is "p4|g4|v4 edit" and all files
-to be modified needed to be checked out, then create a
-CL containing those files.
-.HP
-\fB\-\-nocreate_cl_if_possible\fR
-.TP
-\fB\-\-append_to_cl\fR=\fIAPPEND_TO_CL\fR
-If provided, with a checkout_command, add files that
-need fixing to the specified existing CL.
-.TP
-\fB\-\-separate_project_includes\fR=\fISEPARATE_PROJECT_INCLUDES\fR
-Sort #includes for current project separately from all
-other #includes. This flag specifies the root
-directory of the current project. If the value is
-"<tld>", #includes that share the same top\-level
-directory are assumed to be in the same project. If
-not specified, project #includes will be sorted with
-other non\-system #includes.
-.TP
-\fB\-\-invoking_command_line\fR=\fIINVOKING_COMMAND_LINE\fR
-Internal flag used by iwyu.py, It should be the
-command line used to invoke iwyu.py
-.TP
-\fB\-m\fR, \fB\-\-keep_iwyu_namespace_format\fR
-Keep forward\-declaration namespaces in IWYU format,
-eg. namespace n1 { namespace n2 { class c1; } }. Do
-not convert to "normalized" Google format: namespace
-n1 {\ennamespace n2 {\en class c1;\en}\en}.
-.HP
-\fB\-\-nokeep_iwyu_namespace_format\fR
diff --git a/debian/iwyu.install b/debian/iwyu.install
deleted file mode 100644
index f98d13f..0000000
--- a/debian/iwyu.install
+++ /dev/null
@@ -1 +0,0 @@
-iwyu-build/fix_include usr/bin
diff --git a/debian/iwyu.links b/debian/iwyu.links
deleted file mode 100644
index 207e821..0000000
--- a/debian/iwyu.links
+++ /dev/null
@@ -1,2 +0,0 @@
-/usr/bin/include-what-you-use usr/bin/iwyu
-
diff --git a/debian/iwyu.manpages b/debian/iwyu.manpages
deleted file mode 100644
index 085d5d6..0000000
--- a/debian/iwyu.manpages
+++ /dev/null
@@ -1,4 +0,0 @@
-iwyu-build/include-what-you-use.1
-iwyu-build/iwyu.1
-debian/fix_include.1
-
diff --git a/debian/patches/series b/debian/patches/series
deleted file mode 100644
index e69de29..0000000
--- a/debian/patches/series
+++ /dev/null
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 49143ac..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-TARGET_BUILD=iwyu-build
-VERSION=$(shell dpkg-parsechangelog |grep "^Version:"|sed -e "s|Version: \(.*\)|\1|")
-DEB_BUILD_ARCH?=$(shell dpkg-architecture -qDEB_BUILD_ARCH)
-ADDITIONAL_CXX_FLAGS=""
-
-ifneq (,$(filter $(DEB_BUILD_ARCH),mips64el))
- ADDITIONAL_CXX_FLAGS += -mxgot
-endif
-
-%:
- dh $@ --buildsystem=cmake --builddirectory=$(TARGET_BUILD)
-
-override_dh_auto_configure:
- dh_auto_configure -- -DCMAKE_CXX_FLAGS="$(ADDITIONAL_CXX_FLAGS)" -DLLVM_PATH=/usr/lib/llvm-5.0/
-
-
-override_dh_auto_build:
- dh_auto_build
- help2man --no-info --version-string "$(VERSION)" -n "Analyze #includes in C and C++ source files" $(TARGET_BUILD)/include-what-you-use > $(TARGET_BUILD)/include-what-you-use.1
- cd $(TARGET_BUILD) && ln -s include-what-you-use.1 iwyu.1 && \
- cp ../fix_includes.py fix_include
-
-override_dh_auto_install:
- dh_auto_install
- cd debian/iwyu/usr/bin; \
- rm -f fix_includes.py; \
- mv iwyu_tool.py iwyu_tool
-
-
-override_dh_auto_clean:
- rm -rf $(TARGET_BUILD)
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index 5a4f528..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-version=3
-https://github.com/include-what-you-use/include-what-you-use/tags .*/clang_(.*)\.tar\.gz
diff --git a/dist.sh b/dist.sh
new file mode 100755
index 0000000..c4a0e1d
--- /dev/null
+++ b/dist.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+##===--------- dist.sh - package up binary distribution of IWYU -----------===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+set -eu
+
+# Create clean dist directory
+rm -rf dist
+mkdir dist
+
+# Assume that Release+Asserts build exists.
+ln -f ../../../../../build/Release+Asserts/bin/include-what-you-use dist/
+ln -f fix_includes.py dist/
+ln -f README.txt dist/
+ln -f LICENSE.TXT dist/
+
+pushd dist > /dev/null
+
+# Build archive name to the following pattern:
+# include-what-you-use-<ver>-<arch>-<distro>-<release>.tar.gz
+ARCHIVE=include-what-you-use-3.3-$(uname -m)-$(lsb_release -si)-$(lsb_release -sr).tar.gz
+tar -cvzf $ARCHIVE *
+
+popd > /dev/null
+
diff --git a/docs/IWYUMappings.md b/docs/IWYUMappings.md
new file mode 100644
index 0000000..9fbff07
--- /dev/null
+++ b/docs/IWYUMappings.md
@@ -0,0 +1,116 @@
+## IWYU Mappings ##
+
+One of the difficult problems for IWYU is distinguishing between which header contains a symbol definition and which header is the actual documented header to include for that symbol.
+
+For example, in GCC's libstdc++, `std::unique_ptr<T>` is defined in `<bits/unique_ptr.h>`, but the documented way to get it is to `#include <memory>`.
+
+Another example is `NULL`. Its authoritative header is `<cstddef>`, but for practical purposes `NULL` is more of a keyword, and according to the standard it's acceptable to assume it comes with `<cstring>`, `<clocale>`, `<cwchar>`, `<ctime>`, `<cstdio>` or `<cstdlib>`. In fact, almost every standard library header pulls in `NULL` one way or another, and we probably shouldn't force people to `#include <cstddef>`.
+
+To simplify IWYU deployment and command-line interface, many of these mappings are compiled into the executable. These constitute the *default mappings*.
+
+However, many mappings are toolchain- and version-dependent. Symbol homes and `#include` dependencies change between releases of GCC and are dramatically different for the standard libraries shipped with Microsoft Visual C++. Also, mappings such as these are usually necessary for third-party libraries (e.g. Boost, Qt) or even project-local symbols and headers as well.
+
+Any mappings outside of the default set can therefore be specified as external *mapping files*.
+
+
+### Default Mappings ###
+
+IWYU's default mappings are hard-coded in `iwyu_include_picker.cc`, and are very GCC-centric. There are both symbol- and include mappings for GNU libstdc++ and libc.
+
+
+### Mapping Files ###
+
+The mapping files conventionally use the `.imp` file extension, for "Iwyu MaPping" (terrible, I know). They use a [JSON](http://json.org/) meta-format with the following general form:
+
+ [
+ { <directive>: <data> },
+ { <directive>: <data> }
+ ]
+
+Directives can be one of the literal strings:
+
+ * `include`
+ * `symbol`
+ * `ref`
+
+and data varies between the directives, see below.
+
+Note that you can mix directives of different kinds within the same mapping file.
+
+IWYU uses LLVM's YAML/JSON parser to interpret the mapping files, and it has some idiosyncrasies:
+
+ * Comments use a Python-style `#` prefix, not Javascript's `//`
+ * Single-word strings can be left un-quoted
+
+If the YAML parser is ever made more rigorous, it might be wise not to lean on non-standard behavior, so apart from comment style, try to keep mapping files in line with the JSON spec.
+
+
+#### Include Mappings ####
+
+The `include` directive specifies a mapping between two include names (relative path, including quotes or angle brackets.)
+
+This is typically used to map from a private implementation detail header to a public facade header, such as our `<bits/unique_ptr.h>` to `<memory>` example above.
+
+Data for this directive is a list of four strings containing:
+
+ * The include name to map from
+ * The visibility of the include name to map from
+ * The include name to map to
+ * The visibility of the include name to map to
+
+For example;
+
+ { include: ["<bits/unique_ptr.h>", "private", "<memory>", "public"] }
+
+Most of the original mappings were generated with shell scripts (as evident from the embedded comments) so there are several multi-step mappings from one private header to another, to a third and finally to a public header. This reflects the `#include` chain in the actual library headers. A hand-written mapping could be reduced to one mapping per private header to its corresponding public header.
+
+Include mappings support a special wildcard syntax for the first entry:
+
+ { include: ["@<internal/.*>", "private", "<public>", "public"] }
+
+The `@` prefix is a signal that the remaining content is a regex, and can be used to re-map a whole subdirectory of private headers to a public facade header.
+
+
+#### Symbol Mappings ####
+
+The `symbol` directive maps from a qualified symbol name to its authoritative header.
+
+Data for this directive is a list of four strings containing:
+
+ * The symbol name to map from
+ * The visibility of the symbol
+ * The include name to map to
+ * The visibility of the include name to map to
+
+For example;
+
+ { symbol: ["NULL", "private", "<cstddef>", "public"] }
+
+The symbol visibility is largely redundant -- it must always be `private`. It isn't entirely clear why symbol visibility needs to be specified, and it might be removed moving forward.
+
+Unlike `include`, `symbol` directives do not support the `@`-prefixed regex syntax in the first entry. Track the [following bug](https://github.com/include-what-you-use/include-what-you-use/issues/233) for updates.
+
+
+#### Mapping Refs ####
+
+The last kind of directive, `ref`, is used to pull in another mapping file, much like the C preprocessor's `#include` directive. Data for this directive is a single string: the filename to include.
+
+For example;
+
+ { ref: "more.symbols.imp" },
+ { ref: "/usr/lib/other.includes.imp" }
+
+The rationale for the `ref` directive was to make it easier to compose project-specific mappings from a set of library-oriented mapping files. For example, IWYU might ship with mapping files for [Boost](http://www.boost.org), the SCL, various C standard libraries, the Windows API, the [Poco Library](http://pocoproject.org), etc. Depending on what your specific project uses, you could easily create an aggregate mapping file with refs to the relevant mappings.
+
+
+#### Specifying Mapping Files ####
+
+Mapping files are specified on the command-line using the `--mapping_file` switch:
+
+ $ include-what-you-use -Xiwyu --mapping_file=foo.imp some_file.cc
+
+The switch can be added multiple times to add more than one mapping file.
+
+If the mapping filename is relative, it will be looked up relative to the current directory.
+
+`ref` directives are first looked up relative to the current directory and if not found, relative to the referring mapping file.
diff --git a/docs/IWYUPragmas.md b/docs/IWYUPragmas.md
new file mode 100644
index 0000000..fba0ff6
--- /dev/null
+++ b/docs/IWYUPragmas.md
@@ -0,0 +1,195 @@
+## IWYU pragmas ##
+
+IWYU pragmas are used to give IWYU information that isn't obvious from the source code, such as how different files relate to each other and which includes to never remove or include.
+
+All pragmas start with `// IWYU pragma: ` or `/* IWYU pragma: `. They are case-sensitive and spaces are significant.
+
+
+### IWYU pragma: keep ###
+
+This pragma applies to a single `#include` directive or forward declaration. It forces IWYU to keep an inclusion even if it is deemed unnecessary.
+
+ main.cc:
+ #include <vector> // IWYU pragma: keep
+
+ class ForwardDeclaration; // IWYU pragma: keep
+
+In this case, `std::vector` isn't used, so `<vector>` would normally be discarded, but the pragma instructs IWYU to leave it. Similarly the class `ForwardDeclaration` isn't used but is kept because of the pragma on it.
+
+
+### IWYU pragma: export ###
+
+This pragma applies to a single `#include` directive. It says that the current file is to be considered the provider of any symbol from the included file.
+
+ facade.h:
+ #include "detail/constants.h" // IWYU pragma: export
+ #include "detail/types.h" // IWYU pragma: export
+ #include <vector> // don't export stuff from <vector>
+
+ main.cc:
+ #include "facade.h"
+
+ // Assuming Thing comes from detail/types.h and MAX_THINGS from detail/constants.h
+ std::vector<Thing> things(MAX_THINGS);
+
+Here, since `detail/constants.h` and `detail/types.h` have both been exported, IWYU is happy with the `facade.h` include for `Thing` and `MAX_THINGS`.
+
+In contrast, since `<vector>` has not been exported from `facade.h`, it will be suggested as an additional include.
+
+
+### IWYU pragma: begin_exports/end_exports ###
+
+This pragma applies to a set of `#include` directives. It declares that the including file is to be considered the provider of any symbol from these included files. This is the same as decorating every `#include` directive with `IWYU pragma: export`.
+
+ facade.h:
+ // IWYU pragma: begin_exports
+ #include "detail/constants.h"
+ #include "detail/types.h"
+ // IWYU pragma: end_exports
+
+ #include <vector> // don't export stuff from <vector>
+
+
+### IWYU pragma: private ###
+
+This pragma applies to the current header file. It says that any symbol from this file will be provided by another, optionally named, file.
+
+ private.h:
+ // IWYU pragma: private, include "public.h"
+ struct Private {};
+
+ private2.h:
+ // IWYU pragma: private
+ struct Private2 {};
+
+ public.h:
+ #include "private.h"
+ #include "private2.h"
+
+ main.cc:
+ #include "private.h"
+ #include "private2.h"
+
+ Private p;
+ Private2 i;
+
+Using the type `Private` in `main.cc` will cause IWYU to suggest that you include `public.h`.
+
+Using the type `Private2` in `main.cc` will cause IWYU to suggest that you include `private2.h`, but will also result in a warning that there's no public header for `private2.h`.
+
+
+### IWYU pragma: no_include ###
+
+This pragma applies to the current source file. It declares that the named file should not be suggested for inclusion by IWYU.
+
+ private.h:
+ struct Private {};
+
+ unrelated.h:
+ #include "private.h"
+ ...
+
+ main.cc:
+ #include "unrelated.h"
+ // IWYU pragma: no_include "private.h"
+
+ Private i;
+
+The use of `Private` requires including `private.h`, but due to the `no_include` pragma IWYU will not suggest `private.h` for inclusion. Note also that if you had included `private.h` in `main.cc`, IWYU would suggest that the `#include` be removed.
+
+This is useful when you know a symbol definition is already available via some unrelated header, and you want to preserve that implicit dependency.
+
+The `no_include` pragma is somewhat similar to `private`, but is employed at point of use rather than at point of declaration.
+
+
+### IWYU pragma: no_forward_declare ###
+
+This pragma applies to the current source file. It says that the named symbol should not be suggested for forward-declaration by IWYU.
+
+ public.h:
+ struct Public {};
+
+ unrelated.h:
+ struct Public;
+ ...
+
+ main.cc:
+ #include "unrelated.h" // declares Public
+ // IWYU pragma: no_forward_declare Public
+
+ Public* i;
+
+IWYU would normally suggest forward-declaring `Public` directly in `main.cc`, but `no_forward_declare` suppresses that suggestion. A forward-declaration for `Public` is already available from `unrelated.h`.
+
+This is useful when you know a symbol declaration is already available in a source file via some unrelated header and you want to preserve that implicit dependency, or when IWYU does not correctly understand that the definition is necessary.
+
+
+### IWYU pragma: friend ###
+
+This pragma applies to the current header file. It says that any file matching the given regular expression will be considered a friend, and is allowed to include this header even if it's private. Conceptually similar to `friend` in C++.
+
+If the expression contains spaces, it must be enclosed in quotes.
+
+ detail/private.h:
+ // IWYU pragma: private
+ // IWYU pragma: friend "detail/.*"
+ struct Private {};
+
+ detail/alsoprivate.h:
+ #include "detail/private.h"
+
+ // IWYU pragma: private
+ // IWYU pragma: friend "main\.cc"
+ struct AlsoPrivate : Private {};
+
+ main.cc:
+ #include "detail/alsoprivate.h"
+
+ AlsoPrivate p;
+
+
+### IWYU pragma: associated ###
+
+Associated headers have special significance in IWYU, they're analyzed together with their .cpp file to give an optimal result for the whole component.
+
+By default, IWYU uses the .cpp file's stem (filename without extension) to automatically detect which is the associated header, but sometimes local conventions don't allow a component's .cpp and header file to share a stem, which makes life harder for IWYU.
+
+You can explicitly mark an arbitrary `#include` directive as denoting the associated header with `IWYU pragma: associated`:
+
+ component/public.h:
+ struct Foo {
+ void Bar();
+ };
+
+ component/component.cc:
+ #include "component/public.h" // IWYU pragma: associated
+
+ void Foo::Bar() {
+ }
+
+You can mark multiple `#include` directives as associated and they will all be considered as such.
+
+
+### Which pragma should I use? ###
+
+Ideally, IWYU should be smart enough to understand your intentions (and intentions of the authors of libraries you use), so the first answer should always be: none.
+
+In practice, intentions are not so clear -- it might be ambiguous whether an `#include` is there by clever design or by mistake, whether an `#include` serves to export symbols from a private header through a public facade or if it's just a left-over after some clean-up. Even when intent is obvious, IWYU can make mistakes due to bugs or not-yet-implemented policies.
+
+IWYU pragmas have some overlap, so it can sometimes be hard to choose one over the other. Here's a guide based on how I understand them at the moment:
+
+ * Use `IWYU pragma: keep` to force IWYU to keep any `#include` directive that would be discarded under its normal policies.
+ * Use `IWYU pragma: export` to tell IWYU that one header serves as the provider for all symbols in another, included header (e.g. facade headers). Use `IWYU pragma: begin_exports/end_exports` for a whole group of included headers.
+ * Use `IWYU pragma: no_include` to tell IWYU that the file in which the pragma is defined should never `#include` a specific header (the header may already be included via some other `#include`.)
+ * Use `IWYU pragma: no_forward_declare` to tell IWYU that the file in which the pragma is defined should never forward-declare a specific symbol (a forward declaration may already be available via some other `#include`.)
+ * Use `IWYU pragma: private` to tell IWYU that the header in which the pragma is defined is private, and should not be included directly.
+ * Use `IWYU pragma: private, include "public.h"` to tell IWYU that the header in which the pragma is defined is private, and `public.h` should always be included instead.
+ * Use `IWYU pragma: friend ".*favorites.*"` to override `IWYU pragma: private` selectively, so that a set of files identified by a regex can include the file even if it's private.
+
+The pragmas come in three different classes;
+
+ 1. Ones that apply to a single `#include` directive (`keep`, `export`)
+ 2. Ones that apply to a file being included (`private`, `friend`)
+ 3. Ones that apply to a file including other headers (`no_include`, `no_forward_declare`)
+
+Some files are both included and include others, so it can make sense to mix and match.
diff --git a/docs/WhatIsAUse.md b/docs/WhatIsAUse.md
new file mode 100644
index 0000000..df86d5d
--- /dev/null
+++ b/docs/WhatIsAUse.md
@@ -0,0 +1,182 @@
+## What Is a Use? ##
+
+(*Disclaimer:* the information here is accurate as of 12 May 2011, when it was written. Specifics of IWYU's policy, and even philosophy, may have changed since then. We'll try to remember to update this file as that happens, but may occasionally forget. The further we are from May 2011, the more you should take the below with a grain of salt.)
+
+IWYU has the policy that you should `#include` a declaration for every symbol you "use" in a file, or forward-declare it if possible. But what does it mean to "use" a symbol?
+
+For the most part, IWYU considers a "use" the same as the compiler does: if you get a compiler error saying "Unknown symbol 'foo'", then you are using `foo`. Whether the use is a 'full' use, that needs the definition of the symbol, or a 'forward-declare' use, that can get by with just a declaration of the symbol, likewise matches what the compiler allows.
+
+This makes it sound like IWYU does the moral equivalent of taking a source file, removing `#include` lines from it, seeing what the compiler complains about, and marking uses as appropriate. This is not what IWYU does. Instead, IWYU does a thought experiment: if the definition (or declaration) of a given type were not available, would the code compile? Here is an example illustrating the difference:
+
+ foo.h:
+ #include <ostream>
+ typedef std::ostream OutputEmitter;
+
+ bar.cc:
+ #include "foo.h"
+ OutputEmitter oe;
+ oe << 5;
+
+Does `bar.cc` "use" `std::ostream`, such that it should `#include <ostream>`? You'd hope the answer would be no: the whole point of the `OutputEmitter` typedef, presumably, is to hide the fact the type is an `std::ostream`. Having to have clients `#include <ostream>` rather defeats that purpose. But IWYU sees that you're calling `operator<<(std::ostream&, int)`, which is defined in `<ostream>`, so naively, it should say that you need that header.
+
+But IWYU doesn't (at least, modulo bugs). This is because of its attempt to analyze "author intent".
+
+
+### Author Intent ###
+
+If code has `typedef Foo MyTypedef`, and you write `MyTypedef var;`, you are using `MyTypedef`, but are you also using `Foo`? The answer depends on the _intent_ of the person who wrote the typedef.
+
+In the `OutputEmitter` example above, while we don't know for sure, we can guess that the intent of the author was that clients should not be considered to use the underlying type -- and thus they shouldn't have to `#include <ostream>` themselves. In that case, the typedef author takes responsibility for the underlying type, promising to provide all the definitions needed to make code compile. The philosophy here is: "As long as you `#include "foo.h"`, you can use `OutputEmitter` however you want, without worry of compilation errors."
+
+Some typedef authors have a different intent. `<iosfwd>` has the line
+
+ typedef basic_ostream<char> ostream;
+
+but it does *not* promise "as long as you `#include <iosfwd>`, you can use `std::ostream` however you want, without worry of compilation errors." For most uses of `std::ostream`, you'll get a compiler error unless you `#include <ostream>` as well.
+
+So take a slightly modified version of the above `foo.h`:
+
+ #include <iosfwd>
+ typedef std::ostream OutputEmitter;
+
+This is a self-contained .h file: it's perfectly legal to typedef an incomplete type (that's what `iosfwd` itself does). But now IWYU had better tell `bar.cc` to `#include <ostream>`, or it will break the build. The difference is in the author intent with the typedef.
+
+Another case where author intent turns up is in function return types. Consider this function declaration:
+
+ Foo* GetSingletonObject(); // Foo is defined in foo.h
+
+If you write `GetSingletonObject()->methodOnFoo()`, are you "using" `Foo::methodOnFoo`, such that you should `#include "foo.h"`? Or are you supposed to be able to operate on the results of `GetSingletonObject` without needing to include the definition of the returned type? The answer is: it depends on the author intent. Sometimes the author is willing to provide the definition of the return type, sometimes it is not.
+
+
+#### Re-Exporting ####
+
+When the author of a file is providing a definition of a symbol from somewhere else, we say that the file is "re-exporting" that symbol. In the first `OutputEmitter` example, we say that `foo.h` is re-exporting `ostream`. As a result, people who `#include "foo.h"` get a definition of `ostream` along for free, even if they don't directly `#include <ostream>` themselves. Another way of thinking about it is: if file A re-exports symbol B, we can pretend that A defines B, even if it doesn't.
+
+(In an ideal world, we'd have a very fine-grained concept: "File A re-exports symbol S when it's used in the context of typedef T [or function F, or ...]," but in reality, we have the much looser concept "file A re-exports all symbols from file B.")
+
+A more accurate include-what-you-use rule is this: "If you use a symbol, you must either `#include` the definition of the symbol, or `#include` a file that re-exports the symbol."
+
+
+### Manual re-export identifiers ###
+
+You can mark that one file is re-exporting symbols from another via an IWYU pragma in your source code:
+
+ #include "private.h" // IWYU pragma: export
+
+This tells IWYU that if some other file uses symbols defined in `private.h`, they can `#include` you to get them, if they want.
+
+The full list of IWYU pragmas is defined in [IWYUPragmas.md](IWYUPragmas.md).
+
+
+### Automatic re-export ###
+
+In certain situations, IWYU will decide that one file is exporting a symbol from another even without the use of a pragma. These are places where the author intent is usually to re-export, such as with the `typedef` example above. In each of these cases, a simple technique can be used to override IWYU's decision to re-export.
+
+
+#### Automatic re-export: typedefs ####
+
+If you write
+
+ typedef Foo MyTypedef;
+
+IWYU has to decide whether your file should re-export `Foo` or not. Here is how it gauges author intent:
+
+ * If you (the typedef author), directly `#include` the definition of the underlying type, then IWYU assumes you mean to re-export it.
+ * If you (the typedef author), explicitly provide a forward-declare of the underlying type, but do not directly `#include` its definition, then IWYU assumes you do not mean to re-export it.
+ * Otherwise, IWYU assumes you do not mean to re-export it.
+
+For example:
+
+ #include "foo.h"
+ typedef Foo Typedef1; // IWYU says you intend to re-export Foo
+
+ class Bar;
+ typedef Bar Typedef2; // IWYU says you do not intend to re-export Bar
+
+ #include "file_including_baz.h" // does not define Baz itself
+ typedef Baz Typedef3; // IWYU says you do not intend to re-export Baz
+
+If IWYU says you intend to re-export the underlying type, then nobody who uses your typedef needs to `#include` the definition of the underlying type. In contrast, if IWYU says you do not intend to re-export the underlying type, then everybody who uses your typedef needs to `#include` the definition of the underlying type.
+
+IWYU supports this in its analysis. If you are using `Typedef1` in your code and `#include "foo.h"` anyway, IWYU will suggest you remove it, since you are getting the definition of `Foo` via the typedef.
+
+
+#### Automatic re-export: Function return values ####
+
+The same rule applies with the return value in a function declaration:
+
+ #include "foo.h"
+ Foo Func1(); // IWYU says you intend to re-export Foo
+
+ class Bar;
+ Bar Func2(); // IWYU says you do not intend to re-export Bar
+
+ #include "file_including_baz.h"
+ Baz Func3(); // IWYU says you do not intend to re-export Baz
+
+(Note that C++ is perfectly happy with a forward-declaration of the return type, if the function is just being declared, and not defined.)
+
+As of May 2011, the rule does *not* apply when returning a pointer or reference:
+
+ #include "foo.h"
+ Foo* Func1(); // IWYU says you do *not* intend to re-export Foo
+
+ #include "bar.h"
+ Bar& Func2(); // IWYU says you do *not* intend to re-export Bar
+
+This is considered a bug, and the behavior will likely change in the future to match the case where the functions return a class.
+
+Here is an example of the rule in action:
+
+ foo.h:
+ class Foo { ... }
+
+ bar.h:
+ #include "foo.h"
+ Foo CreateFoo() { ... }
+ void ConsumeFoo(const Foo& foo) { ... }
+
+ baz.cc:
+ #include "bar.h"
+ ConsumeFoo(CreateFoo());
+
+In this case, IWYU will say that `baz.cc` does not need to `#include "foo.h"`, since `bar.h` re-exports it.
+
+
+#### Automatic re-export: Conversion constructors ####
+
+Consider the following code:
+
+ foo.h:
+ class Foo {
+ public:
+ Foo(int i) { ... }; // note: not an explicit constructor!
+ };
+
+ bar.h:
+ class Foo;
+ void MyFunc(Foo foo);
+
+ baz.cc:
+ #include "bar.h"
+ MyFunc(11);
+
+The above code does not compile, because the code to convert `11` to a `Foo` is not visible to `baz.cc`. Either `baz.cc` or `bar.h` needs to `#include "foo.h"` to make the conversion constructor visible where `MyFunc` is being called.
+
+The same rule applies as before:
+
+ #include "foo.h"
+ void Func1(Foo foo); // IWYU says you intend to re-export Foo
+
+ class Foo;
+ void Func2(Foo foo); // IWYU says you do not intend to re-export Foo
+
+ #include "file_including_foo.h"
+ void Func3(Foo foo); // IWYU says you do not intend to re-export Foo
+
+As before, if IWYU decides you do not intend to re-export `Foo`, then all callers (in this case, `baz.cc`) need to.
+
+The rule here applies even to const references (which can also be automatically converted):
+
+ #include "foo.h"
+ void Func1(const Foo& foo); // IWYU says you intend to re-export Foo
diff --git a/docs/WhyIWYU.md b/docs/WhyIWYU.md
new file mode 100644
index 0000000..91b989f
--- /dev/null
+++ b/docs/WhyIWYU.md
@@ -0,0 +1,53 @@
+## Why Include What You Use? ##
+
+Are there any concrete benefits to a strict include-what-you-use policy? We like to think so.
+
+
+### Faster Compiles ###
+
+Every .h file you bring in when compiling a source file lengthens the time to compile, as the bytes have to be read, preprocessed, and parsed. If you're not actually using a .h file, you remove that cost. With template code, where entire instantiations have to be in .h files, this can be hundreds of thousands of bytes of code. In one case at Google, running include-what-you-use over a .cc file improved its compile time by 30%.
+
+Here, the main benefit of include-what-you-use comes from the flip side: "don't include what you don't use."
+
+
+### Fewer Recompiles ###
+
+Many build tools, such as `make`, provide a mechanism for automatically figuring out what .h files a .cc file depends on. These mechanisms typically look at `#include` lines. When unnecessary `#includes` are listed, the build system is more likely to recompile in cases where it's not necessary.
+
+Again, the main advantage here is from "don't include what you don't use."
+
+
+### Allow Refactoring ###
+
+Suppose you refactor `foo.h` so it no longer uses vectors. You'd like to remove `#include <vector>` from `foo.h`, to reduce compile time -- template class files such as `vector` can include a lot of code. But can you? In theory yes, but in practice maybe not: some other file may be #including you and using vectors, and depending (probably unknowingly) on your `#include <vector>` to compile. Your refactor could break code far away from you.
+
+This is most compelling for a very large codebase (such as Google's). In a small codebase, it's practical to just compile everything after a refactor like this, and clean up any errors you see. When your codebase contains hundreds of thousands of source files, identifying and cleaning up the errors can be a project in itself. In practice, people are likely to just leave the `#include <vector>` line in there, even though it's unnecessary.
+
+Here, it's the actual 'include what you use' policy that saves the day. If everyone who uses vector is #including `<vector>` themselves, then you can remove `<vector>` without fear of breaking anything.
+
+
+### Self-documentation ###
+
+When you can trust the `#include` lines to accurately reflect what is used in the file, you can use them to help you understand the code. Looking at them, in itself, can help you understand what this file needs in order to do its work. If you use the optional 'commenting' feature of `fix_includes.py`, you can see what symbols -- what functions and classes -- are used by this code. It's like a pared-down version of doxygen markup, but totally automated and present where the code is (rather than in a separate web browser).
+
+The 'commented' `#include` lines can also make it simpler to match function calls and classes to the files that define them, without depending on a particular IDE.
+
+(The downside, of course, is the comments can get out of date as the code changes, so unless you run IWYU often, you still have to take the comments with a grain of salt. Nothing is free. :-) )
+
+
+### Dependency Cutting ###
+
+Again, this makes the most sense for large code-bases. Suppose your binaries are larger than you would expect, and upon closer examination use symbols that seem totally irrelevant. Where do they come from? Why are they there? With include-what-you-use, you can easily determine this by seeing who includes the files that define these symbols: those includers, and those alone, are responsible for the use.
+
+Once you know where a symbol is used in your binary, you can see how practical it is to remove that use, perhaps by breaking up the relevant .h files into two parts, and fixing up all callers. Again it's IWYU to the rescue: with include-what-you-use, figuring out the callers that need fixing is easy.
+
+
+### Why Forward-Declare? ###
+
+Include-what-you-use tries very hard to figure out when a forward-declare can be used instead of an `#include` (IWYU would be about 90% less code if it didn't bother with trying to forward-declare).
+
+The reason for this is simple: if you can replace an `#include` by a forward-declare, you reduce the code size, speeding up compiles as described above. You also make it easier to break dependencies: not only do you not depend on that header file, you no longer depend on everything it brings in.
+
+There's a cost to forward-declaring as well: you lose the documentation features mentioned above, that come with `#include` lines. (A future version of IWYU may mitigate this problem.) And if a class changes -- for instance, it adds a new default template argument -- you need to change many callsites, not just one. It is also easier to accidentally violate the [One Definition Rule](http://en.wikipedia.org/wiki/One_Definition_Rule) when all you expose is the name of a class (via a forward declare) rather than the full definition (via an `#include`).
+
+One compromise approach is to use 'forwarding headers', such as `<iosfwd>`. These forwarding headers could have comments saying where the definition of each forward-declared class is. Include-what-you-use does not currently support forwarding headers, but may in the future.
diff --git a/docs/WhyIWYUIsDifficult.md b/docs/WhyIWYUIsDifficult.md
new file mode 100644
index 0000000..3fe5f0c
--- /dev/null
+++ b/docs/WhyIWYUIsDifficult.md
@@ -0,0 +1,164 @@
+## Why Include What You Use Is Difficult ##
+
+This section is informational, for folks who are wondering why include-what-you-use requires so much code and yet still has so many errors.
+
+Include-what-you-use has the most problems with templates and macros. If your code doesn't use either, IWYU will probably do great. And, you're probably not actually programming in C++...
+
+
+### Use Versus Forward Declare ###
+
+Include-what-you-use has to be able to tell when a symbol is being used in a way that you can forward-declare it. Otherwise, if you wrote
+
+ vector<MyClass*> foo;
+
+IWYU would tell you to `#include "myclass.h"`, when perhaps the whole reason you're using a pointer here is to avoid the need for that `#include`.
+
+In the above case, it's pretty easy for IWYU to tell that we can safely forward-declare `MyClass`. But now consider
+
+ vector<MyClass> foo; // requires full definition of MyClass
+ scoped_ptr<MyClass> foo; // forward-declaring MyClass is often ok
+
+To distinguish these, clang has to instantiate the vector and scoped_ptr template classes, including analyzing all member variables and the bodies of the constructor and destructor (and recursively for superclasses).
+
+But that's not enough: when instantiating the templates, we need to keep track of which symbols come from template arguments and which don't. For instance, suppose you call `MyFunc<MyClass>()`, where `MyFunc` looks like this:
+
+ template<typename T> void MyFunc() {
+ T* t;
+ MyClass myclass;
+ ...
+ }
+
+In this case, the caller of `MyFunc` is not using the full type of `MyClass`, because the template parameter is only used as a pointer. On the other hand, the file that defines `MyFunc` is using the full type information for `MyClass`. The end result is that the caller can forward-declare `MyClass`, but the file defining `MyFunc` has to `#include "myclass.h"`.
+
+
+### Handling Template Arguments ###
+
+Even figuring out what types are 'used' with a template can be difficult. Consider the following two declarations:
+
+ vector<MyClass> v;
+ hash_set<MyClass> h;
+
+These both have default template arguments, so are parsed like
+
+ vector<MyClass, alloc<MyClass> > v;
+ hash_set<MyClass, hash<MyClass>, equal_to<MyClass>, alloc<MyClass> > h;
+
+What symbols should we say are used? If we say `alloc<MyClass>` is used when you declare a vector, then every file that `#includes` `<vector>` will also need to `#include <memory>`.
+
+So it's tempting to just ignore default template arguments. But that's not right either. What if `hash<MyClass>` is defined in some local `myhash.h` file (as `hash<string>` often is)? Then we want to make sure IWYU says to `#include "myhash.h"` when you create the hash_set (otherwise the code won't compile). That requires paying attention to the default template argument. Figuring out how to handle default template arguments can get very complex.
+
+Even normal template arguments can be confusing. Consider this templated function:
+
+ template<typename A, typename B, typename C> void MyFunc(A (*fn)(B,C))
+ { ... }
+
+and you call `MyFunc(FunctionReturningAFunctionPointer())`. What types are being used where, in this case?
+
+
+### Who is Responsible for Dependent Template Types? ###
+
+If you say `vector<MyClass> v;`, it's clear that you, and not `vector.h` are responsible for the use of `MyClass`, even though all the functions that use `MyClass` are defined in `vector.h`. (OK, technically, these functions are not "defined" in a particular location, they're instantiated from template methods written in `vector.h`, but for us it works out the same.)
+
+When you say `hash_map<MyClass, int> h;`, you are likewise responsible for `MyClass` (and `int`), but are you responsible for `pair<MyClass, int>`? That is the type that hash_map uses to store your entries internally, and it depends on one of your template arguments, but even so it shouldn't be your responsibility -- it's an implementation detail of hash_map. Of course, if you say `hash_map<pair<int, int>, int>`, then you are responsible for the use of `pair`. Distinguishing these two cases from each other, and from the vector case, can be difficult.
+
+Now suppose there's a template function like this:
+
+ template<typename T> void MyFunc(T t) {
+ strcat(t, 'a');
+ strchr(t, 'a');
+ cerr << t;
+ }
+
+If you call `MyFunc(some_char_star)`, which of these symbols are you responsible for, and which is the author of `MyFunc` responsible for: `strcat`, `strchr`, `operator<<(ostream&, T)`?
+
+`strcat` is a normal function, and the author of `MyFunc` is responsible for its use. This is an easy case.
+
+In C++, `strchr` is a templatized function (different impls for `char*` and `const char*`). Which version is called depends on the template argument. So, naively, we'd conclude that the caller is responsible for the use of `strchr`. However, that's ridiculous; we don't want caller of `MyFunc` to have to `#include <string.h>` just to call `MyFunc`. We have special code that (usually) handles this kind of case.
+
+`operator<<` is also a templated function, but it's one that may be defined in lots of different files. It would be ridiculous in its own way if `MyFunc` was responsible for including every file that defines `operator<<(ostream&, T)` for all `T`. So, unlike the two cases above, the caller is the one responsible for the use of `operator<<`, and will have to `#include` the file that defines it. It's counter-intuitive, perhaps, but the alternatives are all worse.
+
+As you can imagine, distinguishing all these cases is extremely difficult. To get it exactly right would require re-implementing C++'s (byzantine) lookup rules, which we have not yet tackled.
+
+
+### Template Template Types ###
+
+Let's say you have a function
+
+ template<template<typename U> T> void MyFunc() {
+ T<string> t;
+ }
+
+And you call `MyFunc<hash_set>`. Who is responsible for the 'use' of `hash<string>`, and thus needs to `#include "myhash.h"`? I think it has to be the caller, even if the caller never uses the `string` type in its file at all. This is rather counter-intuitive. Luckily, it's also rather rare.
+
+
+### Typedefs ###
+
+Suppose you `#include` a file `"foo.h"` that has typedef `hash_map<Foo, Bar> MyMap;`. And you have this code:
+
+ for (MyMap::iterator it = ...)
+
+Who, if anyone, is using the symbol `hash_map<Foo, Bar>::iterator`? If we say you, as the author of the for-loop, are the user, then you must `#include <hash_map>`, which undoubtedly goes against the goal of the typedef (you shouldn't even have to know you're using a hash_map). So we want to say the author of the typedef is responsible for the use. But how could the author of the typedef know that you were going to use `MyMap::iterator`? It can't predict that. That means it has to be responsible for every possible use of the typedef type. This can be complicated to figure out. It requires instantiating all methods of the underlying type, some of which might not even be legal C++ (if, say, the class uses SFINAE).
+
+Worse, when the language auto-derives template types, it loses typedef information. Suppose you wrote this:
+
+ MyMap m;
+ find(m.begin(), m.end(), some_foo);
+
+The compiler sees this as syntactic sugar for `find<hash_map<Foo, Bar, hash<Foo>, equal_to<Foo>, alloc<Foo> >(m.begin(), m.end(), some_foo);`
+
+Not only is the template argument `hash_map` instead of `MyMap`, it includes all the default template arguments, with no indication they're default arguments. All the tricks we used above to intelligently ignore default template arguments are worthless here. We have to jump through lots of hoops so this code doesn't require you to `#include` not only `<hash_map>`, but `<alloc>` and `<utility>` as well.
+
+
+### Macros ###
+
+It's no surprise macros cause a huge problem for include-what-you-use. Basically, all the problems of templates also apply to macros, but worse: with templates you can analyze the uninstantiated template, but with macros, you can't analyze the uninstantiated macro -- it likely doesn't even parse cleanly in isolation. As a result, we have very few tools to distinguish when the author of a macro is responsible for a symbol used in a macro, and when the caller of the macro is responsible.
+
+
+### Includes with Side Effects ###
+
+While not a major problem, this indicates the myriad "gotchas" that exist around include-what-you-use: removing an `#include` and replacing it with a forward-declare may be dangerous even if no symbols are fully used from the `#include`. Consider the following code:
+
+ foo.h:
+ namespace ns { class Foo {}; }
+ using ns::Foo;
+
+ foo.cc:
+ #include "foo.h"
+ Foo* foo;`
+
+If IWYU just blindly replaces the `#include` with a forward declare such as `namespace ns { class Foo; }`, the code will break because of the lost using declaration. Include-what-you-use has to watch out for this case.
+
+Another case is a header file like this:
+
+ foo.h:
+ #define MODULE_NAME MyModule
+ #include "module_writer.h"
+
+We might think we can remove an `#include` of `foo.h` and replace it by `#include "module_writer.h"`, but that is likely to break the build if `module_writer.h` requires `MODULE_NAME` be defined. Since my file doesn't participate in this dependency at all, it won't even notice it. IWYU needs to keep track of dependencies between files it's not even trying to analyze!
+
+
+### Private Includes ###
+
+Suppose you write `vector<int> v;`. You are using vector, and thus have to `#include <vector>`. Even this seemingly easy case is difficult, because vector isn't actually defined in `<vector>`; it's defined in `<bits/stl_vector.h>`. The C++ standard library has hundreds of private files that users are not supposed to `#include` directly. Third party libraries have hundreds more. There's no general way to distinguish private from public headers; we have to manually construct the proper mapping.
+
+In the future, we hope to provide a way for users to annotate if a file is public or private, either a comment or a `#pragma`. For now, we hard-code it in the IWYU tool.
+
+The mappings themselves can be ambiguous. For instance, `NULL` is provided by many files, including `stddef.h`, `stdlib.h`, and more. If you use `NULL`, what header file should IWYU suggest? We have rules to try to minimize the number of `#includes` you have to add; it can get rather involved.
+
+
+### Unparsed Code ###
+
+Conditional `#includes` are a problem for IWYU when the condition is false:
+
+ #if _MSC_VER
+ #include <foo>
+ #endif
+
+If we're not running under windows (and IWYU does not currently run under windows), we have no way of telling if foo is a necessary `#include` or not.
+
+
+### Placing New Includes and Forward-Declares ###
+
+Figuring out where to insert new `#includes` and forward-declares is a complex problem of its own (one that is the responsibility of `fix_includes.py`). In general, we want to put new `#includes` with existing `#includes`. But the existing `#includes` may be broken up into sections, either because of conditional `#includes` (with `#ifdefs`), or macros (such as `#define __GNU_SOURCE`), or for other reasons. Some forward-declares may need to come early in the file, and some may prefer to come later (after we're in an appropriate namespace, for instance).
+
+`fix_includes.py` tries its best to give pleasant-looking output, while being conservative about putting code in a place where it might not compile. It uses heuristics to do this, which are not yet perfect.
diff --git a/fix_includes.py b/fix_includes.py
new file mode 100755
index 0000000..b95f73b
--- /dev/null
+++ b/fix_includes.py
@@ -0,0 +1,2397 @@
+#!/usr/bin/env python
+
+##===--- fix_includes.py - rewrite source files based on iwyu output ------===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+from __future__ import print_function
+
+"""Update files with the 'correct' #include and forward-declare lines.
+
+Given the output of include_what_you_use on stdin -- when run at the
+(default) --v=1 verbosity level or higher -- modify the files
+mentioned in the output, removing their old #include lines and
+replacing them with the lines given by the include_what_you_use
+script.
+
+We only edit files that are writeable (presumably open for p4 edit),
+unless the user supplies a command to make files writeable via the
+--checkout_command flag (eg '--checkout_command="p4 edit"').
+
+
+This script runs in four stages. In the first, it groups physical
+lines together to form 'move spans'. A 'move span' is the atomic unit
+for moving or deleting code. A move span is either a) an #include
+line, along with any comment lines immediately preceding it; b) a
+forward-declare line -- or more if it's a multi-line forward declare
+-- along with preceding comments; c) any other single line. Example:
+
+ // I really am glad I'm forward-declaring this class!
+ // If I didn't, I'd have to #include the entire world.
+ template<typename A, typename B, typename C, typename D>
+ class MyClass;
+
+Then, it groups move spans together into 'reorder spans'. These are
+spans of code that consist entirely of #includes and forward-declares,
+maybe separated by blank lines and comments. We assume that we can
+arbitrarily reorder #includes and forward-declares within a reorder
+span, without affecting correctness. Things like #ifdefs, #defines,
+namespace declarations, static variable declarations, class
+definitions, etc -- just about anything -- break up reorder spans.
+
+In stage 3 it deletes all #include and forward-declare lines that iwyu
+says to delete. iwyu includes line numbers for deletion, making this
+part easy. If this step results in "empty" #ifdefs or namespaces
+(#ifdefs or namespaces with no code inside them), we delete those as
+well. We recalculate the reorder spans, which may have gotten bigger
+due to the deleted code.
+
+In stage 4 it adds new iwyu-dictated #includes and forward-declares
+after the last existing #includes and forward-declares. Then it
+reorders the #includes and forward-declares to match the order
+specified by iwyu. It follows iwyu's instructions as much as
+possible, modulo the constraint that an #include or forward-declare
+cannot leave its current reorder span.
+
+All this moving messes up the blank lines, which we then need to fix
+up. Then we're done!
+"""
+
+__author__ = 'csilvers@google.com (Craig Silverstein)'
+
+import difflib
+import optparse
+import os
+import pipes # For (undocumented) pipes.quote
+import re
+import sys
+import subprocess
+from collections import OrderedDict
+
+_USAGE = """\
+%prog [options] [filename] ... < <output from include-what-you-use script>
+ OR %prog -s [other options] <filename> ...
+
+%prog reads the output from the include-what-you-use
+script on stdin -- run with --v=1 (default) verbose or above -- and,
+unless --sort_only or --dry_run is specified,
+modifies the files mentioned in the output, removing their old
+#include lines and replacing them with the lines given by the
+include_what_you_use script. It also sorts the #include and
+forward-declare lines.
+
+Only writable files (those opened for p4 edit) are modified (unless
+--checkout_command is specified). All files mentioned in the
+include-what-you-use script are modified, unless filenames are
+specified on the commandline, in which case only those files are
+modified.
+
+The exit code is the number of files that were modified (or that would
+be modified if --dry_run was specified) unless that number exceeds 100,
+in which case 100 is returned.
+"""
+
+_COMMENT_RE = re.compile(r'\s*//.*')
+
+# These are the types of lines a file can have. These are matched
+# using re.match(), so don't need a leading ^.
+_C_COMMENT_START_RE = re.compile(r'\s*/\*')
+_C_COMMENT_END_RE = re.compile(r'.*\*/\s*(.*)$')
+_COMMENT_LINE_RE = re.compile(r'\s*//')
+_PRAGMA_ONCE_LINE_RE = re.compile(r'\s*#\s*pragma\s+once')
+_BLANK_LINE_RE = re.compile(r'\s*$')
+_IF_RE = re.compile(r'\s*#\s*if') # compiles #if/ifdef/ifndef
+_ELSE_RE = re.compile(r'\s*#\s*(else|elif)\b') # compiles #else/elif
+_ENDIF_RE = re.compile(r'\s*#\s*endif\b')
+# This is used to delete 'empty' namespaces after fwd-decls are removed.
+# Some third-party libraries use macros to start/end namespaces.
+_NAMESPACE_START_RE = re.compile(r'\s*(namespace\b[^{]*{\s*)+(//.*)?$|'
+ r'\s*(U_NAMESPACE_BEGIN)|'
+ r'\s*(HASH_NAMESPACE_DECLARATION_START)')
+_NAMESPACE_END_RE = re.compile(r'\s*(})|'
+ r'\s*(U_NAMESPACE_END)|'
+ r'\s*(HASH_NAMESPACE_DECLARATION_END)')
+# The group (in parens) holds the unique 'key' identifying this #include.
+_INCLUDE_RE = re.compile(r'\s*#\s*include\s+([<"][^"">]+[>"])')
+# We don't need this to actually match forward-declare lines (we get
+# that information from the iwyu input), but we do need an RE here to
+# serve as an index to _LINE_TYPES. So we use an RE that never matches.
+_FORWARD_DECLARE_RE = re.compile(r'$.FORWARD_DECLARE_RE')
+# Likewise, used to mark an '#ifdef' line of a header guard, or other
+# #ifdef that covers an entire file.
+_HEADER_GUARD_RE = re.compile(r'$.HEADER_GUARD_RE')
+# Marks the '#define' line that comes after a header guard. Since we
+# know the previous line was a header-guard line, we're not that picky
+# about this one.
+_HEADER_GUARD_DEFINE_RE = re.compile(r'\s*#\s*define\s+')
+
+# We annotate every line in the source file by the re it matches, or None.
+# Note that not all of the above RE's are represented here; for instance,
+# we fold _C_COMMENT_START_RE and _C_COMMENT_END_RE into _COMMENT_LINE_RE.
+_LINE_TYPES = [_COMMENT_LINE_RE, _BLANK_LINE_RE,
+ _NAMESPACE_START_RE, _NAMESPACE_END_RE,
+ _IF_RE, _ELSE_RE, _ENDIF_RE,
+ _INCLUDE_RE, _FORWARD_DECLARE_RE,
+ _HEADER_GUARD_RE, _HEADER_GUARD_DEFINE_RE,
+ _PRAGMA_ONCE_LINE_RE,
+ ]
+
+# A regexp matching #include lines that should be a barrier for
+# sorting -- that is, we should never reorganize the code so an
+# #include that used to come before this line now comes after, or vice
+# versa. This can be used for 'fragile' #includes that require other
+# #includes to happen before them to function properly.
+# (Note that the barrier has no effect on where new #includes are
+# added; it just affects the reordering of existing #includes.)
+_BARRIER_INCLUDES = re.compile(r'^\s*#\s*include\s+(<linux/)')
+
+# A list of all known extensions for C++ source files, used to
+# guess if a filename is a source file or a header.
+# Please keep this in sync with source_extensions in iwyu_path_util.cc.
+_SOURCE_EXTENSIONS = [".c", ".C", ".cc", ".CC", ".cxx", ".CXX",
+ ".cpp", ".CPP", ".c++", ".C++", ".cp"]
+
+
+# Adapt Python 2 iterators to Python 3 syntax
+if sys.version_info[0] < 3:
+ def next(i):
+ return i.next()
+
+
+class OrderedSet(object):
+ """ Sometimes sets affect order of outputs, which hinders testing. This
+ (naive) set implementation preserves order to avoid that problem. """
+ def __init__(self, iterable=None):
+ iterable = iterable or []
+ self.storage = OrderedDict((a, None) for a in iterable)
+
+ def add(self, value):
+ self.storage[value] = None
+
+ def intersection_update(self, other):
+ self.storage = OrderedDict(
+ (k, None) for k in self.storage if k in other.storage)
+
+ def update(self, other):
+ self.storage.update(other.storage)
+
+ def difference(self, other):
+ diff_values = (v for v in self if v not in other)
+ return OrderedSet(diff_values)
+
+ def __iter__(self):
+ return self.storage.keys().__iter__()
+
+ def __contains__(self, value):
+ return value in self.storage
+
+ def __len__(self):
+ return len(self.storage)
+
+
+def _MayBeHeaderFile(filename):
+ """Tries to figure out if filename is a C++ header file. Defaults to yes."""
+ # Header files have all sorts of extensions: .h, .hpp, .hxx, or no
+ # extension at all. So we say everything is a header file unless it
+ # has a known extension that's not.
+ extension = os.path.splitext(filename)[1]
+ return extension not in _SOURCE_EXTENSIONS
+
+
+class FixIncludesError(Exception):
+ pass
+
+
+class IWYUOutputRecord(object):
+ """Information that the iwyu output file has about one source file."""
+
+ def __init__(self, filename):
+ self.filename = filename
+
+ # A set of integers.
+ self.lines_to_delete = set()
+
+ # A set of integer line-numbers, for each #include iwyu saw that
+ # is marked with a line number. This is usually not an exhaustive
+ # list of include-lines, but that's ok because we only use this
+ # data structure for sanity checking: we double-check with our own
+ # analysis that these lines are all # #include lines. If not, we
+ # know the iwyu data is likely out of date, and we complain. So
+ # more data here is always welcome, but not essential.
+ self.some_include_lines = set()
+
+ # A set of integer line-number spans [start_line, end_line), for
+ # each forward-declare iwyu saw. iwyu reports line numbers for
+ # every forward-declare it sees in the source code. (It won't
+ # report, though, forward-declares inside '#if 0' or similar.)
+ self.seen_forward_declare_lines = set()
+
+ # A set of each line in the iwyu 'add' section.
+ self.includes_and_forward_declares_to_add = OrderedSet()
+
+ # A map from the include filename (including ""s or <>s) to the
+ # full line as given by iwyu, which includes comments that iwyu
+ # has put next to the #include. This holds both 'to-add' and
+ # 'to-keep' #includes. If flags.comments is False, the comments
+ # are removed before adding to this list.
+ self.full_include_lines = OrderedDict()
+
+ def Merge(self, other):
+ """Merges other with this one. They must share a filename.
+
+ This function is intended to be used when we see two iwyu records
+ in the input, both for the same file. We can merge the two together.
+ We are conservative: we union the lines to add, and intersect the
+ lines to delete.
+
+ Arguments:
+ other: an IWYUOutputRecord to merge into this one.
+ It must have the same value for filename that self does.
+ """
+ assert self.filename == other.filename, "Can't merge distinct files"
+ self.lines_to_delete.intersection_update(other.lines_to_delete)
+ self.some_include_lines.update(other.some_include_lines)
+ self.seen_forward_declare_lines.update(other.seen_forward_declare_lines)
+ self.includes_and_forward_declares_to_add.update(
+ other.includes_and_forward_declares_to_add)
+ self.full_include_lines.update(other.full_include_lines)
+
+ def HasContentfulChanges(self):
+ """Returns true iff this record has at least one add or delete."""
+ return (self.includes_and_forward_declares_to_add or
+ self.lines_to_delete)
+
+ def __str__(self):
+ return ('--- iwyu record ---\n FILENAME: %s\n LINES TO DELETE: %s\n'
+ ' (SOME) INCLUDE LINES: %s\n (SOME) FWD-DECL LINES: %s\n'
+ ' TO ADD: %s\n ALL INCLUDES: %s\n---\n'
+ % (self.filename, self.lines_to_delete,
+ self.some_include_lines, self.seen_forward_declare_lines,
+ self.includes_and_forward_declares_to_add,
+ self.full_include_lines))
+
+
+class IWYUOutputParser(object):
+ """Parses the lines in iwyu output corresponding to one source file."""
+
+ # iwyu adds this comment to some lines to map them to the source file.
+ _LINE_NUMBERS_COMMENT_RE = re.compile(r'\s*// lines ([0-9]+)-([0-9]+)')
+
+ # The output of include-what-you-use has sections that indicate what
+ # #includes and forward-declares should be added to the output file,
+ # what should be removed, and what the end result is. The first line
+ # of each section also has the filename.
+ _ADD_SECTION_RE = re.compile(r'^(.*) should add these lines:$')
+ _REMOVE_SECTION_RE = re.compile(r'^(.*) should remove these lines:$')
+ _TOTAL_SECTION_RE = re.compile(r'^The full include-list for (.*):$')
+ _SECTION_END_RE = re.compile(r'^---$')
+
+ # Alternately, if a file does not need any iwyu modifications (though
+ # it still may need its #includes sorted), iwyu will emit this:
+ _NO_EDITS_RE = re.compile(r'^\((.*) has correct #includes/fwd-decls\)$')
+
+ _RE_TO_NAME = {_ADD_SECTION_RE: 'add',
+ _REMOVE_SECTION_RE: 'remove',
+ _TOTAL_SECTION_RE: 'total',
+ _SECTION_END_RE: 'end',
+ _NO_EDITS_RE: 'no_edits',
+ }
+ # A small state-transition machine. key==None indicates the start
+ # state. value==None means that the key is an end state (that is,
+ # its presence indicates the record is finished).
+ _EXPECTED_NEXT_RE = {
+ None: frozenset([_ADD_SECTION_RE, _NO_EDITS_RE]),
+ _ADD_SECTION_RE: frozenset([_REMOVE_SECTION_RE]),
+ _REMOVE_SECTION_RE: frozenset([_TOTAL_SECTION_RE]),
+ _TOTAL_SECTION_RE: frozenset([_SECTION_END_RE]),
+ _SECTION_END_RE: None,
+ _NO_EDITS_RE: None,
+ }
+
+ def __init__(self):
+ # This is set to one of the 'section' REs above. None is the start-state.
+ self.current_section = None
+ self.filename = '<unknown file>'
+ self.lines_by_section = {} # key is an RE, value is a list of lines
+
+ def _ProcessOneLine(self, line):
+ """Reads one line of input, updates self, and returns False at EORecord.
+
+ If the line matches one of the hard-coded section names, updates
+ self.filename and self.current_section. Otherwise, the line is
+ taken to be a member of the currently active section, and is added
+ to self.lines_by_section.
+
+ Arguments:
+ line: one line from the iwyu input file.
+
+ Returns:
+ False if the line is the end-of-section marker, True otherwise.
+
+ Raises:
+ FixIncludesError: if there is an out-of-order section or
+ mismatched filename.
+ """
+ line = line.rstrip() # don't worry about line endings
+ if not line: # just ignore blank lines
+ return True
+
+ for (section_re, section_name) in self._RE_TO_NAME.items():
+ m = section_re.search(line)
+ if m:
+ # Check or set the filename (if the re has a group, it's for filename).
+ if section_re.groups >= 1:
+ this_filename = m.group(1)
+ if (self.current_section is not None and
+ this_filename != self.filename):
+ raise FixIncludesError('"%s" section for %s comes after "%s" for %s'
+ % (section_name, this_filename,
+ self._RE_TO_NAME[self.current_section],
+ self.filename))
+ self.filename = this_filename
+
+ # Check and set the new section we're entering.
+ if section_re not in self._EXPECTED_NEXT_RE[self.current_section]:
+ if self.current_section is None:
+ raise FixIncludesError('%s: "%s" section unexpectedly comes first'
+ % (self.filename, section_name))
+ else:
+ raise FixIncludesError('%s: "%s" section unexpectedly follows "%s"'
+ % (self.filename, section_name,
+ self._RE_TO_NAME[self.current_section]))
+ self.current_section = section_re
+ # We're done parsing this record if this section has nothing after it.
+ return self._EXPECTED_NEXT_RE[self.current_section] is not None
+
+ # We're not starting a new section, so just add to the current section.
+ # We ignore lines before section-start, they're probably things like
+ # compiler messages ("Compiling file foo").
+ if self.current_section is not None:
+ self.lines_by_section.setdefault(self.current_section, []).append(line)
+ return True
+
+ def ParseOneRecord(self, iwyu_output, flags):
+ """Given a file object with output from an iwyu run, return per file info.
+
+ For each source file that iwyu_output mentions (because iwyu was run on
+ it), we return a structure holding the information in IWYUOutputRecord:
+ 1) What file these changes apply to
+ 2) What line numbers hold includes/fwd-declares to remove
+ 3) What includes/fwd-declares to add
+ 4) Ordering information for includes and fwd-declares
+
+ Arguments:
+ iwyu_output: a File object returning lines from an iwyu run
+ flags: commandline flags, as parsed by optparse. We use
+ flags.comments, which controls whether we output comments
+ generated by iwyu.
+ Returns:
+ An IWYUOutputRecord object, or None at EOF.
+
+ Raises:
+ FixIncludesError: for malformed-looking lines in the iwyu output.
+ """
+ for line in iwyu_output:
+ if not self._ProcessOneLine(line): # returns False at end-of-record
+ break
+ else: # for/else
+ return None # at EOF
+
+ # Now set up all the fields in an IWYUOutputRecord.
+ # IWYUOutputRecord.filename
+ retval = IWYUOutputRecord(self.filename)
+
+ # IWYUOutputRecord.lines_to_delete
+ for line in self.lines_by_section.get(self._REMOVE_SECTION_RE, []):
+ m = self._LINE_NUMBERS_COMMENT_RE.search(line)
+ if not m:
+ raise FixIncludesError('line "%s" (for %s) has no line number'
+ % (line, self.filename))
+ # The RE is of the form [start_line, end_line], inclusive.
+ for line_number in range(int(m.group(1)), int(m.group(2)) + 1):
+ retval.lines_to_delete.add(line_number)
+
+ # IWYUOutputRecord.some_include_lines
+ for line in (self.lines_by_section.get(self._REMOVE_SECTION_RE, []) +
+ self.lines_by_section.get(self._TOTAL_SECTION_RE, [])):
+ if not _INCLUDE_RE.match(line):
+ continue
+ m = self._LINE_NUMBERS_COMMENT_RE.search(line)
+ if not m:
+ continue # not all #include lines have line numbers, but some do
+ for line_number in range(int(m.group(1)), int(m.group(2)) + 1):
+ retval.some_include_lines.add(line_number)
+
+ # IWYUOutputRecord.seen_forward_declare_lines
+ for line in (self.lines_by_section.get(self._REMOVE_SECTION_RE, []) +
+ self.lines_by_section.get(self._TOTAL_SECTION_RE, [])):
+ # Everything that's not an #include is a forward-declare.
+ if line.startswith('- '): # the 'remove' lines all start with '- '.
+ line = line[len('- '):]
+ if _INCLUDE_RE.match(line):
+ continue
+ m = self._LINE_NUMBERS_COMMENT_RE.search(line)
+ if m:
+ retval.seen_forward_declare_lines.add((int(m.group(1)),
+ int(m.group(2))+1))
+
+ # IWYUOutputRecord.includes_and_forward_declares_to_add
+ for line in self.lines_by_section.get(self._ADD_SECTION_RE, []):
+ line = _COMMENT_RE.sub('', line)
+ retval.includes_and_forward_declares_to_add.add(line)
+
+ # IWYUOutputRecord.full_include_lines
+ for line in self.lines_by_section.get(self._TOTAL_SECTION_RE, []):
+ m = _INCLUDE_RE.match(line)
+ if m:
+ if not flags.comments:
+ line = _COMMENT_RE.sub('', line) # pretend there were no comments
+ else:
+ # Just remove '// line XX': that's iwyu metadata, not a real comment
+ line = self._LINE_NUMBERS_COMMENT_RE.sub('', line)
+ retval.full_include_lines[m.group(1)] = line
+
+ return retval
+
+
+class LineInfo(object):
+ """Information about a single line of a source file."""
+
+ def __init__(self, line):
+ """Initializes the content of the line, but no ancillary fields."""
+ # The content of the line in the input file
+ self.line = line
+
+ # The 'type' of the line. The 'type' is one of the regular
+ # expression objects in _LINE_TYPES, or None for any line that
+ # does not match any regular expression in _LINE_TYPES.
+ self.type = None
+
+ # True if no lines processed before this one have the same type
+ # as this line.
+ self.is_first_line_of_this_type = False
+
+ # Set to true if we want to delete/ignore this line in the output
+ # (for instance, because iwyu says to delete this line). At the
+ # start, the only line to delete is the 'dummy' line 0.
+ self.deleted = self.line is None
+
+ # If this line is an #include or a forward-declare, gives a
+ # [begin,end) pair saying the 'span' this line is part of. We do
+ # this for two types of span: the move span (an #include or
+ # forward declare, along with any preceding comments) and the
+ # reorder span (a continguous block of move-spans, connected only
+ # by blank lines and comments). For lines that are not an
+ # #include or forward-declare, these may have an arbitrary value.
+ self.move_span = None
+ self.reorder_span = None
+
+ # If this line is an #include or a forward-declare, gives the
+ # 'key' of the line. For #includes it is the filename included,
+ # including the ""s or <>s. For a forward-declare it's the name
+ # of the class/struct. For other types of lines, this is None.
+ self.key = None
+
+ def __str__(self):
+ if self.deleted:
+ line = 'XX-%s-XX' % self.line
+ else:
+ line = '>>>%s<<<' % self.line
+ if self.type is None:
+ type_id = None
+ else:
+ type_id = _LINE_TYPES.index(self.type)
+ return ('%s\n -- type: %s (key: %s). move_span: %s. reorder_span: %s'
+ % (line, type_id, self.key, self.move_span, self.reorder_span))
+
+
+def _ReadFile(filename):
+ """Read from filename and return a list of file lines."""
+ try:
+ return open(filename).read().splitlines()
+ except (IOError, OSError) as why:
+ print("Skipping '%s': %s" % (filename, why))
+ return None
+
+
+def _ReadWriteableFile(filename, ignore_writeable):
+ """Read from filename and return a list of file lines.
+
+ Given a filename, if the file is found and is writable, read
+ the file contents and return it as a list of lines (newlines
+ removed). If the file is not found or is not writable, or if
+ there is another IO error, return None.
+
+ Arguments:
+ filename: the name of the file to read.
+ ignore_writeable: if True, don't check whether the file is writeable;
+ return the contents anyway.
+
+ Returns:
+ A list of lines (without trailing newline) from filename, or None
+ if the file is not writable, or cannot be read.
+ """
+ if os.access(filename, os.W_OK) or ignore_writeable:
+ return _ReadFile(filename)
+ return None
+
+
+def _WriteFileContentsToFileObject(f, file_lines, line_ending):
+ """Write the given file-lines to the file."""
+ f.write(line_ending.join(file_lines))
+ f.write(line_ending)
+
+def _DetectLineEndings(filename):
+ """Detect line ending of given file."""
+
+ # Find out which file ending is used first. The
+ # first lines indicate the line ending for the whole file
+ # so pathological files with mixed endings aren't handled properly!
+ f = open(filename, 'U')
+ try:
+ while f.newlines is None:
+ if f.readline() == '':
+ break
+ return f.newlines if f.newlines != None and \
+ type(f.newlines) is not tuple else '\n'
+ finally:
+ f.close()
+
+def _WriteFileContents(filename, file_lines):
+ """Write the given file-lines to the file."""
+ try:
+ line_ending = _DetectLineEndings(filename)
+ # Open file in binary mode to preserve line endings
+ f = open(filename, 'wb')
+ try:
+ _WriteFileContentsToFileObject(f, file_lines, line_ending)
+ finally:
+ f.close()
+ except (IOError, OSError) as why:
+ print("Error writing '%s': %s" % (filename, why))
+
+
+def _CreateCommandLine(command, args):
+ """Join the command with the args in a shell-quoted way."""
+ ret = '%s %s' % (command, ' '.join(map(pipes.quote, args)))
+ print('Running: ' + ret)
+ return ret
+
+
+def _GetCommandOutputLines(command, args):
+ """Return an iterable over the output lines of the given shell command."""
+ full_command = _CreateCommandLine(command, args)
+ proc = subprocess.Popen(full_command, shell=True, stdout=subprocess.PIPE)
+ return proc.stdout
+
+
+def _RunCommand(command, args):
+ """Run the given shell command."""
+ for line in _GetCommandOutputLines(command, args):
+ print(line, end=None)
+
+
+def _GetCommandOutputWithInput(command, stdin_text):
+ """Return the output of the given command fed the stdin_text."""
+ print(command)
+ proc = subprocess.Popen(command,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ shell=True)
+ return proc.communicate(input=stdin_text)[0]
+
+
+def PrintFileDiff(old_file_contents, new_file_contents):
+ """Print a unified diff between files, specified as lists of lines."""
+ diff = difflib.unified_diff(old_file_contents, new_file_contents)
+ # skip the '--- <filename>/+++ <filename>' lines at the start
+ try:
+ next(diff)
+ next(diff)
+ print('\n'.join(l.rstrip() for l in diff))
+ except StopIteration:
+ pass
+
+
+def _MarkHeaderGuardIfPresent(file_lines):
+ """If any line in file_lines is a header-guard, mark it in file_lines.
+
+ We define a header-guard as follows: an #ifdef where there is
+ nothing contentful before or after the #ifdef. Also, the #ifdef
+ should have no #elif in it (though we don't currently test that).
+ This catches the common case of an 'ifdef guard' in .h file, such
+ as '#ifndef FOO_H\n#define FOO_H\n...contents...\n#endif', but it
+ can also catch other whole-program #ifdefs, such as
+ '#ifdef __linux\n...\n#endif'. The issue here is that if an #ifdef
+ encloses the entire file, then we are willing to put new
+ #includes/fwd-declares inside the #ifdef (which normally we
+ wouldn't do). So we want to mark such #ifdefs with a special label.
+
+ If we find such an #ifdef line -- and a single file can have at most
+ one -- we change its type to a special type for header guards.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type filled in.
+ """
+ # Pass over blank lines, pragmas and comments at the top of the file.
+ i = 0
+ for i in range(len(file_lines)):
+ if (not file_lines[i].deleted and
+ file_lines[i].type not in [_COMMENT_LINE_RE, _BLANK_LINE_RE,
+ _PRAGMA_ONCE_LINE_RE]):
+ break
+ else: # for/else: got to EOF without finding any non-blank/comment lines
+ return
+
+ # This next line is the candidate header guard-line.
+ ifdef_start = i
+ if file_lines[ifdef_start].type != _IF_RE:
+ # Not a header guard, just return without doing anything.
+ return
+
+ # Find the end of this ifdef, to see if it's really a header guard..
+ ifdef_depth = 0
+ for ifdef_end in range(ifdef_start, len(file_lines)):
+ if file_lines[ifdef_end].deleted:
+ continue
+ if file_lines[ifdef_end].type == _IF_RE:
+ ifdef_depth += 1
+ elif file_lines[ifdef_end].type == _ENDIF_RE:
+ ifdef_depth -= 1
+ if ifdef_depth == 0: # The end of our #ifdef!
+ break
+ else: # for/else
+ return False # Weird: never found a close to this #ifdef
+
+ # Finally, all the lines after the end of the ifdef must be blank or comments.
+ for i in range(ifdef_end + 1, len(file_lines)):
+ if (not file_lines[i].deleted and
+ file_lines[i].type not in [_COMMENT_LINE_RE, _BLANK_LINE_RE]):
+ return
+
+ # We passed the gauntlet!
+ file_lines[ifdef_start].type = _HEADER_GUARD_RE
+
+ # And the line after the header guard #ifdef is the '#define' (usually).
+ if _HEADER_GUARD_DEFINE_RE.match(file_lines[ifdef_start + 1].line):
+ file_lines[ifdef_start+1].type = _HEADER_GUARD_DEFINE_RE
+
+
+def _CalculateLineTypesAndKeys(file_lines, iwyu_record):
+ """Fills file_line's type and key fields, where the 'type' is a regexp object.
+
+ We match each line (line_info.line) against every regexp in
+ _LINE_TYPES, and assign the first that matches, or None if none
+ does. We also use iwyu_record's some_include_lines and
+ seen_forward_declare_lines to identify those lines. In fact,
+ that's the only data source we use for forward-declare lines.
+
+ Sets file_line.type and file_line.is_first_line_of_this_type for
+ each file_line in file_lines.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .line fields filled in.
+ iwyu_record: the IWYUOutputRecord struct for this source file.
+
+ Raises:
+ FixIncludesError: if iwyu_record's line-number information is
+ is inconsistent with what we see in the file. (For instance,
+ it says line 12 is an #include, but we say it's a blank line,
+ or the file only has 11 lines.)
+ """
+ seen_types = set()
+ in_c_style_comment = False
+ for line_info in file_lines:
+ if line_info.line is None:
+ line_info.type = None
+ elif _C_COMMENT_START_RE.match(line_info.line):
+ # Note: _C_COMMENT_START_RE only matches a comment at the start
+ # of a line. Comments in the middle of a line are ignored.
+ # This can cause problems with multi-line comments that start
+ # in the middle of the line, but that's hopefully quite rare.
+ # TODO(csilvers): check for that case.
+ m = _C_COMMENT_END_RE.match(line_info.line)
+ if not m: # comment continues onto future lines
+ line_info.type = _COMMENT_LINE_RE
+ in_c_style_comment = True
+ elif not m.group(1): # comment extends across entire line (only)
+ line_info.type = _COMMENT_LINE_RE
+ else: # comment takes only part of line, treat as content
+ # TODO(csilvers): this mis-diagnoses lines like '/*comment*/class Foo;'
+ line_info.type = None
+ elif in_c_style_comment and _C_COMMENT_END_RE.match(line_info.line):
+ line_info.type = _COMMENT_LINE_RE
+ in_c_style_comment = False
+ elif in_c_style_comment:
+ line_info.type = _COMMENT_LINE_RE
+ else:
+ for type_re in _LINE_TYPES:
+ # header-guard-define-re has a two-part decision criterion: it
+ # matches the RE, *and* it comes after a header guard line.
+ # That's too complex to figure out now, so we skip over it now
+ # and fix it up later in _MarkHeaderGuardIfPresent().
+ if type_re in (_HEADER_GUARD_DEFINE_RE,):
+ continue
+ m = type_re.match(line_info.line)
+ if m:
+ line_info.type = type_re
+ if type_re == _INCLUDE_RE:
+ line_info.key = m.group(1) # get the 'key' for the #include.
+ break
+ else: # for/else
+ line_info.type = None # means we didn't match any re
+
+ line_info.is_first_line_of_this_type = (line_info.type not in seen_types)
+ seen_types.add(line_info.type)
+
+ # Now double-check against iwyu that we got all the #include lines right.
+ for line_number in iwyu_record.some_include_lines:
+ if file_lines[line_number].type != _INCLUDE_RE:
+ raise FixIncludesError('iwyu line number %s:%d (%s) is not an #include'
+ % (iwyu_record.filename, line_number,
+ file_lines[line_number].line))
+
+ # We depend entirely on the iwyu_record for the forward-declare lines.
+ for (start_line, end_line) in iwyu_record.seen_forward_declare_lines:
+ for line_number in range(start_line, end_line):
+ if line_number >= len(file_lines):
+ raise FixIncludesError('iwyu line number %s:%d is past file-end'
+ % (iwyu_record.filename, line_number))
+ file_lines[line_number].type = _FORWARD_DECLARE_RE
+
+ # While we're at it, let's do a bit more sanity checking on iwyu_record.
+ for line_number in iwyu_record.lines_to_delete:
+ if line_number >= len(file_lines):
+ raise FixIncludesError('iwyu line number %s:%d is past file-end'
+ % (iwyu_record.filename, line_number))
+ elif file_lines[line_number].type not in (_INCLUDE_RE,
+ _FORWARD_DECLARE_RE):
+ raise FixIncludesError('iwyu line number %s:%d (%s) is not'
+ ' an #include or forward declare'
+ % (iwyu_record.filename, line_number,
+ file_lines[line_number].line))
+
+ # Check if this file has a header guard, which for our purposes is
+ # an #ifdef (or #if) that covers an entire source file. Usually
+ # this will be a standard .h header-guard, but it could be something
+ # like '#if __linux/#endif'. The point here is that if an #ifdef
+ # encloses the entire file, then we are willing to put new
+ # #includes/fwd-declares inside the #ifdef (which normally we
+ # wouldn't do). So we mark such #ifdefs with a special label.
+ _MarkHeaderGuardIfPresent(file_lines)
+
+
+def _PreviousNondeletedLine(file_lines, line_number):
+ """Returns the line number of the previous not-deleted line, or None."""
+ for line_number in range(line_number - 1, -1, -1):
+ if not file_lines[line_number].deleted:
+ return line_number
+ return None
+
+
+def _NextNondeletedLine(file_lines, line_number):
+ """Returns the line number of the next not-deleted line, or None."""
+ for line_number in range(line_number + 1, len(file_lines)):
+ if not file_lines[line_number].deleted:
+ return line_number
+ return None
+
+
+def _LineNumberStartingPrecedingComments(file_lines, line_number):
+ """Returns the line-number for the comment-lines preceding the given linenum.
+
+ Looking at file_lines, look at the lines immediately preceding the
+ given line-number. If they're comment lines, return the first line
+ of the comment lines preceding the given line. Otherwise, return
+ the given line number.
+
+ As a special case, if the comments go all the way up to the first
+ line of the file (line 1), we assume they're comment lines, which
+ are special -- they're not associated with any source code line --
+ and we return line_number in that case.
+
+ Arguments:
+ file_lines: an array of LineInfo objects, with .type fields filled in.
+ line_number: an index into file_lines.
+
+ Returns:
+ The first line number of the preceding comments, or line_number
+ if there are no preceding comments or they appear to be a
+ top-of-file copyright notice.
+ """
+ retval = line_number
+ while retval > 0 and file_lines[retval - 1].type == _COMMENT_LINE_RE:
+ retval -= 1
+ if retval <= 1: # top-of-line comments
+ retval = line_number # so ignore all the comment lines
+ return retval
+
+
+def _CalculateMoveSpans(file_lines, forward_declare_spans):
+ """Fills each input_line's move_span field.
+
+ A 'move span' is a range of lines (from file_lines) that includes
+ an #include or forward-declare, and all the comments preceding it.
+ It is the unit we would move if we decided to move (or delete) this
+ #include or forward-declare.
+
+ For lines of type _INCLUDE_RE or _FORWARD_DECLARE_RE, the move span
+ is set to the tuple [start_of_span, end_of_span). All other lines
+ have the move span kept at None.
+
+ Arguments:
+ file_lines: an array of LineInfo objects, with .type fields filled in.
+ forward_declare_spans: a set of line-number pairs
+ [start_line, end_line), each representing a single namespace.
+ In practice this comes from iwyu_record.seen_forward_declare_lines.
+ """
+ # First let's do #includes.
+ for line_number in range(len(file_lines)):
+ if file_lines[line_number].type == _INCLUDE_RE:
+ span_begin = _LineNumberStartingPrecedingComments(file_lines, line_number)
+ for i in range(span_begin, line_number + 1):
+ file_lines[i].move_span = (span_begin, line_number + 1)
+
+ # Now forward-declares. These spans come as input to this function.
+ for (span_begin, span_end) in forward_declare_spans:
+ span_begin = _LineNumberStartingPrecedingComments(file_lines, span_begin)
+ for i in range(span_begin, span_end):
+ file_lines[i].move_span = (span_begin, span_end)
+
+
+def _ContainsBarrierInclude(file_lines, line_range):
+ """Returns true iff some line in [line_range[0], line_range[1]) is BARRIER."""
+ for line_number in range(*line_range):
+ if (not file_lines[line_number].deleted and
+ _BARRIER_INCLUDES.search(file_lines[line_number].line)):
+ return True
+ return False
+
+
+def _LinesAreAllBlank(file_lines, start_line, end_line):
+ """Returns true iff all lines in [start_line, end_line) are blank/deleted."""
+ for line_number in range(start_line, end_line):
+ if (not file_lines[line_number].deleted and
+ file_lines[line_number].type != _BLANK_LINE_RE):
+ return False
+ return True
+
+
+def _CalculateReorderSpans(file_lines):
+ """Fills each input_line's reorder_span field.
+
+ A 'reorder span' is a range of lines (from file_lines) that only has
+ #includes and forward-declares in it (and maybe blank lines, and
+ comments associated with #includes or forward-declares). In
+ particular, it does not include any "real code" besides #includes
+ and forward-declares: no functions, no static variable assignment,
+ no macro #defines, no nothing. We are willing to reorder #includes
+ and namespaces freely inside a reorder span.
+
+ Calculating reorder_span is easy: they're just the union of
+ contiguous move-spans (with perhaps blank lines and comments
+ thrown in), because move-spans share the 'no actual code'
+ requirement.
+
+ There's one exception: if any move-span matches the
+ _BARRIER_INCLUDES regexp, it means that we should consider that
+ move-span to be a 'barrier': nothing should get reordered from one
+ side of that move-span to the other. (This is used for #includes
+ that depend on other #includes being before them to function
+ properly.) We do that by putting them into their own reorder span.
+
+ For lines of type _INCLUDE_RE or _FORWARD_DECLARE_RE, the reorder
+ span is set to the tuple [start_of_span, end_of_span). All other
+ lines have an arbitrary value for the reorder span.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type and .move_span
+ fields filled in.
+ """
+ # Happily, move_spans are disjoint. Just make sure they're sorted and unique.
+ move_spans = [s.move_span for s in file_lines if s.move_span is not None]
+ sorted_move_spans = sorted(set(move_spans))
+
+ i = 0
+ while i < len(sorted_move_spans):
+ reorder_span_start = sorted_move_spans[i][0]
+
+ # If we're a 'nosort' include, we're always in a reorder span of
+ # our own. Otherwise, add in the next move span if we're
+ # connected to it only by blank lines.
+ if not _ContainsBarrierInclude(file_lines, sorted_move_spans[i]):
+ while i < len(sorted_move_spans) - 1:
+ move_span_end = sorted_move_spans[i][1]
+ next_move_span_start = sorted_move_spans[i+1][0]
+ if (_LinesAreAllBlank(file_lines, move_span_end, next_move_span_start)
+ and not _ContainsBarrierInclude(file_lines, sorted_move_spans[i+1])):
+ i += 1
+ else:
+ break
+ reorder_span_end = sorted_move_spans[i][1]
+ # We'll map every line in the span to the span-extent.
+ for line_number in range(reorder_span_start, reorder_span_end):
+ file_lines[line_number].reorder_span = (reorder_span_start,
+ reorder_span_end)
+ i += 1
+
+
+def ParseOneFile(f, iwyu_record):
+ """Given a file object, read and classify the lines of the file.
+
+ For each file that iwyu_output mentions, we return a list of LineInfo
+ objects, which is a parsed version of each line, including not only
+ its content but its 'type', its 'key', etc.
+
+ Arguments:
+ f: an iterable object returning lines from a file.
+ iwyu_record: the IWYUOutputRecord struct for this source file.
+
+ Returns:
+ An array of LineInfo objects. The first element is always a dummy
+ element, so the first line of the file is at retval[1], matching
+ the way iwyu counts line numbers.
+ """
+ file_lines = [LineInfo(None)]
+ for line in f:
+ file_lines.append(LineInfo(line))
+ _CalculateLineTypesAndKeys(file_lines, iwyu_record)
+ _CalculateMoveSpans(file_lines, iwyu_record.seen_forward_declare_lines)
+ _CalculateReorderSpans(file_lines)
+ return file_lines
+
+
+def _DeleteEmptyNamespaces(file_lines):
+ """Delete namespaces with nothing in them.
+
+ Empty namespaces could be caused by transformations that removed
+ forward-declarations:
+ namespace foo {
+ class Myclass;
+ }
+ ->
+ namespace foo {
+ }
+ We want to get rid of the 'empty' namespace in this case.
+
+ This routine 'deletes' lines by setting their 'deleted' field to True.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type fields filled in.
+
+ Returns:
+ The number of namespaces deleted.
+ """
+ num_namespaces_deleted = 0
+ start_line = 0
+ while start_line < len(file_lines):
+ line_info = file_lines[start_line]
+ if line_info.deleted or line_info.type != _NAMESPACE_START_RE:
+ start_line += 1
+ continue
+ # Because multiple namespaces can be on one line
+ # ("namespace foo { namespace bar { ..."), we need to count.
+ # We use the max because line may have 0 '{'s if it's a macro.
+ # TODO(csilvers): ignore { in comments.
+ namespace_depth = max(line_info.line.count('{'), 1)
+ end_line = start_line + 1
+ while end_line < len(file_lines):
+ line_info = file_lines[end_line]
+ if line_info.deleted:
+ end_line += 1
+ elif line_info.type in (_COMMENT_LINE_RE, _BLANK_LINE_RE):
+ end_line += 1 # ignore blank lines
+ elif line_info.type == _NAMESPACE_START_RE: # nested namespace
+ namespace_depth += max(line_info.line.count('{'), 1)
+ end_line += 1
+ elif line_info.type == _NAMESPACE_END_RE:
+ namespace_depth -= max(line_info.line.count('}'), 1)
+ end_line += 1
+ if namespace_depth <= 0:
+ # Delete any comments preceding this namespace as well.
+ start_line = _LineNumberStartingPrecedingComments(file_lines,
+ start_line)
+ # And also blank lines.
+ while (start_line > 0 and
+ file_lines[start_line-1].type == _BLANK_LINE_RE):
+ start_line -= 1
+ for line_number in range(start_line, end_line):
+ file_lines[line_number].deleted = True
+ num_namespaces_deleted += 1
+ break
+ else: # bail: we're at a line indicating this isn't an empty namespace
+ end_line = start_line + 1 # rewind to try again with nested namespaces
+ break
+ start_line = end_line
+
+ return num_namespaces_deleted
+
+
+def _DeleteEmptyIfdefs(file_lines):
+ """Deletes ifdefs with nothing in them.
+
+ This could be caused by transformations that removed #includes:
+ #ifdef OS_WINDOWS
+ # include <windows.h>
+ #endif
+ ->
+ #ifdef OS_WINDOWS
+ #endif
+ We want to get rid of the 'empty' #ifdef in this case.
+ We also handle 'empty' #ifdefs with #else, if both sides of
+ the #else are empty. We also handle #ifndef and #if.
+
+ This routine 'deletes' lines by replacing their content with None.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type fields filled in.
+
+ Returns:
+ The number of ifdefs deleted.
+ """
+ num_ifdefs_deleted = 0
+ start_line = 0
+ while start_line < len(file_lines):
+ if file_lines[start_line].type not in (_IF_RE, _HEADER_GUARD_RE):
+ start_line += 1
+ continue
+ end_line = start_line + 1
+ while end_line < len(file_lines):
+ line_info = file_lines[end_line]
+ if line_info.deleted:
+ end_line += 1
+ elif line_info.type in (_ELSE_RE, _COMMENT_LINE_RE, _BLANK_LINE_RE):
+ end_line += 1 # ignore blank lines
+ elif line_info.type == _ENDIF_RE:
+ end_line += 1
+ # Delete any comments preceding this #ifdef as well.
+ start_line = _LineNumberStartingPrecedingComments(file_lines,
+ start_line)
+ # And also blank lines.
+ while (start_line > 0 and
+ file_lines[start_line-1].type == _BLANK_LINE_RE):
+ start_line -= 1
+ for line_number in range(start_line, end_line):
+ file_lines[line_number].deleted = True
+ num_ifdefs_deleted += 1
+ break
+ else: # bail: we're at a line indicating this isn't an empty ifdef
+ end_line = start_line + 1 # rewind to try again with nested #ifdefs
+ break
+ start_line = end_line
+
+ return num_ifdefs_deleted
+
+
+def _DeleteDuplicateLines(file_lines, line_ranges):
+ """Goes through all lines in line_ranges, and if any are dups, deletes them.
+
+ For all lines in line_ranges, if any is the same as a previously
+ seen line, set its deleted bit to True. The purpose of line_ranges
+ is to avoid lines in #ifdefs and namespaces, that may be identical
+ syntactically but have different semantics. Ideally, line_ranges
+ should include only 'top-level' lines.
+
+ We ignore lines that consist only of comments (or are blank). We
+ ignore end-of-line comments when comparing lines for equality.
+ NOTE: Because our comment-finding RE is primitive, it's best if
+ line_ranges covers only #include and forward-declare lines. In
+ particular, it should not cover lines that may have C literal
+ strings in them.
+
+ Arguments:
+ file_lines: an array of LineInfo objects.
+ line_ranges: a list of [start_line, end_line) pairs.
+ """
+ seen_lines = set()
+ for line_range in line_ranges:
+ for line_number in range(*line_range):
+ if file_lines[line_number].type in (_BLANK_LINE_RE, _COMMENT_LINE_RE):
+ continue
+ uncommented_line = _COMMENT_RE.sub('', file_lines[line_number].line)
+ if uncommented_line in seen_lines:
+ file_lines[line_number].deleted = True
+ elif not file_lines[line_number].deleted:
+ seen_lines.add(uncommented_line)
+
+
+def _DeleteExtraneousBlankLines(file_lines, line_range):
+ """Deletes extraneous blank lines caused by line deletion.
+
+ Here's a example file:
+ class Foo { ... };
+
+ class Bar;
+
+ class Baz { ... }
+
+ If we delete the "class Bar;" line, we also want to delete one of
+ the blank lines around it, otherwise we leave two blank lines
+ between Foo and Baz which looks bad. The idea is that if we have
+ whitespace on both sides of a deleted span of code, the whitespace
+ on one of the sides is 'extraneous'. In this case, we should delete
+ not only 'class Bar;' but also the whitespace line below it. That
+ leaves one blank line between Foo and Bar, like people would expect.
+
+ We're careful to only delete the minimum of the number of blank
+ lines that show up on either side. If 'class Bar' had one blank
+ line before it, and one hundred after it, we'd only delete one blank
+ line when we delete 'class Bar'. This matches user's expecatations.
+
+ The situation can get tricky when two deleted spans touch (we might
+ think it's safe to delete the whitespace between them when it's
+ not). To be safe, we only do this check when an entire reorder-span
+ has been deleted. So we check the given line_range, and only do
+ blank-line deletion if every line in the range is deleted.
+
+ Arguments:
+ file_lines: an array of LineInfo objects, with .type filled in.
+ line_range: a range [start_line, end_line). It should correspond
+ to a reorder-span.
+ """
+ # First make sure the entire span is deleted.
+ for line_number in range(*line_range):
+ if not file_lines[line_number].deleted:
+ return
+
+ before_line = _PreviousNondeletedLine(file_lines, line_range[0])
+ after_line = _NextNondeletedLine(file_lines, line_range[1] - 1)
+ while (before_line and file_lines[before_line].type == _BLANK_LINE_RE and
+ after_line and file_lines[after_line].type == _BLANK_LINE_RE):
+ # OK, we've got whitespace on both sides of a deleted span. We
+ # only want to keep whitespace on one side, so delete on the other.
+ file_lines[after_line].deleted = True
+ before_line = _PreviousNondeletedLine(file_lines, before_line)
+ after_line = _NextNondeletedLine(file_lines, after_line)
+
+
+def _ShouldInsertBlankLine(decorated_move_span, next_decorated_move_span,
+ file_lines, flags):
+ """Returns true iff we should insert a blank line between the two spans.
+
+ Given two decorated move-spans, of the form
+ (reorder_range, kind, noncomment_lines, all_lines)
+ returns true if we should insert a blank line between them. We
+ always put a blank line when transitioning from an #include to a
+ forward-declare and back. When the appropriate commandline flag is
+ set, we also put a blank line between the 'main' includes (foo.h)
+ and the C/C++ system includes, and another between the system
+ includes and the rest of the Google includes.
+
+ If the two move spans are in different reorder_ranges, that means
+ the first move_span is at the end of a reorder range. In that case,
+ a different rule for blank lines applies: if the next line is
+ contentful (eg 'static int x = 5;'), or a namespace start, we want
+ to insert a blank line to separate the move-span from the next
+ block. When figuring out if the next line is contentful, we skip
+ over comments.
+
+ Arguments:
+ decorated_move_span: a decorated_move_span we may want to put a blank
+ line after.
+ next_decorated_move_span: the next decorated_move_span, which may
+ be a sentinel decorated_move_span at end-of-file.
+ file_lines: an array of LineInfo objects with .deleted filled in.
+ flags: commandline flags, as parsed by optparse. We use
+ flags.blank_lines, which controls whether we put blank
+ lines between different 'kinds' of #includes.
+
+ Returns:
+ true if we should insert a blank line after decorated_move_span.
+ """
+ # First handle the 'at the end of a reorder range' case.
+ if decorated_move_span[0] != next_decorated_move_span[0]:
+ next_line = _NextNondeletedLine(file_lines, decorated_move_span[0][1] - 1)
+ # Skip over comments to figure out if the next line is contentful.
+ while (next_line and next_line < len(file_lines) and
+ file_lines[next_line].type == _COMMENT_LINE_RE):
+ next_line += 1
+ return (next_line and next_line < len(file_lines) and
+ file_lines[next_line].type in (_NAMESPACE_START_RE, None))
+
+ # We never insert a blank line between two spans of the same kind.
+ # Nor do we ever insert a blank line at EOF.
+ (this_kind, next_kind) = (decorated_move_span[1], next_decorated_move_span[1])
+ if this_kind == next_kind or next_kind == _EOF_KIND:
+ return False
+
+ # We also never insert a blank line between C and C++-style #includes,
+ # no matter what the flag value.
+ if (this_kind in [_C_SYSTEM_INCLUDE_KIND, _CXX_SYSTEM_INCLUDE_KIND] and
+ next_kind in [_C_SYSTEM_INCLUDE_KIND, _CXX_SYSTEM_INCLUDE_KIND]):
+ return False
+
+ # Handle the case we're going from an include to fwd declare or
+ # back. If we get here, we can't both be fwd-declares, so it
+ # suffices to check if either of us is.
+ if this_kind == _FORWARD_DECLARE_KIND or next_kind == _FORWARD_DECLARE_KIND:
+ return True
+
+ # Now, depending on the flag, we insert a blank line whenever the
+ # kind changes (we handled the one case where a changing kind
+ # doesn't introduce a blank line, above).
+ if flags.blank_lines:
+ return this_kind != next_kind
+
+ return False
+
+
+def _GetToplevelReorderSpans(file_lines):
+ """Returns a sorted list of all reorder_spans not inside an #ifdef/namespace.
+
+ This routine looks at all the reorder_spans in file_lines, ignores
+ reorder spans inside #ifdefs and namespaces -- except for the 'header
+ guard' ifdef that encapsulates an entire .h file -- and returns the
+ rest in sorted order.
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type and
+ .reorder_span filled in.
+
+ Returns:
+ A list of [start_line, end_line) reorder_spans.
+ """
+ in_ifdef = [False] * len(file_lines) # lines inside an #if
+ ifdef_depth = 0
+ for line_number in range(len(file_lines)):
+ line_info = file_lines[line_number]
+ if line_info.deleted:
+ continue
+ if line_info.type == _IF_RE: # does not cover the header-guard ifdef
+ ifdef_depth += 1
+ elif line_info.type == _ENDIF_RE:
+ ifdef_depth -= 1
+ if ifdef_depth > 0:
+ in_ifdef[line_number] = True
+
+ # Figuring out whether a } ends a namespace or some other languague
+ # construct is hard, so as soon as we see any 'contentful' line
+ # inside a namespace, we assume the entire rest of the file is in
+ # the namespace.
+ in_namespace = [False] * len(file_lines)
+ namespace_depth = 0
+ for line_number in range(len(file_lines)):
+ line_info = file_lines[line_number]
+ if line_info.deleted:
+ continue
+ if line_info.type == _NAMESPACE_START_RE:
+ # The 'max' is because the namespace-re may be a macro.
+ namespace_depth += max(line_info.line.count('{'), 1)
+ elif line_info.type == _NAMESPACE_END_RE:
+ namespace_depth -= max(line_info.line.count('}'), 1)
+ if namespace_depth > 0:
+ in_namespace[line_number] = True
+ if line_info.type is None:
+ for i in range(line_number, len(file_lines)): # rest of file
+ in_namespace[i] = True
+ break
+
+ reorder_spans = [fl.reorder_span for fl in file_lines if fl.reorder_span]
+ reorder_spans = sorted(set(reorder_spans))
+ good_reorder_spans = []
+ for reorder_span in reorder_spans:
+ for line_number in range(*reorder_span):
+ if in_ifdef[line_number] or in_namespace[line_number]:
+ break
+ else: # for/else
+ good_reorder_spans.append(reorder_span) # never in ifdef or namespace
+
+ return good_reorder_spans
+
+
+def _GetFirstNamespaceLevelReorderSpan(file_lines):
+ """Returns the first reorder-span inside a namespace, if it's easy to do.
+
+ This routine is meant to handle the simple case where code consists
+ of includes and forward-declares, and then a 'namespace
+ my_namespace'. We return the reorder span of the inside-namespace
+ forward-declares, which is a good place to insert new
+ inside-namespace forward-declares (rather than putting these new
+ forward-declares at the top level).
+
+ So it goes through the top of the file, stopping at the first
+ 'contentful' line. If that line has the form 'namespace <foo> {',
+ it then continues until it finds a forward-declare line, or a
+ non-namespace contentful line. In the former case, it figures out
+ the reorder-span this forward-declare line is part of, while in the
+ latter case it creates a new reorder-span. It returns
+ (enclosing_namespaces, reorder_span).
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type and
+ .reorder_span filled in.
+
+ Returns:
+ (None, None) if we could not find a first namespace-level
+ reorder-span, or (enclosing_namespaces, reorder_span), where
+ enclosing_namespaces is a string that looks like (for instance)
+ 'namespace ns1 { namespace ns2 {', and reorder-span is a
+ [start_line, end_line) pair.
+ """
+ simple_namespace_re = re.compile(r'^\s*namespace\s+([^{\s]+)\s*\{\s*(//.*)?$')
+ namespace_prefix = ''
+
+ for line_number in range(len(file_lines)):
+ line_info = file_lines[line_number]
+
+ if line_info.deleted:
+ continue
+
+ # If we're an empty line, just ignore us. Likewise with #include
+ # lines, which aren't 'contentful' for our purposes, and the
+ # header guard, which is (by definition) the only kind of #ifdef
+ # that we can be inside and still considered at the "top level".
+ if line_info.type in (_COMMENT_LINE_RE, _BLANK_LINE_RE, _INCLUDE_RE,
+ _HEADER_GUARD_RE, _HEADER_GUARD_DEFINE_RE,
+ _PRAGMA_ONCE_LINE_RE):
+ continue
+
+ # If we're a 'contentful' line such as a (non-header-guard) #ifdef, bail.
+ elif line_info.type in (_IF_RE, _NAMESPACE_END_RE, _ELSE_RE, _ENDIF_RE,
+ None): # None is a 'normal' contentful line
+ # TODO(csilvers): we could probably keep going if there are no
+ # braces on the line. We could also keep track of our #ifdef
+ # depth instead of bailing on #else and #endif, and only accept
+ # the fwd-decl-inside-namespace if it's at ifdef-depth 0.
+ break
+
+ elif line_info.type == _NAMESPACE_START_RE:
+ # Only handle the simple case of 'namespace <foo> {'
+ m = simple_namespace_re.match(line_info.line)
+ if not m:
+ break
+ namespace_prefix += ('namespace %s { ' % m.group(1).strip())
+
+ elif line_info.type == _FORWARD_DECLARE_RE:
+ # If we're not in a namespace, keep going. Otherwise, this is
+ # just the situation we're looking for!
+ if namespace_prefix:
+ return (namespace_prefix, line_info.reorder_span)
+
+ else:
+ # We should have handled all the cases above!
+ assert False, ('unknown line-info type',
+ _LINE_TYPES.index(line_info.type))
+
+ # We stopped because we hit a contentful line (or, possibly, a
+ # weird-looking namespace). If we're inside the first-namespace,
+ # return this position as a good place to insert forward-declares.
+ if namespace_prefix:
+ return (namespace_prefix, (line_number, line_number))
+ return (None, None)
+
+
+# These are potential 'kind' arguments to _FirstReorderSpanWith.
+# We also sort our output in this order, to the extent possible.
+_MAIN_CU_INCLUDE_KIND = 1 # e.g. #include "foo.h" when editing foo.cc
+_C_SYSTEM_INCLUDE_KIND = 2 # e.g. #include <stdio.h>
+_CXX_SYSTEM_INCLUDE_KIND = 3 # e.g. #include <vector>
+_NONSYSTEM_INCLUDE_KIND = 4 # e.g. #include "bar.h"
+_PROJECT_INCLUDE_KIND = 5 # e.g. #include "myproject/quux.h"
+_FORWARD_DECLARE_KIND = 6 # e.g. class Baz;
+_EOF_KIND = 7 # used at eof
+
+
+def _IsSystemInclude(line_info):
+ """Given a line-info, return true iff the line is a <>-style #include."""
+ # The key for #includes includes the <> or "", so this is easy. :-)
+ return line_info.type == _INCLUDE_RE and line_info.key[0] == '<'
+
+
+def _IsMainCUInclude(line_info, filename):
+ """Given a line-info, return true iff the line is a 'main-CU' #include line.
+
+ A 'main-CU' #include line is one that is related to the file being edited.
+ For instance, if we are editing foo.cc, foo.h is a main-CU #include, as
+ is foo-inl.h. The same holds if we are editing foo_test.cc.
+
+ The algorithm is like so: first, canonicalize the includee by removing the
+ following suffixes:
+ -inl.h .h
+
+ Then canonicalize the includer by removing file extension and then the
+ following suffixes:
+ _unittest _regtest _test
+
+ Rule 1: If the canonical names (filenames after removal) match --
+ including all directories -- the .h file is a main-cu #include.
+
+ Rule 2: If the basenames of the canonnical names match -- that is,
+ ignoring all directories -- the .h file is a main-cu #include *if*
+ it is the first #include seen.
+
+ Arguments:
+ line_info: a LineInfo structure with .type,
+ .is_first_line_of_this_type, and .key filled in.
+ filename: the name of the file being edited.
+
+ Returns:
+ True if line_info is an #include of a main_CU file, False else.
+ """
+ if line_info.type != _INCLUDE_RE or _IsSystemInclude(line_info):
+ return False
+ # First, normalize the includee by getting rid of -inl.h and .h
+ # suffixes (for the #include) and the "'s around the #include line.
+ canonical_include = re.sub(r'(-inl\.h|\.h|\.H)$',
+ '', line_info.key.replace('"', ''))
+ # Then normalize includer by stripping extension and Google's test suffixes.
+ canonical_file, _ = os.path.splitext(filename)
+ canonical_file = re.sub(r'(_unittest|_regtest|_test)$', '', canonical_file)
+ # .h files in /public/ match .cc files in /internal/.
+ canonical_include2 = re.sub(r'/public/', '/internal/', canonical_include)
+
+ # Rule 1:
+ if canonical_file in (canonical_include, canonical_include2):
+ return True
+ # Rule 2:
+ if (line_info.is_first_line_of_this_type and
+ os.path.basename(canonical_file) == os.path.basename(canonical_include)):
+ return True
+
+ return False
+
+
+def _GetPathRoot(path):
+ """ Return the root of a path, i.e. the first path component.
+ We allow / as an alternative path separator on Windows because it helps with
+ testing and forward slashes are common even on Windows in portable codebases.
+ """
+ first_sep = path.find(os.path.sep)
+ if os.path.sep != '/' and first_sep == -1:
+ first_sep = path.find('/')
+
+ if first_sep == -1:
+ return None
+
+ return path[0:first_sep]
+
+
+def _IsSameProject(line_info, edited_file, project):
+ """Return true if included file and edited file are in the same project.
+
+ An included_file is in project 'project' if the project is a prefix of the
+ included_file. 'project' should end with /.
+
+ As a special case, if project is '<tld>', then the project is defined to
+ be the top-level directory of edited_file.
+
+ Arguments:
+ line_info: a LineInfo structure with .key containing the file that is
+ being included.
+ edited_file: the name of the file being edited.
+ project: if '<tld>', set the project path to be the top-level directory
+ name of the file being edited. If not '<tld>', this value is used to
+ specify the project directory.
+
+ Returns:
+ True if line_info and filename belong in the same project, False otherwise.
+ """
+ included_file = line_info.key[1:]
+ if project != '<tld>':
+ return included_file.startswith(project)
+ included_root = _GetPathRoot(included_file)
+ edited_root = _GetPathRoot(edited_file)
+ return (included_root and edited_root and included_root == edited_root)
+
+
+def _GetLineKind(file_line, filename, separate_project_includes):
+ """Given a file_line + file being edited, return best *_KIND value or None."""
+ line_without_coments = _COMMENT_RE.sub('', file_line.line)
+ if file_line.deleted:
+ return None
+ elif _IsMainCUInclude(file_line, filename):
+ return _MAIN_CU_INCLUDE_KIND
+ elif _IsSystemInclude(file_line) and '.' in line_without_coments:
+ return _C_SYSTEM_INCLUDE_KIND
+ elif _IsSystemInclude(file_line):
+ return _CXX_SYSTEM_INCLUDE_KIND
+ elif file_line.type == _INCLUDE_RE:
+ if (separate_project_includes and
+ _IsSameProject(file_line, filename, separate_project_includes)):
+ return _PROJECT_INCLUDE_KIND
+ return _NONSYSTEM_INCLUDE_KIND
+ elif file_line.type == _FORWARD_DECLARE_RE:
+ return _FORWARD_DECLARE_KIND
+ else:
+ return None
+
+
+def _FirstReorderSpanWith(file_lines, good_reorder_spans, kind, filename,
+ flags):
+ """Returns [start_line,end_line) of 1st reorder_span with a line of kind kind.
+
+ This function iterates over all the reorder_spans in file_lines, and
+ calculates the first one that has a line of the given kind in it.
+ If no such reorder span is found, it takes the last span of 'lower'
+ kinds (main-cu kind is lowest, forward-declare is highest). If no
+ such reorder span is found, it takes the first span of 'higher'
+ kind, but not considering the forward-declare kind (we don't want to
+ put an #include with the first forward-declare, because it may be
+ inside a class or something weird). If there's *still* no match, we
+ return the first line past leading comments, whitespace, and #ifdef
+ guard lines. If there's *still* no match, we just insert at
+ end-of-file.
+
+ As a special case, we never return a span for forward-declares that is
+ after 'contentful' code, even if other forward-declares are there.
+ For instance:
+ using Foo::Bar;
+ class Bang;
+ We want to make sure to put 'namespace Foo { class Bar; }'
+ *before* the using line!
+
+ kind is one of the following enums, with examples:
+ _MAIN_CU_INCLUDE_KIND: #include "foo.h" when editing foo.cc
+ _C_SYSTEM_INCLUDE_KIND: #include <stdio.h>
+ _CXX_SYSTEM_INCLUDE_KIND: #include <vector>
+ _NONSYSTEM_INCLUDE_KIND: #include "bar.h"
+ _PROJECT_INCLUDE_KIND: #include "myproject/quux.h"
+ _FORWARD_DECLARE_KIND: class Baz;
+
+ Arguments:
+ file_lines: an array of LineInfo objects with .type and
+ .reorder_span filled in.
+ good_reorder_spans: a sorted list of reorder_spans to consider
+ (should not include reorder_spans inside #ifdefs or
+ namespaces).
+ kind: one of *_KIND values.
+ filename: the name of the file that file_lines comes from.
+ This is passed to _GetLineKind (are we a main-CU #include?)
+ flags: commandline flags, as parsed by optparse. We use
+ flags.separate_project_includes to sort the #includes for the
+ current project separately from other #includes.
+
+ Returns:
+ A pair of line numbers, [start_line, end_line), that is the 'best'
+ reorder_span in file_lines for the given kind.
+ """
+ assert kind in (_MAIN_CU_INCLUDE_KIND, _C_SYSTEM_INCLUDE_KIND,
+ _CXX_SYSTEM_INCLUDE_KIND, _NONSYSTEM_INCLUDE_KIND,
+ _PROJECT_INCLUDE_KIND, _FORWARD_DECLARE_KIND), kind
+ # Figure out where the first 'contentful' line is (after the first
+ # 'good' span, so we skip past header guards and the like). Basically,
+ # the first contentful line is a line not in any reorder span.
+ for i in range(len(good_reorder_spans) - 1):
+ if good_reorder_spans[i][1] != good_reorder_spans[i+1][0]:
+ first_contentful_line = good_reorder_spans[i][1]
+ break
+ else: # got to the end of the file without finding a break in the spans
+ if good_reorder_spans:
+ first_contentful_line = good_reorder_spans[-1][1]
+ else:
+ first_contentful_line = 0
+
+ # Let's just find the first and last span for each kind.
+ first_reorder_spans = {}
+ last_reorder_spans = {}
+ for reorder_span in good_reorder_spans:
+ for line_number in range(*reorder_span):
+ line_kind = _GetLineKind(file_lines[line_number], filename,
+ flags.separate_project_includes)
+ # Ignore forward-declares that come after 'contentful' code; we
+ # never want to insert new forward-declares there.
+ if (line_kind == _FORWARD_DECLARE_KIND and
+ line_number > first_contentful_line):
+ continue
+ if line_kind is not None:
+ first_reorder_spans.setdefault(line_kind, reorder_span)
+ last_reorder_spans[line_kind] = reorder_span
+
+ # Find the first span of our kind.
+ if kind in first_reorder_spans:
+ return first_reorder_spans[kind]
+
+ # Second choice: last span of the kinds above us:
+ for backup_kind in range(kind - 1, _MAIN_CU_INCLUDE_KIND - 1, -1):
+ if backup_kind in last_reorder_spans:
+ return last_reorder_spans[backup_kind]
+
+ # Third choice: first span of the kinds below us, but not counting
+ # _FORWARD_DECLARE_KIND.
+ for backup_kind in range(kind + 1, _FORWARD_DECLARE_KIND):
+ if backup_kind in first_reorder_spans:
+ return first_reorder_spans[backup_kind]
+
+ # There are no reorder-spans at all, or they are only
+ # _FORWARD_DECLARE spans. Return the first line past the leading
+ # comments, whitespace, and #ifdef guard lines, or the beginning
+ # of the _FORWARD_DECLARE span, whichever is smaller.
+ line_number = 0
+ seen_header_guard = False
+ while line_number < len(file_lines):
+ if file_lines[line_number].deleted:
+ line_number += 1
+ elif file_lines[line_number].type == _HEADER_GUARD_RE:
+ seen_header_guard = True
+ line_number += 2 # skip over the header guard
+ elif file_lines[line_number].type == _BLANK_LINE_RE:
+ line_number += 1
+ elif file_lines[line_number].type == _PRAGMA_ONCE_LINE_RE:
+ seen_header_guard = True
+ line_number += 1
+ elif (file_lines[line_number].type == _COMMENT_LINE_RE
+ and not seen_header_guard):
+ # We put #includes after top-of-file comments. But comments
+ # inside the header guard are no longer top-of-file comments;
+ # #includes go before them.
+ line_number += 1
+ else:
+ # If the "first line" we would return is inside the forward-declare
+ # reorder span, just return that span, rather than creating a new
+ # span inside the existing one.
+ if first_reorder_spans:
+ assert list(first_reorder_spans.keys()) == [_FORWARD_DECLARE_KIND], \
+ first_reorder_spans
+ if line_number >= first_reorder_spans[_FORWARD_DECLARE_KIND][0]:
+ return first_reorder_spans[_FORWARD_DECLARE_KIND]
+ return (line_number, line_number)
+
+ # OK, I guess just insert at the end of the file
+ return (len(file_lines), len(file_lines))
+
+
+def _RemoveNamespacePrefix(fwd_decl_iwyu_line, namespace_prefix):
+ """Return a version of the input line with namespace_prefix removed, or None.
+
+ If fwd_decl_iwyu_line is
+ namespace ns1 { namespace ns2 { namespace ns3 { foo } } }
+ and namespace_prefix = 'namespace ns1 { namespace ns2 {', then
+ this function returns 'namespace ns3 { foo }'. It removes the
+ namespace_prefix, and any } }'s at the end of the line. If line
+ does not fit this form, then this function returns None.
+
+ Arguments:
+ line: a line from iwyu about a forward-declare line to add
+ namespace_prefix: a non-empty string of the form
+ namespace <ns1> { namespace <ns2> { [...]
+
+ Returns:
+ A version of the input line with the namespaces in namespace
+ prefix removed, or None if this is not possible because the input
+ line is not of the right form.
+ """
+ assert namespace_prefix, "_RemoveNamespaces requires a non-empty prefix"
+ if not fwd_decl_iwyu_line.startswith(namespace_prefix):
+ return None
+
+ # Remove the prefix
+ fwd_decl_iwyu_line = fwd_decl_iwyu_line[len(namespace_prefix):].lstrip()
+
+ # Remove the matching trailing }'s, preserving comments.
+ num_braces = namespace_prefix.count('{')
+ ending_braces_re = re.compile(r'(\s*\}){%d}\s*$' % num_braces)
+ m = ending_braces_re.search(fwd_decl_iwyu_line)
+ if not m:
+ return None
+ fwd_decl_iwyu_line = fwd_decl_iwyu_line[:m.start(0)]
+
+ return fwd_decl_iwyu_line
+
+
+def _DecoratedMoveSpanLines(iwyu_record, file_lines, move_span_lines, flags):
+ """Given a span of lines from file_lines, returns a "decorated" result.
+
+ First, we construct the actual contents of the move-span, as a list
+ of strings (one per line). If we see an #include in the move_span,
+ we replace its comments with the ones in iwyu_record, if present
+ (iwyu_record will never have any comments if flags.comments is
+ False).
+
+ Second, we construct a string, of the 'contentful' part of the
+ move_span -- that is, without the leading comments -- with
+ whitespace removed, and a few other changes made. This is used for
+ sorting (we remove whitespace so '# include <foo>' compares properly
+ against '#include <bar>').
+
+ Third, we figure out the 'kind' of this span: system include,
+ main-cu include, etc.
+
+ We return all of these together in a tuple, along with the
+ reorder-span this move span is inside. We pick the best
+ reorder-span if one isn't already present (because it's an
+ #include we're adding in, for instance.) This allows us to sort
+ all the moveable content.
+
+ Arguments:
+ iwyu_record: the IWYUOutputRecord struct for this source file.
+ file_lines: a list of LineInfo objects holding the parsed output of
+ the file in iwyu_record.filename
+ move_span_lines: A list of LineInfo objects. For #includes and
+ forward-declares already in the file, this will be a sub-list
+ of file_lines. For #includes and forward-declares we're adding
+ in, it will be a newly created list.
+ flags: commandline flags, as parsed by optparse. We use
+ flags.separate_project_includes to sort the #includes for the
+ current project separately from other #includes.
+
+ Returns:
+ A tuple (reorder_span, kind, sort_key, all_lines_as_list)
+ sort_key is the 'contentful' part of the move_span, which whitespace
+ removed, and -inl.h changed to _inl.h (so it sorts later).
+ all_lines_as_list is a list of strings, not of LineInfo objects.
+ Returns None if the move-span has been deleted, or for some other
+ reason lacks an #include or forward-declare line.
+ """
+ # Get to the first contentful line.
+ for i in range(len(move_span_lines)):
+ if (not move_span_lines[i].deleted and
+ move_span_lines[i].type in (_INCLUDE_RE, _FORWARD_DECLARE_RE)):
+ first_contentful_line = i
+ break
+ else: # for/else
+ # No include or forward-declare line seen, must be a deleted span.
+ return None
+
+ firstline = move_span_lines[first_contentful_line]
+ m = _INCLUDE_RE.match(firstline.line)
+ if m:
+ # If we're an #include, the contentful lines are easy. But we have
+ # to do the comment-replacing first.
+ sort_key = firstline.line
+ iwyu_version = iwyu_record.full_include_lines.get(m.group(1), '')
+ if _COMMENT_LINE_RE.search(iwyu_version): # the iwyu version has comments
+ sort_key = iwyu_version # replace the comments
+ all_lines = ([li.line for li in move_span_lines[:-1] if not li.deleted] +
+ [sort_key])
+ else:
+ # We're a forward-declare. Also easy.
+ contentful_list = [li.line for li in move_span_lines[first_contentful_line:]
+ if not li.deleted]
+ sort_key = ''.join(contentful_list)
+ all_lines = [li.line for li in move_span_lines if not li.deleted]
+
+ # Get rid of whitespace in the contentful_lines
+ sort_key = re.sub(r'\s+', '', sort_key)
+ # Replace -inl.h with _inl.h so foo-inl.h sorts after foo.h in #includes.
+ sort_key = sort_key.replace('-inl.h', '_inl.h')
+
+ # Next figure out the kind.
+ kind = _GetLineKind(firstline, iwyu_record.filename,
+ flags.separate_project_includes)
+
+ # All we're left to do is the reorder-span we're in. Hopefully it's easy.
+ reorder_span = firstline.reorder_span
+ if reorder_span is None: # must be a new #include we're adding
+ # If we're a forward-declare inside a namespace, see if there's a
+ # reorder span inside the same namespace we can fit into.
+ if kind == _FORWARD_DECLARE_KIND:
+ (namespace_prefix, possible_reorder_span) = \
+ _GetFirstNamespaceLevelReorderSpan(file_lines)
+ if (namespace_prefix and possible_reorder_span and
+ firstline.line.startswith(namespace_prefix)):
+ # Great, we can go into this reorder_span. We also need to
+ # modify all-lines because this line doesn't need the
+ # namespace prefix anymore. Make sure we can do that before
+ # succeeding.
+ new_firstline = _RemoveNamespacePrefix(firstline.line, namespace_prefix)
+ if new_firstline:
+ assert all_lines[first_contentful_line] == firstline.line
+ all_lines[first_contentful_line] = new_firstline
+ reorder_span = possible_reorder_span
+
+ # If that didn't work out, find a top-level reorder span to go into.
+ if reorder_span is None:
+ # TODO(csilvers): could make this more efficient by storing, per-kind.
+ toplevel_reorder_spans = _GetToplevelReorderSpans(file_lines)
+ reorder_span = _FirstReorderSpanWith(file_lines, toplevel_reorder_spans,
+ kind, iwyu_record.filename, flags)
+
+ return (reorder_span, kind, sort_key, all_lines)
+
+
+def _CommonPrefixLength(a, b):
+ """Given two lists, returns the index of 1st element not common to both."""
+ end = min(len(a), len(b))
+ for i in range(end):
+ if a[i] != b[i]:
+ return i
+ return end
+
+
+def _NormalizeNamespaceForwardDeclareLines(lines):
+ """'Normalize' namespace lines in a list of output lines and return new list.
+
+ When suggesting new forward-declares to insert, iwyu uses the following
+ format, putting each class on its own line with all namespaces:
+ namespace foo { namespace bar { class A; } }
+ namespace foo { namespace bar { class B; } }
+ namespace foo { namespace bang { class C; } }
+ We convert this to 'normalized' form, which puts namespaces on their
+ own line and collects classes together:
+ namespace foo {
+ namespace bar {
+ class A;
+ class B;
+ } // namespace bar
+ namespace bang {
+ class C;
+ } // namespace bang
+ } // namespace foo
+
+ Non-namespace lines are left alone. Only adjacent namespace lines
+ from the input are merged.
+
+ Arguments:
+ lines: a list of output-lines -- that is, lines that are ready to
+ be emitted as-is to the output file.
+
+ Returns:
+ A new version of lines, with namespace lines normalized as above.
+ """
+ # iwyu input is very regular, which is nice.
+ iwyu_namespace_re = re.compile(r'namespace ([^{]*) { ')
+ iwyu_classname_re = re.compile(r'{ ([^{}]*) }')
+
+ retval = []
+ current_namespaces = []
+ # We append a blank line so the final namespace-closing happens "organically".
+ for line in lines + ['']:
+ namespaces_in_line = iwyu_namespace_re.findall(line)
+ differ_pos = _CommonPrefixLength(namespaces_in_line, current_namespaces)
+ namespaces_to_close = reversed(current_namespaces[differ_pos:])
+ namespaces_to_open = namespaces_in_line[differ_pos:]
+ retval.extend('} // namespace %s' % ns for ns in namespaces_to_close)
+ retval.extend('namespace %s {' % ns for ns in namespaces_to_open)
+ current_namespaces = namespaces_in_line
+ # Now add the current line. If we were a namespace line, it's the
+ # 'class' part of the line (everything but the 'namespace {'s).
+ if namespaces_in_line:
+ m = iwyu_classname_re.search(line)
+ if not m:
+ raise FixIncludesError('Malformed namespace line from iwyu: %s', line)
+ retval.append(m.group(1))
+ else:
+ retval.append(line)
+
+ assert retval and retval[-1] == '', 'What happened to our sentinel line?'
+ return retval[:-1]
+
+
+def _DeleteLinesAccordingToIwyu(iwyu_record, file_lines):
+ """Deletes all lines that iwyu_record tells us to, and cleans up after."""
+ for line_number in iwyu_record.lines_to_delete:
+ # Delete the entire move-span (us and our preceding comments).
+ for i in range(*file_lines[line_number].move_span):
+ file_lines[i].deleted = True
+
+ while True:
+ num_deletes = _DeleteEmptyNamespaces(file_lines)
+ num_deletes += _DeleteEmptyIfdefs(file_lines)
+ if num_deletes == 0:
+ break
+
+ # Also delete any duplicate lines in the input. To avoid trouble
+ # (accidentally deleting inside an #ifdef, for instance), we only
+ # check 'top-level' #includes and forward-declares.
+ toplevel_reorder_spans = _GetToplevelReorderSpans(file_lines)
+ _DeleteDuplicateLines(file_lines, toplevel_reorder_spans)
+
+ # If a whole reorder span was deleted, check if it has extra
+ # whitespace on both sides that we could trim. We've already
+ # deleted extra blank lines inside #ifdefs and namespaces,
+ # so looking at toplevel spans is enough.
+ for reorder_span in toplevel_reorder_spans:
+ _DeleteExtraneousBlankLines(file_lines, reorder_span)
+
+
+def _GetSymbolNameFromForwardDeclareLine(line):
+ """Given a forward declare line to add from iwyu output, get symbol.
+
+ Two possibilities: In or not in namespace(s).
+ If in namespaces, then return foo::bar::sym.
+ Else just sym.
+ """
+ iwyu_namespace_re = re.compile(r'namespace ([^{]*) { ')
+ symbolname_re = re.compile(r'([A-Za-z0-9_]+)')
+ namespaces_in_line = iwyu_namespace_re.findall(line)
+ symbols_in_line = symbolname_re.findall(line)
+ symbol_name = symbols_in_line[-1]
+ if (namespaces_in_line):
+ symbol_name = '::'.join(namespaces_in_line) + '::' + symbol_name
+ return symbol_name
+
+
+def FixFileLines(iwyu_record, file_lines, flags):
+ """Applies one block of lines from the iwyu output script.
+
+ Called once we have read all the lines from the iwyu output script
+ pertaining to a single source file, and parsed them into an
+ iwyu_record. At that point we edit the source file, remove the old
+ #includes and forward-declares, insert the #includes and
+ forward-declares, and reorder the lot, all as specified by the iwyu
+ output script. The resulting source code lines are returned.
+
+ Arguments:
+ iwyu_record: an IWYUOutputRecord object holding the parsed output
+ of the include-what-you-use script (run at verbose level 1 or
+ higher) pertaining to a single source file.
+ file_lines: a list of LineInfo objects holding the parsed output of
+ the file in iwyu_record.filename
+ flags: commandline flags, as parsed by optparse. We use
+ flags.safe_headers to turn off deleting lines, and use the
+ other flags indirectly (via calls to other routines).
+
+ Returns:
+ An array of 'fixed' source code lines, after modifications as
+ specified by iwyu.
+ """
+ # First delete the includes and forward-declares that we should delete.
+ # This is easy since iwyu tells us the line numbers.
+ if not (flags.safe_headers and _MayBeHeaderFile(iwyu_record.filename)):
+ _DeleteLinesAccordingToIwyu(iwyu_record, file_lines)
+
+ # With these deletions, we may be able to merge together some
+ # reorder-spans. Recalculate them to see.
+ _CalculateReorderSpans(file_lines)
+
+ # For every move-span in our file -- that's every #include and
+ # forward-declare we saw -- 'decorate' the move-range to allow us
+ # to sort them.
+ move_spans = set([fl.move_span for fl in file_lines if fl.move_span])
+ decorated_move_spans = []
+ for (start_line, end_line) in move_spans:
+ decorated_span = _DecoratedMoveSpanLines(iwyu_record, file_lines,
+ file_lines[start_line:end_line],
+ flags)
+ if decorated_span:
+ decorated_move_spans.append(decorated_span)
+
+ # Now let's add in a decorated move-span for all the new #includes
+ # and forward-declares.
+ symbol_names_seen = set()
+ for line in iwyu_record.includes_and_forward_declares_to_add:
+ line_info = LineInfo(line)
+ m = _INCLUDE_RE.match(line)
+ if m:
+ line_info.type = _INCLUDE_RE
+ line_info.key = m.group(1)
+ else:
+ # Avoid duplicates that can arise if different template args
+ # were suggested by different iwyu analyses for this file.
+ symbol_name = _GetSymbolNameFromForwardDeclareLine(line)
+ if symbol_name in symbol_names_seen:
+ continue
+ symbol_names_seen.add(symbol_name)
+ line_info.type = _FORWARD_DECLARE_RE
+ decorated_span = _DecoratedMoveSpanLines(iwyu_record, file_lines,
+ [line_info], flags)
+ assert decorated_span, 'line to add is not an #include or fwd-decl?'
+ decorated_move_spans.append(decorated_span)
+
+ # Add a sentinel decorated move-span, to make life easy, and sort.
+ decorated_move_spans.append(((len(file_lines), len(file_lines)),
+ _EOF_KIND, '', []))
+ decorated_move_spans.sort()
+
+ # Now go through all the lines of the input file and construct the
+ # output file. Before we get to the next reorder-span, we just
+ # copy lines over verbatim (ignoring deleted lines, of course).
+ # In a reorder-span, we just print the sorted content, introducing
+ # blank lines when appropriate.
+ output_lines = []
+ line_number = 0
+ while line_number < len(file_lines):
+ current_reorder_span = decorated_move_spans[0][0]
+
+ # Just copy over all the lines until the next reorder span.
+ while line_number < current_reorder_span[0]:
+ if not file_lines[line_number].deleted:
+ output_lines.append(file_lines[line_number].line)
+ line_number += 1
+
+ # Now fill in the contents of the reorder-span from decorated_move_spans
+ new_lines = []
+ while (decorated_move_spans and
+ decorated_move_spans[0][0] == current_reorder_span):
+ new_lines.extend(decorated_move_spans[0][3]) # the full content
+ if (len(decorated_move_spans) > 1 and
+ _ShouldInsertBlankLine(decorated_move_spans[0],
+ decorated_move_spans[1], file_lines, flags)):
+ new_lines.append('')
+ decorated_move_spans = decorated_move_spans[1:] # pop
+
+ if not flags.keep_iwyu_namespace_format:
+ # Now do the munging to convert namespace lines from the iwyu input
+ # format to the 'official style' format:
+ # 'namespace foo { class Bar; }\n' -> 'namespace foo {\nclass Bar;\n}'
+ # along with collecting multiple classes in the same namespace.
+ new_lines = _NormalizeNamespaceForwardDeclareLines(new_lines)
+ output_lines.extend(new_lines)
+ line_number = current_reorder_span[1] # go to end of span
+
+ return output_lines
+
+
+def GetFixedFile(iwyu_record, flags):
+ """Figure out #include and forward-declare line fixes of one file.
+
+ Given an iwyu record for a single file, listing the #includes and
+ forward-declares to add, remove, and re-sort, loads the file, makes
+ the fixes, and returns the fixed file as a list of lines. The flags
+ affect the details of the fixing.
+
+ Arguments:
+ iwyu_record: an IWYUOutputRecord object holding the parsed output
+ of the include-what-you-use script (run at verbose level 1 or
+ higher) pertaining to a single source file.
+ iwyu_record.filename indicates what file to edit.
+ flags: commandline flags, as parsed by optparse. We use
+ flags.dry_run and flags.checkout_command, which determine
+ whether we try to fix unwritable files, and other flags
+ indirectly.
+
+ Returns:
+ A list of strings representing the 'fixed' file, if the file has
+ changed, or None if the file hasn't changed at all.
+ """
+ file_contents = _ReadWriteableFile(iwyu_record.filename,
+ flags.dry_run or flags.checkout_command)
+ if not file_contents:
+ print('(skipping %s: not a writable file)' % iwyu_record.filename)
+ return None
+ print(">>> Fixing #includes in '%s'" % iwyu_record.filename)
+ file_lines = ParseOneFile(file_contents, iwyu_record)
+ old_lines = [fl.line for fl in file_lines
+ if fl is not None and fl.line is not None]
+ fixed_lines = FixFileLines(iwyu_record, file_lines, flags)
+ fixed_lines = [line for line in fixed_lines if line is not None]
+ if old_lines == fixed_lines:
+ print("No changes in file ", iwyu_record.filename)
+ return None
+
+ if flags.dry_run:
+ PrintFileDiff(old_lines, fixed_lines)
+
+ return fixed_lines
+
+
+
+
+def CreateCLForCheckoutCommand(checkout_command, invoking_command):
+ """Create a CL using a command inferred from the checkout_command.
+
+ Arguments:
+ checkout_commmand: The command specified with --checkout_command
+ invoking_command: If not None, the command line passed to iwyu.py
+
+ Returns:
+ A CL number on success, else None.
+
+ If the checkout_command is 'p4|g4|v4 edit' then attempt to create a
+ CL with an appropriate description. On success, return the CL
+ number. Otherwise return None.
+ """
+ if checkout_command in ('p4 edit', 'g4 edit', 'v4 edit'):
+ what4 = checkout_command.split(' ')[0]
+ else:
+ # We don't know how to create a CL. Punt.
+ return None
+
+ description_lines = ['\tInclude what you use.\n']
+ if invoking_command:
+ description_lines.append(
+ '\tThe following command was run to modify the files:\n')
+ description_lines.append('\t' + invoking_command + '\n')
+
+ # The change description must be of a certain form. First invoke
+ # '<what4> client -o' to create a template, then replace
+ # '<enter description here>' with the desired description.
+ # The lines after that are File lines, which we will discard
+ # here, because we will add the files via '<what4> edit -c <CL#>'.
+ input_lines = []
+ description_added = False
+ output_lines = []
+ for line in _GetCommandOutputLines(what4, ['change', '-o']):
+ output_lines.append(line)
+ if line == '\t<enter description here>\n':
+ input_lines.extend(description_lines)
+ description_added = True
+ break
+ else:
+ input_lines.append(line)
+
+ if not description_added:
+ print('ERROR: Didn\'t find "\t<enter description here>" in'
+ ' "%s change -o" output' % what4)
+ for line in output_lines:
+ print(line, end=None)
+ return None
+
+ input_text = ''.join(input_lines)
+ output = _GetCommandOutputWithInput('%s change -i'
+ % what4, input_text)
+ # Parse output for "Changelist XXX created."
+ m = re.match(r'Change (\d+) created.', output)
+ if not m:
+ print('ERROR: Unexpected change creation output "%s"' % output)
+ return None
+ return m.group(1)
+
+def FixManyFiles(iwyu_records, flags):
+ """Given a list of iwyu_records, fix each file listed in the record.
+
+ For each iwyu record in the input, which lists the #includes and
+ forward-declares to add, remove, and re-sort, loads the file, makes
+ the fixes, and writes the fixed file to disk. The flags affect the
+ details of the fixing.
+
+ Arguments:
+ iwyu_records: a collection of IWYUOutputRecord objects holding
+ the parsed output of the include-what-you-use script (run at
+ verbose level 1 or higher) pertaining to a single source file.
+ iwyu_record.filename indicates what file to edit.
+ flags: commandline flags, as parsed by optparse. We use
+ flags.dry_run and flags.checkout_command, which determine
+ how we read and write files, and other flags indirectly.
+
+ Returns:
+ The number of files fixed (as opposed to ones that needed no fixing).
+ """
+ file_and_fix_pairs = []
+ files_to_checkout = []
+ for iwyu_record in iwyu_records:
+ try:
+ fixed_lines = GetFixedFile(iwyu_record, flags)
+ if fixed_lines is not None:
+ file_and_fix_pairs.append((iwyu_record.filename, fixed_lines))
+ if flags.checkout_command and \
+ not flags.dry_run and \
+ not os.access(iwyu_record.filename, os.W_OK):
+ files_to_checkout.append(iwyu_record.filename)
+ except FixIncludesError as why:
+ print('ERROR: %s - skipping file %s' % (why, iwyu_record.filename))
+
+ # It's much faster to check out all the files at once.
+ if flags.checkout_command and files_to_checkout:
+ checkout_command = flags.checkout_command
+ # If --create_cl_if_possible was specified, AND if all files that
+ # need fixing are not writable (not opened for edit in this
+ # client), try to create a CL to contain those edits. This is to
+ # avoid inadvertently creating multiple CLs.
+ if (flags.create_cl_if_possible and
+ len(files_to_checkout) == len(file_and_fix_pairs)):
+ cl = CreateCLForCheckoutCommand(flags.checkout_command,
+ flags.invoking_command_line)
+ if cl:
+ # Assumption: the checkout command supports the '-c <CL#>' syntax.
+ checkout_command += (' -c ' + cl)
+ # Else if --append_to_cl was specified, add the files that need
+ # editing to the specified (existing) CL.
+ # NOTE: If one or more of these files is already open, this will
+ # presumably fail.
+ elif flags.append_to_cl:
+ checkout_command += (' -c %d' % flags.append_to_cl)
+ _RunCommand(checkout_command, files_to_checkout)
+
+ if not flags.dry_run:
+ for filename, fixed_lines in file_and_fix_pairs:
+ _WriteFileContents(filename, fixed_lines)
+
+ files_fixed = [filename for filename, _ in file_and_fix_pairs]
+
+ print('IWYU edited %d files on your behalf.\n' % len(files_fixed))
+
+ return len(files_fixed)
+
+
+def ProcessIWYUOutput(f, files_to_process, flags):
+ """Fix the #include and forward-declare lines as directed by f.
+
+ Given a file object that has the output of the include_what_you_use
+ script, see every file to be edited and edit it, if appropriate.
+
+ Arguments:
+ f: an iterable object that is the output of include_what_you_use.
+ files_to_process: A set of filenames, or None. If not None, we
+ ignore files mentioned in f that are not in files_to_process.
+ flags: commandline flags, as parsed by optparse. The only flag
+ we use directly is flags.ignore_re, to indicate files not to
+ process; we also pass the flags to other routines.
+
+ Returns:
+ The number of files that had to be modified (because they weren't
+ already all correct). In dry_run mode, returns the number of
+ files that would have been modified.
+ """
+ # First collect all the iwyu data from stdin.
+
+ # Maintain sort order by using OrderedDict instead of dict
+ iwyu_output_records = OrderedDict() # IWYUOutputRecords keyed by filename
+ while True:
+ iwyu_output_parser = IWYUOutputParser()
+ try:
+ iwyu_record = iwyu_output_parser.ParseOneRecord(f, flags)
+ if not iwyu_record:
+ break
+ except FixIncludesError as why:
+ print('ERROR: %s' % why)
+ continue
+ filename = iwyu_record.filename
+ if files_to_process is not None and filename not in files_to_process:
+ print('(skipping %s: not listed on commandline)' % filename)
+ continue
+ if flags.ignore_re and re.search(flags.ignore_re, filename):
+ print('(skipping %s: it matches --ignore_re, which is %s)' % (
+ filename, flags.ignore_re))
+ continue
+
+ if filename in iwyu_output_records:
+ iwyu_output_records[filename].Merge(iwyu_record)
+ else:
+ iwyu_output_records[filename] = iwyu_record
+
+ # Now ignore all the files that never had any contentful changes
+ # seen for them. (We have to wait until we're all done, since a .h
+ # file may have a contentful change when #included from one .cc
+ # file, but not another, and we need to have merged them above.)
+ for filename in iwyu_output_records:
+ if not iwyu_output_records[filename].HasContentfulChanges():
+ print('(skipping %s: iwyu reports no contentful changes)' % filename)
+ # Mark that we're skipping this file by setting the record to None
+ iwyu_output_records[filename] = None
+
+ # Now do all the fixing, and return the number of files modified
+ contentful_records = [ior for ior in iwyu_output_records.values() if ior]
+ return FixManyFiles(contentful_records, flags)
+
+
+def SortIncludesInFiles(files_to_process, flags):
+ """For each file in files_to_process, sort its #includes.
+
+ This reads each input file, sorts the #include lines, and replaces
+ the input file with the result. Like ProcessIWYUOutput, this
+ requires that the file be writable, or that flags.checkout_command
+ be set. SortIncludesInFiles does not add or remove any #includes.
+ It also ignores forward-declares.
+
+ Arguments:
+ files_to_process: a list (or set) of filenames.
+ flags: commandline flags, as parsed by optparse. We do not use
+ any flags directly, but pass them to other routines.
+
+ Returns:
+ The number of files that had to be modified (because they weren't
+ already all correct, that is, already in sorted order).
+ """
+ num_fixes_made = 0
+ sort_only_iwyu_records = []
+ for filename in files_to_process:
+ # An empty iwyu record has no adds or deletes, so its only effect
+ # is to cause us to sort the #include lines. (Since fix_includes
+ # gets all its knowledge of where forward-declare lines are from
+ # the iwyu input, with an empty iwyu record it just ignores all
+ # the forward-declare lines entirely.)
+ sort_only_iwyu_records.append(IWYUOutputRecord(filename))
+ return FixManyFiles(sort_only_iwyu_records, flags)
+
+
+def main(argv):
+ # Parse the command line.
+ parser = optparse.OptionParser(usage=_USAGE)
+ parser.add_option('-b', '--blank_lines', action='store_true', default=True,
+ help=('Put a blank line between primary header file and'
+ ' C/C++ system #includes, and another blank line'
+ ' between system #includes and google #includes'
+ ' [default]'))
+ parser.add_option('--noblank_lines', action='store_false', dest='blank_lines')
+
+ parser.add_option('--comments', action='store_true', default=False,
+ help='Put comments after the #include lines')
+ parser.add_option('--nocomments', action='store_false', dest='comments')
+
+ parser.add_option('--safe_headers', action='store_true', default=True,
+ help=('Do not remove unused #includes/fwd-declares from'
+ ' header files; just add new ones [default]'))
+ parser.add_option('--nosafe_headers', action='store_false',
+ dest='safe_headers')
+
+ parser.add_option('-s', '--sort_only', action='store_true',
+ help=('Just sort #includes of files listed on cmdline;'
+ ' do not add or remove any #includes'))
+
+ parser.add_option('-n', '--dry_run', action='store_true', default=False,
+ help=('Do not actually edit any files; just print diffs.'
+ ' Return code is 0 if no changes are needed,'
+ ' else min(the number of files that would be'
+ ' modified, 100)'))
+
+ parser.add_option('--ignore_re', default=None,
+ help=('fix_includes.py will skip editing any file whose'
+ ' name matches this regular expression.'))
+
+ parser.add_option('--checkout_command', default=None,
+ help=('A command, such as "p4 edit", to run on all the'
+ ' non-writeable files before modifying them. The'
+ ' filenames will be appended to the command after'
+ ' a space. The command will not be run on any file'
+ ' that does not need to change.'))
+
+ parser.add_option('--create_cl_if_possible', action='store_true',
+ default=True,
+ help=('If --checkout_command is "p4|g4|v4 edit" and'
+ ' all files to be modified needed to be checked out,'
+ ' then create a CL containing those files.'))
+ parser.add_option('--nocreate_cl_if_possible', action='store_false',
+ dest='create_cl_if_possible')
+
+ parser.add_option('--append_to_cl', action='store',
+ default=None, type='int', dest='append_to_cl',
+ help=('If provided, with a checkout_command, add files'
+ ' that need fixing to the specified existing CL.'))
+
+ parser.add_option('--separate_project_includes', default=None,
+ help=('Sort #includes for current project separately'
+ ' from all other #includes. This flag specifies'
+ ' the root directory of the current project.'
+ ' If the value is "<tld>", #includes that share the'
+ ' same top-level directory are assumed to be in the'
+ ' same project. If not specified, project #includes'
+ ' will be sorted with other non-system #includes.'))
+
+ parser.add_option('--invoking_command_line', default=None,
+ help=('Internal flag used by iwyu.py, It should be the'
+ ' command line used to invoke iwyu.py'))
+
+
+ parser.add_option('-m', '--keep_iwyu_namespace_format', action='store_true',
+ default=False,
+ help=('Keep forward-declaration namespaces in IWYU format, '
+ 'eg. namespace n1 { namespace n2 { class c1; } }.'
+ ' Do not convert to "normalized" Google format: '
+ 'namespace n1 {\\nnamespace n2 {\\n class c1;'
+ '\\n}\\n}.'))
+ parser.add_option('--nokeep_iwyu_namespace_format', action='store_false',
+ dest='keep_iwyu_namespace_format')
+
+ (flags, files_to_modify) = parser.parse_args(argv[1:])
+ if files_to_modify:
+ files_to_modify = set(files_to_modify)
+ else:
+ files_to_modify = None
+
+ if (flags.separate_project_includes and
+ not flags.separate_project_includes.startswith('<') and # 'special' vals
+ not flags.separate_project_includes.endswith(os.path.sep) and
+ not flags.separate_project_includes.endswith('/')):
+ flags.separate_project_includes += os.path.sep
+
+ if flags.append_to_cl and flags.create_cl_if_possible:
+ sys.exit('FATAL ERROR: At most one of --append_to_cl and '
+ '--create_cl_if_possible allowed')
+
+ if flags.sort_only:
+ if not files_to_modify:
+ sys.exit('FATAL ERROR: -s flag requires a list of filenames')
+ return SortIncludesInFiles(files_to_modify, flags)
+ else:
+ return ProcessIWYUOutput(sys.stdin, files_to_modify, flags)
+
+
+if __name__ == '__main__':
+ num_files_fixed = main(sys.argv)
+ sys.exit(min(num_files_fixed, 100))
diff --git a/fix_includes_test.py b/fix_includes_test.py
new file mode 100755
index 0000000..28e255f
--- /dev/null
+++ b/fix_includes_test.py
@@ -0,0 +1,3552 @@
+#!/usr/bin/env python
+
+##===--- fix_includes_test.py - test for fix_includes.py ------------------===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+from __future__ import print_function
+
+"""Test for fix_includes.py
+
+Test test test!
+"""
+
+__author__ = 'csilvers@google.com (Craig Silverstein)'
+
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from io import StringIO
+
+import re
+import sys
+# I use unittest instead of googletest to ease opensourcing.
+import unittest
+import fix_includes
+
+
+class FakeFlags(object):
+ def __init__(self):
+ self.blank_lines = False
+ self.comments = True
+ self.dry_run = False
+ self.ignore_re = None
+ self.checkout_command = None
+ self.safe_headers = False
+ self.separate_project_includes = None
+ self.create_cl_if_possible = True
+ self.invoking_command_line = 'iwyu.py my_targets'
+ self.find_affected_targets = True
+ self.keep_iwyu_namespace_format = False
+
+class FakeRunCommand(object):
+ def __init__(self):
+ self.command = None
+ self.args = None
+
+ def RunCommand(self, command, args):
+ self.command = command
+ self.args = args
+
+
+class FakeGetCommandOutputWithInput(object):
+ def __init__(self, stdout):
+ self.stdout = stdout
+ self.command = None
+ self.stdin = None
+
+ def GetCommandOutputWithInput(self, command, stdin):
+ print('GetCommandOutputWithInput(%s, ...)' % command)
+ self.command = command
+ self.stdin = stdin
+ return self.stdout
+
+
+class FakeGetCommandOutputLines(object):
+ def __init__(self):
+ self.stdout_lines_map = {}
+ self.command = None
+ self.args = None
+
+ def GetCommandOutputLines(self, command, args):
+ print('GetCommandOutputLines(%s, %s)' % (command, args))
+ self.command = command
+ self.args = args
+ return self.stdout_lines_map[command]
+
+ def SetCommandOutputLines(self, command, lines):
+ lines = [line + '\n' for line in lines]
+ self.stdout_lines_map[command] = lines
+
+class FixIncludesBase(unittest.TestCase):
+ """Does setup that every test will want."""
+
+ def _ReadFile(self, filename):
+ assert filename in self.before_map, filename
+ return self.before_map[filename]
+
+ def setUp(self):
+ self.flags = FakeFlags()
+
+ # Map from filename to its contents (a list of lines) before fixing.
+ self.before_map = {}
+ # Map from filename to the 'correct' contents it should have after fixing.
+ self.expected_after_map = {}
+
+ # INPUT: fix_includes._ReadFile takes a filename
+ # and returns the contents of filename (as a list).
+ fix_includes._ReadFile = self._ReadFile
+
+ # OUTPUT: Instead of writing to file, save full output.
+ self.actual_after_contents = []
+ fix_includes._WriteFileContents = \
+ lambda filename, contents: self.actual_after_contents.extend(contents)
+
+ # Stub out OS writeability check to say all files are writeable.
+ fix_includes.os.access = \
+ lambda filename, flags: True
+
+ # Stub out the checkout command; keep a list of all files checked out.
+ self.fake_checkout_command = FakeRunCommand()
+ fix_includes._RunCommand = self.fake_checkout_command.RunCommand
+
+ # Stub out the CL creation command.
+ self.fake_cl_creation_command = (
+ FakeGetCommandOutputWithInput('Change 1234 created.\n'))
+ fix_includes._GetCommandOutputWithInput = (
+ self.fake_cl_creation_command.GetCommandOutputWithInput)
+
+ # Create a generic 'stubber'.
+ self.fake_get_command_output_lines = FakeGetCommandOutputLines()
+ fix_includes._GetCommandOutputLines = (
+ self.fake_get_command_output_lines.GetCommandOutputLines)
+
+ # Stub out the CL template command.
+ self.fake_get_command_output_lines.SetCommandOutputLines(
+ 'g4', ['Description:',
+ '\t<enter description here>',
+ '',
+ 'Files:',
+ '\tthis_file_should_not_appear_in_the_cl'])
+
+ # Stub out the find_clients_of_files command.
+ self.find_clients_of_files_command = (
+ '/google/data/ro/projects/cymbal/tools/find_clients_of_files.par')
+ self.fake_get_command_output_lines.SetCommandOutputLines(
+ self.find_clients_of_files_command,
+ ['==== 1 targets from 1 packages are affected',
+ '==== targets',
+ '//foo/bar:a'])
+
+ # Stub out stdout
+ self.stdout_stub = StringIO()
+ fix_includes.sys.stdout = self.stdout_stub
+
+ def SetFindClientsOfFilesOutput(self, output_lines):
+ self.fake_get_command_output_lines.SetCommandOutputLines(
+ self.find_clients_of_files_command, output_lines)
+
+ def RegisterFileContents(self, file_contents_map):
+ """Parses and stores the given map from filename to file-contents.
+
+ The values of the map are file 'contents', written in a simple
+ markup language that allows us to encode both the 'before' and
+ expected 'after' contents of a file. Every line is taken
+ literally to be in both the before and after, with the following
+ exceptions:
+ 1) Lines that look like '///+foo' are removed from 'before',
+ and replaced by 'foo' in 'after'. (This is an 'add'
+ instruction.)
+ 2) Lines that end in '///-' are removed from both 'after'
+ and the '\s*///-' suffix is removed from 'before'.
+ (This is a 'remove' instruction.)
+
+ This function processes the input map to produce self.before_map
+ and self.expected_after_map.
+
+ Arguments:
+ file_contents_map: a map from filename to 'contents'. Contents
+ is a string, having the format mentioned above.
+ """
+ remove_re = re.compile('\s*///-$')
+ for (filename, contents) in file_contents_map.items():
+ before_contents = []
+ expected_after_contents = []
+ for line in contents.splitlines():
+ m = remove_re.search(line)
+ if m:
+ before_contents.append(line[:m.start()])
+ elif line.startswith('///+'):
+ expected_after_contents.append(line[len('///+'):])
+ else:
+ before_contents.append(line)
+ expected_after_contents.append(line)
+ self.before_map[filename] = before_contents
+ self.expected_after_map[filename] = expected_after_contents
+
+ def ProcessAndTest(self, iwyu_output, cmdline_files=None, unedited_files=[],
+ expected_num_modified_files=None):
+ """For all files mentioned in iwyu_output, compare expected and actual.
+
+ Arguments:
+ iwyu_output: the output the iwyu script gave when run over the
+ set of input files.
+ cmdline_files: files to pass in to ProcessIWYUOutput (that, in
+ an actual fix_includes run, would come from the commandline).
+ These limit what files fix_includes chooses to edit.
+ unedited_files: the list of files that are listed in iwyu_output,
+ but fix_files has chosen not to edit for some reason.
+ expected_num_modified_files: what we expect ProcessIWYUOutput to
+ return. If None, suppress this check.
+ """
+ filenames = re.findall('^(\S+) should add these lines:', iwyu_output, re.M)
+ if not filenames: # This is the other possible starting-line
+ filenames = re.findall('^\((\S+) has correct #includes/fwd-decls\)',
+ iwyu_output, re.M)
+
+ expected_after = []
+ for filename in fix_includes.OrderedSet(filenames): # uniquify
+ if filename not in unedited_files:
+ expected_after.extend(self.expected_after_map[filename])
+
+ iwyu_output_as_file = StringIO(iwyu_output)
+ num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file,
+ cmdline_files,
+ self.flags)
+
+ if expected_after != self.actual_after_contents:
+ print("=== Expected:")
+ for line in expected_after:
+ print(line)
+ print("=== Got:")
+ for line in self.actual_after_contents:
+ print(line)
+ print("===")
+ self.assertListEqual(expected_after, self.actual_after_contents)
+ if expected_num_modified_files is not None:
+ self.assertEqual(expected_num_modified_files, num_modified_files)
+
+ def MakeFilesUnwriteable(self):
+ """Stub out OS writeability check to say all files are NOT writeable."""
+ fix_includes.os.access = \
+ lambda filename, flags: False
+
+
+class FixIncludesTest(FixIncludesBase):
+ """End-to-end tests from input file to output file."""
+
+ def testSimple(self):
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+simple should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+simple should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for simple:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'simple': infile})
+ self.ProcessAndTest(iwyu_output, expected_num_modified_files=1)
+
+ def testUnifiedDiffOutput(self):
+ """Test the unified diff output generated by dry runs."""
+ infile = """
+#include <notused.h>
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+unified_diff.cc should add these lines:
+
+unified_diff.cc should remove these lines:
+- #include <notused.h> // lines 2-2
+
+The full include-list for unified_diff.cc:
+---
+"""
+ diff_expect = """\
+>>> Fixing #includes in 'unified_diff.cc'
+@@ -1,4 +1,2 @@
+-
+-#include <notused.h>
+
+ int main() { return 0; }
+IWYU edited 1 files on your behalf.
+
+"""
+
+ self.flags.dry_run = True
+ self.RegisterFileContents({'unified_diff.cc': infile})
+ self.ProcessAndTest(iwyu_output, unedited_files=['unified_diff.cc'])
+
+ self.assertEqual(self.stdout_stub.getvalue(), diff_expect)
+
+ def testNodiffOutput(self):
+ """Tests handling of the '(<file> has correct #includes)' iwyu output."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+#include <ctype.h> // iwyu will not reorder, even though non-alphabetical
+
+namespace Foo;
+
+namespace Bar;
+
+int main() { return 0; }
+"""
+ iwyu_output = "(nodiffs.h has correct #includes/fwd-decls)\n"
+ self.RegisterFileContents({'nodiffs.h': infile})
+ # fix_includes gives special output when there are no changes, so
+ # we can't use the normal ProcessAndTest.
+ iwyu_output_as_file = StringIO(iwyu_output)
+ num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file,
+ None, self.flags)
+ self.assertListEqual([], self.actual_after_contents) # 'no diffs'
+ self.assertEqual(0, num_modified_files)
+
+ def testNodiffOutputWithNoSorting(self):
+ """Tests 'correct #includes' iwyu output, but does not need reordering."""
+ infile = """\
+// Copyright 2010
+
+#include <ctype.h>
+#include <stdio.h>
+
+namespace Foo;
+
+namespace Bar;
+
+int main() { return 0; }
+"""
+ iwyu_output = "(nodiffs_nosorting.h has correct #includes/fwd-decls)\n"
+ self.RegisterFileContents({'nodiffs_nosorting.h': infile})
+ # fix_includes gives special output when there are no changes, so
+ # we can't use the normal ProcessAndTest.
+ iwyu_output_as_file = StringIO(iwyu_output)
+ num_modified_files = fix_includes.ProcessIWYUOutput(iwyu_output_as_file,
+ None, self.flags)
+ self.assertListEqual([], self.actual_after_contents) # 'no diffs'
+ self.assertEqual(0, num_modified_files)
+
+ def testRemoveEmptyNamespace(self):
+ """Tests we remove a namespace if we remove all fwd-decls inside it."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+
+namespace ns { ///-
+class Foo; ///-
+namespace ns2 { ///-
+namespace ns3 { ///-
+class Bar; ///-
+} } ///-
+class Baz; ///-
+} ///-
+ ///-
+int main() { return 0; }
+"""
+ iwyu_output = """\
+empty_namespace should add these lines:
+
+empty_namespace should remove these lines:
+- class Foo; // lines 6-6
+- namespace ns { namespace ns2 { namespace ns3 { class Bar; } } } // lines 9-9
+- namespace ns { class Baz; } } // lines 11-11
+
+The full include-list for empty_namespace:
+#include <stdio.h>
+---
+"""
+ self.RegisterFileContents({'empty_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemovePartOfEmptyNamespace(self):
+ """Tests we remove a namespace if empty, but not enclosing namespaces."""
+ infile = """\
+// Copyright 2010
+
+namespace maps_transit_realtime {
+namespace service_alerts {
+class StaticServiceAlertStore;
+namespace trigger { ///-
+class Trigger; ///-
+} // namespace trigger ///-
+namespace ui { ///-
+class Alert; ///-
+} // namespace ui ///-
+} // namespace service_alerts
+} // namespace maps_transit_realtime
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+empty_internal_namespace should add these lines:
+
+empty_internal_namespace should remove these lines:
+- namespace maps_transit_realtime { namespace service_alerts { namespace trigger { class Trigger; } } } // lines 7-7
+- namespace maps_transit_realtime { namespace service_alerts { namespace ui { class Alert; } } } // lines 10-10
+
+The full include-list for empty_internal_namespace:
+namespace maps_transit_realtime { namespace service_alerts { class StaticServiceAlertStore; } } // lines 5-5
+---
+"""
+ self.RegisterFileContents({'empty_internal_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemoveEmptyIfdef(self):
+ """Tests we remove an #ifdef if we remove all #includes inside it."""
+ # Also makes sure we reorder properly around the removed ifdef.
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+///+#include <stdlib.h>
+// Only on windows. ///-
+#ifdef OS_WINDOWS ///-
+#include <notused.h> ///-
+#include <notused2.h> ///-
+#endif ///-
+#include "used.h"
+#include <stdlib.h> ///-
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+empty_ifdef should add these lines:
+#include "used2.h"
+
+empty_ifdef should remove these lines:
+- #include <notused.h> // lines 6-6
+- #include <notused2.h> // lines 7-7
+
+The full include-list for empty_ifdef:
+#include <stdio.h>
+#include <stdlib.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'empty_ifdef': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemoveEmptyNestedIfdef(self):
+ """Tests we remove an empty #ifdef inside a non-empty #ifdef."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+#ifdef NDEBUG
+ // Only on windows. ///-
+# ifdef OS_WINDOWS ///-
+# include <notused.h> ///-
+# include <notused2.h> ///-
+# endif ///-
+# undef VERBOSE_LOGGING
+#endif
+///+#include <stdlib.h>
+#include "used.h"
+#include <stdlib.h> ///-
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+empty_nested_ifdef should add these lines:
+#include "used2.h"
+
+empty_nested_ifdef should remove these lines:
+- #include <notused.h> // lines 7-7
+- #include <notused2.h> // lines 8-8
+
+The full include-list for empty_nested_ifdef:
+#include <stdlib.h>
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'empty_nested_ifdef': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNonEmptyIfdef(self):
+ """Tests we keep an #ifdef if we don't remove all #includes inside it."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+#ifdef OS_WINDOWS
+#include <notused.h> ///-
+#include <used_win.h>
+#endif
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+nonempty_ifdef should add these lines:
+#include "used2.h"
+
+nonempty_ifdef should remove these lines:
+- #include <notused.h> // lines 5-5
+
+The full include-list for nonempty_ifdef:
+#include <used_win.h>
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'nonempty_ifdef': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testKeepIfdefsWithNonIncludes(self):
+ """Tests we keep an #ifdef if we have a non-#include inside it."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+#ifdef OS_WINDOWS
+#define IN_WINDOWS
+#include <notused.h> ///-
+#endif
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+nonempty_ifdef should add these lines:
+#include "used2.h"
+
+nonempty_ifdef should remove these lines:
+- #include <notused.h> // lines 6-6
+
+The full include-list for nonempty_ifdef:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'nonempty_ifdef': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemoveComments(self):
+ """Tests we remove comments above #includes."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+// This file is not used. ///-
+#include <notused.h> ///-
+ ///-
+// This file is not used either. ///-
+// It's not used. ///-
+// Not used at all. ///-
+#include <notused2.h> ///-
+ ///-
+#include "notused3.h" ///-
+
+// This comment should stay, it's not before an #include.
+const int kInt = 5;
+// This file is used.
+// It's definitedly used.
+#include "used.h"
+///+#include "used2.h"
+
+const int kInt2 = 6;
+ ///-
+// This forward-declare is in a reorder_span all by itself. ///-
+class NotUsed; ///-
+
+// This comment should stay, it's not before an #include.
+int main() { return 0; }
+"""
+ iwyu_output = """\
+remove_comments should add these lines:
+#include "used2.h"
+
+remove_comments should remove these lines:
+- #include <notused.h> // lines 5-5
+- #include <notused2.h> // lines 10-10
+- #include "notused3.h" // lines 12-12
+- class NotUsed; // lines 23-23
+
+The full include-list for remove_comments:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'remove_comments': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNoBlankLineAfterTopOfFileCxxComments(self):
+ """Tests we don't remove top-of-file c++ comments right before #includes."""
+ infile = """\
+// Copyright 2010
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+top_of_file_comments.cc should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+top_of_file_comments.cc should remove these lines:
+- #include <notused.h> // lines 2-2
+
+The full include-list for top_of_file_comments.cc:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'top_of_file_comments.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNoBlankLineAfterTopOfFileCComments(self):
+ """Tests we don't remove top-of-file c comments right before #includes."""
+ infile = """\
+/*
+ * Copyright 2010
+ */
+#include <notused.h> ///-
+/* This is a one-line c-style comment. */ ///-
+#include <notused2.h> /* this is a c-style comment after a line */ ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+top_of_file_comments.c should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+top_of_file_comments.c should remove these lines:
+- #include <notused.h> // lines 4-4
+- #include <notused2.h> // lines 6-6
+
+The full include-list for top_of_file_comments.c:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'top_of_file_comments.c': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNotFullLineCComments(self):
+ """Tests that we treat lines with c comments then code as code-lines."""
+ infile = """\
+// Copyright 2010
+///+#include <stdio.h>
+///+
+/* code here */ x = 4;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+not_full_line_c_comments.c should add these lines:
+#include <stdio.h>
+
+not_full_line_c_comments.c should remove these lines:
+
+The full include-list for not_full_line_c_comments.c:
+#include <stdio.h>
+---
+"""
+ self.RegisterFileContents({'not_full_line_c_comments.c': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testUnusualHFileNames(self):
+ """Tests we treat .pb.h files as header files."""
+ infile = """\
+/*
+ * Copyright 2010
+ */
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.pb.h"
+///+#include "used2.pb.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+pb.h.cc should add these lines:
+#include <stdio.h>
+#include "used2.pb.h"
+
+pb.h.cc should remove these lines:
+- #include <notused.h> // lines 4-4
+
+The full include-list for pb.h.cc:
+#include <stdio.h>
+#include "used.pb.h"
+#include "used2.pb.h"
+---
+"""
+ self.RegisterFileContents({'pb.h.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testFwdDeclLines(self):
+ """Tests that we keep or remove forward declares based on iwyu output."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo> class KeepTplClass;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+fwd_decl should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+fwd_decl should remove these lines:
+- #include <notused.h> // lines 3-3
+- class NoKeepClass; // lines 7-7
+
+The full include-list for fwd_decl:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+struct KeepStruct; // lines 6-6
+template<typename Foo> class KeepTplClass; // lines 8-8
+---
+"""
+ self.RegisterFileContents({'fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testMultiLineFwdDecls(self):
+ """Tests we keep forward-decls that span more than one line."""
+ infile = """\
+// Copyright 2010
+
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo, typename Bar = Baz>
+class Keep2LineTplClass;
+template<typename Foo, typename Bar = Baz> ///-
+class NoKeep2LineTplClass; ///-
+template<typename Foo,
+ typename Bar = Baz>
+class Keep3LineTplClass;
+template<typename Foo, ///-
+ typename Bar = Baz> ///-
+class NoKeep3LineTplClass; ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+multiline_fwd_decl should add these lines:
+
+multiline_fwd_decl should remove these lines:
+- class NoKeepClass; // lines 4-4
+- template<typename Foo, typename Bar = Baz> class NoKeep2LineTplClass; // lines 7-8
+- template<typename Foo, typename Bar = Baz> class NoKeep3LineTplClass; // lines 12-14
+
+The full include-list for multiline_fwd_decl:
+struct KeepStruct; // lines 3-3
+template<typename Foo, typename Bar=Baz> class Keep2LineTplClass; // lines 5-6
+template<typename Foo, typename Bar=Baz> class Keep3LineTplClass; // lines 9-11
+---
+"""
+ self.RegisterFileContents({'multiline_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testKeepExplicitSpecializations(self):
+ """Tests we don't interpret an explicit spec. as a forward-declare."""
+ infile = """\
+// Copyright 2010
+
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo> class KeepTplClass;
+///+
+template<> class KeepTplClass<int>;
+template<typename T> void TplFn<T>();
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+explicit_specialization should add these lines:
+
+explicit_specialization should remove these lines:
+- class NoKeepClass; // lines 4-4
+
+The full include-list for explicit_specialization:
+struct KeepStruct; // lines 3-3
+template<typename Foo> class KeepTplClass; // lines 5-5
+---
+"""
+ self.RegisterFileContents({'explicit_specialization': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testKeepNestedForwardDeclares(self):
+ """Tests that we don't remove forward-declares inside classes/structs."""
+ infile = """\
+// Copyright 2010
+
+class Keep;
+class NoKeep; ///-
+///+
+class Nest {
+ class NestedClass;
+///+
+ class NestedClass {
+ };
+ class NestedClass2 { }; // looks just like a fwd declare, except for the {}
+ template<typename T>
+ class NestedTplClass; // test multi-line nested classes as well
+///+
+ friend class NoKeep;
+ template<typename T> friend class NoKeepTpl;
+};
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+nested_fwd_decl should add these lines:
+
+nested_fwd_decl should remove these lines:
+- class NoKeep; // lines 4-4
+
+The full include-list for nested_fwd_decl:
+class Keep; // lines 3-3
+class Nest::NestedClass; // lines 6-6
+template<typename T> class Nest::NestedTplClass; // lines 11-11
+---
+"""
+ self.RegisterFileContents({'nested_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareBeforeUsingStatement(self):
+ """Tests we never add a forward-declare after a contentful line."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+///+namespace Bar {
+///+class Baz;
+///+} // namespace Bar
+///+
+using Bar::baz;
+
+namespace Foo { class Bang; } ///-
+///+namespace Foo {
+///+class Bang;
+///+} // namespace Foo
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_before_using should add these lines:
+namespace Bar { class Baz; }
+
+add_fwd_decl_before_using should remove these lines:
+
+The full include-list for add_fwd_decl_before_using:
+#include "foo.h"
+namespace Bar { class Baz; }
+namespace Foo { class Bang; } // lines 7-7
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_before_using': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInNamespace(self):
+ """Make sure we normalize namespaces properly."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+///+namespace ns {
+///+class Foo;
+///+namespace ns2 {
+///+namespace ns3 {
+///+class Bar;
+///+template <typename T> class Bang;
+///+} // namespace ns3
+///+} // namespace ns2
+///+namespace ns4 {
+///+class Baz;
+///+} // namespace ns4
+///+} // namespace ns
+///+
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_inside_namespace should add these lines:
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+
+add_fwd_decl_inside_namespace should remove these lines:
+
+The full include-list for add_fwd_decl_inside_namespace:
+#include "foo.h" // lines 3-3
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_inside_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInsideNamespaceSometimes(self):
+ """Tests that in special situations, we will put fwd-decls inside a ns."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+class Bar;
+template <typename T> class Baz;
+
+namespace ns {
+
+ namespace ns2 { // we sure do love nesting our namespaces!
+
+class NsFoo;
+///+namespace ns3 {
+///+class NsBang;
+///+template <typename T> class NsBaz;
+///+} // namespace ns3
+template <typename T> class NsBar;
+
+}
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_inside_namespace should add these lines:
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+
+add_fwd_decl_inside_namespace should remove these lines:
+
+The full include-list for add_fwd_decl_inside_namespace:
+#include "foo.h" // lines 3-3
+class Bar; // lines 5-5
+namespace ns { namespace ns2 { class NsFoo; } } // lines 12-12
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+namespace ns { namespace ns2 { template <typename T> class NsBar; } } // lines 13-13
+template <typename T> class Baz; // lines 6-6
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_inside_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInsideNamespaceWithHeaderGuard(self):
+ """Tests that the header guard doesn't confuse our in-ns algorithm."""
+ infile = """\
+// Copyright 2010
+
+#ifndef HDR_GUARD
+#define HDR_GUARD
+
+#include "foo.h"
+
+class Bar;
+template <typename T> class Baz;
+
+namespace ns {
+
+ namespace ns2 { // we sure do love nesting our namespaces!
+
+class NsFoo;
+///+namespace ns3 {
+///+class NsBang;
+///+template <typename T> class NsBaz;
+///+} // namespace ns3
+template <typename T> class NsBar;
+
+}
+}
+
+#endif // HDR_GUARD
+"""
+ iwyu_output = """\
+add_fwd_decl_with_hdr_guard should add these lines:
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+
+add_fwd_decl_with_hdr_guard should remove these lines:
+
+The full include-list for add_fwd_decl_with_hdr_guard:
+#include "foo.h" // lines 6-6
+class Bar; // lines 8-8
+namespace ns { namespace ns2 { class NsFoo; } } // lines 15-15
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+namespace ns { namespace ns2 { template <typename T> class NsBar; } } // lines 16-16
+template <typename T> class Baz; // lines 9-9
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_with_hdr_guard': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testDoNotAddForwardDeclareInsideNamespaceWithContentfulLine(self):
+ """Tests that for 'confusing' code, we keep fwd-decl at the top."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+class Bar;
+///+namespace ns {
+///+namespace ns2 {
+///+class NsBang;
+///+template <typename T> class NsBaz;
+///+} // namespace ns2
+///+} // namespace ns
+template <typename T> class Baz;
+
+#ifdef THIS_IS_A_CONTENTFUL_LINE
+#include "bar.h"
+#endif
+
+namespace ns {
+
+namespace ns2 {
+
+class NsFoo;
+template <typename T> class NsBar;
+
+}
+
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+do_not_add_fwd_decl_inside_namespace should add these lines:
+namespace ns { namespace ns2 { class NsBang; } }
+namespace ns { namespace ns2 { template <typename T> class NsBaz; } }
+
+do_not_add_fwd_decl_inside_namespace should remove these lines:
+
+The full include-list for do_not_add_fwd_decl_inside_namespace:
+#include "foo.h" // lines 3-3
+class Bar; // lines 5-5
+namespace ns { namespace ns2 { class NsBang; } }
+namespace ns { namespace ns2 { class NsFoo; } } // lines 16-16
+namespace ns { namespace ns2 { template <typename T> class NsBar; } } // lines 17-17
+namespace ns { namespace ns2 { template <typename T> class NsBaz; } }
+template <typename T> class Baz; // lines 6-6
+---
+"""
+ self.RegisterFileContents({'do_not_add_fwd_decl_inside_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInsideNamespaceWithoutForwardDeclaresAlready(self):
+ """Tests we put fwd-decls inside an ns even if the ns has no fwd-decl."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+class Bar;
+template <typename T> class Baz;
+
+namespace ns {
+
+ namespace ns2 { // we sure do love nesting our namespaces!
+
+///+namespace ns3 {
+///+class NsBang;
+///+template <typename T> class NsBaz;
+///+} // namespace ns3
+///+
+int MyFunction() { }
+
+}
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_inside_namespace_without_fwd_decl should add these lines:
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+
+add_fwd_decl_inside_namespace_without_fwd_decl should remove these lines:
+
+The full include-list for add_fwd_decl_inside_namespace_without_fwd_decl:
+#include "foo.h" // lines 3-3
+class Bar; // lines 5-5
+namespace ns { namespace ns2 { namespace ns3 { class NsBang; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBaz; } } }
+template <typename T> class Baz; // lines 6-6
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_inside_namespace_without_fwd_decl':
+ infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInsideNamespaceWithUnnamedNamespace(self):
+ """Tests that unnamed namespaces do not mess up our in-ns calculation."""
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+class Bar;
+
+namespace ns {
+///+
+///+class NsBang;
+///+template <typename T> class NsBaz;
+
+namespace {
+class NsFoo;
+template <typename T> class NsBar;
+}
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_inside_namespace_unnamed_ns should add these lines:
+namespace ns { class NsBang; }
+namespace ns { template <typename T> class NsBaz; }
+
+add_fwd_decl_inside_namespace_unnamed_ns should remove these lines:
+
+The full include-list for add_fwd_decl_inside_namespace_unnamed_ns:
+#include "foo.h" // lines 3-3
+class Bar; // lines 5-5
+namespace ns { namespace { class NsFoo; } } // lines 12-12
+namespace ns { class NsBang; }
+namespace ns { template <typename T> class NsBaz; }
+namespace ns { namespace { template <typename T> class NsBar; } } // lines 13-13
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_inside_namespace_unnamed_ns':
+ infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemoveNamespaces(self):
+ """Tests that we keep or remove ns's based on fwd decl content."""
+ infile = """\
+// Copyright 2010
+
+namespace ns1 {
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo> class KeepTplClass;
+}
+ ///-
+namespace ns1 { ///-
+namespace ns2 { ///-
+// This should all go away. ///-
+// Even with the multi-line comment here. ///-
+template<typename Foo> class NoKeepTplClass; ///-
+} ///-
+} ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+ns_fwd_decl should add these lines:
+
+ns_fwd_decl should remove these lines:
+- class NoKeepClass; // lines 5-5
+- namespace ns1 { namespace ns2 { template<typename Foo> class NoKeepTplClass; } } // lines 13-13
+
+The full include-list for ns_fwd_decl:
+namespace ns1 { struct KeepStruct; } // lines 4-4
+namespace ns1 { template<typename Foo> class KeepTplClass; } // lines 6-6
+---
+"""
+ self.RegisterFileContents({'ns_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testKeepNamespacesWithNonForwardDecls(self):
+ """Tests we never remove a ns with 'real' content in it."""
+ infile = """\
+// Copyright 2010
+
+namespace ns1 {
+int ns_int = 5;
+class NoKeepClass; ///-
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+keep_ns_fwd_decl should add these lines:
+
+keep_ns_fwd_decl should remove these lines:
+- class NoKeepClass; // lines 5-5
+
+The full include-list for keep_ns_fwd_decl:
+---
+"""
+ self.RegisterFileContents({'keep_ns_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testICUNamespaces(self):
+ """Tests we treat the icu namespace macros as namespaces."""
+ infile = """\
+// Copyright 2010
+
+U_NAMESPACE_BEGIN // macro from icu
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo> class KeepTplClass;
+U_NAMESPACE_END
+ ///-
+ U_NAMESPACE_BEGIN ///-
+ template<typename Foo> class NoKeepTplClass; ///-
+ U_NAMESPACE_END ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+icu_namespace should add these lines:
+
+icu_namespace should remove these lines:
+- class NoKeepClass; // lines 5-5
+- template<typename Foo> class NoKeepTplClass; // lines 10-10
+
+The full include-list for icu_namespace:
+namespace ns1 { struct KeepStruct; } // lines 4-4
+namespace ns1 { template<typename Foo> class KeepTplClass; } // lines 6-6
+---
+"""
+ self.RegisterFileContents({'icu_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testHashNamespaces(self):
+ """Tests we treat the hash namespace macros as namespaces."""
+ infile = """\
+// Copyright 2010
+
+HASH_NAMESPACE_DECLARATION_START // macro from hash.h
+struct KeepStruct;
+class NoKeepClass; ///-
+template<typename Foo> class KeepTplClass;
+HASH_NAMESPACE_DECLARATION_END
+ ///-
+ HASH_NAMESPACE_DECLARATION_START ///-
+ template<typename Foo> class NoKeepTplClass; ///-
+ HASH_NAMESPACE_DECLARATION_END ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+hash_namespace should add these lines:
+
+hash_namespace should remove these lines:
+- class NoKeepClass; // lines 5-5
+- template<typename Foo> class NoKeepTplClass; // lines 10-10
+
+The full include-list for hash_namespace:
+namespace ns1 { struct KeepStruct; } // lines 4-4
+namespace ns1 { template<typename Foo> class KeepTplClass; } // lines 6-6
+---
+"""
+ self.RegisterFileContents({'hash_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testElaboratedClasses(self):
+ """Tests we don't remove lines like 'class Foo* fooptr'."""
+ infile = """\
+// Copyright 2010
+
+struct KeepStruct;
+class NoKeepClass; ///-
+///+
+struct NoKeepStruct* s;
+struct NoKeepStruct& t;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+elaborated_class should add these lines:
+
+elaborated_class should remove these lines:
+- class NoKeepClass; // lines 4-4
+
+The full include-list for elaborated_class:
+struct KeepStruct; // lines 3-3
+---
+"""
+ self.RegisterFileContents({'elaborated_class': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testBFlag(self):
+ """Tests that --b properly separates sections."""
+ self.flags.blank_lines = True
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include "subdir/bflag.h"
+///+
+///+#include <stdio.h>
+///+
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+subdir/bflag.cc should add these lines:
+#include "subdir/bflag.h"
+#include <stdio.h>
+#include "used2.h"
+
+subdir/bflag.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for subdir/bflag.cc:
+#include "subdir/bflag.h"
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'subdir/bflag.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testSafeHeadersFlag(self):
+ """Tests that --safe_headers causes us to not delete lines."""
+ self.flags.safe_headers = True
+ infile = """\
+// Copyright 2010
+
+#include <notused.h>
+#include <notused2.h> // Hello!
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+class Foo;
+template<typename T>
+class Bar;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+safe_flag.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+safe_flag.h should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include <notused.h> // lines 4-4
+- class Foo // lines 7-7
+- class Bar // lines 8-9
+
+The full include-list for safe_flag.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'safe_flag.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testSafeHeadersFlagTwice(self):
+ """Tests running --safe_headers 2ce in a row doesn't duplicate comments."""
+ self.flags.safe_headers = True
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> // iwyu says this can be removed
+#include <notused2.h> // Hello!; iwyu says this can be removed
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+class Foo; // iwyu says this can be removed
+template<typename T> // iwyu says this can be removed
+class Bar; // iwyu says this can be removed
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+safe_flag_twice.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+safe_flag_twice.h should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include <notused.h> // lines 4-4
+- class Foo // lines 7-7
+- class Bar // lines 8-9
+
+The full include-list for safe_flag_twice.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'safe_flag_twice.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testSafeHeadersFlagOnCcFiles(self):
+ """Tests that we delete even in --safe_headers mode, on .cc files."""
+ self.flags.safe_headers = True
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+#include <notused2.h> // Hello! ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+class Foo; ///-
+template<typename T> ///-
+class Bar; ///-
+ ///-
+int main() { return 0; }
+"""
+ iwyu_output = """\
+safe_flag.cc should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+safe_flag.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include <notused.h> // lines 4-4
+- class Foo // lines 7-7
+- class Bar // lines 8-9
+
+The full include-list for safe_flag.cc:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'safe_flag.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIncludeComments(self):
+ """Tests that we properly include comments on #include lines."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include "subdir/include_comments.h"
+///+#include <stdio.h> // for printf(), etc.
+#include "used.h" ///-
+///+#include "used.h" // for Used
+///+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==()
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+subdir/include_comments.cc should add these lines:
+#include "subdir/include_comments.h"
+#include <stdio.h> // for printf(), etc.
+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==()
+
+subdir/include_comments.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for subdir/include_comments.cc:
+#include "subdir/include_comments.h"
+#include <stdio.h> // for printf(), etc.
+#include "used.h" // for Used
+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==()
+---
+"""
+ self.RegisterFileContents({'subdir/include_comments.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNocommentsFlag(self):
+ """Tests we properly don't include/modify comments with --nocomments."""
+ self.flags.comments = False
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include "subdir/include_comments.h"
+///+#include <stdio.h>
+#include "used.h" // my favorite #include!
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+subdir/include_comments.cc should add these lines:
+#include "subdir/include_comments.h"
+#include <stdio.h> // for printf(), etc.
+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==()
+
+subdir/include_comments.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for subdir/include_comments.cc:
+#include "subdir/include_comments.h"
+#include <stdio.h> // for printf(), etc.
+#include "used.h" // for Used
+#include "used2.h" // for Used2, Used2::Used2, Used2::~Used2, Used2::Used_Enum, operator==()
+---
+"""
+ self.RegisterFileContents({'subdir/include_comments.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testFixingTwoFiles(self):
+ """Make sure data for one fix doesn't overlap with a second."""
+ file_a = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+#include "used_only_in_file_a.h"
+#include "used_only_in_file_b.h" ///-
+
+class FileAClass; // kept for file A, not for file B
+class FileBClass; // kept for file B, not for file A ///-
+"""
+ file_b = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+#include "used_only_in_file_a.h" ///-
+#include "used_only_in_file_b.h"
+
+class FileAClass; // kept for file A, not for file B ///-
+class FileBClass; // kept for file B, not for file A
+"""
+ iwyu_output = """\
+file_a.cc should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+file_a.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include "used_only_in_file_b.h" // lines 6-6
+- class FileBClass; // lines 9-9
+
+The full include-list for file_a.cc:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+#include "used_only_in_file_a.h"
+class FileAClass; // lines 8-8
+---
+
+file_b.cc should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+file_b.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include "used_only_in_file_a.h" // lines 5-5
+- class FileAClass; // lines 8-8
+
+The full include-list for file_b.cc:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+#include "used_only_in_file_b.h"
+class FileBClass; // lines 9-9
+---
+"""
+ self.RegisterFileContents({'file_a.cc': file_a, 'file_b.cc': file_b})
+ self.ProcessAndTest(iwyu_output)
+
+ def testListingTheSameFileTwice(self):
+ """Test when foo.cc is specified twice. It should fix conservatively."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+///+#include "include_this_file" // for reason 2
+#include "used.h"
+///+#include "used2.h"
+#include "used_only_in_file_a.h"
+#include "used_only_in_file_b.h" ///-
+
+class FileAClass; // kept for file A, not for file B
+class FileBClass; // kept for file B, not for file A ///-
+///+namespace foo {
+///+template <typename Arg1> ClassTemplate;
+///+} // namespace foo
+///+template <typename Arg1> ClassTemplate;
+"""
+ iwyu_output = """\
+twice.cc should add these lines:
+#include <stdio.h>
+#include "include_this_file" // for reason 1
+namespace foo { template <typename Arg1> ClassTemplate; }
+template <typename Arg1> ClassTemplate;
+
+twice.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include "used_only_in_file_a.h" // lines 5-5
+- #include "used_only_in_file_b.h" // lines 6-6
+- class FileAClass; // lines 8-8
+- class FileBClass; // lines 9-9
+
+The full include-list for twice.cc:
+#include <stdio.h>
+#include "include_this_file" // for reason 1
+#include "used.h"
+namespace foo { template <typename Arg1> ClassTemplate; }
+template <typename Arg1> ClassTemplate;
+---
+
+twice.cc should add these lines:
+#include "used2.h"
+#include "include_this_file" // for reason 2
+namespace foo { template <typename Arg2> ClassTemplate; }
+template <typename Arg2> ClassTemplate;
+
+twice.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include "used_only_in_file_b.h" // lines 6-6
+- class FileBClass; // lines 9-9
+
+The full include-list for twice.cc:
+#include "include_this_file" // for reason 2
+#include "used.h"
+#include "used2.h"
+#include "used_only_in_file_a.h"
+class FileAClass; // lines 8-8
+namespace foo { template <typename Arg2> ClassTemplate; }
+template <typename Arg2> ClassTemplate;
+---
+"""
+ self.RegisterFileContents({'twice.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testListingTheSameFileTwiceAndOnceIsANoop(self):
+ """Test when foo.cc is specified twice, once with 'all correct'."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h>
+///+#include <stdio.h>
+///+#include "include_this_file" // for reason 1
+#include "used.h"
+#include "used_only_in_file_a.h"
+
+class FileAClass;
+///+namespace foo {
+///+template <typename Arg1> ClassTemplate;
+///+} // namespace foo
+///+template <typename Arg1> ClassTemplate;
+"""
+ iwyu_output = """\
+twice.cc should add these lines:
+#include <stdio.h>
+#include "include_this_file" // for reason 1
+namespace foo { template <typename Arg1> ClassTemplate; }
+template <typename Arg1> ClassTemplate;
+
+twice.cc should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include "used_only_in_file_a.h" // lines 5-5
+- class FileAClass; // lines 7-7
+
+The full include-list for twice.cc:
+#include <stdio.h>
+#include "include_this_file" // for reason 1
+#include "used.h"
+namespace foo { template <typename Arg1> ClassTemplate; }
+template <typename Arg1> ClassTemplate;
+---
+
+(twice.cc has correct #includes/fwd-decls)
+"""
+ self.RegisterFileContents({'twice.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclare(self):
+ """Test adding a forward-declare, rather than keeping one."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+///+
+///+struct NotUsed;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+new_fwd_decl should add these lines:
+#include <stdio.h>
+#include "used2.h"
+struct NotUsed;
+
+new_fwd_decl should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for new_fwd_decl:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+struct NotUsed;
+---
+"""
+ self.RegisterFileContents({'new_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddAndKeepForwardDeclare(self):
+ """Test adding a forward-declare in addition to keeping one."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+class ForwardDeclClass;
+///+struct NotUsed;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+new_and_keep_fwd_decl should add these lines:
+#include <stdio.h>
+#include "used2.h"
+struct NotUsed;
+
+new_and_keep_fwd_decl should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for new_and_keep_fwd_decl:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+class ForwardDeclareClass; // lines 6-6
+struct NotUsed;
+---
+"""
+ self.RegisterFileContents({'new_and_keep_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeToFileThatHasOnlyForwardDeclarations(self):
+ """Tests we add an #include in an appropriate place if none exist."""
+ infile = """\
+// Copyright 2010
+
+///+#include <stdio.h>
+///+#include "used.h"
+///+
+const int kFoo = 5; // we should insert before the contentful line.
+
+class Foo;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+no_include_fwd_decl should add these lines:
+#include <stdio.h>
+#include "used.h"
+
+no_include_fwd_decl should remove these lines:
+
+The full include-list for no_include_fwd_decl:
+#include <stdio.h>
+#include "used.h"
+class Foo; // lines 5-5
+---
+"""
+ self.RegisterFileContents({'no_include_fwd_decl': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclarationToFileThatHasOnlyIncludes(self):
+ """Tests we add a forward-declare in an appropriate place if none exist."""
+ infile = """\
+// Copyright 2010
+
+const int kFoo = 5; // make sure we don't just insert at the beginning
+
+#include <stdio.h>
+#include "used.h"
+///+
+///+class Foo;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+no_fwd_decl_include should add these lines:
+class Foo;
+
+no_fwd_decl_include should remove these lines:
+
+The full include-list for no_fwd_decl_include:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+---
+"""
+ self.RegisterFileContents({'no_fwd_decl_include': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeToContentlessFile(self):
+ """Tests we add an #include ok to a basically empty file.."""
+ infile = """\
+// Copyright 2010
+///+#include <stdio.h>
+///+#include "used.h"
+///+
+///+class Foo;
+"""
+ iwyu_output = """\
+no_include should add these lines:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+
+no_include should remove these lines:
+
+The full include-list for no_include:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+---
+"""
+ self.RegisterFileContents({'no_include': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeToEmptyFile(self):
+ """Tests we add an #include ok to an empty file.."""
+ infile = ''
+ iwyu_output = """\
+empty_file should add these lines:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+
+empty_file should remove these lines:
+
+The full include-list for empty_file:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+---
+"""
+ self.RegisterFileContents({'empty_file': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeToOnlyOneContentfulLineFile(self):
+ """Prevent regression when the only contentful line was the last."""
+ infile = """\
+// Copyright 2010
+///+
+///+#include <stdio.h>
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+only_one_contentful_line.c should add these lines:
+#include <stdio.h>
+
+only_one_contentful_line.c should remove these lines:
+
+The full include-list for only_one_contentful_line.c:
+#include <stdio.h>
+---
+"""
+ self.RegisterFileContents({'only_one_contentful_line.c': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testCommentsAtEndOfFile(self):
+ """Tests we don't crash if a file ends with #includs and then a comment."""
+ infile = """\
+// Copyright 2010
+
+const int kFoo = 5; // make sure we don't just insert at the beginning
+
+#include <stdio.h>
+#include "used.h"
+///+
+///+class Foo;
+// Comments, and then...nothing
+"""
+ iwyu_output = """\
+comments_at_end_of_file should add these lines:
+class Foo;
+
+comments_at_end_of_file should remove these lines:
+
+The full include-list for comments_at_end_of_file:
+#include <stdio.h>
+#include "used.h"
+class Foo;
+---
+"""
+ self.RegisterFileContents({'comments_at_end_of_file': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddSystemIncludeToFileWithoutAny(self):
+ """Tests we add a system #include to a non-sys location when needed."""
+ infile = """\
+// Copyright 2010
+
+#ifdef HAVE_TYPE_TRAITS_H
+#include <type_traits.h>
+#endif
+///+#include <stdio.h>
+#include "used.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+system_include should add these lines:
+#include <stdio.h>
+
+system_include should remove these lines:
+
+The full include-list for system_include:
+#include <stdio.h>
+#include "used.h"
+---
+"""
+ self.RegisterFileContents({'system_include': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddNonSystemHeaderUnderMainCUHeader(self):
+ """Tests we distinguish main-cu headers from other non-system headers."""
+ infile = """\
+// Copyright 2010
+
+///+#include "main_cu.h"
+#include "main_cu-inl.h"
+ ///-
+#include <stdio.h>
+///+#include <stdlib.h>
+#ifdef WINDOWS
+#include <windows.h>
+#endif
+
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+main_cu_test.cc should add these lines:
+#include <stdlib.h>
+#include "main_cu.h"
+#include "used2.h"
+
+main_cu_test.cc should remove these lines:
+
+The full include-list for main_cu_test.cc:
+#include "main_cu.h"
+#include "main_cu-inl.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'main_cu_test.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddWithNearestIncludes(self):
+ """Tests we add "includes" with <includes> when there's a choice."""
+ infile = """\
+// Copyright 2010
+
+#include "nearest_include.h"
+
+static int x = 6;
+#include <stdio.h>
+///+#include "used.h"
+
+static int y = 7;
+class Foo;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+nearest_include.cc should add these lines:
+#include "used.h"
+
+nearest_include.cc should remove these lines:
+
+The full include-list for nearest_include.cc:
+#include "nearest_include.h"
+#include <stdio.h>
+#include "used.h"
+class Foo; // lines 9-9
+---
+"""
+ self.RegisterFileContents({'nearest_include.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testFalseAlarmHeaderGuard(self):
+ """Tests we calculate top-level-ness even in face of a fake header-guard."""
+ infile = """\
+// Copyright 2010
+
+#include "nearest_toplevel_include.h"
+
+static int x = 6;
+#include <stdio.h>
+///+#include "used.h"
+
+#ifndef MAP_ANONYMOUS // This is the fake header guard!
+# define MAP_ANONYMOUS MAP_ANON
+#endif
+
+#ifdef FOO
+#include <foo.h>
+#endif
+#if defined(BAR)
+#include <bar.h>
+#endif
+
+static int y = 7;
+class Foo;
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+nearest_toplevel_include.cc should add these lines:
+#include "used.h"
+
+nearest_toplevel_include.cc should remove these lines:
+
+The full include-list for nearest_toplevel_include.cc:
+#include "nearest_toplevel_include.h"
+#include <bar.h>
+#include <foo.h>
+#include <stdio.h>
+#include "used.h"
+class Foo; // lines 9-9
+---
+"""
+ self.RegisterFileContents({'nearest_toplevel_include.cc': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterHeaderGuard(self):
+ """Test that we are willing to insert .h's inside a header guard."""
+ infile = """\
+// Copyright 2010
+
+#ifndef SIMPLE_H_
+#define SIMPLE_H_
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+#endif
+"""
+ iwyu_output = """\
+simple.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+simple.h should remove these lines:
+- #include <notused.h> // lines 6-6
+
+The full include-list for simple.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'simple.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterSoloPragmaOnce(self):
+ """Test that we are willing to insert .h's after #pragma once."""
+ infile = """\
+// Copyright 2010
+
+#pragma once
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+"""
+ iwyu_output = """\
+pragma_once.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+pragma_once.h should remove these lines:
+- #include <notused.h> // lines 5-5
+
+The full include-list for pragma_once.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'pragma_once.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterPragmaOnceWithHeaderGuard(self):
+ """Test that we are willing to insert .h's after #pragma once and header
+ guard."""
+ infile = """\
+// Copyright 2010
+
+#pragma once
+#ifndef PRAGMA_ONCE_H_
+#define PRAGMA_ONCE_H_
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+#endif
+"""
+ iwyu_output = """\
+pragma_once_with_guard.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+pragma_once_with_guard.h should remove these lines:
+- #include <notused.h> // lines 7-7
+
+The full include-list for pragma_once_with_guard.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'pragma_once_with_guard.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterEarlyPragmaOnce(self):
+ """Test that we are willing to insert .h's after early #pragma once."""
+ infile = """\
+#pragma once
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+"""
+ iwyu_output = """\
+early_pragma_once.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+early_pragma_once.h should remove these lines:
+- #include <notused.h> // lines 4-4
+
+The full include-list for early_pragma_once.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'early_pragma_once.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterEarlyPragmaOnceWithHeaderGuard(self):
+ """Test that we are willing to insert .h's after early #pragma once and
+ header guard."""
+ infile = """\
+#pragma once
+// Copyright 2010
+
+#ifndef PRAGMA_ONCE_H_
+#define PRAGMA_ONCE_H_
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+#endif
+"""
+ iwyu_output = """\
+early_pragma_once_with_guard.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+early_pragma_once_with_guard.h should remove these lines:
+- #include <notused.h> // lines 7-7
+
+The full include-list for early_pragma_once_with_guard.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'early_pragma_once_with_guard.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterWeirdPragmaOnce(self):
+ """Test that we are willing to insert .h's after creatively formatted
+ #pragma once."""
+ infile = """\
+ # pragma once
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+"""
+ iwyu_output = """\
+weird_pragma_once.h should add these lines:
+#include <stdio.h>
+
+weird_pragma_once.h should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for weird_pragma_once.h:
+#include <stdio.h>
+---
+"""
+ self.RegisterFileContents({'weird_pragma_once.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeBeforePragmaMessage(self):
+ """Test that non-once #pragmas are pushed after the #includes."""
+ infile = """\
+///+#include <stdio.h>
+///+
+#pragma message "Hello world!"
+
+#include <notused.h> ///-
+"""
+ iwyu_output = """\
+weird_pragma_once.h should add these lines:
+#include <stdio.h>
+
+weird_pragma_once.h should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for weird_pragma_once.h:
+#include <stdio.h>
+---
+"""
+ self.RegisterFileContents({'weird_pragma_once.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterWeirdHeaderGuard(self):
+ """Test that we are willing to insert .h's inside a non-standard h-guard."""
+ infile = """\
+// Copyright 2010
+
+#if ! defined (SIMPLE_H_)
+#define SIMPLE_H_
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+#endif
+"""
+ iwyu_output = """\
+simple.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+simple.h should remove these lines:
+- #include <notused.h> // lines 6-6
+
+The full include-list for simple.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'simple.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterHeaderGuardLikeIfdef(self):
+ """Test that we are willing to insert .h's inside a h-guard-*like* line."""
+ infile = """\
+// Copyright 2010
+
+#ifdef __linux // serves the same role as a header guard
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+#endif
+
+// Comments are allowed after the header guard.
+"""
+ iwyu_output = """\
+os_header_guard.h should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+os_header_guard.h should remove these lines:
+- #include <notused.h> // lines 5-5
+
+The full include-list for os_header_guard.h:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'os_header_guard.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddIncludeAfterHeaderGuardButBeforeComments(self):
+ """Test that we introduce new #includes right after a header guard."""
+ infile = """\
+// Copyright 2010
+
+#ifndef SIMPLE_WITH_COMMENT_H_
+#define SIMPLE_WITH_COMMENT_H_
+
+///+#include <stdio.h>
+///+#include "used.h"
+///+
+// This is a comment
+void ForThisFunction();
+
+#endif
+"""
+ iwyu_output = """\
+simple_with_comment.h should add these lines:
+#include <stdio.h>
+#include "used.h"
+
+simple_with_comment.h should remove these lines:
+
+The full include-list for simple_with_comment.h:
+#include <stdio.h>
+#include "used.h"
+---
+"""
+ self.RegisterFileContents({'simple_with_comment.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIdentifyingHeaderGuardLines(self):
+ """Test that not all #defines look like header guards."""
+ infile = """\
+// Copyright 2010
+
+#ifndef IDENTIFYING_HEADER_GUARD_LINES_H_
+#define IDENTIFYING_HEADER_GUARD_LINES_H_
+
+namespace foo {
+// The namespace decl should come before this #define, not after.
+// It will, unless we wrongly say the #define is a header-guard define.
+///+namespace bar {
+///+class Baz;
+///+} // namespace bar
+///+
+#define NOT_A_HEADER_GUARD_LINE 1
+}
+
+#endif
+"""
+ iwyu_output = """\
+identifying_header_guard_lines.h should add these lines:
+namespace foo { namespace bar { class Baz; } }
+
+identifying_header_guard_lines.h should remove these lines:
+
+The full include-list for identifying_header_guard_lines.h:
+namespace foo { namespace bar { class Baz; } }
+---
+"""
+ self.RegisterFileContents({'identifying_header_guard_lines.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIncludeOfCcFile(self):
+ """Test that iwyu leaves .cc #includes alone."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int kFoo = 5;
+
+#include "not_mentioned.cc"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+cc_include should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+cc_include should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for cc_include:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'cc_include': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testCommentsBeforeIncludeLines(self):
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+// This is the first include.
+///+// Or it will be, after we reorder.
+///+#include <stdio.h>
+// This is the second include.
+// Or *it* will be, after we reorder.
+#include "used.h"
+// This is the first include. ///-
+// Or it will be, after we reorder. ///-
+#include <stdio.h> ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+comments_with_includes should add these lines:
+
+comments_with_includes should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for comments_with_includes:
+#include <stdio.h>
+#include "used.h"
+---
+"""
+ self.RegisterFileContents({'comments_with_includes': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testRemoveDuplicates(self):
+ """Tests we uniquify if an #include is in there twice."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+#include "used.h" // same line even though it has a comment ///-
+// Even though these two comment-lines are the same, they won't get de-duped.
+// Even though these two comment-lines are the same, they won't get de-duped.
+#ifdef _WINDOWS
+// But keep this one because it's in an #ifdef.
+#include "used.h"
+#endif
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+remove_duplicates should add these lines:
+#include <stdio.h>
+
+remove_duplicates should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for remove_duplicates:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'remove_duplicates': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testNestedNamespaces(self):
+ infile = """\
+// Copyright 2010
+
+///+#include <stdio.h>
+///+
+namespace X {
+class OneA
+///+
+namespace Y {
+///+class TwoA;
+class TwoB;
+class TwoA; ///-
+}}
+class Toplevel;
+ ///-
+namespace A { ///-
+namespace B { namespace C { ///-
+class Delete1; ///-
+}}} ///-
+ ///-
+namespace A { namespace B { class Delete2; } } ///-
+ ///-
+namespace A { ///-
+ namespace B { ///-
+ class Delete3; ///-
+ } ///-
+} // namespace A ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+many_namespaces should add these lines:
+#include <stdio.h>
+
+many_namespaces should remove these lines:
+- class Delete1; // lines 13-13
+- class Delete2; // lines 16-16
+- class Delete3; // lines 20-20
+
+The full include-list for many_namespaces:
+#include <stdio.h>
+class Toplevel; // lines 9-9
+class TwoA; // lines 7-7
+class TwoB; // lines 6-6
+class OneA; // lines 4-4
+---
+"""
+ self.RegisterFileContents({'many_namespaces': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testDoNotInsertIncludeIntoAClass(self):
+ infile = """\
+// Copyright 2010
+
+///+#include <stdio.h>
+///+
+class Foo {
+};
+
+class Bar {
+ class FwdDecl;
+
+ FwdDecl* f;
+}
+"""
+ iwyu_output = """\
+include_not_in_class should add these lines:
+#include <stdio.h>
+
+include_not_in_class should remove these lines:
+
+The full include-list for include_not_in_class:
+#include <stdio.h>
+class FwdDecl; // lines 7-7
+---
+"""
+ self.RegisterFileContents({'include_not_in_class': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIdenticalForwardDeclaredNamesInDifferentNamespaces(self):
+ infile = """\
+// Copyright 2010
+
+///+namespace ns1 {
+///+class ForwardDeclared;
+///+} // namespace ns1
+///+namespace ns2 {
+///+class ForwardDeclared;
+///+} // namespace ns2
+"""
+ iwyu_output = """\
+identical_names should add these lines:
+namespace ns1 { class ForwardDeclared; }
+namespace ns2 { class ForwardDeclared; }
+
+identical_names should remove these lines:
+
+The full include-list for identical_names:
+namespace ns1 { class ForwardDeclared; }
+namespace ns2 { class ForwardDeclared; }
+---
+"""
+ self.RegisterFileContents({'identical_names': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIterativeNamespaceDelete(self):
+ """Tests deleting a namespace with an emptied #ifdef inside it."""
+ infile = """\
+// Copyright 2010
+ ///-
+namespace foo { ///-
+#ifdef FWD_DECL ///-
+class Bar; ///-
+#endif ///-
+} ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+iterative_namespace should add these lines:
+
+iterative_namespace should remove these lines:
+- class Bar; // lines 5-5
+
+The full include-list for iterative_namespace:
+---
+"""
+ self.RegisterFileContents({'iterative_namespace': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testIterativeIfdefDelete(self):
+ """Tests deleting an ifdef with an emptied namespace inside it."""
+ infile = """\
+// Copyright 2010
+ ///-
+#ifdef FWD_DECL ///-
+namespace foo { ///-
+class Bar; ///-
+} ///-
+#endif ///-
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+iterative_ifdef should add these lines:
+
+iterative_ifdef should remove these lines:
+- class Bar; // lines 5-5
+
+The full include-list for iterative_ifdef:
+---
+"""
+ self.RegisterFileContents({'iterative_ifdef': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testOutOfRangeLineNumber(self):
+ """Test we skip editing completely if iwyu has a really big line number."""
+ # fix_includes skips the file-editing if it detects a problem, as
+ # in this test case. The way that skipping is evidenced in the
+ # test, is the output is empty.
+ infile = """\
+// Copyright 2010 ///-
+ ///-
+#include <notused.h> ///-
+#include "used.h" ///-
+ ///-
+int main() { return 0; } ///-
+"""
+ iwyu_output = """\
+out_of_range should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+out_of_range should remove these lines:
+- #include <notused.h> // lines 3-3
+- #include <bignumber.h> // lines 3000-3000
+
+The full include-list for out_of_range:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'out_of_range': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testDeleteExtraneousBlankLines(self):
+ """Test we delete blank lines around deleted spans correctly."""
+ infile = """\
+// Copyright 2010
+
+class Foo { };
+ ///-
+class Bar; ///-
+
+
+class Baz { };
+
+
+class Bang; ///-
+ ///-
+class Qux { };
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+extraneous_blank_lines should add these lines:
+
+extraneous_blank_lines should remove these lines:
+- class Bar; // lines 5-5
+- class Bang; // lines 11-11
+
+The full include-list for extraneous_blank_lines:
+---
+"""
+ self.RegisterFileContents({'extraneous_blank_lines': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testKeepNolintComment(self):
+ """Test we keep a nolint comment."""
+ infile = """\
+// Copyright 2010
+
+#include "bar.h" // NOLINT(iwyu)
+#include "baz.h" // NOLINT(iwyu): blah blah
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+keep_nolint should add these lines:
+
+keep_nolint should remove these lines:
+
+The full include-list for keep_nolint:
+#include "bar.h" // lines 3-3
+#include "baz.h" // lines 4-4
+---
+"""
+
+ self.RegisterFileContents({'keep_nolint': infile})
+ # No files are written, because there are no changes.
+ self.ProcessAndTest(iwyu_output, unedited_files=['keep_nolint'])
+
+ def testKeepNolintCommentInNocommentMode(self):
+ """Test we keep a nolint comment even with --nocomments."""
+ self.flags.comments = False
+ self.testKeepNolintComment()
+
+ # Test the IWYUOutputParser method _MatchSectionHeading.
+
+ def testIWYUOutputParserMatchSectionHeadingSuccess(self):
+ parser = fix_includes.IWYUOutputParser()
+ self.assertEqual(None, parser.current_section)
+ self.assertEqual('<unknown file>', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(''))
+ self.assertEqual(None, parser.current_section)
+ self.assertEqual('<unknown file>', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(
+ 'myfile.cc should add these lines:'))
+ self.assertEqual(parser._ADD_SECTION_RE, parser.current_section)
+ self.assertEqual('add', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('myfile.cc', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(
+ 'myfile.cc should remove these lines:'))
+ self.assertEqual(parser._REMOVE_SECTION_RE, parser.current_section)
+ self.assertEqual('remove', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('myfile.cc', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(
+ 'The full include-list for myfile.cc:'))
+ self.assertEqual(parser._TOTAL_SECTION_RE, parser.current_section)
+ self.assertEqual('total', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('myfile.cc', parser.filename)
+
+ self.assertTrue(not parser._ProcessOneLine('---'))
+ self.assertEqual(parser._SECTION_END_RE, parser.current_section)
+ self.assertEqual('end', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('myfile.cc', parser.filename)
+
+ def testIWYUOutputParserMatchSectionHeadingWindowsPaths(self):
+ # Windows path names can contain the ':' character, so make sure that parses
+ # correctly. IWYU uses POSIX-style forward slashes consistently, so follow
+ # suit here.
+ parser = fix_includes.IWYUOutputParser()
+ self.assertTrue(parser._ProcessOneLine(
+ 'C:/src/myfile.cc should add these lines:'))
+ self.assertEqual(parser._ADD_SECTION_RE, parser.current_section)
+ self.assertEqual('add', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('C:/src/myfile.cc', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(
+ 'C:/src/myfile.cc should remove these lines:'))
+ self.assertEqual(parser._REMOVE_SECTION_RE, parser.current_section)
+ self.assertEqual('remove', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('C:/src/myfile.cc', parser.filename)
+
+ self.assertTrue(parser._ProcessOneLine(
+ 'The full include-list for C:/src/myfile.cc:'))
+ self.assertEqual(parser._TOTAL_SECTION_RE, parser.current_section)
+ self.assertEqual('total', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('C:/src/myfile.cc', parser.filename)
+
+ def testIWYUOutputParserProcessOneLineProcessNoEditsHeader(self):
+ parser = fix_includes.IWYUOutputParser()
+ line = '(myfile.cc has correct #includes/fwd-decls)'
+ self.assertTrue(not parser._ProcessOneLine(line))
+ self.assertEqual(parser._NO_EDITS_RE, parser.current_section)
+ self.assertEqual('no_edits', parser._RE_TO_NAME[parser.current_section])
+ self.assertEqual('myfile.cc', parser.filename)
+
+ def testIWYUOutputParserProcessOneLineAddNotSeenFirst(self):
+ parser = fix_includes.IWYUOutputParser()
+ self.assertRaises(fix_includes.FixIncludesError,
+ parser._ProcessOneLine,
+ 'myfile.cc should remove these lines:')
+
+ def testIWYUOutputParserProcessOneLineOutOfOrder(self):
+ parser = fix_includes.IWYUOutputParser()
+ self.assertTrue(parser._ProcessOneLine(
+ 'myfile.cc should add these lines:'))
+ self.assertRaises(fix_includes.FixIncludesError,
+ parser._ProcessOneLine,
+ 'The full include-list for myfile.cc:')
+
+ def testIWYUOutputParserProcessOneLineIncorrectFilename(self):
+ parser = fix_includes.IWYUOutputParser()
+ self.assertTrue(parser._ProcessOneLine(
+ 'myfile.cc should add these lines:'))
+ self.assertRaises(fix_includes.FixIncludesError,
+ parser._ProcessOneLine,
+ 'not_myfile.cc should remove these lines:')
+
+ def testIWYUOutputParserProcessOneLineNoMatcher(self):
+ parser = fix_includes.IWYUOutputParser()
+ # We successfully process this not-in-any-section line, but update no data.
+ self.assertTrue(parser._ProcessOneLine('#include <foo>'))
+ self.assertEqual(None, parser.current_section)
+ self.assertEqual('<unknown file>', parser.filename)
+
+ def testIWYUOutputParserSuccess(self):
+ """Tests the IWYUOutputParser method ParseOneRecord."""
+ iwyu_output = """\
+simple should add these lines:
+#include <stdio.h>
+#include "used2.h"
+namespace ns {class ForwardDeclared;}
+
+simple should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for simple:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+namespace ns {class ForwardDeclared;}
+---
+"""
+ parser = fix_includes.IWYUOutputParser()
+ record = parser.ParseOneRecord(iwyu_output.splitlines(), self.flags)
+
+ self.assertEqual('simple', record.filename)
+ self.assertSetEqual(set([3]), record.lines_to_delete)
+ self.assertSetEqual(set(('#include <stdio.h>',
+ '#include "used2.h"',
+ 'namespace ns {class ForwardDeclared;}')),
+ record.includes_and_forward_declares_to_add)
+
+ def testIWYUOutputParserRemoveLineNoComment(self):
+ iwyu_output = """\
+no_comment should add these lines:
+
+no_comment should remove these lines:
+- #include <notused.h>
+
+The full include-list for no_key:
+---
+"""
+ parser = fix_includes.IWYUOutputParser()
+ self.assertRaises(fix_includes.FixIncludesError,
+ parser.ParseOneRecord,
+ iwyu_output.splitlines(),
+ self.flags)
+
+ def testNotWriteable(self):
+ """Test that files don't get rewritten if they are not writeable."""
+ infile = """\
+// Copyright 2010
+
+#include <notused.h>
+#include "used.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+unwritable should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+unwritable should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for unwritable:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'unwritable': infile})
+ self.MakeFilesUnwriteable()
+ # No files are written, because they are not writeable.
+ self.ProcessAndTest(iwyu_output, unedited_files=['unwritable'])
+
+
+ def testFileSpecifiedOnCommandline(self):
+ """Test we limit editing to files specified on the commandline."""
+ changed_infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ unchanged_infile = """\
+// Copyright 2010
+
+#include <notused.h>
+#include "used.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+changed should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+changed should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for changed:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ # Have the exact same iwyu output for 'unchanged' as for 'changed'.
+ iwyu_output += iwyu_output.replace('changed', 'unchanged')
+
+ self.RegisterFileContents({'changed': changed_infile,
+ 'unchanged': unchanged_infile})
+ # unchanged should not be edited, since it is not listed on the 'cmdline'.
+ self.ProcessAndTest(iwyu_output, cmdline_files=['changed'],
+ unedited_files=['unchanged'])
+
+ def testIgnoreRe(self):
+ """Test the behavior of the --ignore_re flag."""
+ changed_infile = """\
+// Copyright 2010
+
+#include <notused.h> ///-
+///+#include <stdio.h>
+#include "used.h"
+///+#include "used2.h"
+
+int main() { return 0; }
+"""
+ unchanged_infile = """\
+// Copyright 2010
+
+#include <notused.h>
+#include "used.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+changed should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+changed should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for changed:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ # Have the exact same iwyu output for 'unchanged' as for 'changed'.
+ iwyu_output += iwyu_output.replace('changed', 'unchanged')
+
+ self.RegisterFileContents({'changed': changed_infile,
+ 'unchanged': unchanged_infile})
+ # unchanged should not be edited, since it matches ignore_re.
+ self.flags.ignore_re = 'nch'
+ self.ProcessAndTest(iwyu_output, unedited_files=['unchanged'])
+
+ def testSortIncludes(self):
+ """Test sorting includes only -- like running fix_includes.py -s."""
+ infile = """\
+// Copyright 2010
+
+#include <stdio.h>
+// This file is not used.
+#include <notused.h>
+
+// This file is not used either.
+// It's not used.
+// Not used at all.
+#include <notused2.h>
+
+#include "notused3.h"
+
+// This comment should stay, it's not before an #include.
+const int kInt = 5;
+// This file is used.
+// It's definitedly used.
+#include "used.h"
+#include <stdlib.h>
+
+const int kInt2 = 6;
+
+#include "foo.cc"
+
+// This comment should stay, it's not before an #include.
+int main() { return 0; }
+"""
+ expected_output = """\
+// Copyright 2010
+
+// This file is not used.
+#include <notused.h>
+// This file is not used either.
+// It's not used.
+// Not used at all.
+#include <notused2.h>
+#include <stdio.h>
+#include "notused3.h"
+
+// This comment should stay, it's not before an #include.
+const int kInt = 5;
+#include <stdlib.h>
+// This file is used.
+// It's definitedly used.
+#include "used.h"
+
+const int kInt2 = 6;
+
+#include "foo.cc"
+
+// This comment should stay, it's not before an #include.
+int main() { return 0; }
+"""
+ self.RegisterFileContents({'sort': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(['sort'], self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testSortingMultipleFiles(self):
+ """Tests passing more than one argument to SortIncludesInFiles()."""
+ infile1 = """\
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+"""
+ infile2 = """\
+#include "z.h"
+#include "y.h"
+#include "x.y"
+"""
+
+ expected_output = """\
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "x.y"
+#include "y.h"
+#include "z.h"
+"""
+ self.RegisterFileContents({'f1': infile1, 'f2': infile2})
+ num_files_modified = fix_includes.SortIncludesInFiles(['f1', 'f2'],
+ self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(2, num_files_modified)
+
+
+ def testSortingIncludesAlreadySorted(self):
+ """Tests sorting includes only, when includes are already sorted."""
+ infile = """\
+// Copyright 2010
+
+#include <ctype.h>
+#include <stdio.h>
+
+namespace Foo; // fwd-decls are out of order, but sorter ignores them
+
+namespace Bar;
+
+int main() { return 0; }
+"""
+ self.RegisterFileContents({'sort_nosorting.h': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(['sort_nosorting.h'],
+ self.flags)
+ self.assertListEqual([], self.actual_after_contents)
+ self.assertEqual(0, num_files_modified)
+
+ def testBarrierIncludes(self):
+ """Tests that we correctly sort 'around' _BARRIER_INCLUDES."""
+ infile = """\
+// Copyright 2010
+
+#include <linux/a_stay_top.h>
+#include <stdlib.h> ///-
+#include <linux/can_sort_around_this_deleted_include> ///-
+#include <stdio.h>
+///+#include <stdlib.h>
+#include "user/include.h"
+///+#include "user/new_include.h"
+#include <linux/c_stay_second.h>
+#include <linux/b_stay_third.h>
+#include <ctype.h>
+#include <cpp_include>
+///+#include <new_cpp_include>
+#include <linux/d_stay_fourth.h>
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+barrier_includes.h should add these lines:
+#include "user/new_include.h"
+#include <new_cpp_include>
+
+barrier_includes.h should remove these lines:
+- #include <linux/can_sort_around_this_deleted_include> // lines 5-5
+
+The full include-list for barrier_includes.h:
+#include "user/include.h"
+#include "user/new_include.h"
+#include <cpp_include>
+#include <ctype.h>
+#include <linux/a_stay_top.h>
+#include <linux/b_stay_third.h>
+#include <linux/c_stay_second.h>
+#include <linux/d_stay_fourth.h>
+#include <new_cpp_include>
+#include <stdio.h>
+#include <stdlib.h>
+---
+"""
+ self.RegisterFileContents({'barrier_includes.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testSortingMainCUIncludeInSameDirectory(self):
+ """Check that we identify when first .h file is a main-cu #include."""
+ infile = """\
+#include <stdio.h>
+#include "me/subdir0/foo.h"
+#include "other/baz.h"
+"""
+ expected_output = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "other/baz.h"
+"""
+ self.RegisterFileContents({'me/subdir0/foo.cc': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(
+ ['me/subdir0/foo.cc'], self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testSortingMainCUIncludeWithUpperCaseH(self):
+ """Check that we identify when first .H file is a main-cu #include."""
+ infile = """\
+#include <stdio.h>
+#include "foo.H"
+"""
+ expected_output = """\
+#include "foo.H"
+#include <stdio.h>
+"""
+ self.RegisterFileContents({'foo.cc': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(
+ ['foo.cc'], self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testSortingMainCUIncludeInSameDirectoryWithInl(self):
+ """Check that we identify when first -inl.h file is a main-cu #include."""
+ infile = """\
+#include <stdio.h>
+#include "me/subdir0/foo-inl.h"
+#include "other/baz.h"
+"""
+ expected_output = """\
+#include "me/subdir0/foo-inl.h"
+#include <stdio.h>
+#include "other/baz.h"
+"""
+ self.RegisterFileContents({'me/subdir0/foo.cc': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(
+ ['me/subdir0/foo.cc'], self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testSortingMainCUIncludeInDifferentDirectory(self):
+ """Check that we identify when first .h file is a main-cu #include."""
+ infile = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "other/baz.h"
+"""
+ self.RegisterFileContents({'me/other_subdir/foo.cc': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(
+ ['me/other_subdir/foo.cc'], self.flags)
+ self.assertListEqual([], self.actual_after_contents)
+ self.assertEqual(0, num_files_modified)
+
+ def testSortingMainCUIncludeInDifferentDirectoryWhenNotFirst(self):
+ """Check that we don't let second .h be a main-cu #include."""
+ infile = """\
+#include <stdio.h>
+#include "me/subdir0/foo.h"
+#include "other/baz.h"
+"""
+ self.RegisterFileContents({'me/other_subdir/foo.cc': infile})
+ num_files_modified = fix_includes.SortIncludesInFiles(
+ ['me/other_subdir/foo.cc'], self.flags)
+ self.assertListEqual([], self.actual_after_contents)
+ self.assertEqual(0, num_files_modified)
+
+ def testSortingProjectIncludesAuto(self):
+ """Check that project includes can be sorted separately."""
+ infile = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "me/subdir2/bar.h"
+#include "me/subdir1/bar.h"
+#include "me/subdir0/bar.h"
+#include "other/baz.h"
+"""
+ expected_output = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "other/baz.h"
+#include "me/subdir0/bar.h"
+#include "me/subdir1/bar.h"
+#include "me/subdir2/bar.h"
+"""
+ self.RegisterFileContents({'me/subdir0/foo.cc': infile})
+ self.flags.separate_project_includes = '<tld>'
+ num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'],
+ self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testSortingProjectIncludesUserSpecified(self):
+ """Test user-specified project directory name."""
+ infile = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "me/subdir2/bar.h"
+#include "me/subdir1/bar.h"
+#include "me/subdir0/bar.h"
+#include "other/baz.h"
+"""
+ expected_output = """\
+#include "me/subdir0/foo.h"
+#include <stdio.h>
+#include "me/subdir1/bar.h"
+#include "me/subdir2/bar.h"
+#include "other/baz.h"
+#include "me/subdir0/bar.h"
+"""
+ self.RegisterFileContents({'me/subdir0/foo.cc': infile})
+ self.flags.separate_project_includes = 'me/subdir0'
+ num_files_modified = fix_includes.SortIncludesInFiles(['me/subdir0/foo.cc'],
+ self.flags)
+ self.assertListEqual(expected_output.strip().split('\n'),
+ self.actual_after_contents)
+ self.assertEqual(1, num_files_modified)
+
+ def testAddingNewIncludesAfterRemovingOldOnes(self):
+ infile = """\
+// Copyright 2008 Google Inc. All Rights Reserved.
+// Author: zhifengc@google.com (Zhifeng Chen)
+
+#ifndef STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_
+#define STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_
+
+#include "util/task/status.h" ///-
+#include "strings/stringpiece.h" ///-
+///+#include <string> // for string
+///+#include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN
+///+#include "base/scoped_ptr.h" // for scoped_ptr
+
+class Query;
+///+namespace util {
+///+class Status;
+///+} // namespace util
+
+namespace structuredsearch {
+
+///+class FieldSpecification;
+class FieldTokenizer;
+class FieldSpecification; ///-
+class TokenizationSpec;
+
+class QueryXlator { ... };
+
+#endif // #define STRUCTUREDSEARCH_COMMON_INTERNAL_DFS_H_
+"""
+ iwyu_output = """\
+structuredsearch/common/internal/query_field_xlate.h should add these lines:
+#include <string> // for string
+#include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN
+#include "base/scoped_ptr.h" // for scoped_ptr
+namespace util { class Status; }
+
+structuredsearch/common/internal/query_field_xlate.h should remove these lines:
+- #include "strings/stringpiece.h" // lines 8-8
+- #include "util/task/status.h" // lines 7-7
+
+The full include-list for structuredsearch/common/internal/query_field_xlate.h:
+#include <string> // for string
+#include "base/macros.h" // for DISALLOW_COPY_AND_ASSIGN
+#include "base/scoped_ptr.h" // for scoped_ptr
+class Query; // lines 10-10
+namespace structuredsearch { class FieldSpecification; } // lines 15-15
+namespace structuredsearch { class FieldTokenizer; } // lines 14-14
+namespace structuredsearch { class TokenizationSpec; } // lines 16-16
+namespace util { class Status; }
+---
+"""
+ self.RegisterFileContents(
+ {'structuredsearch/common/internal/query_field_xlate.h': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testDryRun(self):
+ """Tests that --dry_run mode does not modify files."""
+ self.flags.dry_run = True
+ infile = """\
+// Copyright 2010
+
+#include <notused.h>
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+dry_run should add these lines:
+#include <stdio.h>
+#include "used2.h"
+
+dry_run should remove these lines:
+- #include <notused.h> // lines 3-3
+
+The full include-list for dry_run:
+#include <stdio.h>
+#include "used.h"
+#include "used2.h"
+---
+"""
+ self.RegisterFileContents({'dry_run': infile})
+ num_modified_files = fix_includes.ProcessIWYUOutput(
+ StringIO(iwyu_output), ['dry_run'], self.flags)
+ self.assertListEqual([], self.actual_after_contents)
+ self.assertEqual(1, num_modified_files)
+
+ def testAddForwardDeclareAndKeepIwyuNamespaceFormat(self):
+ """Tests that --keep_iwyu_namespace_format writes namespace lines
+ using the IWYU one-line format.
+ Input code similar to case testAddForwardDeclareInNamespace."""
+ self.flags.keep_iwyu_namespace_format = True
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+///+namespace ns { class Foo; }
+///+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+///+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+///+namespace ns { namespace ns4 { class Baz; } }
+///+
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_declare_keep_iwyu_namespace should add these lines:
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+
+add_fwd_declare_keep_iwyu_namespace should remove these lines:
+
+The full include-list for add_fwd_declare_keep_iwyu_namespace:
+#include "foo.h" // lines 3-3
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+---
+"""
+ self.RegisterFileContents({'add_fwd_declare_keep_iwyu_namespace': infile})
+ self.ProcessAndTest(iwyu_output, expected_num_modified_files=1)
+
+ def testAddNestedForwardDeclaresWithKeepIwyuNamespaceFormat(self):
+ """Tests that --keep_iwyu_namespace_format writes namespace lines
+ using the IWYU one-line format.
+ Input code similar to case
+ testAddForwardDeclareInsideNamespaceWithoutForwardDeclaresAlready."""
+ self.flags.keep_iwyu_namespace_format = True
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+class Bar;
+///+class Foo;
+///+namespace ns1 { class NsFoo; }
+///+namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } }
+///+namespace ns1 { namespace ns2 { namespace ns3 { template <typename T> class NsBang; } } }
+template <typename T> class Baz;
+
+
+namespace ns {
+
+///+class NsFoo;
+///+namespace ns2 { namespace ns3 { class NsBaz; } }
+///+namespace ns2 { namespace ns3 { template <typename T> class NsBang; } }
+///+
+class NsBar;
+
+ namespace ns2 { // we sure do love nesting our namespaces!
+
+int MyFunction() { }
+
+}
+}
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_decl_with_keep_iwyu_format should add these lines:
+class Foo;
+namespace ns { class NsFoo; }
+namespace ns { namespace ns2 { namespace ns3 { class NsBaz; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBang; } } }
+namespace ns1 { class NsFoo; }
+namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } }
+namespace ns1 { namespace ns2 { namespace ns3 { template <typename T> class NsBang; } } }
+
+add_fwd_decl_with_keep_iwyu_format should remove these lines:
+
+The full include-list for add_fwd_decl_with_keep_iwyu_format:
+#include "foo.h" // lines 3-3
+class Bar; // lines 5-5
+class Foo;
+namespace ns { class NsFoo; }
+namespace ns { namespace ns2 { class NsBar; } }
+namespace ns { namespace ns2 { namespace ns3 { class NsBaz; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class NsBang; } } }
+namespace ns1 { class NsFoo; }
+namespace ns1 { namespace ns2 { namespace ns3 { class NsBaz; } } }
+namespace ns1 { namespace ns2 { namespace ns3 { template <typename T> class NsBang; } } }
+template <typename T> class Baz; // lines 6-6
+---
+"""
+ self.RegisterFileContents({'add_fwd_decl_with_keep_iwyu_format': infile})
+ self.ProcessAndTest(iwyu_output)
+
+ def testAddForwardDeclareInNamespaceWithKeepIwyuNamespaceFormat(self):
+ """Tests that --keep_iwyu_namespace_format writes namespace lines
+ using the IWYU one-line format.
+ Input code similar to case testAddForwardDeclareInNamespace."""
+ self.flags.keep_iwyu_namespace_format = True
+ infile = """\
+// Copyright 2010
+
+#include "foo.h"
+
+///+namespace ns { class Foo; }
+///+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+///+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+///+namespace ns { namespace ns4 { class Baz; } }
+///+
+
+int main() { return 0; }
+"""
+ iwyu_output = """\
+add_fwd_declare_keep_iwyu_namespace should add these lines:
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+
+add_fwd_declare_keep_iwyu_namespace should remove these lines:
+
+The full include-list for add_fwd_declare_keep_iwyu_namespace:
+#include "foo.h" // lines 3-3
+namespace ns { class Foo; }
+namespace ns { namespace ns2 { namespace ns3 { class Bar; } } }
+namespace ns { namespace ns2 { namespace ns3 { template <typename T> class Bang; } } }
+namespace ns { namespace ns4 { class Baz; } }
+---
+"""
+ self.RegisterFileContents({'add_fwd_declare_keep_iwyu_namespace': infile})
+ self.ProcessAndTest(iwyu_output, expected_num_modified_files=1)
+
+ def testMain(self):
+ """Make sure calling main doesn't crash. Inspired by a syntax-error bug."""
+ # Give an empty stdin so we don't actually try to parse anything.
+ old_stdin = sys.stdin
+ try:
+ sys.stdin = StringIO()
+ fix_includes.main(['fix_includes.py']) # argv[0] doesn't really matter
+ finally:
+ sys.stdin = old_stdin
+
+ def testFilenamesForSortingInMain(self):
+ """Make sure if we use s, we have a filename specified, in main()."""
+ # -s without any files to sort.
+ self.assertRaises(SystemExit, fix_includes.main,
+ ['fix_includes.py', '-s'])
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/gcc.libc.imp b/gcc.libc.imp
new file mode 100644
index 0000000..66e9fdb
--- /dev/null
+++ b/gcc.libc.imp
@@ -0,0 +1,205 @@
+# Mappings for GNU libc
+# ( cd /usr/include && grep '^ *# *include' {sys/,net/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: [ "<$2>", private, "<$1>", public ] },@' | grep bits/ | sort )
+# When I saw more than one mapping for these, I typically picked
+# what I thought was the "best" one.
+[
+ { include: [ "<bits/a.out.h>", private, "<a.out.h>", public ] },
+ { include: [ "<bits/auxv.h>", private, "<sys/auxv.h>", public ] },
+ { include: [ "<bits/byteswap.h>", private, "<byteswap.h>", public ] },
+ { include: [ "<bits/cmathcalls.h>", private, "<complex.h>", public ] },
+ { include: [ "<bits/confname.h>", private, "<unistd.h>", public ] },
+ { include: [ "<bits/dirent.h>", private, "<dirent.h>", public ] },
+ { include: [ "<bits/dlfcn.h>", private, "<dlfcn.h>", public ] },
+ { include: [ "<bits/elfclass.h>", private, "<link.h>", public ] },
+ { include: [ "<bits/endian.h>", private, "<endian.h>", public ] },
+ { include: [ "<bits/environments.h>", private, "<unistd.h>", public ] },
+ { include: [ "<bits/epoll.h>", private, "<sys/epoll.h>", public ] },
+ { include: [ "<bits/errno.h>", private, "<errno.h>", public ] },
+ { include: [ "<bits/error.h>", private, "<error.h>", public ] },
+ { include: [ "<bits/eventfd.h>", private, "<sys/eventfd.h>", public ] },
+ { include: [ "<bits/fcntl.h>", private, "<fcntl.h>", public ] },
+ { include: [ "<bits/fcntl2.h>", private, "<fcntl.h>", public ] },
+ { include: [ "<bits/fenv.h>", private, "<fenv.h>", public ] },
+ { include: [ "<bits/fenvinline.h>", private, "<fenv.h>", public ] },
+ { include: [ "<bits/huge_val.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/huge_valf.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/huge_vall.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/hwcap.h>", private, "<sys/auxv.h>", public ] },
+ { include: [ "<bits/inf.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/inotify.h>", private, "<sys/inotify.h>", public ] },
+ { include: [ "<bits/ioctl-types.h>", private, "<sys/ioctl.h>", public ] },
+ { include: [ "<bits/ioctls.h>", private, "<sys/ioctl.h>", public ] },
+ { include: [ "<bits/ipc.h>", private, "<sys/ipc.h>", public ] },
+ { include: [ "<bits/ipctypes.h>", private, "<sys/ipc.h>", public ] },
+ { include: [ "<bits/libio-ldbl.h>", private, "<libio.h>", public ] },
+ { include: [ "<bits/link.h>", private, "<link.h>", public ] },
+ { include: [ "<bits/locale.h>", private, "<locale.h>", public ] },
+ { include: [ "<bits/math-finite.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mathcalls.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mathdef.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mathinline.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mman.h>", private, "<sys/mman.h>", public ] },
+ { include: [ "<bits/monetary-ldbl.h>", private, "<monetary.h>", public ] },
+ { include: [ "<bits/mqueue.h>", private, "<mqueue.h>", public ] },
+ { include: [ "<bits/mqueue2.h>", private, "<mqueue.h>", public ] },
+ { include: [ "<bits/msq.h>", private, "<sys/msg.h>", public ] },
+ { include: [ "<bits/nan.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/netdb.h>", private, "<netdb.h>", public ] },
+ { include: [ "<bits/param.h>", private, "<sys/param.h>", public ] },
+ { include: [ "<bits/poll.h>", private, "<sys/poll.h>", private ] },
+ { include: [ "<bits/poll2.h>", private, "<sys/poll.h>", private ] },
+ { include: [ "<bits/posix1_lim.h>", private, "<limits.h>", public ] },
+ { include: [ "<bits/posix2_lim.h>", private, "<limits.h>", public ] },
+ { include: [ "<bits/posix_opt.h>", private, "<unistd.h>", public ] },
+ { include: [ "<bits/printf-ldbl.h>", private, "<printf.h>", public ] },
+ { include: [ "<bits/pthreadtypes.h>", private, "<pthread.h>", public ] },
+ { include: [ "<bits/resource.h>", private, "<sys/resource.h>", public ] },
+ { include: [ "<bits/sched.h>", private, "<sched.h>", public ] },
+ { include: [ "<bits/select.h>", private, "<sys/select.h>", public ] },
+ { include: [ "<bits/select2.h>", private, "<sys/select.h>", public ] },
+ { include: [ "<bits/sem.h>", private, "<sys/sem.h>", public ] },
+ { include: [ "<bits/semaphore.h>", private, "<semaphore.h>", public ] },
+ { include: [ "<bits/setjmp.h>", private, "<setjmp.h>", public ] },
+ { include: [ "<bits/setjmp2.h>", private, "<setjmp.h>", public ] },
+ { include: [ "<bits/shm.h>", private, "<sys/shm.h>", public ] },
+ { include: [ "<bits/sigaction.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/sigcontext.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/siginfo.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/signum.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/sigset.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/sigstack.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/sigthread.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/sockaddr.h>", private, "<sys/un.h>", public ] },
+ { include: [ "<bits/socket.h>", private, "<sys/socket.h>", public ] },
+ { include: [ "<bits/socket2.h>", private, "<sys/socket.h>", public ] },
+ { include: [ "<bits/socket_type.h>", private, "<sys/socket.h>", public ] },
+ { include: [ "<bits/stab.def>", private, "<stab.h>", public ] },
+ { include: [ "<bits/stat.h>", private, "<sys/stat.h>", public ] },
+ { include: [ "<bits/statfs.h>", private, "<sys/statfs.h>", public ] },
+ { include: [ "<bits/statvfs.h>", private, "<sys/statvfs.h>", public ] },
+ { include: [ "<bits/stdio-ldbl.h>", private, "<stdio.h>", public ] },
+ { include: [ "<bits/stdio-lock.h>", private, "<libio.h>", public ] },
+ { include: [ "<bits/stdio.h>", private, "<stdio.h>", public ] },
+ { include: [ "<bits/stdio2.h>", private, "<stdio.h>", public ] },
+ { include: [ "<bits/stdio_lim.h>", private, "<stdio.h>", public ] },
+ { include: [ "<bits/stdlib-bsearch.h>", private, "<stdlib.h>", public ] },
+ { include: [ "<bits/stdlib-float.h>", private, "<stdlib.h>", public ] },
+ { include: [ "<bits/stdlib-ldbl.h>", private, "<stdlib.h>", public ] },
+ { include: [ "<bits/stdlib.h>", private, "<stdlib.h>", public ] },
+ { include: [ "<bits/string.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/string2.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/string3.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/stropts.h>", private, "<stropts.h>", public ] },
+ { include: [ "<bits/sys_errlist.h>", private, "<stdio.h>", public ] },
+ { include: [ "<bits/syscall.h>", private, "<sys/syscall.h>", private ] },
+ { include: [ "<bits/sysctl.h>", private, "<sys/sysctl.h>", public ] },
+ { include: [ "<bits/syslog-ldbl.h>", private, "<sys/syslog.h>", private ] },
+ { include: [ "<bits/syslog-path.h>", private, "<sys/syslog.h>", private ] },
+ { include: [ "<bits/syslog.h>", private, "<sys/syslog.h>", private ] },
+ { include: [ "<bits/termios.h>", private, "<termios.h>", public ] },
+ { include: [ "<bits/time.h>", private, "<sys/time.h>", public ] },
+ { include: [ "<bits/timerfd.h>", private, "<sys/timerfd.h>", public ] },
+ { include: [ "<bits/timex.h>", private, "<sys/timex.h>", public ] },
+ { include: [ "<bits/types.h>", private, "<sys/types.h>", public ] },
+ { include: [ "<bits/uio.h>", private, "<sys/uio.h>", public ] },
+ { include: [ "<bits/unistd.h>", private, "<unistd.h>", public ] },
+ { include: [ "<bits/ustat.h>", private, "<sys/ustat.h>", private ] },
+ { include: [ "<bits/utmp.h>", private, "<utmp.h>", public ] },
+ { include: [ "<bits/utmpx.h>", private, "<utmpx.h>", public ] },
+ { include: [ "<bits/utsname.h>", private, "<sys/utsname.h>", public ] },
+ { include: [ "<bits/waitflags.h>", private, "<sys/wait.h>", public ] },
+ { include: [ "<bits/waitstatus.h>", private, "<sys/wait.h>", public ] },
+ { include: [ "<bits/wchar-ldbl.h>", private, "<wchar.h>", public ] },
+ { include: [ "<bits/wchar.h>", private, "<wchar.h>", public ] },
+ { include: [ "<bits/wchar2.h>", private, "<wchar.h>", public ] },
+ { include: [ "<bits/wordsize.h>", private, "<limits.h>", public ] },
+ { include: [ "<bits/xopen_lim.h>", private, "<limits.h>", public ] },
+ { include: [ "<bits/xtitypes.h>", private, "<stropts.h>", public ] },
+ # Sometimes libc tells you what mapping to do via an '#error':
+ # # error "Never use <bits/dlfcn.h> directly; include <dlfcn.h> instead."
+ # or
+ # # error "Never include <bits/socket_type.h> directly; use <sys/socket.h> instead."
+ # ( cd /usr/include && grep -R '^ *# *error "Never use\|include' * | perl -nle 'm/<([^>]+).*directly.*<([^>]+)/ && print qq@ { include: [ "<$1>", private, "<$2>", public ] },@' | sort )
+ { include: [ "<bits/a.out.h>", private, "<a.out.h>", public ] },
+ { include: [ "<bits/byteswap-16.h>", private, "<byteswap.h>", public ] },
+ { include: [ "<bits/byteswap.h>", private, "<byteswap.h>", public ] },
+ { include: [ "<bits/cmathcalls.h>", private, "<complex.h>", public ] },
+ { include: [ "<bits/confname.h>", private, "<unistd.h>", public ] },
+ { include: [ "<bits/dirent.h>", private, "<dirent.h>", public ] },
+ { include: [ "<bits/dlfcn.h>", private, "<dlfcn.h>", public ] },
+ { include: [ "<bits/elfclass.h>", private, "<link.h>", public ] },
+ { include: [ "<bits/endian.h>", private, "<endian.h>", public ] },
+ { include: [ "<bits/epoll.h>", private, "<sys/epoll.h>", public ] },
+ { include: [ "<bits/eventfd.h>", private, "<sys/eventfd.h>", public ] },
+ { include: [ "<bits/fcntl-linux.h>", private, "<fcntl.h>", public ] },
+ { include: [ "<bits/fcntl.h>", private, "<fcntl.h>", public ] },
+ { include: [ "<bits/fenv.h>", private, "<fenv.h>", public ] },
+ { include: [ "<bits/huge_val.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/huge_valf.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/huge_vall.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/in.h>", private, "<netinet/in.h>", public ] },
+ { include: [ "<bits/inf.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/inotify.h>", private, "<sys/inotify.h>", public ] },
+ { include: [ "<bits/ioctl-types.h>", private, "<sys/ioctl.h>", public ] },
+ { include: [ "<bits/ioctls.h>", private, "<sys/ioctl.h>", public ] },
+ { include: [ "<bits/ipc.h>", private, "<sys/ipc.h>", public ] },
+ { include: [ "<bits/ipctypes.h>", private, "<sys/ipc.h>", public ] },
+ { include: [ "<bits/locale.h>", private, "<locale.h>", public ] },
+ { include: [ "<bits/math-finite.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mathdef.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mathinline.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/mman-linux.h>", private, "<sys/mman.h>", public ] },
+ { include: [ "<bits/mman.h>", private, "<sys/mman.h>", public ] },
+ { include: [ "<bits/mqueue.h>", private, "<mqueue.h>", public ] },
+ { include: [ "<bits/msq.h>", private, "<sys/msg.h>", public ] },
+ { include: [ "<bits/nan.h>", private, "<math.h>", public ] },
+ { include: [ "<bits/param.h>", private, "<sys/param.h>", public ] },
+ { include: [ "<bits/poll.h>", private, "<sys/poll.h>", private ] },
+ { include: [ "<bits/predefs.h>", private, "<features.h>", public ] },
+ { include: [ "<bits/resource.h>", private, "<sys/resource.h>", public ] },
+ { include: [ "<bits/select.h>", private, "<sys/select.h>", public ] },
+ { include: [ "<bits/semaphore.h>", private, "<semaphore.h>", public ] },
+ { include: [ "<bits/sigcontext.h>", private, "<signal.h>", public ] },
+ { include: [ "<bits/signalfd.h>", private, "<sys/signalfd.h>", public ] },
+ { include: [ "<bits/stdlib-float.h>", private, "<stdlib.h>", public ] },
+ { include: [ "<bits/string.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/string2.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/string3.h>", private, "<string.h>", public ] },
+ { include: [ "<bits/syscall.h>", private, "<sys/syscall.h>", private ] },
+ { include: [ "<bits/timerfd.h>", private, "<sys/timerfd.h>", public ] },
+ { include: [ "<bits/typesizes.h>", private, "<sys/types.h>", public ] },
+ # Top-level #includes that just forward to another file:
+ # $ for i in /usr/include/*; do [ -f $i ] } && [ `wc -l < $i` = 1 ] } && echo $i; done
+ # (poll.h, syscall.h, syslog.h, ustat.h, wait.h).
+ # For each file, I looked at the list of canonical header files --
+ # http://www.opengroup.org/onlinepubs/9699919799/idx/head.html --
+ # to decide which of the two files is canonical. If neither is
+ # on the POSIX.1 1998 list, I just choose the top-level one.
+ { include: [ "<sys/poll.h>", private, "<poll.h>", public ] },
+ { include: [ "<sys/syscall.h>", private, "<syscall.h>", public ] },
+ { include: [ "<sys/syslog.h>", private, "<syslog.h>", public ] },
+ { include: [ "<sys/ustat.h>", private, "<ustat.h>", public ] },
+ { include: [ "<wait.h>", private, "<sys/wait.h>", public ] },
+ # These are all files in bits/ that delegate to asm/ and linux/ to
+ # do all (or lots) of the work. Note these are private->private.
+ # $ for i in /usr/include/bits/*; do for dir in asm linux; do grep -H -e $dir/`basename $i` $i; done; done
+ { include: [ "<linux/errno.h>", private, "<bits/errno.h>", private ] },
+ { include: [ "<asm/ioctls.h>", private, "<bits/ioctls.h>", private ] },
+ { include: [ "<asm/socket.h>", private, "<bits/socket.h>", private ] },
+ { include: [ "<linux/socket.h>", private, "<bits/socket.h>", private ] },
+ # Some asm files have 32- and 64-bit variants:
+ # $ ls /usr/include/asm/*_{32,64}.h
+ { include: [ "<asm/posix_types_32.h>", private, "<asm/posix_types.h>", public ] },
+ { include: [ "<asm/posix_types_64.h>", private, "<asm/posix_types.h>", public ] },
+ { include: [ "<asm/unistd_32.h>", private, "<asm/unistd.h>", private ] },
+ { include: [ "<asm/unistd_64.h>", private, "<asm/unistd.h>", private ] },
+ # I don't know what grep would have found these. I found them
+ # via user report.
+ { include: [ "<asm/errno.h>", private, "<errno.h>", public ] },
+ { include: [ "<asm/errno-base.h>", private, "<errno.h>", public ] },
+ { include: [ "<asm/ptrace-abi.h>", private, "<asm/ptrace.h>", public ] },
+ { include: [ "<asm/unistd.h>", private, "<syscall.h>", public ] },
+ { include: [ "<linux/limits.h>", private, "<limits.h>", public ] }, # PATH_MAX
+ { include: [ "<linux/prctl.h>", private, "<sys/prctl.h>", public ] },
+ { include: [ "<sys/ucontext.h>", private, "<ucontext.h>", public ] },
+]
diff --git a/gcc.stl.headers.imp b/gcc.stl.headers.imp
new file mode 100644
index 0000000..625e448
--- /dev/null
+++ b/gcc.stl.headers.imp
@@ -0,0 +1,228 @@
+# GCC STL headers
+[
+ # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e bits/ -e tr1_impl/ | sort -u)
+ # I removed a lot of 'meaningless' dependencies -- for instance,
+ # <functional> //includes <bits/stringfwd.h>, but if someone is
+ # using strings, <functional> isn't enough to satisfy iwyu.
+ # We may need to add other dirs in future versions of gcc.
+ { include: ["<bits/algorithmfwd.h>", private, "<algorithm>", public ] },
+ { include: ["<bits/allocator.h>", private, "<memory>", public ] },
+ { include: ["<bits/atomic_word.h>", private, "<ext/atomicity.h>", public ] },
+ { include: ["<bits/basic_file.h>", private, "<fstream>", public ] },
+ { include: ["<bits/basic_ios.h>", private, "<ios>", public ] },
+ { include: ["<bits/basic_string.h>", private, "<string>", public ] },
+ { include: ["<bits/basic_string.tcc>", private, "<string>", public ] },
+ { include: ["<bits/boost_sp_shared_count.h>", private, "<memory>", public ] },
+ { include: ["<bits/c++io.h>", private, "<ext/stdio_sync_filebuf.h>", public ] },
+ { include: ["<bits/c++config.h>", private, "<cstddef>", public ] },
+ { include: ["<bits/char_traits.h>", private, "<string>", public ] },
+ { include: ["<bits/cmath.tcc>", private, "<cmath>", public ] },
+ { include: ["<bits/codecvt.h>", private, "<fstream>", public ] },
+ { include: ["<bits/cxxabi_tweaks.h>", private, "<cxxabi.h>", public ] },
+ { include: ["<bits/deque.tcc>", private, "<deque>", public ] },
+ { include: ["<bits/fstream.tcc>", private, "<fstream>", public ] },
+ { include: ["<bits/functional_hash.h>", private, "<unordered_map>", public ] },
+ { include: ["<bits/gslice.h>", private, "<valarray>", public ] },
+ { include: ["<bits/gslice_array.h>", private, "<valarray>", public ] },
+ { include: ["<bits/hashtable.h>", private, "<unordered_map>", public ] },
+ { include: ["<bits/hashtable.h>", private, "<unordered_set>", public ] },
+ { include: ["<bits/indirect_array.h>", private, "<valarray>", public ] },
+ { include: ["<bits/ios_base.h>", private, "<iostream>", public ] },
+ { include: ["<bits/ios_base.h>", private, "<ios>", public ] },
+ { include: ["<bits/ios_base.h>", private, "<iomanip>", public ] },
+ { include: ["<bits/locale_classes.h>", private, "<locale>", public ] },
+ { include: ["<bits/locale_facets.h>", private, "<locale>", public ] },
+ { include: ["<bits/locale_facets_nonio.h>", private, "<locale>", public ] },
+ { include: ["<bits/localefwd.h>", private, "<locale>", public ] },
+ { include: ["<bits/mask_array.h>", private, "<valarray>", public ] },
+ { include: ["<bits/ostream.tcc>", private, "<ostream>", public ] },
+ { include: ["<bits/ostream_insert.h>", private, "<ostream>", public ] },
+ { include: ["<bits/postypes.h>", private, "<iostream>", public ] },
+ { include: ["<bits/slice_array.h>", private, "<valarray>", public ] },
+ { include: ["<bits/stl_algo.h>", private, "<algorithm>", public ] },
+ { include: ["<bits/stl_algobase.h>", private, "<algorithm>", public ] },
+ { include: ["<bits/stl_bvector.h>", private, "<vector>", public ] },
+ { include: ["<bits/stl_construct.h>", private, "<memory>", public ] },
+ { include: ["<bits/stl_deque.h>", private, "<deque>", public ] },
+ { include: ["<bits/stl_function.h>", private, "<functional>", public ] },
+ { include: ["<bits/stl_heap.h>", private, "<queue>", public ] },
+ { include: ["<bits/stl_iterator.h>", private, "<iterator>", public ] },
+ { include: ["<bits/stl_iterator_base_funcs.h>", private, "<iterator>", public ] },
+ { include: ["<bits/stl_iterator_base_types.h>", private, "<iterator>", public ] },
+ { include: ["<bits/stl_list.h>", private, "<list>", public ] },
+ { include: ["<bits/stl_map.h>", private, "<map>", public ] },
+ { include: ["<bits/stl_multimap.h>", private, "<map>", public ] },
+ { include: ["<bits/stl_multiset.h>", private, "<set>", public ] },
+ { include: ["<bits/stl_numeric.h>", private, "<numeric>", public ] },
+ { include: ["<bits/stl_pair.h>", private, "<utility>", public ] },
+ { include: ["<bits/stl_pair.h>", private, "<tr1/utility>", public ] },
+ { include: ["<bits/stl_queue.h>", private, "<queue>", public ] },
+ { include: ["<bits/stl_raw_storage_iter.h>", private, "<memory>", public ] },
+ { include: ["<bits/stl_relops.h>", private, "<utility>", public ] },
+ { include: ["<bits/stl_set.h>", private, "<set>", public ] },
+ { include: ["<bits/stl_stack.h>", private, "<stack>", public ] },
+ { include: ["<bits/stl_tempbuf.h>", private, "<memory>", public ] },
+ { include: ["<bits/stl_tree.h>", private, "<map>", public ] },
+ { include: ["<bits/stl_tree.h>", private, "<set>", public ] },
+ { include: ["<bits/stl_uninitialized.h>", private, "<memory>", public ] },
+ { include: ["<bits/stl_vector.h>", private, "<vector>", public ] },
+ { include: ["<bits/stream_iterator.h>", private, "<iterator>", public ] },
+ { include: ["<bits/streambuf.tcc>", private, "<streambuf>", public ] },
+ { include: ["<bits/streambuf_iterator.h>", private, "<iterator>", public ] },
+ { include: ["<bits/stringfwd.h>", private, "<string>", public ] },
+ { include: ["<bits/valarray_after.h>", private, "<valarray>", public ] },
+ { include: ["<bits/valarray_array.h>", private, "<valarray>", public ] },
+ { include: ["<bits/valarray_before.h>", private, "<valarray>", public ] },
+ { include: ["<bits/vector.tcc>", private, "<vector>", public ] },
+ { include: ["<tr1_impl/array>", private, "<array>", public ] },
+ { include: ["<tr1_impl/array>", private, "<tr1/array>", public ] },
+ { include: ["<tr1_impl/boost_shared_ptr.h>", private, "<memory>", public ] },
+ { include: ["<tr1_impl/boost_shared_ptr.h>", private, "<tr1/memory>", public ] },
+ { include: ["<tr1_impl/boost_sp_counted_base.h>", private, "<memory>", public ] },
+ { include: ["<tr1_impl/boost_sp_counted_base.h>", private, "<tr1/memory>", public ] },
+ { include: ["<tr1_impl/cctype>", private, "<cctype>", public ] },
+ { include: ["<tr1_impl/cctype>", private, "<tr1/cctype>", public ] },
+ { include: ["<tr1_impl/cfenv>", private, "<cfenv>", public ] },
+ { include: ["<tr1_impl/cfenv>", private, "<tr1/cfenv>", public ] },
+ { include: ["<tr1_impl/cinttypes>", private, "<cinttypes>", public ] },
+ { include: ["<tr1_impl/cinttypes>", private, "<tr1/cinttypes>", public ] },
+ { include: ["<tr1_impl/cmath>", private, "<cmath>", public ] },
+ { include: ["<tr1_impl/cmath>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1_impl/complex>", private, "<complex>", public ] },
+ { include: ["<tr1_impl/complex>", private, "<tr1/complex>", public ] },
+ { include: ["<tr1_impl/cstdint>", private, "<cstdint>", public ] },
+ { include: ["<tr1_impl/cstdint>", private, "<tr1/cstdint>", public ] },
+ { include: ["<tr1_impl/cstdio>", private, "<cstdio>", public ] },
+ { include: ["<tr1_impl/cstdio>", private, "<tr1/cstdio>", public ] },
+ { include: ["<tr1_impl/cstdlib>", private, "<cstdlib>", public ] },
+ { include: ["<tr1_impl/cstdlib>", private, "<tr1/cstdlib>", public ] },
+ { include: ["<tr1_impl/cwchar>", private, "<cwchar>", public ] },
+ { include: ["<tr1_impl/cwchar>", private, "<tr1/cwchar>", public ] },
+ { include: ["<tr1_impl/cwctype>", private, "<cwctype>", public ] },
+ { include: ["<tr1_impl/cwctype>", private, "<tr1/cwctype>", public ] },
+ { include: ["<tr1_impl/functional>", private, "<functional>", public ] },
+ { include: ["<tr1_impl/functional>", private, "<tr1/functional>", public ] },
+ { include: ["<tr1_impl/random>", private, "<random>", public ] },
+ { include: ["<tr1_impl/random>", private, "<tr1/random>", public ] },
+ { include: ["<tr1_impl/regex>", private, "<regex>", public ] },
+ { include: ["<tr1_impl/regex>", private, "<tr1/regex>", public ] },
+ { include: ["<tr1_impl/type_traits>", private, "<tr1/type_traits>", public ] },
+ { include: ["<tr1_impl/type_traits>", private, "<type_traits>", public ] },
+ { include: ["<tr1_impl/unordered_map>", private, "<tr1/unordered_map>", public ] },
+ { include: ["<tr1_impl/unordered_map>", private, "<unordered_map>", public ] },
+ { include: ["<tr1_impl/unordered_set>", private, "<tr1/unordered_set>", public ] },
+ { include: ["<tr1_impl/unordered_set>", private, "<unordered_set>", public ] },
+ { include: ["<tr1_impl/utility>", private, "<tr1/utility>", public ] },
+ { include: ["<tr1_impl/utility>", private, "<utility>", public ] },
+ # This didn't come from the grep, but seems to be where swap()
+ # is defined?
+ { include: ["<bits/move.h>", private, "<algorithm>", public ] }, # for swap<>()
+ # Hash and hashtable-based containers.
+ { include: ["<tr1_impl/functional_hash.h>", private, "<tr1/functional>", public ] },
+ { include: ["<tr1_impl/functional_hash.h>", private, "<tr1/unordered_map>", public ] },
+ { include: ["<tr1_impl/functional_hash.h>", private, "<tr1/unordered_set>", public ] },
+ { include: ["<tr1/functional_hash.h>", private, "<tr1/functional>", public ] },
+ { include: ["<tr1/functional_hash.h>", private, "<tr1/unordered_map>", public ] },
+ { include: ["<tr1/functional_hash.h>", private, "<tr1/unordered_set>", public ] },
+ { include: ["<tr1_impl/hashtable>", private, "<tr1/unordered_map>", public ] },
+ { include: ["<tr1_impl/hashtable>", private, "<tr1/unordered_set>", public ] },
+ { include: ["<tr1/hashtable.h>", private, "<tr1/unordered_map>", public ] },
+ { include: ["<tr1/hashtable.h>", private, "<tr1/unordered_set>", public ] },
+ # All .tcc files are gcc internal-include files. We get them from
+ # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep -R '^ *# *include.*tcc' * | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | sort )
+ # I had to manually edit some of the entries to say the map-to is private.
+ { include: ["<bits/basic_ios.tcc>", private, "<bits/basic_ios.h>", private ] },
+ { include: ["<bits/basic_string.tcc>", private, "<string>", public ] },
+ { include: ["<bits/cmath.tcc>", private, "<cmath>", public ] },
+ { include: ["<bits/deque.tcc>", private, "<deque>", public ] },
+ { include: ["<bits/fstream.tcc>", private, "<fstream>", public ] },
+ { include: ["<bits/istream.tcc>", private, "<istream>", public ] },
+ { include: ["<bits/list.tcc>", private, "<list>", public ] },
+ { include: ["<bits/locale_classes.tcc>", private, "<bits/locale_classes.h>", private ] },
+ { include: ["<bits/locale_facets.tcc>", private, "<bits/locale_facets.h>", private ] },
+ { include: ["<bits/locale_facets_nonio.tcc>", private,
+ "<bits/locale_facets_nonio.h>", private ] },
+ { include: ["<bits/ostream.tcc>", private, "<ostream>", public ] },
+ { include: ["<bits/sstream.tcc>", private, "<sstream>", public ] },
+ { include: ["<bits/streambuf.tcc>", private, "<streambuf>", public ] },
+ { include: ["<bits/valarray_array.tcc>", private, "<bits/valarray_array.h>", private ] },
+ { include: ["<bits/vector.tcc>", private, "<vector>", public ] },
+ { include: ["<debug/safe_iterator.tcc>", private, "<debug/safe_iterator.h>", public ] },
+ { include: ["<tr1/bessel_function.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/beta_function.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/ell_integral.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/exp_integral.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/gamma.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/hypergeometric.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/legendre_function.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/modified_bessel_func.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/poly_hermite.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/poly_laguerre.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1/riemann_zeta.tcc>", private, "<tr1/cmath>", public ] },
+ { include: ["<tr1_impl/random.tcc>", private, "<tr1_impl/random>", private ] },
+ # Some bits->bits //includes: A few files in bits re-export
+ # symbols from other files in bits.
+ # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include.*bits/' bits/* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep bits/ | sort -u)
+ # and carefully picked reasonable-looking results (algorithm
+ # *uses* pair but doesn't *re-export* pair, for instance).
+ { include: ["<bits/boost_concept_check.h>", private,
+ "<bits/concept_check.h>", private ] },
+ { include: ["<bits/c++allocator.h>", private, "<bits/allocator.h>", private ] },
+ { include: ["<bits/codecvt.h>", private, "<bits/locale_facets_nonio.h>", private ] },
+ { include: ["<bits/ctype_base.h>", private, "<bits/locale_facets.h>", private ] },
+ { include: ["<bits/ctype_inline.h>", private, "<bits/locale_facets.h>", private ] },
+ { include: ["<bits/functexcept.h>", private, "<bits/stl_algobase.h>", private ] },
+ { include: ["<bits/locale_classes.h>", private, "<bits/basic_ios.h>", private ] },
+ { include: ["<bits/locale_facets.h>", private, "<bits/basic_ios.h>", private ] },
+ { include: ["<bits/messages_members.h>", private,
+ "<bits/locale_facets_nonio.h>", private ] },
+ { include: ["<bits/postypes.h>", private, "<bits/char_traits.h>", private ] },
+ { include: ["<bits/slice_array.h>", private, "<bits/valarray_before.h>", private ] },
+ { include: ["<bits/stl_construct.h>", private, "<bits/stl_tempbuf.h>", private ] },
+ { include: ["<bits/stl_move.h>", private, "<bits/stl_algobase.h>", private ] },
+ { include: ["<bits/stl_uninitialized.h>", private, "<bits/stl_tempbuf.h>", private ] },
+ { include: ["<bits/stl_vector.h>", private, "<bits/stl_bvector.h>", private ] },
+ { include: ["<bits/streambuf_iterator.h>", private, "<bits/basic_ios.h>", private ] },
+ # I don't think we want to be having people move to 'backward/'
+ # yet. (These hold deprecated STL classes that we still use
+ # actively.) These are the ones that turned up in an analysis of
+ { include: ["<backward/auto_ptr.h>", private, "<memory>", public ] },
+ { include: ["<backward/binders.h>", private, "<functional>", public ] },
+ { include: ["<backward/hash_fun.h>", private, "<hash_map>", public ] },
+ { include: ["<backward/hash_fun.h>", private, "<hash_set>", public ] },
+ { include: ["<backward/hashtable.h>", private, "<hash_map>", public ] },
+ { include: ["<backward/hashtable.h>", private, "<hash_set>", public ] },
+ { include: ["<backward/strstream>", private, "<strstream>", public ] },
+ # We have backward as part of the -I search path now, so have the
+ # non-backwards-prefix version as well.
+ { include: ["<auto_ptr.h>", private, "<memory>", public ] },
+ { include: ["<binders.h>", private, "<functional>", public ] },
+ { include: ["<hash_fun.h>", private, "<hash_map>", public ] },
+ { include: ["<hash_fun.h>", private, "<hash_set>", public ] },
+ { include: ["<hashtable.h>", private, "<hash_map>", public ] },
+ { include: ["<hashtable.h>", private, "<hash_set>", public ] },
+ # (This one should perhaps be found automatically somehow.)
+ { include: ["<ext/sso_string_base.h>", private, "<string>", public ] },
+ # The iostream .h files are confusing. Lots of private headers,
+ # which are handled above, but we also have public headers
+ # #including each other (eg <iostream> //includes <istream>). We
+ # are pretty forgiving: if a user specifies any public header, we
+ # generally don't require the others.
+ # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && egrep '^ *# *include <(istream|ostream|iostream|fstream|sstream|streambuf|ios|iosfwd)>' *stream* ios | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ and print qq@ { include: ["<$2>", public, "<$1>", public ] },@' | sort -u )
+ { include: ["<ios>", public, "<istream>", public ] },
+ { include: ["<ios>", public, "<ostream>", public ] },
+ { include: ["<iosfwd>", public, "<ios>", public ] },
+ { include: ["<iosfwd>", public, "<streambuf>", public ] },
+ { include: ["<istream>", public, "<fstream>", public ] },
+ { include: ["<istream>", public, "<iostream>", public ] },
+ { include: ["<istream>", public, "<sstream>", public ] },
+ { include: ["<ostream>", public, "<fstream>", public ] },
+ { include: ["<ostream>", public, "<iostream>", public ] },
+ { include: ["<ostream>", public, "<istream>", public ] },
+ { include: ["<ostream>", public, "<sstream>", public ] },
+ { include: ["<streambuf>", public, "<ios>", public ] },
+ # The location of exception_defines.h varies by GCC version. It should
+ # never be included directly.
+ { include: ["<bits/exception_defines.h>", private, "<exception>", public ] },
+ { include: ["<exception_defines.h>", private, "<exception>", public ] },
+]
diff --git a/gcc.symbols.imp b/gcc.symbols.imp
new file mode 100644
index 0000000..4ab9c57
--- /dev/null
+++ b/gcc.symbols.imp
@@ -0,0 +1,154 @@
+# For library symbols that can be defined in more than one header
+# file, maps from symbol-name to legitimate header files.
+# This list was generated via
+# grep -R '__.*_defined' /usr/include | perl -nle 'm,/usr/include/([^:]*):#\s*\S+ __(.*)_defined, and print qq@ { symbol: [ "$2", public, "<$1>", public ] },@' | sort -u
+# I ignored all entries that only appeared once on the list (eg uint32_t).
+# I then added in NULL, which according to [diff.null] C.2.2.3, can
+# be defined in <clocale>, <cstddef>, <cstdio>, <cstdlib>,
+# <cstring>, <ctime>, or <cwchar>. We also allow their C
+# equivalents.
+# In each case, I ordered them so <sys/types.h> was first, if it was
+# an option for this type. That's the preferred #include all else
+# equal. The visibility on the symbol-name is ignored; by convension
+# we always set it to private.
+[
+ { symbol: [ "blksize_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "blkcnt_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "blkcnt_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "blksize_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "daddr_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "daddr_t", private, "<rpc/types.h>", public ] },
+ { symbol: [ "dev_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "dev_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "error_t", private, "<errno.h>", public ] },
+ { symbol: [ "error_t", private, "<argp.h>", public ] },
+ { symbol: [ "error_t", private, "<argz.h>", public ] },
+ { symbol: [ "fsblkcnt_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "fsblkcnt_t", private, "<sys/statvfs.h>", public ] },
+ { symbol: [ "fsfilcnt_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "fsfilcnt_t", private, "<sys/statvfs.h>", public ] },
+ { symbol: [ "gid_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "gid_t", private, "<grp.h>", public ] },
+ { symbol: [ "gid_t", private, "<pwd.h>", public ] },
+ { symbol: [ "gid_t", private, "<stropts.h>", public ] },
+ { symbol: [ "gid_t", private, "<sys/ipc.h>", public ] },
+ { symbol: [ "gid_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "gid_t", private, "<unistd.h>", public ] },
+ { symbol: [ "id_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "id_t", private, "<sys/resource.h>", public ] },
+ { symbol: [ "ino64_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "ino64_t", private, "<dirent.h>", public ] },
+ { symbol: [ "ino_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "ino_t", private, "<dirent.h>", public ] },
+ { symbol: [ "ino_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "int8_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "int8_t", private, "<stdint.h>", public ] },
+ { symbol: [ "intptr_t", private, "<stdint.h>", public ] },
+ { symbol: [ "intptr_t", private, "<unistd.h>", public ] },
+ { symbol: [ "key_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "key_t", private, "<sys/ipc.h>", public ] },
+ { symbol: [ "mode_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "mode_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "mode_t", private, "<sys/ipc.h>", public ] },
+ { symbol: [ "mode_t", private, "<sys/mman.h>", public ] },
+ { symbol: [ "nlink_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "nlink_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "off64_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "off64_t", private, "<unistd.h>", public ] },
+ { symbol: [ "off_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "off_t", private, "<unistd.h>", public ] },
+ { symbol: [ "off_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "off_t", private, "<sys/mman.h>", public ] },
+ { symbol: [ "pid_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "pid_t", private, "<unistd.h>", public ] },
+ { symbol: [ "pid_t", private, "<signal.h>", public ] },
+ { symbol: [ "pid_t", private, "<sys/msg.h>", public ] },
+ { symbol: [ "pid_t", private, "<sys/shm.h>", public ] },
+ { symbol: [ "pid_t", private, "<termios.h>", public ] },
+ { symbol: [ "pid_t", private, "<time.h>", public ] },
+ { symbol: [ "pid_t", private, "<utmpx.h>", public ] },
+ { symbol: [ "sigset_t", private, "<signal.h>", public ] },
+ { symbol: [ "sigset_t", private, "<sys/epoll.h>", public ] },
+ { symbol: [ "sigset_t", private, "<sys/select.h>", public ] },
+ { symbol: [ "socklen_t", private, "<bits/socket.h>", private ] },
+ { symbol: [ "socklen_t", private, "<unistd.h>", public ] },
+ { symbol: [ "socklen_t", private, "<arpa/inet.h>", public ] },
+ { symbol: [ "ssize_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "ssize_t", private, "<unistd.h>", public ] },
+ { symbol: [ "ssize_t", private, "<monetary.h>", public ] },
+ { symbol: [ "ssize_t", private, "<sys/msg.h>", public ] },
+ { symbol: [ "suseconds_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "suseconds_t", private, "<sys/time.h>", public ] },
+ { symbol: [ "suseconds_t", private, "<sys/select.h>", public ] },
+ { symbol: [ "u_char", private, "<sys/types.h>", public ] },
+ { symbol: [ "u_char", private, "<rpc/types.h>", public ] },
+ { symbol: [ "uid_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "uid_t", private, "<unistd.h>", public ] },
+ { symbol: [ "uid_t", private, "<pwd.h>", public ] },
+ { symbol: [ "uid_t", private, "<signal.h>", public ] },
+ { symbol: [ "uid_t", private, "<stropts.h>", public ] },
+ { symbol: [ "uid_t", private, "<sys/ipc.h>", public ] },
+ { symbol: [ "uid_t", private, "<sys/stat.h>", public ] },
+ { symbol: [ "useconds_t", private, "<sys/types.h>", public ] },
+ { symbol: [ "useconds_t", private, "<unistd.h>", public ] },
+ # glob.h seems to define size_t if necessary, but it should come from stddef.
+ { symbol: [ "size_t", private, "<stddef.h>", public ] },
+ { symbol: [ "size_t", private, "<stdio.h>", public ] },
+ { symbol: [ "size_t", private, "<stdlib.h>", public ] },
+ { symbol: [ "size_t", private, "<string.h>", public ] },
+ { symbol: [ "size_t", private, "<time.h>", public ] },
+ { symbol: [ "size_t", private, "<wchar.h>", public ] },
+ # Macros that can be defined in more than one file, don't have the
+ # same __foo_defined guard that other types do, so the grep above
+ # doesn't discover them. Until I figure out a better way, I just
+ # add them in by hand as I discover them.
+ { symbol: [ "EOF", private, "<stdio.h>", public ] },
+ { symbol: [ "EOF", private, "<libio.h>", public ] },
+ { symbol: [ "FILE", private, "<stdio.h>", public ] },
+ { symbol: [ "va_list", private, "<stdarg.h>", public ] },
+ # These are symbols that could be defined in either stdlib.h or
+ # malloc.h, but we always want the stdlib location.
+ { symbol: [ "malloc", private, "<stdlib.h>", public ] },
+ { symbol: [ "calloc", private, "<stdlib.h>", public ] },
+ { symbol: [ "realloc", private, "<stdlib.h>", public ] },
+ { symbol: [ "free", private, "<stdlib.h>", public ] },
+ # Entries for NULL
+ { symbol: [ "NULL", private, "<stddef.h>", public ] }, # 'canonical' location for NULL
+ { symbol: [ "NULL", private, "<clocale>", public ] },
+ { symbol: [ "NULL", private, "<cstddef>", public ] },
+ { symbol: [ "NULL", private, "<cstdio>", public ] },
+ { symbol: [ "NULL", private, "<cstdlib>", public ] },
+ { symbol: [ "NULL", private, "<cstring>", public ] },
+ { symbol: [ "NULL", private, "<ctime>", public ] },
+ { symbol: [ "NULL", private, "<cwchar>", public ] },
+ { symbol: [ "NULL", private, "<locale.h>", public ] },
+ { symbol: [ "NULL", private, "<stdio.h>", public ] },
+ { symbol: [ "NULL", private, "<stdlib.h>", public ] },
+ { symbol: [ "NULL", private, "<string.h>", public ] },
+ { symbol: [ "NULL", private, "<time.h>", public ] },
+ { symbol: [ "NULL", private, "<wchar.h>", public ] },
+
+ # Kludge time: almost all STL types take an allocator, but they
+ # almost always use the default value. Usually we detect that
+ # and don't try to do IWYU, but sometimes it passes through.
+ # For instance, when adding two strings, we end up calling
+ # template<_CharT,_Traits,_Alloc> ... operator+(
+ # basic_string<_CharT,_Traits,_Alloc>, ...)
+ # These look like normal template args to us, so we see they're
+ # used and declare an iwyu dependency, even though we don't need
+ # to #include the traits or alloc type ourselves. The surest way
+ # to deal with this is to just say that everyone provides
+ # std::allocator. We can add more here at need.
+ { symbol: [ "std::allocator", private, "<memory>", public ] },
+ { symbol: [ "std::allocator", private, "<string>", public ] },
+ { symbol: [ "std::allocator", private, "<vector>", public ] },
+ { symbol: [ "std::allocator", private, "<map>", public ] },
+ { symbol: [ "std::allocator", private, "<set>", public ] },
+ # A similar kludge for std::char_traits. basic_string,
+ # basic_ostream and basic_istream have this as a default template
+ # argument, and sometimes it bleeds through when clang desugars the
+ # string/ostream/istream type.
+ { symbol: [ "std::char_traits", private, "<string>", public ] },
+ { symbol: [ "std::char_traits", private, "<ostream>", public ] },
+ { symbol: [ "std::char_traits", private, "<istream>", public ] }
+]
diff --git a/iwyu.cc b/iwyu.cc
new file mode 100644
index 0000000..9d0294a
--- /dev/null
+++ b/iwyu.cc
@@ -0,0 +1,3981 @@
+//===--- iwyu.cc - main logic and driver for include-what-you-use ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A Clang-based tool that catches Include-What-You-Use violations:
+//
+// The analysis enforces the following rule:
+//
+// - For every symbol (variable, function, constant, type, and macro)
+// X in C++ file CU.cc, X must be declared in CU.cc or in a header
+// file directly included by itself, CU.h, or CU-inl.h. Likewise
+// for CU.h and CU-inl.h.
+//
+// The rule has a few slight wrinkles:
+// 1) CU_test.cc can also 'inherit' #includes from CU.h and CU-inl.h.
+// Likewise for CU_unittest.cc, CU_regtest.cc, etc.
+// 2) CU.cc can inherit #includes from ../public/CU.h in addition to
+// ./CU.h (likewise for -inl.h).
+// 3) For system #includes, and a few google #includes, we hard-code
+// in knowledge of which #include files are public and which are not.
+// (For instance, <vector> is public, <bits/stl_vector.h> is not.)
+// We force CU.cc, CU.h, and CU-inl.h to #include the public version.
+//
+// iwyu.cc checks if a symbol can be forward-declared instead of fully
+// declared. If so, it will enforce the rule that the symbol is
+// forward-declared in the file that references it. We only forward-
+// declare classes and structs (possibly templatized). We will not
+// try to forward-declare variables or functions.
+//
+// Checking iwyu violations for variables, functions, constants, and
+// macros is easy. Types can be trickier. Obviously, if you declare
+// a variable of type Foo in cu.cc, it's straightforward to check
+// whether it's an iwyu violation. But what if you call a function
+// that returns a type, e.g. 'if (FnReturningSomeSTLType()->empty())'?
+// Is it an iwyu violation if you don't #include the header for that
+// STL type? We say no: whatever file provided the function
+// FnReturningSomeSTLType is also responsible for providing whatever
+// the STL type is, so we don't have to. Otherwise, we get into an
+// un-fun propagation problem if we change the signature of
+// FnReturningSomeSTLType to return a different type of STL type. So
+// in general, types are only iwyu-checked if they appear explicitly
+// in the source code.
+//
+// It can likewise be difficult to say whether a template arg is
+// forward-declable: set<Foo*> x does not require the full type info
+// for Foo, but remove_pointer<Foo*>::type does. And f<Foo>() doesn't
+// require full type info for Foo if f doesn't actually use Foo in it.
+// For now we do the simple heuristic that if the template arg is a
+// pointer, it's ok if it's forward-declared, and if not, it's not.
+//
+// We use the following terminology:
+//
+// - A *symbol* is the name of a function, variable, constant, type,
+// macro, etc.
+//
+// - A *quoted include path* is an include path with the surrounding <>
+// or "", e.g. <stdio.h> or "ads/util.h".
+//
+// - Any #include falls into exactly one of three (non-overlapping)
+// categories:
+//
+// * it's said to be *necessary* if it's a compiler or IWYU error to
+// omit the #include;
+//
+// * it's said to be *optional* if the #include is unnecessary but
+// having it is not an IWYU error either (e.g. if bar.h is a
+// necessary #include of foo.h, and foo.cc uses symbols from
+// bar.h, it's optional for foo.cc to #include bar.h.);
+//
+// * it's said to be *undesired* if it's an IWYU error to have the
+// #include.
+//
+// Therefore, when we say a #include is *desired*, we mean that it's
+// either necessary or optional.
+//
+// - We also say that a #include is *recommended* if the IWYU tool
+// recommends to have it in the C++ source file. Obviously, any
+// necessary #include must be recommended, and no undesired
+// #include can be recommended. An optional #include can be
+// either recommended or not -- the IWYU tool can decide which
+// case it is. For example, if foo.cc desires bar.h, but can
+// already get it via foo.h, IWYU won't recommend foo.cc to
+// #include bar.h, unless it already does so.
+
+#include <algorithm> // for swap, find, make_pair
+#include <cstddef> // for size_t
+#include <cstdio> // for snprintf
+#include <cstdlib> // for atoi, exit
+#include <cstring>
+#include <deque> // for swap
+#include <iterator> // for find
+#include <list> // for swap
+#include <map> // for map, swap, etc
+#include <memory> // for unique_ptr
+#include <set> // for set, set<>::iterator, swap
+#include <string> // for string, operator+, etc
+#include <utility> // for pair, make_pair
+#include <vector> // for vector, swap
+
+#include "iwyu_ast_util.h"
+#include "iwyu_cache.h"
+#include "iwyu_globals.h"
+#include "iwyu_lexer_utils.h"
+#include "iwyu_location_util.h"
+#include "iwyu_output.h"
+#include "iwyu_path_util.h"
+// This is needed for
+// preprocessor_info().PublicHeaderIntendsToProvide(). Somehow IWYU
+// removes it mistakenly.
+#include "iwyu_preprocessor.h" // IWYU pragma: keep
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+#include "port.h" // for CHECK_
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/AST/ASTConsumer.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/OperationKinds.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/Stmt.h"
+#include "clang/AST/TemplateBase.h"
+#include "clang/AST/Type.h"
+#include "clang/AST/TypeLoc.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/Frontend/FrontendAction.h"
+#include "clang/Lex/Preprocessor.h"
+#include "clang/Sema/Sema.h"
+
+namespace clang {
+class FileEntry;
+class PPCallbacks;
+} // namespace clang
+
+namespace include_what_you_use {
+
+// I occasionally clean up this list by running:
+// $ grep "using clang":: iwyu.cc | cut -b14- | tr -d ";" | while read t; do grep -q "[^:]$t" iwyu.cc || echo $t; done
+using clang::ASTConsumer;
+using clang::ASTContext;
+using clang::ASTFrontendAction;
+using clang::Attr;
+using clang::CXXConstructExpr;
+using clang::CXXConstructorDecl;
+using clang::CXXCtorInitializer;
+using clang::CXXDeleteExpr;
+using clang::CXXDestructorDecl;
+using clang::CXXMethodDecl;
+using clang::CXXNewExpr;
+using clang::CXXOperatorCallExpr;
+using clang::CXXRecordDecl;
+using clang::CallExpr;
+using clang::ClassTemplateDecl;
+using clang::ClassTemplateSpecializationDecl;
+using clang::CompilerInstance;
+using clang::ConstructorUsingShadowDecl;
+using clang::Decl;
+using clang::DeclContext;
+using clang::DeclRefExpr;
+using clang::ElaboratedType;
+using clang::EnumType;
+using clang::Expr;
+using clang::FileEntry;
+using clang::FriendDecl;
+using clang::FriendTemplateDecl;
+using clang::FunctionDecl;
+using clang::FunctionProtoType;
+using clang::FunctionTemplateDecl;
+using clang::FunctionType;
+using clang::ImplicitCastExpr;
+using clang::LValueReferenceType;
+using clang::LinkageSpecDecl;
+using clang::MemberExpr;
+using clang::NamedDecl;
+using clang::NestedNameSpecifier;
+using clang::NestedNameSpecifierLoc;
+using clang::OverloadExpr;
+using clang::ParmVarDecl;
+using clang::PPCallbacks;
+using clang::PointerType;
+using clang::QualType;
+using clang::QualifiedTypeLoc;
+using clang::RecordDecl;
+using clang::RecursiveASTVisitor;
+using clang::ReferenceType;
+using clang::SourceLocation;
+using clang::Stmt;
+using clang::SubstTemplateTypeParmType;
+using clang::TagDecl;
+using clang::TagType;
+using clang::TemplateArgument;
+using clang::TemplateArgumentList;
+using clang::TemplateArgumentLoc;
+using clang::TemplateName;
+using clang::TemplateSpecializationType;
+using clang::TranslationUnitDecl;
+using clang::Type;
+using clang::TypeLoc;
+using clang::TypedefDecl;
+using clang::TypedefNameDecl;
+using clang::TypedefType;
+using clang::UnaryExprOrTypeTraitExpr;
+using clang::UsingDecl;
+using clang::UsingShadowDecl;
+using clang::ValueDecl;
+using clang::VarDecl;
+using llvm::cast;
+using llvm::dyn_cast;
+using llvm::dyn_cast_or_null;
+using llvm::errs;
+using llvm::isa;
+using std::make_pair;
+using std::map;
+using std::set;
+using std::string;
+using std::swap;
+using std::vector;
+
+namespace {
+
+string IntToString(int i) {
+ char buf[64]; // big enough for any number
+ snprintf(buf, sizeof(buf), "%d", i);
+ return buf;
+}
+
+bool CanIgnoreLocation(SourceLocation loc) {
+ // If we're in a macro expansion, we always want to treat this as
+ // being in the expansion location, never the as-written location,
+ // since that's what the compiler does. CanIgnoreCurrentASTNode()
+ // is an optimization, so we want to be conservative about what we
+ // ignore.
+ const FileEntry* file_entry = GetFileEntry(loc);
+ const FileEntry* file_entry_after_macro_expansion =
+ GetFileEntry(GetInstantiationLoc(loc));
+
+ // ignore symbols used outside foo.{h,cc} + check_also
+ return (!ShouldReportIWYUViolationsFor(file_entry) &&
+ !ShouldReportIWYUViolationsFor(file_entry_after_macro_expansion));
+}
+
+} // anonymous namespace
+
+// ----------------------------------------------------------------------
+// --- BaseAstVisitor
+// ----------------------------------------------------------------------
+//
+// We have a hierarchy of AST visitor classes, to keep the logic
+// as clear as possible. The top level, BaseAstVisitor, has some
+// basic, not particularly iwyu-related, functionality:
+//
+// 1) Maintain current_ast_node_, the current chain in the AST tree.
+// 2) Provide functions related to the current location.
+// 3) Print each node we're visiting, depending on --verbose settings.
+// 4) Add appropriate implicit text. iwyu acts as if all constructor
+// initializers were explicitly written, all default constructors
+// were explicitly written, etc, even if they're not. We traverse
+// the implicit stuff as if it were explicit.
+// 5) Add two callbacks that subclasses can override (just like any
+// other AST callback): TraverseImplicitDestructorCall and
+// HandleFunctionCall. TraverseImplicitDestructorCall is a
+// callback for a "pseudo-AST" node that covers destruction not
+// specified in source, such as a destructor destroying one of the
+// fields in its class. HandleFunctionCall is a convenience
+// callback that bundles callbacks from many different kinds of
+// function-calling callbacks (CallExpr, CXXConstructExpr, etc)
+// into one place.
+//
+// To maintain current_ast_node_ properly, this class also implements
+// VisitNestedNameSpecifier, VisitTemplateName, VisitTemplateArg, and
+// VisitTemplateArgLoc, which are parallel to the Visit*Decl()/etc
+// visitors. Subclasses should override these Visit routines, and not
+// the Traverse routine directly.
+
+template <class Derived>
+class BaseAstVisitor : public RecursiveASTVisitor<Derived> {
+ public:
+ typedef RecursiveASTVisitor<Derived> Base;
+
+ // We need to create implicit ctor/dtor nodes, which requires
+ // non-const methods on CompilerInstance, so the var can't be const.
+ explicit BaseAstVisitor(CompilerInstance* compiler)
+ : compiler_(compiler),
+ current_ast_node_(nullptr) {}
+
+ virtual ~BaseAstVisitor() = default;
+
+ //------------------------------------------------------------
+ // Pure virtual methods that a subclass must implement.
+
+ // Returns true if we are not interested in the current ast node for
+ // any reason (for instance, it lives in a file we're not
+ // analyzing).
+ virtual bool CanIgnoreCurrentASTNode() const = 0;
+
+ // Returns true if we should print the information for the
+ // current AST node, given what file it's in. For instance,
+ // except at very high verbosity levels, we don't print AST
+ // nodes from system header files.
+ virtual bool ShouldPrintSymbolFromCurrentFile() const = 0;
+
+ // A string to add to the information we print for each symbol.
+ // Each subclass can thus annotate if it's handling a node.
+ // The return value, if not empty, should start with a space!
+ virtual string GetSymbolAnnotation() const = 0;
+
+ //------------------------------------------------------------
+ // (1) Maintain current_ast_node_
+
+ // How subclasses can access current_ast_node_;
+ const ASTNode* current_ast_node() const { return current_ast_node_; }
+ ASTNode* current_ast_node() { return current_ast_node_; }
+ void set_current_ast_node(ASTNode* an) { current_ast_node_ = an; }
+
+ bool TraverseDecl(Decl* decl) {
+ if (current_ast_node_->StackContainsContent(decl))
+ return true; // avoid recursion
+ ASTNode node(decl, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ return Base::TraverseDecl(decl);
+ }
+
+ bool TraverseStmt(Stmt* stmt) {
+ if (current_ast_node_->StackContainsContent(stmt))
+ return true; // avoid recursion
+ ASTNode node(stmt, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ return Base::TraverseStmt(stmt);
+ }
+
+ bool TraverseType(QualType qualtype) {
+ if (qualtype.isNull())
+ return Base::TraverseType(qualtype);
+ const Type* type = qualtype.getTypePtr();
+ if (current_ast_node_->StackContainsContent(type))
+ return true; // avoid recursion
+ ASTNode node(type, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ return Base::TraverseType(qualtype);
+ }
+
+ // RecursiveASTVisitor has a hybrid type-visiting system: it will
+ // call TraverseTypeLoc when it can, but will call TraverseType
+ // otherwise. For instance, if we see a FunctionDecl, and it
+ // exposes the return type via a TypeLoc, it will recurse via
+ // TraverseTypeLoc. If it exposes the return type only via a
+ // QualType, though, it will recurse via TraverseType. The upshot
+ // is we need two versions of all the Traverse*Type routines. (We
+ // don't need two versions the Visit*Type routines, since the
+ // default behavior of Visit*TypeLoc is to just call Visit*Type.)
+ bool TraverseTypeLoc(TypeLoc typeloc) {
+ // QualifiedTypeLoc is a bit of a special case in the typeloc
+ // system, off to the side. We don't care about qualifier
+ // positions, so avoid the need for special-casing by just
+ // traversing the unqualified version instead.
+ if (typeloc.getAs<QualifiedTypeLoc>()) {
+ typeloc = typeloc.getUnqualifiedLoc();
+ }
+ if (current_ast_node_->StackContainsContent(&typeloc))
+ return true; // avoid recursion
+ ASTNode node(&typeloc, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ return Base::TraverseTypeLoc(typeloc);
+ }
+
+ bool TraverseNestedNameSpecifier(NestedNameSpecifier* nns) {
+ if (nns == nullptr)
+ return true;
+ ASTNode node(nns, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ if (!this->getDerived().VisitNestedNameSpecifier(nns))
+ return false;
+ return Base::TraverseNestedNameSpecifier(nns);
+ }
+
+ bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc nns_loc) {
+ if (!nns_loc) // using NNSLoc::operator bool()
+ return true;
+ ASTNode node(&nns_loc, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ // TODO(csilvers): have VisitNestedNameSpecifierLoc instead.
+ if (!this->getDerived().VisitNestedNameSpecifier(
+ nns_loc.getNestedNameSpecifier()))
+ return false;
+ return Base::TraverseNestedNameSpecifierLoc(nns_loc);
+ }
+
+ bool TraverseTemplateName(TemplateName template_name) {
+ ASTNode node(&template_name, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ if (!this->getDerived().VisitTemplateName(template_name))
+ return false;
+ return Base::TraverseTemplateName(template_name);
+ }
+
+ bool TraverseTemplateArgument(const TemplateArgument& arg) {
+ ASTNode node(&arg, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ if (!this->getDerived().VisitTemplateArgument(arg))
+ return false;
+ return Base::TraverseTemplateArgument(arg);
+ }
+
+ bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc& argloc) {
+ ASTNode node(&argloc, *GlobalSourceManager());
+ CurrentASTNodeUpdater canu(&current_ast_node_, &node);
+ if (!this->getDerived().VisitTemplateArgumentLoc(argloc))
+ return false;
+ return Base::TraverseTemplateArgumentLoc(argloc);
+ }
+
+ //------------------------------------------------------------
+ // (2) Provide functions related to the current location.
+
+ SourceLocation CurrentLoc() const {
+ CHECK_(current_ast_node_ && "Call CurrentLoc within Visit* or Traverse*");
+ return current_ast_node_->GetLocation();
+ }
+
+ string CurrentFilePath() const {
+ return GetFilePath(CurrentLoc());
+ }
+
+ const FileEntry* CurrentFileEntry() const {
+ return GetFileEntry(CurrentLoc());
+ }
+
+ string PrintableCurrentLoc() const {
+ return PrintableLoc(CurrentLoc());
+ }
+
+ //------------------------------------------------------------
+ // (3) Print each node we're visiting.
+
+ // The current file location, the class or decl or type name in
+ // brackets, along with annotations such as the indentation depth,
+ // etc.
+ string AnnotatedName(const string& name) const {
+ return (PrintableCurrentLoc() + ": (" +
+ IntToString(current_ast_node_->depth()) + GetSymbolAnnotation() +
+ (current_ast_node_->in_forward_declare_context() ?
+ ", fwd decl" : "") +
+ ") [ " + name + " ] ");
+ }
+
+ // At verbose level 7 and above, returns a printable version of
+ // the pointer, suitable for being emitted after AnnotatedName.
+ // At lower verbose levels, returns the empty string.
+ string PrintablePtr(const void* ptr) const {
+ if (ShouldPrint(7)) {
+ char buffer[32];
+ snprintf(buffer, sizeof(buffer), "%p ", ptr);
+ return buffer;
+ }
+ return "";
+ }
+
+ // The top-level Decl class. All Decls call this visitor (in
+ // addition to any more-specific visitors that apply for a
+ // particular decl).
+ bool VisitDecl(clang::Decl* decl) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName(string(decl->getDeclKindName()) + "Decl")
+ << PrintablePtr(decl) << PrintableDecl(decl) << "\n";
+ }
+ return true;
+ }
+
+ bool VisitStmt(clang::Stmt* stmt) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName(stmt->getStmtClassName()) << PrintablePtr(stmt);
+ PrintStmt(stmt);
+ errs() << "\n";
+ }
+ return true;
+ }
+
+ bool VisitType(clang::Type* type) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName(string(type->getTypeClassName()) + "Type")
+ << PrintablePtr(type) << PrintableType(type) << "\n";
+ }
+ return true;
+ }
+
+ // Make sure our logging message shows we're in the TypeLoc hierarchy.
+ bool VisitTypeLoc(clang::TypeLoc typeloc) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName(string(typeloc.getTypePtr()->getTypeClassName())
+ + "TypeLoc")
+ << PrintableTypeLoc(typeloc) << "\n";
+ }
+ return true;
+ }
+
+ bool VisitNestedNameSpecifier(NestedNameSpecifier* nns) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("NestedNameSpecifier")
+ << PrintablePtr(nns) << PrintableNestedNameSpecifier(nns) << "\n";
+ }
+ return true;
+ }
+
+ bool VisitTemplateName(TemplateName template_name) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("TemplateName")
+ << PrintableTemplateName(template_name) << "\n";
+ }
+ return true;
+ }
+
+ bool VisitTemplateArgument(const TemplateArgument& arg) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("TemplateArgument")
+ << PrintablePtr(&arg) << PrintableTemplateArgument(arg) << "\n";
+ }
+ return true;
+ }
+
+ bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& argloc) {
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("TemplateArgumentLoc")
+ << PrintablePtr(&argloc) << PrintableTemplateArgumentLoc(argloc)
+ << "\n";
+ }
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // (4) Add implicit text.
+
+ // When we see an object that has implicit text that iwyu
+ // wants to look at, we make callbacks as if that text had
+ // been explicitly written. Here's text we consider:
+ //
+ // * CXXDestructorDecl: a destructor call for each non-POD field
+ // in the dtor's class, and each base type of that class.
+ // * CXXConstructorDecl: a constructor call for each type/base
+ // of the class that is not explicitly listed in an initializer.
+ // * CXXRecordDecl: a CXXConstructorDecl for each implicit
+ // constructor (zero-arg and copy). A CXXDestructor decl
+ // if the destructor is implicit. A CXXOperatorCallDecl if
+ // operator= is explicit.
+
+ bool TraverseCXXConstructorDecl(clang::CXXConstructorDecl* decl) {
+ if (!Base::TraverseCXXConstructorDecl(decl)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ // We only care about classes that are actually defined.
+ if (!decl || !decl->isThisDeclarationADefinition()) return true;
+
+ // RAV's TraverseCXXConstructorDecl already handles
+ // explicitly-written initializers, so we just want the rest.
+ for (CXXConstructorDecl::init_const_iterator it = decl->init_begin();
+ it != decl->init_end(); ++it) {
+ const CXXCtorInitializer* init = *it;
+ if (!init->isWritten()) {
+ if (!this->getDerived().TraverseStmt(init->getInit()))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ bool TraverseCXXDestructorDecl(clang::CXXDestructorDecl* decl) {
+ if (!Base::TraverseCXXDestructorDecl(decl)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ // We only care about calls that are actually defined.
+ if (!decl || !decl->isThisDeclarationADefinition()) return true;
+
+ // Collect all the fields (and bases) we destroy, and call the dtor.
+ set<const Type*> member_types;
+ const CXXRecordDecl* record = decl->getParent();
+ for (clang::RecordDecl::field_iterator it = record->field_begin();
+ it != record->field_end(); ++it) {
+ member_types.insert(it->getType().getTypePtr());
+ }
+ for (clang::CXXRecordDecl::base_class_const_iterator
+ it = record->bases_begin(); it != record->bases_end(); ++it) {
+ member_types.insert(it->getType().getTypePtr());
+ }
+ for (const Type* type : member_types) {
+ const NamedDecl* member_decl = TypeToDeclAsWritten(type);
+ // We only want those fields that are c++ classes.
+ if (const CXXRecordDecl* cxx_field_decl = DynCastFrom(member_decl)) {
+ if (const CXXDestructorDecl* field_dtor
+ = cxx_field_decl->getDestructor()) {
+ if (!this->getDerived().TraverseImplicitDestructorCall(
+ const_cast<CXXDestructorDecl*>(field_dtor), type))
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ // clang lazily constructs the implicit methods of a C++ class (the
+ // default constructor and destructor, etc) -- it only bothers to
+ // create a CXXMethodDecl if someone actually calls these classes.
+ // But we need to be non-lazy: iwyu depends on analyzing what future
+ // code *may* call in a class, not what current code *does*. So we
+ // force all the lazy evaluation to happen here. This will
+ // (possibly) add a bunch of MethodDecls to the AST, as children of
+ // decl. We're hoping it will always be safe to modify the AST
+ // while it's being traversed!
+ void InstantiateImplicitMethods(CXXRecordDecl* decl) {
+ if (decl->isDependentType()) // only instantiate if class is instantiated
+ return;
+
+ clang::Sema& sema = compiler_->getSema();
+ DeclContext::lookup_result ctors = sema.LookupConstructors(decl);
+ for (NamedDecl* ctor_lookup : ctors) {
+ // Ignore templated or inheriting constructors.
+ if (isa<FunctionTemplateDecl>(ctor_lookup) ||
+ isa<UsingDecl>(ctor_lookup) ||
+ isa<ConstructorUsingShadowDecl>(ctor_lookup))
+ continue;
+ CXXConstructorDecl* ctor = cast<CXXConstructorDecl>(ctor_lookup);
+ if (!ctor->hasBody() && !ctor->isDeleted() && ctor->isImplicit()) {
+ if (sema.getSpecialMember(ctor) == clang::Sema::CXXDefaultConstructor) {
+ sema.DefineImplicitDefaultConstructor(CurrentLoc(), ctor);
+ } else {
+ // TODO(nlewycky): enable this!
+ //sema.DefineImplicitCopyConstructor(CurrentLoc(), ctor);
+ }
+ }
+ // Unreferenced template constructors stay uninstantiated on purpose.
+ }
+
+ if (CXXDestructorDecl* dtor = sema.LookupDestructor(decl)) {
+ if (!dtor->isDeleted()) {
+ if (!dtor->hasBody() && dtor->isImplicit())
+ sema.DefineImplicitDestructor(CurrentLoc(), dtor);
+ if (!dtor->isDefined() && dtor->getTemplateInstantiationPattern())
+ sema.PendingInstantiations.emplace_back(dtor, CurrentLoc());
+ }
+ }
+
+ // TODO(nlewycky): copy assignment operator
+
+ // clang queues up method instantiations. We need to process them now.
+ sema.PerformPendingInstantiations();
+ }
+
+ // clang doesn't bother to set a TypeSourceInfo for implicit
+ // methods, since, well, they don't have a location. But
+ // RecursiveASTVisitor crashes without one, so when we lie and say
+ // we're not implicit, we have to lie and give a location as well.
+ // (We give the null location.) This is a small memory leak.
+ void SetTypeSourceInfoForImplicitMethodIfNeeded(FunctionDecl* decl) {
+ if (decl->getTypeSourceInfo() == nullptr) {
+ ASTContext& ctx = compiler_->getASTContext();
+ decl->setTypeSourceInfo(ctx.getTrivialTypeSourceInfo(decl->getType()));
+ }
+ }
+
+ // RAV.h's TraverseDecl() ignores implicit nodes, so we lie a bit.
+ // TODO(csilvers): figure out a more principled way.
+ bool TraverseImplicitDeclHelper(clang::FunctionDecl* decl) {
+ CHECK_(decl->isImplicit() && "TraverseImplicitDecl is for implicit decls");
+ decl->setImplicit(false);
+ SetTypeSourceInfoForImplicitMethodIfNeeded(decl);
+ bool retval = this->getDerived().TraverseDecl(decl);
+ decl->setImplicit(true);
+ return retval;
+ }
+
+ // Handle implicit methods that otherwise wouldn't be seen by RAV.
+ bool TraverseCXXRecordDecl(clang::CXXRecordDecl* decl) {
+ if (!Base::TraverseCXXRecordDecl(decl)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ // We only care about classes that are actually defined.
+ if (!decl || !decl->isThisDeclarationADefinition()) return true;
+
+ InstantiateImplicitMethods(decl);
+
+ // Check to see if there are any implicit constructors. Can be
+ // several: implicit default constructor, implicit copy constructor.
+ for (CXXRecordDecl::ctor_iterator it = decl->ctor_begin();
+ it != decl->ctor_end(); ++it) {
+ CXXConstructorDecl* ctor = *it;
+ if (ctor->isImplicit() && !ctor->isDeleted()) {
+ if (!TraverseImplicitDeclHelper(ctor))
+ return false;
+ }
+ }
+
+ // Check the (single) destructor.
+ bool has_implicit_declared_destructor =
+ (!decl->needsImplicitDestructor() &&
+ !decl->hasUserDeclaredDestructor());
+ if (has_implicit_declared_destructor) {
+ if (!TraverseImplicitDeclHelper(decl->getDestructor()))
+ return false;
+ }
+
+ // Check copy and move assignment operators.
+ for (CXXRecordDecl::method_iterator it = decl->method_begin();
+ it != decl->method_end(); ++it) {
+ bool is_assignment_operator =
+ it->isCopyAssignmentOperator() || it->isMoveAssignmentOperator();
+ if (is_assignment_operator && it->isImplicit()) {
+ if (!TraverseImplicitDeclHelper(*it))
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // (5) Add TraverseImplicitDestructorCall and HandleFunctionCall.
+
+ // TraverseImplicitDestructorCall: This is a callback this class
+ // introduces that is a first-class callback just like any AST-node
+ // callback. It is used to cover two places where the compiler
+ // destroys objects, but there's no written indication of that in
+ // the text: (1) when a local variable or a temporary goes out of
+ // scope (NOTE: in this case, we attribute the destruction to the
+ // same line as the corresponding construction, not to where the
+ // scope ends). (2) When a destructor destroys one of the fields of
+ // a class. For instance: 'class Foo { MyClass b; }': In addition
+ // to executing its body, Foo::~Foo calls MyClass::~Myclass on b.
+ // Note we only call this if an actual destructor is being executed:
+ // we don't call it when an int goes out of scope!
+ //
+ // HandleFunctionCall: A convenience callback that 'bundles'
+ // the following Expr's, each of which causes one or more
+ // function calls when evaluated (though most of them are
+ // not a child of CallExpr):
+ // * CallExpr (obviously)
+ // * CXXMemberCallExpr
+ // * CXXOperatorCallExpr -- a call to operatorXX()
+ // * CXXConstructExpr -- calls a constructor to create an object,
+ // and maybe a destructor when the object goes out of scope.
+ // * CXXTemporaryObjectExpr -- subclass of CXXConstructExpr
+ // * CXXNewExpr -- calls operator new and a constructor
+ // * CXXDeleteExpr -- calls operator delete and a destructor
+ // * DeclRefExpr -- if the declref is a function pointer, we
+ // treat it as a function call, since it can act like one
+ // in the future
+ // * ImplicitDestructorCall -- calls a destructor
+ // Each of these calls HandleFunctionCall for the function calls
+ // it does. A subclass interested only in function calls, and
+ // not exactly what expression caused them, can override
+ // HandleFunctionCall. Note: subclasses should expect that
+ // the first argument to HandleFunctionCall may be nullptr (e.g. when
+ // constructing a built-in type), in which case the handler should
+ // immediately return.
+
+ // If the function being called is a member of a class, parent_type
+ // is the type of the method's owner (parent), as it is written in
+ // the source. (We need the type-as-written so we can distinguish
+ // explicitly-written template args from default template args.) We
+ // also pass in the CallExpr (or CXXConstructExpr, etc). This may
+ // be nullptr if the function call is implicit.
+ bool HandleFunctionCall(clang::FunctionDecl* callee,
+ const clang::Type* parent_type,
+ const clang::Expr* calling_expr) {
+ if (!callee) return true;
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("FunctionCall")
+ << PrintablePtr(callee) << PrintableDecl(callee) << "\n";
+ }
+ return true;
+ }
+
+ bool TraverseImplicitDestructorCall(clang::CXXDestructorDecl* decl,
+ const Type* type_being_destroyed) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (!decl) return true;
+ if (ShouldPrintSymbolFromCurrentFile()) {
+ errs() << AnnotatedName("Destruction")
+ << PrintableType(type_being_destroyed) << "\n";
+ }
+ return this->getDerived().HandleFunctionCall(decl, type_being_destroyed,
+ static_cast<Expr*>(nullptr));
+ }
+
+
+ bool TraverseCallExpr(clang::CallExpr* expr) {
+ if (!Base::TraverseCallExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ return this->getDerived().HandleFunctionCall(expr->getDirectCallee(),
+ TypeOfParentIfMethod(expr),
+ expr);
+ }
+
+ bool TraverseCXXMemberCallExpr(clang::CXXMemberCallExpr* expr) {
+ if (!Base::TraverseCXXMemberCallExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ return this->getDerived().HandleFunctionCall(expr->getDirectCallee(),
+ TypeOfParentIfMethod(expr),
+ expr);
+ }
+
+ bool TraverseCXXOperatorCallExpr(clang::CXXOperatorCallExpr* expr) {
+ if (!Base::TraverseCXXOperatorCallExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* parent_type = TypeOfParentIfMethod(expr);
+ // If we're a free function -- bool operator==(MyClass a, MyClass b) --
+ // we still want to have a parent_type, as if we were defined as
+ // MyClass::operator==. So we go through the arguments and take the
+ // first one that's a class, and associate the function with that.
+ if (!parent_type) {
+ if (const Expr* first_argument = GetFirstClassArgument(expr))
+ parent_type = GetTypeOf(first_argument);
+ }
+ return this->getDerived().HandleFunctionCall(expr->getDirectCallee(),
+ parent_type, expr);
+ }
+
+ bool TraverseCXXConstructExpr(clang::CXXConstructExpr* expr) {
+ if (!Base::TraverseCXXConstructExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (!this->getDerived().HandleFunctionCall(expr->getConstructor(),
+ GetTypeOf(expr),
+ expr))
+ return false;
+
+ // When creating a local variable or a temporary, but not a pointer, the
+ // constructor is also responsible for destruction (which happens
+ // implicitly when the variable goes out of scope). Only when initializing
+ // a field of a class does the constructor not have to worry
+ // about destruction. It turns out it's easier to check for that.
+ bool will_call_implicit_destructor_on_leaving_scope =
+ !IsCXXConstructExprInInitializer(current_ast_node()) &&
+ !IsCXXConstructExprInNewExpr(current_ast_node());
+ if (will_call_implicit_destructor_on_leaving_scope) {
+ // Create the destructor if it hasn't been lazily created yet.
+ InstantiateImplicitMethods(expr->getConstructor()->getParent());
+ if (const CXXDestructorDecl* dtor_decl = GetSiblingDestructorFor(expr)) {
+ if (!this->getDerived().TraverseImplicitDestructorCall(
+ const_cast<CXXDestructorDecl*>(dtor_decl), GetTypeOf(expr)))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ bool TraverseCXXTemporaryObjectExpr(clang::CXXTemporaryObjectExpr* expr) {
+ if (!Base::TraverseCXXTemporaryObjectExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ // In this case, we *know* we're responsible for destruction as well.
+ InstantiateImplicitMethods(expr->getConstructor()->getParent());
+ CXXConstructorDecl* ctor_decl = expr->getConstructor();
+ CXXDestructorDecl* dtor_decl =
+ const_cast<CXXDestructorDecl*>(GetSiblingDestructorFor(expr));
+ const Type* type = GetTypeOf(expr);
+ return (this->getDerived().HandleFunctionCall(ctor_decl, type, expr) &&
+ this->getDerived().HandleFunctionCall(dtor_decl, type, expr));
+ }
+
+ bool TraverseCXXNewExpr(clang::CXXNewExpr* expr) {
+ if (!Base::TraverseCXXNewExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* parent_type = expr->getAllocatedType().getTypePtrOrNull();
+ // 'new' calls operator new in addition to the ctor of the new-ed type.
+ if (FunctionDecl* operator_new = expr->getOperatorNew()) {
+ // If operator new is a method, it must (by the semantics of
+ // per-class operator new) be a method on the class we're newing.
+ const Type* op_parent = nullptr;
+ if (isa<CXXMethodDecl>(operator_new))
+ op_parent = parent_type;
+ if (!this->getDerived().HandleFunctionCall(operator_new, op_parent, expr))
+ return false;
+ }
+ return true;
+ }
+
+ bool TraverseCXXDeleteExpr(clang::CXXDeleteExpr* expr) {
+ if (!Base::TraverseCXXDeleteExpr(expr)) return false;
+
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* parent_type = expr->getDestroyedType().getTypePtrOrNull();
+ // We call operator delete in addition to the dtor of the deleted type.
+ if (FunctionDecl* operator_delete = expr->getOperatorDelete()) {
+ // If operator delete is a method, it must (by the semantics of per-
+ // class operator delete) be a method on the class we're deleting.
+ const Type* op_parent = nullptr;
+ if (isa<CXXMethodDecl>(operator_delete))
+ op_parent = parent_type;
+ if (!this->getDerived().HandleFunctionCall(operator_delete, op_parent,
+ expr))
+ return false;
+ }
+ const CXXDestructorDecl* dtor = GetDestructorForDeleteExpr(expr);
+ return this->getDerived().HandleFunctionCall(
+ const_cast<CXXDestructorDecl*>(dtor), parent_type, expr);
+ }
+
+ // This is to catch function pointers to templates.
+ // For instance, 'MyFunctionPtr p = &TplFn<MyClass*>;': we need to
+ // expand TplFn to see if it needs full type info for MyClass.
+ bool TraverseDeclRefExpr(clang::DeclRefExpr* expr) {
+ if (!Base::TraverseDeclRefExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (FunctionDecl* fn_decl = DynCastFrom(expr->getDecl())) {
+ // If fn_decl has a class-name before it -- 'MyClass::method' --
+ // it's a method pointer.
+ const Type* parent_type = nullptr;
+ if (expr->getQualifier() && expr->getQualifier()->getAsType())
+ parent_type = expr->getQualifier()->getAsType();
+ if (!this->getDerived().HandleFunctionCall(fn_decl, parent_type, expr))
+ return false;
+ }
+ return true;
+ }
+
+ protected:
+ CompilerInstance* compiler() { return compiler_; }
+
+ private:
+ template <typename T> friend class BaseAstVisitor;
+ CompilerInstance* const compiler_;
+
+ // The currently active decl/stmt/type/etc -- that is, the node
+ // being currently visited in a Visit*() or Traverse*() method. The
+ // advantage of ASTNode over the object passed in to Visit*() and
+ // Traverse*() is ASTNode knows its parent.
+ ASTNode* current_ast_node_;
+};
+
+// ----------------------------------------------------------------------
+// --- AstTreeFlattenerVisitor
+// ----------------------------------------------------------------------
+//
+// This simple visitor just creates a set of all AST nodes (stored as
+// void*'s) seen while traversing via BaseAstVisitor.
+
+class AstFlattenerVisitor : public BaseAstVisitor<AstFlattenerVisitor> {
+ public:
+ typedef BaseAstVisitor<AstFlattenerVisitor> Base;
+
+ // We divide our set of nodes into category by type. For most AST
+ // nodes, we can store just a pointer to the node. However, for
+ // some AST nodes we don't get a pointer into the AST, we get a
+ // temporary (stack-allocated) object, and have to store the full
+ // object ourselves and use its operator== to test for equality.
+ // These types each get their own set (or, usually, vector, since
+ // the objects tend not to support operator< or hash<>()).
+ class NodeSet {
+ public:
+ // We could add more versions, but these are the only useful ones so far.
+ bool Contains(const Type* type) const {
+ return ContainsKey(others, type);
+ }
+ bool Contains(const Decl* decl) const {
+ return ContainsKey(others, decl);
+ }
+ bool Contains(const ASTNode& node) const {
+ if (const TypeLoc* tl = node.GetAs<TypeLoc>()) {
+ return ContainsValue(typelocs, *tl);
+ } else if (const NestedNameSpecifierLoc* nl
+ = node.GetAs<NestedNameSpecifierLoc>()) {
+ return ContainsValue(nnslocs, *nl);
+ } else if (const TemplateName* tn = node.GetAs<TemplateName>()) {
+ // The best we can do is to compare the associated decl
+ if (tn->getAsTemplateDecl() == nullptr)
+ return false; // be conservative if we can't compare decls
+ for (const TemplateName& tpl_name : tpl_names) {
+ if (tpl_name.getAsTemplateDecl() == tn->getAsTemplateDecl())
+ return true;
+ }
+ return false;
+ } else if (const TemplateArgument* ta = node.GetAs<TemplateArgument>()) {
+ // TODO(csilvers): figure out how to compare template arguments
+ (void)ta;
+ return false;
+ } else if (const TemplateArgumentLoc* tal =
+ node.GetAs<TemplateArgumentLoc>()) {
+ // TODO(csilvers): figure out how to compare template argument-locs
+ (void)tal;
+ return false;
+ } else {
+ return ContainsKey(others, node.GetAs<void>());
+ }
+ }
+
+ void AddAll(const NodeSet& that) {
+ Extend(&typelocs, that.typelocs);
+ Extend(&nnslocs, that.nnslocs);
+ Extend(&tpl_names, that.tpl_names);
+ Extend(&tpl_args, that.tpl_args);
+ Extend(&tpl_arglocs, that.tpl_arglocs);
+ InsertAllInto(that.others, &others);
+ }
+
+ // Needed since we're treated like an stl-like object.
+ bool empty() const {
+ return (typelocs.empty() && nnslocs.empty() &&
+ tpl_names.empty() && tpl_args.empty() &&
+ tpl_arglocs.empty() && others.empty());
+ }
+ void clear() {
+ typelocs.clear();
+ nnslocs.clear();
+ tpl_names.clear();
+ tpl_args.clear();
+ tpl_arglocs.clear();
+ others.clear();
+ }
+
+ private:
+ friend class AstFlattenerVisitor;
+
+ // It's ok not to check for duplicates; we're just traversing the tree.
+ void Add(TypeLoc tl) { typelocs.push_back(tl); }
+ void Add(NestedNameSpecifierLoc nl) { nnslocs.push_back(nl); }
+ void Add(TemplateName tn) { tpl_names.push_back(tn); }
+ void Add(TemplateArgument ta) { tpl_args.push_back(ta); }
+ void Add(TemplateArgumentLoc tal) { tpl_arglocs.push_back(tal); }
+ void Add(const void* o) { others.insert(o); }
+
+ vector<TypeLoc> typelocs;
+ vector<NestedNameSpecifierLoc> nnslocs;
+ vector<TemplateName> tpl_names;
+ vector<TemplateArgument> tpl_args;
+ vector<TemplateArgumentLoc> tpl_arglocs;
+ set<const void*> others;
+ };
+
+ //------------------------------------------------------------
+ // Public interface:
+
+ explicit AstFlattenerVisitor(CompilerInstance* compiler) : Base(compiler) { }
+
+ const NodeSet& GetNodesBelow(Decl* decl) {
+ CHECK_(seen_nodes_.empty() && "Nodes should be clear before GetNodesBelow");
+ NodeSet* node_set = &nodeset_decl_cache_[decl];
+ if (node_set->empty()) {
+ if (decl->isImplicit()) {
+ TraverseImplicitDeclHelper(dyn_cast_or_null<FunctionDecl>(decl));
+ } else {
+ TraverseDecl(decl);
+ }
+ swap(*node_set, seen_nodes_); // move the seen_nodes_ into the cache
+ }
+ return *node_set; // returns the cache entry
+ }
+
+ //------------------------------------------------------------
+ // Pure virtual methods that the base class requires.
+
+ bool CanIgnoreCurrentASTNode() const override {
+ return false;
+ }
+
+ bool ShouldPrintSymbolFromCurrentFile() const override {
+ return false;
+ }
+
+ string GetSymbolAnnotation() const override {
+ return "[Uninstantiated template AST-node] ";
+ }
+
+ //------------------------------------------------------------
+ // Top-level handlers that construct the tree.
+
+ bool VisitDecl(Decl*) { AddCurrentAstNodeAsPointer(); return true; }
+
+ bool VisitStmt(Stmt*) { AddCurrentAstNodeAsPointer(); return true; }
+
+ bool VisitType(Type*) { AddCurrentAstNodeAsPointer(); return true; }
+
+ bool VisitTypeLoc(TypeLoc typeloc) {
+ VERRS(7) << GetSymbolAnnotation() << PrintableTypeLoc(typeloc) << "\n";
+ seen_nodes_.Add(typeloc);
+ return true;
+ }
+
+ bool VisitNestedNameSpecifier(NestedNameSpecifier*) {
+ AddCurrentAstNodeAsPointer();
+ return true;
+ }
+
+ bool VisitTemplateName(TemplateName tpl_name) {
+ VERRS(7) << GetSymbolAnnotation()
+ << PrintableTemplateName(tpl_name) << "\n";
+ seen_nodes_.Add(tpl_name);
+ return true;
+ }
+
+ bool VisitTemplateArgument(const TemplateArgument& tpl_arg) {
+ VERRS(7) << GetSymbolAnnotation()
+ << PrintableTemplateArgument(tpl_arg) << "\n";
+ seen_nodes_.Add(tpl_arg);
+ return true;
+ }
+
+ bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& tpl_argloc) {
+ VERRS(7) << GetSymbolAnnotation()
+ << PrintableTemplateArgumentLoc(tpl_argloc) << "\n";
+ seen_nodes_.Add(tpl_argloc);
+ return true;
+ }
+
+ bool TraverseImplicitDestructorCall(clang::CXXDestructorDecl* decl,
+ const Type* type) {
+ VERRS(7) << GetSymbolAnnotation() << "[implicit dtor] "
+ << static_cast<void*>(decl)
+ << (decl ? PrintableDecl(decl) : "nullptr") << "\n";
+ AddAstNodeAsPointer(decl);
+ return Base::TraverseImplicitDestructorCall(decl, type);
+ }
+
+ bool HandleFunctionCall(clang::FunctionDecl* callee,
+ const clang::Type* parent_type,
+ const clang::Expr* calling_expr) {
+ VERRS(7) << GetSymbolAnnotation() << "[function call] "
+ << static_cast<void*>(callee)
+ << (callee ? PrintableDecl(callee) : "nullptr") << "\n";
+ AddAstNodeAsPointer(callee);
+ return Base::HandleFunctionCall(callee, parent_type, calling_expr);
+ }
+
+ //------------------------------------------------------------
+ // Class logic.
+
+ void AddAstNodeAsPointer(const void* node) {
+ seen_nodes_.Add(node);
+ }
+
+ void AddCurrentAstNodeAsPointer() {
+ if (ShouldPrint(7)) {
+ errs() << GetSymbolAnnotation() << current_ast_node()->GetAs<void>()
+ << " ";
+ PrintASTNode(current_ast_node());
+ errs() << "\n";
+ }
+ AddAstNodeAsPointer(current_ast_node()->GetAs<void>());
+ }
+
+ private:
+ NodeSet seen_nodes_;
+
+ // Because we make a new AstFlattenerVisitor each time we flatten, we
+ // need to make this map static.
+ // TODO(csilvers): just have one flattener, so this needn't be static.
+ static map<const Decl*, NodeSet> nodeset_decl_cache_;
+};
+
+map<const Decl*, AstFlattenerVisitor::NodeSet>
+AstFlattenerVisitor::nodeset_decl_cache_;
+
+// ----------------------------------------------------------------------
+// --- VisitorState
+// ----------------------------------------------------------------------
+//
+// This is a simple struct holding data that IwyuBaseASTVisitor will
+// need to access and manipulate. It's held separately from
+// IwyuBaseASTVisitor because we want this information to be shared
+// between the IwyuASTConsumer and the InstantiatedTemplateVisitor,
+// each of which gets its own copy of IwyuBaseASTVisitor data. So to
+// share data, we need to hold it somewhere else.
+
+struct VisitorState {
+ VisitorState(CompilerInstance* c, const IwyuPreprocessorInfo& ipi)
+ : compiler(c), preprocessor_info(ipi) {}
+
+ CompilerInstance* const compiler;
+
+ // Information gathered at preprocessor time, including #include info.
+ const IwyuPreprocessorInfo& preprocessor_info;
+
+ // When we see an overloaded function that depends on a template
+ // parameter, we can't resolve the overload until the template
+ // is instantiated (e.g., MyFunc<int> in the following example):
+ // template<typename T> MyFunc() { OverloadedFunction(T()); }
+ // However, sometimes we can do iwyu even before resolving the
+ // overload, if *all* potential overloads live in the same file. We
+ // mark the location of such 'early-processed' functions here, so
+ // when we see the function again at template-instantiation time, we
+ // know not to do iwyu-checking on it again. (Since the actual
+ // function-call exprs are different between the uninstantiated and
+ // instantiated calls, we can't store the exprs themselves, but have
+ // to store their location.)
+ set<SourceLocation> processed_overload_locs;
+
+ // When we see a using declaration, we want to keep track of what
+ // file it's in, because other files may depend on that using
+ // declaration to get the names of their types right. We want to
+ // make sure we don't replace an #include with a forward-declare
+ // when we might need the #include's using declaration.
+ // The key is the type being 'used', the FileEntry is the file
+ // that has the using decl. If there are multiple using decls
+ // for a file, we prefer the one that has NamedDecl in it.
+ multimap<const NamedDecl*, const UsingDecl*> using_declarations;
+};
+
+// ----------------------------------------------------------------------
+// --- IwyuBaseAstVisitor
+// ----------------------------------------------------------------------
+//
+// We use two AST visitor classes to implement IWYU: IwyuAstConsumer
+// is the main visitor that traverses the AST corresponding to what's
+// actually written in the source code, and
+// InstantiatedTemplateVisitor is for traversing template
+// instantiations. This class template holds iwyu work that is be
+// shared by both.
+
+template <class Derived>
+class IwyuBaseAstVisitor : public BaseAstVisitor<Derived> {
+ public:
+ typedef BaseAstVisitor<Derived> Base;
+
+ explicit IwyuBaseAstVisitor(VisitorState* visitor_state)
+ : Base(visitor_state->compiler),
+ visitor_state_(visitor_state) {}
+
+ ~IwyuBaseAstVisitor() override = default;
+
+ // To avoid having this-> pointers everywhere, we re-export Base's
+ // functions that we use in this class. This is a language nit(?)
+ // when a templated class subclasses from another templated class.
+ using Base::CanIgnoreCurrentASTNode;
+ using Base::CurrentLoc;
+ using Base::CurrentFileEntry;
+ using Base::PrintableCurrentLoc;
+ using Base::current_ast_node;
+
+ //------------------------------------------------------------
+ // Pure virtual methods that a subclass must implement.
+
+ // Returns true if we are not interested in iwyu information for the
+ // given type, where the type is *not* the current AST node.
+ // TODO(csilvers): check we're calling this consistent with its API.
+ virtual bool CanIgnoreType(const Type* type) const = 0;
+
+ // Returns true if we are not interested in doing an iwyu check on
+ // the given decl, where the decl is *not* the current AST node.
+ // TODO(csilvers): check we're calling this consistent with its API.
+ virtual bool CanIgnoreDecl(const Decl* decl) const = 0;
+
+ //------------------------------------------------------------
+ // IWYU logic.
+
+ // Helper for MapPrivateDeclToPublicDecl. Returns true if the decl
+ // is a template specialization whose (written qualified) name matches
+ // the given name, has the given number of template arguments, and
+ // whose specified tpl argument is a type.
+ bool DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ const Decl* decl, const string& name,
+ size_t num_args, size_t type_arg_idx) const {
+ const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(decl);
+ if (!tpl_decl)
+ return false;
+ const string actual_name = GetWrittenQualifiedNameAsString(tpl_decl);
+ if (name != actual_name)
+ return false;
+ const TemplateArgumentList& tpl_args = tpl_decl->getTemplateArgs();
+ if (tpl_args.size() != num_args)
+ return false;
+ if (tpl_args.get(type_arg_idx).getKind() != TemplateArgument::Type)
+ return false;
+ return true;
+ }
+
+ // This requires the above function to have been called on decl, first.
+ const Type* GetTplTypeArg(const Decl* decl, size_t type_arg_idx) const {
+ const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(decl);
+ CHECK_(tpl_decl && "Must call DeclIsTemplateWithNameAndNumArgsAndTypeArg");
+ const TemplateArgumentList& tpl_args = tpl_decl->getTemplateArgs();
+ CHECK_(tpl_args.size() > type_arg_idx && "Invalid type_arg_idx");
+ CHECK_(tpl_args.get(type_arg_idx).getKind() == TemplateArgument::Type);
+ return tpl_args.get(type_arg_idx).getAsType().getTypePtr();
+ }
+
+ // Some types, such as __gnu_cxx::__normal_iterator or std::__wrap_iter, are
+ // private types that should not be exposed to the user. Instead, they're
+ // exposed to the user via typedefs, like vector::iterator.
+ // Sometimes, the typedef gets lost (such as for find(myvec.begin(),
+ // myvec.end(), foo)), so we need to manually map back. We map
+ // __normal_iterator<foo, vector> to vector<> and __wrap_iter<foo> to foo,
+ // assuming that the vector<> class includes the typedef. Likewise, we map
+ // any free function taking a private iterator (such as operator==) the
+ // same way, assuming that that (templatized) function is instantiated
+ // as part of the vector class.
+ // We do something similar for _List_iterator and _List_const_iterator
+ // from GNU libstdc++, and for __list_iterator and __list_const_iterator
+ // from libc++. These private names are defined in stl_list.h and list
+ // respectively, so we don't need to re-map them, but we do want to re-map
+ // reverse_iterator<_List_iterator> to something in list header.
+ // If the input decl does not correspond to one of these private
+ // decls, we return nullptr. This method is actually a helper for
+ // MapPrivateDeclToPublicDecl() and MapPrivateTypeToPublicType().
+ const Type* MapPrivateDeclToPublicType(const NamedDecl* decl) const {
+ const NamedDecl* class_decl = decl;
+ // If we're a member method, then the __normal_iterator or __wrap_iter will
+ // be the parent: __normal_iterator::operator=. If we're a free
+ // overloaded operator, then the __normal_iterator will be the
+ // first argument: operator==(__normal_iterator<...>& lhs, ...);
+ if (const CXXMethodDecl* method_decl = DynCastFrom(class_decl)) {
+ class_decl = method_decl->getParent();
+ } else if (const FunctionDecl* fn = DynCastFrom(decl)) {
+ if (fn->isOverloadedOperator() && fn->getNumParams() >= 1) {
+ const Type* firstarg_type = fn->getParamDecl(0)->getType().getTypePtr();
+ firstarg_type = RemovePointersAndReferencesAsWritten(firstarg_type);
+ class_decl = TypeToDeclAsWritten(firstarg_type);
+ }
+ }
+
+ // In addition to __normal_iterator<x> and __wrap_iter<x>, we want
+ // to handle reverse_iterator<__normal_iterator<x>>, and in the same way.
+ if (DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::reverse_iterator", 1, 0)) {
+ const Type* reversed_iterator_type = GetTplTypeArg(class_decl, 0);
+ // Gets class_decl to be reversed iterator.
+ class_decl = TypeToDeclAsWritten(reversed_iterator_type);
+
+ // If it's reverse_iterator<_List_iterator>, map to
+ // _List_iterator, which is defined in stl_list like we want. Also map
+ // reverse_iterator<__list_iterator> to __list_iterator which is defined
+ // in list.
+ if (DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::_List_iterator", 1, 0) ||
+ DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::_List_const_iterator", 1, 0) ||
+ DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::__list_iterator", 2, 0) ||
+ DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::__list_const_iterator", 2, 0)) {
+ return reversed_iterator_type;
+ }
+ }
+
+ if (DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "__gnu_cxx::__normal_iterator", 2, 1)) {
+ return GetTplTypeArg(class_decl, 1);
+ }
+ if (DeclIsTemplateWithNameAndNumArgsAndTypeArg(
+ class_decl, "std::__wrap_iter", 1, 0)) {
+ return GetTplTypeArg(class_decl, 0);
+ }
+
+ return nullptr;
+ }
+
+ const NamedDecl* MapPrivateDeclToPublicDecl(const NamedDecl* decl) const {
+ const Type* public_type = MapPrivateDeclToPublicType(decl);
+ if (public_type)
+ return TypeToDeclAsWritten(public_type);
+ return decl;
+ }
+
+ const Type* MapPrivateTypeToPublicType(const Type* type) const {
+ const NamedDecl* private_decl = TypeToDeclAsWritten(type);
+ const Type* public_type = MapPrivateDeclToPublicType(private_decl);
+ if (public_type)
+ return public_type;
+ return type;
+ }
+
+ // Get the canonical use location for a (location, decl) pair.
+ // Decide whether the file expanding the macro or the file defining the macro
+ // should be held responsible for a use.
+ SourceLocation GetCanonicalUseLocation(SourceLocation use_loc,
+ const NamedDecl* decl) {
+ // If we're not in a macro, just echo the use location.
+ if (!use_loc.isMacroID())
+ return use_loc;
+
+ VERRS(5) << "Trying to determine use location for '"
+ << PrintableDecl(decl) << "'\n";
+
+ clang::SourceManager* sm = GlobalSourceManager();
+ SourceLocation spelling_loc = sm->getSpellingLoc(use_loc);
+ SourceLocation expansion_loc = sm->getExpansionLoc(use_loc);
+
+ // If the file defining the macro contains a forward decl, keep it around
+ // and treat it as a hint that the expansion loc is responsible for the
+ // symbol.
+ const FileEntry* macro_def_file = GetLocFileEntry(spelling_loc);
+ VERRS(5) << "Macro is defined in file '" << GetFilePath(macro_def_file)
+ << "'. Looking for fwd-decl hint...\n";
+
+ const NamedDecl* fwd_decl = nullptr;
+ for (const NamedDecl* redecl : GetClassRedecls(decl)) {
+ if (GetFileEntry(redecl) == macro_def_file && IsForwardDecl(redecl)) {
+ fwd_decl = redecl;
+
+ // Make sure we keep that forward-declaration, even if it's probably
+ // unused in this file.
+ IwyuFileInfo* file_info =
+ preprocessor_info().FileInfoFor(macro_def_file);
+ file_info->ReportForwardDeclareUse(
+ spelling_loc, fwd_decl,
+ IsNodeInsideCXXMethodBody(current_ast_node()), nullptr);
+ break;
+ }
+ }
+
+ // Resolve the best use location based on our current knowledge.
+ //
+ // 1) If the use_loc is in <scratch space>, we assume it's formed by macro
+ // argument concatenation, and attribute responsibility to the expansion
+ // location.
+ // 2) If the macro definition file forward-declares the used decl, that's a
+ // hint that it wants the expansion location to take responsibility.
+ //
+ // Otherwise, the spelling loc is responsible.
+ if (IsInScratchSpace(spelling_loc)) {
+ VERRS(5) << "Spelling location is in <scratch space>, presumably as a "
+ "result of macro arg concatenation.\n";
+ use_loc = expansion_loc;
+ } else if (fwd_decl != nullptr) {
+ VERRS(5) << "Found a forward-decl in macro definition file.\n";
+ use_loc = expansion_loc;
+ } else {
+ use_loc = spelling_loc;
+ }
+
+ VERRS(4) << "Attributing use of '" << PrintableDecl(decl)
+ << "' to location at " << PrintableLoc(use_loc) << ".\n";
+
+ return use_loc;
+ }
+
+ // There are a few situations where iwyu is more restrictive than
+ // C++: where C++ allows a forward-declare but iwyu wants the full
+ // type. One is in a typedef: if you write 'typedef Foo MyTypedef',
+ // iwyu says that you are responsible for #including "foo.h", but
+ // the language allows a forward-declare. Another is for
+ // 'autocast': if your function has a parameter with a conversion
+ // (one-arg, not-explicit) constructor, iwyu requires that the
+ // function-author provides the full type of that parameter, but
+ // the language doesn't. (It's ok with all callers providing the
+ // full type instead.)
+ //
+ // In each of these situations, we allow the user to say that iwyu
+ // should not require #includes for these underlying types, but
+ // allow forward-declares instead. The author can do this by
+ // explicitly forward-declaring in the same file: for instance, they
+ // would do
+ // class Foo; typedef Foo MyTypedef; // can be on different lines :-)
+ // class AutocastType; void MyFunc(AutocastType); // but in same file
+ // If a definition- or declaration-site does this forward-declaring
+ // *and* does not directly #include the necessary file for Foo or
+ // AutocastType, we take that as a signal from the code-author that
+ // iwyu should relax its policies. These functions calculate the
+ // types (which may have many component-types if it's a templated
+ // type) for which the code-author has made this decision.
+ bool CodeAuthorWantsJustAForwardDeclare(const Type* type,
+ SourceLocation use_loc) {
+ const NamedDecl* decl = TypeToDeclAsWritten(type);
+ if (decl == nullptr) // only class-types are candidates for returning true
+ return false;
+
+ // If we're a template specialization, we also accept
+ // forward-declarations of the underlying template (vector<T>, not
+ // vector<int>).
+ set<const NamedDecl*> redecls = GetClassRedecls(decl);
+ if (const ClassTemplateSpecializationDecl* spec_decl = DynCastFrom(decl)) {
+ InsertAllInto(GetClassRedecls(spec_decl->getSpecializedTemplate()),
+ &redecls);
+ }
+
+ // Check if the author forward-declared the class in the same file.
+ bool found_earlier_forward_declare_in_same_file = false;
+ for (const NamedDecl* redecl : redecls) {
+ if (IsBeforeInSameFile(redecl, use_loc)) {
+ found_earlier_forward_declare_in_same_file = true;
+ break;
+ }
+ }
+ if (!found_earlier_forward_declare_in_same_file)
+ return false;
+
+ // Check if the the author is not #including the file with the
+ // definition. PublicHeaderIntendsToProvide has exactly the
+ // semantics we want. Note if there's no definition anywhere, we
+ // say the author does not want the full type (which is a good
+ // thing, since there isn't one!)
+ if (const NamedDecl* dfn = GetDefinitionForClass(decl)) {
+ if (IsBeforeInSameFile(dfn, use_loc))
+ return false;
+ if (preprocessor_info().PublicHeaderIntendsToProvide(
+ GetFileEntry(use_loc), GetFileEntry(dfn))) {
+ return false;
+ }
+ }
+
+ // OK, looks like the author has stated they don't want the fulll type.
+ return true;
+ }
+
+ // Returns the first type that is not a typedef in a template. For example,
+ // for template
+ //
+ // template<typename T> class Foo {
+ // typedef T value_type;
+ // typedef value_type& reference;
+ // };
+ //
+ // for type 'reference' it will return type T with which Foo was instantiated.
+ const Type* DesugarDependentTypedef(const TypedefType* typedef_type) {
+ const DeclContext* parent
+ = typedef_type->getDecl()->getLexicalDeclContext();
+ if (const ClassTemplateSpecializationDecl* template_parent
+ = DynCastFrom(parent)) {
+ return DesugarDependentTypedef(typedef_type, template_parent);
+ }
+ return typedef_type;
+ }
+
+ const Type* DesugarDependentTypedef(
+ const TypedefType* typedef_type, const RecordDecl* parent) {
+ const Type* underlying_type
+ = typedef_type->getDecl()->getUnderlyingType().getTypePtr();
+ if (const TypedefType* underlying_typedef = DynCastFrom(underlying_type)) {
+ if (underlying_typedef->getDecl()->getLexicalDeclContext() == parent) {
+ return DesugarDependentTypedef(underlying_typedef, parent);
+ }
+ }
+ return underlying_type;
+ }
+
+ set<const Type*> GetCallerResponsibleTypesForTypedef(
+ const TypedefDecl* decl) {
+ set<const Type*> retval;
+ const Type* underlying_type = decl->getUnderlyingType().getTypePtr();
+ // If the underlying type is itself a typedef, we recurse.
+ if (const TypedefType* underlying_typedef = DynCastFrom(underlying_type)) {
+ if (const TypedefDecl* underlying_typedef_decl
+ = DynCastFrom(TypeToDeclAsWritten(underlying_typedef))) {
+ // TODO(csilvers): if one of the intermediate typedefs
+ // #includes the necessary definition of the 'final'
+ // underlying type, do we want to return the empty set here?
+ return GetCallerResponsibleTypesForTypedef(underlying_typedef_decl);
+ }
+ }
+
+ const Type* deref_type
+ = RemovePointersAndReferencesAsWritten(underlying_type);
+ if (CodeAuthorWantsJustAForwardDeclare(deref_type, GetLocation(decl))) {
+ retval.insert(deref_type);
+ // TODO(csilvers): include template type-args if appropriate.
+ // This requires doing an iwyu visit of the instantiated
+ // underlying type and seeing which type-args we require full
+ // use for. Also have to handle the case where the type-args
+ // are themselves templates. It will require pretty substantial
+ // iwyu surgery.
+ }
+ return retval;
+ }
+
+ // ast_node is the node for the autocast CastExpr. We use it to get
+ // the parent CallExpr to figure out what function is being called.
+ set<const Type*> GetCallerResponsibleTypesForAutocast(
+ const ASTNode* ast_node) {
+ while (ast_node && !ast_node->IsA<CallExpr>())
+ ast_node = ast_node->parent();
+ CHECK_(ast_node && "Should only check Autocast if under a CallExpr");
+ const CallExpr* call_expr = ast_node->GetAs<CallExpr>();
+ const FunctionDecl* fn_decl = call_expr->getDirectCallee();
+ if (!fn_decl) // TODO(csilvers): what to do for fn ptrs and the like?
+ return set<const Type*>();
+
+ // Collect the non-explicit, one-arg constructor ('autocast') types.
+ set<const Type*> autocast_types;
+ for (FunctionDecl::param_const_iterator param = fn_decl->param_begin();
+ param != fn_decl->param_end(); ++param) {
+ const Type* param_type = GetTypeOf(*param);
+ if (HasImplicitConversionConstructor(param_type)) {
+ const Type* deref_param_type =
+ RemovePointersAndReferencesAsWritten(param_type);
+ autocast_types.insert(deref_param_type);
+ }
+ }
+
+ // Now look at all the function decls that are visible from the
+ // call-location. We keep only the autocast params that *all*
+ // the function decl authors want the caller to be responsible
+ // for. We do this by elimination: start with all types, and
+ // remove them as we see authors providing the full type.
+ set<const Type*> retval = autocast_types;
+ for (FunctionDecl::redecl_iterator fn_redecl = fn_decl->redecls_begin();
+ fn_redecl != fn_decl->redecls_end(); ++fn_redecl) {
+ // Ignore function-decls that we can't see from the use-location.
+ if (!preprocessor_info().FileTransitivelyIncludes(
+ GetFileEntry(call_expr), GetFileEntry(*fn_redecl))) {
+ continue;
+ }
+ for (set<const Type*>::iterator it = retval.begin();
+ it != retval.end(); ) {
+ if (!CodeAuthorWantsJustAForwardDeclare(*it, GetLocation(*fn_redecl))) {
+ // set<> has nice property that erasing doesn't invalidate iterators.
+
+ retval.erase(it++);
+ } else {
+ ++it;
+ }
+ }
+ }
+
+ // TODO(csilvers): include template type-args of each entry of retval.
+
+ return retval;
+ }
+
+ set<const Type*> GetCallerResponsibleTypesForFnReturn(
+ const FunctionDecl* decl) {
+ set<const Type*> retval;
+ const Type* return_type
+ = RemoveElaboration(decl->getReturnType().getTypePtr());
+ if (CodeAuthorWantsJustAForwardDeclare(return_type, GetLocation(decl))) {
+ retval.insert(return_type);
+ // TODO(csilvers): include template type-args if appropriate.
+ }
+ return retval;
+ }
+
+ //------------------------------------------------------------
+ // Checkers, that tell iwyu_output about uses of symbols.
+ // We let, but don't require, subclasses to override these.
+
+ // The comment, if not nullptr, is extra text that is included along
+ // with the warning message that iwyu emits.
+ virtual void ReportDeclUseWithComment(SourceLocation used_loc,
+ const NamedDecl* used_decl,
+ const char* comment) {
+ const NamedDecl* target_decl = used_decl;
+
+ // Sometimes a shadow decl comes between us and the 'real' decl.
+ if (const UsingShadowDecl* shadow_decl = DynCastFrom(used_decl))
+ target_decl = shadow_decl->getTargetDecl();
+
+ // Map private decls like __normal_iterator to their public counterpart.
+ target_decl = MapPrivateDeclToPublicDecl(target_decl);
+ if (CanIgnoreDecl(target_decl))
+ return;
+
+ // Canonicalize the use location and report the use.
+ used_loc = GetCanonicalUseLocation(used_loc, target_decl);
+ const FileEntry* used_in = GetFileEntry(used_loc);
+ preprocessor_info().FileInfoFor(used_in)->ReportFullSymbolUse(
+ used_loc, target_decl, IsNodeInsideCXXMethodBody(current_ast_node()),
+ comment);
+
+ // Sometimes using a decl drags in a few other uses as well:
+
+ // If we're a use that depends on a using declaration, make sure
+ // we #include the file with the using declaration. Need to check
+ // the original reported decl so we don't lose the shadow information.
+ // TODO(csilvers): check that our getQualifier() does not match
+ // the namespace of the decl. If we have 'using std::vector;' +
+ // 'std::vector<int> foo;' we don't actually care about the
+ // using-decl.
+ // TODO(csilvers): maybe just insert our own using declaration
+ // instead? We can call it "Use what you use". :-)
+ // TODO(csilvers): check for using statements and namespace aliases too.
+ if (const UsingDecl* using_decl
+ = GetUsingDeclarationOf(used_decl,
+ GetDeclContext(current_ast_node()))) {
+ preprocessor_info().FileInfoFor(used_in)->ReportUsingDeclUse(
+ used_loc, using_decl, IsNodeInsideCXXMethodBody(current_ast_node()),
+ "(for using decl)");
+ }
+
+ // For typedefs, the user of the type is sometimes the one
+ // responsible for the underlying type. We check if that is the
+ // case here, since we might be using a typedef type from
+ // anywhere. ('autocast' is similar, but is handled in
+ // VisitCastExpr; 'fn-return-type' is also similar and is
+ // handled in HandleFunctionCall.)
+ if (const TypedefDecl* typedef_decl = DynCastFrom(target_decl)) {
+ // One exception: if this TypedefType is being used in another
+ // typedef (that is, 'typedef MyTypedef OtherTypdef'), then the
+ // user -- the other typedef -- is never responsible for the
+ // underlying type. Instead, users of that typedef are.
+ if (!current_ast_node()->template ParentIsA<TypedefDecl>()) {
+ const set<const Type*>& underlying_types
+ = GetCallerResponsibleTypesForTypedef(typedef_decl);
+ if (!underlying_types.empty()) {
+ VERRS(6) << "User, not author, of typedef "
+ << typedef_decl->getQualifiedNameAsString()
+ << " owns the underlying type:\n";
+ // If any of the used types are themselves typedefs, this will
+ // result in a recursive expansion. Note we are careful to
+ // recurse inside this class, and not go back to subclasses.
+ for (const Type* type : underlying_types)
+ IwyuBaseAstVisitor<Derived>::ReportTypeUseWithComment(
+ used_loc, type, nullptr);
+ }
+ }
+ }
+ }
+
+ // The comment, if not nullptr, is extra text that is included along
+ // with the warning message that iwyu emits.
+ virtual void ReportDeclForwardDeclareUseWithComment(SourceLocation used_loc,
+ const NamedDecl* used_decl,
+ const char* comment) {
+ const NamedDecl* target_decl = used_decl;
+
+ // Sometimes a shadow decl comes between us and the 'real' decl.
+ if (const UsingShadowDecl* shadow_decl = DynCastFrom(used_decl))
+ target_decl = shadow_decl->getTargetDecl();
+
+ target_decl = MapPrivateDeclToPublicDecl(target_decl);
+ if (CanIgnoreDecl(target_decl))
+ return;
+
+ // Canonicalize the use location and report the use.
+ used_loc = GetCanonicalUseLocation(used_loc, target_decl);
+ const FileEntry* used_in = GetFileEntry(used_loc);
+ preprocessor_info().FileInfoFor(used_in)->ReportForwardDeclareUse(
+ used_loc, target_decl, IsNodeInsideCXXMethodBody(current_ast_node()),
+ comment);
+
+ // If we're a use that depends on a using declaration, make sure
+ // we #include the file with the using declaration.
+ if (const UsingDecl* using_decl
+ = GetUsingDeclarationOf(used_decl,
+ GetDeclContext(current_ast_node()))) {
+ preprocessor_info().FileInfoFor(used_in)->ReportUsingDeclUse(
+ used_loc, using_decl, IsNodeInsideCXXMethodBody(current_ast_node()),
+ "(for using decl)");
+ }
+ }
+
+ // Like ReportDeclUse, but for the common case of no comment.
+ void ReportDeclUse(SourceLocation used_loc, const NamedDecl* decl) {
+ return ReportDeclUseWithComment(used_loc, decl, nullptr);
+ }
+
+ void ReportDeclForwardDeclareUse(SourceLocation used_loc,
+ const NamedDecl* decl) {
+ return ReportDeclForwardDeclareUseWithComment(used_loc, decl, nullptr);
+ }
+
+ void ReportDeclsUse(SourceLocation used_loc,
+ const set<const NamedDecl*>& decls) {
+ for (const NamedDecl* decl : decls)
+ ReportDeclUse(used_loc, decl);
+ }
+
+ // Called when the given type is fully used at used_loc, regardless
+ // of the type being explicitly written in the source code or not.
+ // The comment, if not nullptr, is extra text that is included along
+ // with the warning message that iwyu emits.
+ virtual void ReportTypeUseWithComment(SourceLocation used_loc,
+ const Type* type,
+ const char* comment) {
+ // TODO(csilvers): figure out if/when calling CanIgnoreType() is correct.
+ if (!type)
+ return;
+
+ // Map private types like __normal_iterator to their public counterpart.
+ type = MapPrivateTypeToPublicType(type);
+ // For the below, we want to be careful to call *our*
+ // ReportDeclUse(), not any of the ones in subclasses.
+ if (IsPointerOrReferenceAsWritten(type)) {
+ type = RemovePointersAndReferencesAsWritten(type);
+ if (const NamedDecl* decl = TypeToDeclAsWritten(type)) {
+ VERRS(6) << "(For pointer type " << PrintableType(type) << "):\n";
+ IwyuBaseAstVisitor<Derived>::ReportDeclForwardDeclareUseWithComment(
+ used_loc, decl, comment);
+ }
+ } else {
+ if (const NamedDecl* decl = TypeToDeclAsWritten(type)) {
+ decl = GetDefinitionAsWritten(decl);
+ VERRS(6) << "(For type " << PrintableType(type) << "):\n";
+ IwyuBaseAstVisitor<Derived>::ReportDeclUseWithComment(
+ used_loc, decl, comment);
+ }
+ }
+ }
+
+ // Like ReportTypeUse, but for the common case of no comment.
+ void ReportTypeUse(SourceLocation used_loc, const Type* type) {
+ return ReportTypeUseWithComment(used_loc, type, nullptr);
+ }
+
+ void ReportTypesUse(SourceLocation used_loc, const set<const Type*>& types) {
+ for (const Type* type : types)
+ ReportTypeUse(used_loc, type);
+ }
+
+ //------------------------------------------------------------
+ // Visitors of types derived from clang::Decl.
+
+ // Friend declarations only need their types forward-declared.
+ bool VisitFriendDecl(clang::FriendDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ current_ast_node()->set_in_forward_declare_context(true);
+ return true;
+ }
+
+ bool VisitFriendTemplateDecl(clang::FriendTemplateDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ current_ast_node()->set_in_forward_declare_context(true);
+ return true;
+ }
+
+ // If you say 'typedef Foo Bar', C++ says you just need to
+ // forward-declare Foo. But iwyu would rather you fully define Foo,
+ // so all users of Bar don't have to. We make two exceptions:
+ // 1) The author of the typedef doesn't *want* to provide Foo, and
+ // is happy making all the callers do so. The author indicates
+ // this by explicitly forward-declaring Foo and not #including
+ // foo.h.
+ // 2) The typedef is a member of a templated class, and the
+ // underlying type is a template parameter:
+ // template<class T> struct C { typedef T value_type; };
+ // This is not a re-export because you need the type to
+ // access the typedef (via 'C<Someclass>::value_type'), so
+ // there's no need for the typedef-file to provide the type
+ // too. TODO(csilvers): this is patently wrong; figure out
+ // something better. We need something that doesn't require
+ // the full type info for creating a scoped_ptr<MyClass>.
+ // As an extension of (2), if the typedef is a template type that
+ // contains T as a template parameter, the typedef still re-exports
+ // the template type (it's not (2)), but the template parameter
+ // itself can be forward-declared, just as in (2). That is:
+ // template<class T> struct C { typedef pair<T,T> value_type; };
+ // iwyu will demand the full type of pair, but not of its template
+ // arguments. This is handled not here, but below, in
+ // VisitSubstTemplateTypeParmType.
+ bool VisitTypedefDecl(clang::TypedefDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ const Type* underlying_type = decl->getUnderlyingType().getTypePtr();
+ const Type* deref_type
+ = RemovePointersAndReferencesAsWritten(underlying_type);
+
+ if (CodeAuthorWantsJustAForwardDeclare(deref_type, GetLocation(decl)) ||
+ isa<SubstTemplateTypeParmType>(underlying_type)) {
+ current_ast_node()->set_in_forward_declare_context(true);
+ } else {
+ current_ast_node()->set_in_forward_declare_context(false);
+ }
+
+ return Base::VisitTypedefDecl(decl);
+ }
+
+ // If we're a declared (not defined) function, all our types --
+ // return type and argument types -- are forward-declarable. The
+ // one exception required by the language is the throw types, which
+ // we clean up in VisitType().
+ // There are two more exceptions that iwyu imposes:
+ // (1) iwyu asks the function author to provide the full type
+ // information for the return type. That way the user doesn't
+ // have to.
+ // (2) If any of our function parameters have a type with a
+ // non-explicit, one-arg constructor, or is a const reference to
+ // such a type, mark that type as not forward declarable. The
+ // worry is that people might need the full type for the
+ // implicit conversion (the 'autocast'), for instance, passing
+ // in a char* to Fn(const StringPiece& foo) { ... }
+ // Both of these iwyu requirements can be overridden by the function
+ // author; for details, see CodeAuthorWantsJustAForwardDeclare.
+ bool VisitFunctionDecl(clang::FunctionDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (!decl->isThisDeclarationADefinition()) {
+ // Make all our types forward-declarable...
+ current_ast_node()->set_in_forward_declare_context(true);
+ }
+
+ // (The exceptions below don't apply to friend declarations; we
+ // never need full types for them.)
+ if (IsFriendDecl(decl))
+ return true;
+
+ // ...except the return value.
+ const Type* return_type
+ = RemoveElaboration(decl->getReturnType().getTypePtr());
+ const bool is_responsible_for_return_type
+ = (!CanIgnoreType(return_type) &&
+ !IsPointerOrReferenceAsWritten(return_type) &&
+ !CodeAuthorWantsJustAForwardDeclare(return_type, GetLocation(decl)));
+ // Don't bother to report here, when the language agrees with us
+ // we need the full type; that will be reported elsewhere, so
+ // reporting here would be double-counting.
+ const bool type_use_reported_in_visit_function_type
+ = (!current_ast_node()->in_forward_declare_context() ||
+ !IsClassType(return_type));
+ if (is_responsible_for_return_type &&
+ !type_use_reported_in_visit_function_type) {
+ ReportTypeUseWithComment(GetLocation(decl), return_type,
+ "(for fn return type)");
+ }
+
+ // ...and non-explicit, one-arg ('autocast') constructor types.
+ for (FunctionDecl::param_iterator param = decl->param_begin();
+ param != decl->param_end(); ++param) {
+ const Type* param_type = GetTypeOf(*param);
+ if (!HasImplicitConversionConstructor(param_type))
+ continue;
+ const Type* deref_param_type =
+ RemovePointersAndReferencesAsWritten(param_type);
+ if (CanIgnoreType(param_type) && CanIgnoreType(deref_param_type))
+ continue;
+
+ // TODO(csilvers): remove this 'if' check when we've resolved the
+ // clang bug where getTypeSourceInfo() can return nullptr.
+ if ((*param)->getTypeSourceInfo()) {
+ const TypeLoc param_tl = (*param)->getTypeSourceInfo()->getTypeLoc();
+ // While iwyu requires the full type of autocast parameters,
+ // c++ does not. Function-writers can force iwyu to follow
+ // the language by explicitly forward-declaring the type.
+ // Check for that now, and don't require the full type.
+ if (CodeAuthorWantsJustAForwardDeclare(deref_param_type,
+ GetLocation(&param_tl)))
+ continue;
+ // This is a 'full type required' check, to 'turn off' fwd decl.
+ // But don't bother to report in situations where we need the
+ // full type for other reasons; that's just double-reporting.
+ if (current_ast_node()->in_forward_declare_context() ||
+ IsPointerOrReferenceAsWritten(param_type)) {
+ ReportTypeUseWithComment(GetLocation(&param_tl), deref_param_type,
+ "(for autocast)");
+ }
+ } else {
+ VERRS(6) << "WARNING: nullptr TypeSourceInfo for "
+ << PrintableDecl(*param)
+ << " (type " << PrintableType(param_type) << ")\n";
+ }
+ }
+ return true;
+ }
+
+ // Special handling for C++ methods to detect covariant return types.
+ // These are defined as a derived class overriding a method with a different
+ // return type from the base.
+ bool VisitCXXMethodDecl(CXXMethodDecl* method_decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (HasCovariantReturnType(method_decl)) {
+ const Type* return_type = RemovePointersAndReferencesAsWritten(
+ method_decl->getReturnType().getTypePtr());
+
+ VERRS(3) << "Found covariant return type in "
+ << method_decl->getQualifiedNameAsString()
+ << ", needs complete type of "
+ << PrintableType(return_type)
+ << ".\n";
+
+ ReportTypeUse(CurrentLoc(), return_type);
+ }
+
+ return Base::VisitCXXMethodDecl(method_decl);
+ }
+
+ //------------------------------------------------------------
+ // Visitors of types derived from clang::Stmt.
+
+ // Catch statements always require the full type to be visible,
+ // no matter if we're catching by value, reference or pointer.
+ bool VisitCXXCatchStmt(clang::CXXCatchStmt* stmt) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (const Type* caught_type = stmt->getCaughtType().getTypePtrOrNull()) {
+ // Strip off pointers/references to get to the 'base' type.
+ caught_type = RemovePointersAndReferencesAsWritten(caught_type);
+ ReportTypeUse(CurrentLoc(), caught_type);
+ } else {
+ // catch(...): no type to act on here.
+ }
+
+ return Base::VisitCXXCatchStmt(stmt);
+ }
+
+ // When casting non-pointers, iwyu will do the right thing
+ // automatically, but sometimes when casting from one pointer to
+ // another, you still need the full type information of both types:
+ // for instance, when static-casting from a sub-class to a
+ // super-class. Testing shows this is true for static, dynamic
+ // casts, and implicit casts, but not for reinterpret casts, const
+ // casts, or C-style casts. (Functional casts like int(3.5) are
+ // treated the same as C-style casts.) clang helpfully provides a
+ // 'cast kind', which we use to determine when full types are
+ // needed. When we notice that the cast is a cast up or down a
+ // class hierarchy, we require full type info for both types even
+ // for C-style casts (though the language doesn't), to give the
+ // compiler a fighting chance of generating correct code.
+ bool VisitCastExpr(clang::CastExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ const Type* const from_type = GetTypeOf(expr->getSubExprAsWritten());
+ const Type* const to_type = GetTypeOf(expr);
+ const Type* const deref_from_type = RemovePointersAndReferences(from_type);
+ const Type* const deref_to_type = RemovePointersAndReferences(to_type);
+
+ // For all those casts that don't result in function calls
+ // (everything except a user-defined cast or a constructor cast),
+ // we only care about the need for full types when casting either
+ // a pointer to a pointer, or any type to a reference.
+ // Unfortunately, when casting to a reference, clang seems to
+ // strip the reference off of to_type, so we need a separate
+ // function call to tell.
+ if (expr->getCastKind() != clang::CK_UserDefinedConversion &&
+ expr->getCastKind() != clang::CK_ConstructorConversion) {
+ if (!((from_type->hasPointerRepresentation() && // pointer or reference
+ to_type->hasPointerRepresentation()) ||
+ IsCastToReferenceType(expr)))
+ return true; // we only care about ptr-to-ptr casts for this check
+ }
+
+ bool need_full_deref_from_type = false;
+ bool need_full_deref_to_type = false;
+ // The list of kinds: http://clang.llvm.org/doxygen/namespaceclang.html
+ switch (expr->getCastKind()) {
+ // This cast still isn't handled directly.
+ case clang::CK_Dependent:
+ break;
+
+ // These casts don't require any iwyu action.
+ case clang::CK_LValueToRValue:
+ case clang::CK_AtomicToNonAtomic:
+ case clang::CK_NonAtomicToAtomic:
+ case clang::CK_ReinterpretMemberPointer:
+ case clang::CK_BuiltinFnToFnPtr:
+ case clang::CK_ZeroToOCLEvent: // OpenCL event_t is a built-in type.
+ case clang::CK_ZeroToOCLQueue: // OpenCL queue_t is a built-in type.
+ case clang::CK_IntToOCLSampler: // OpenCL sampler_t is a built-in type.
+ case clang::CK_AddressSpaceConversion: // Address spaces are associated
+ // with pointers, so no need for
+ // the full type.
+ break;
+
+ // We shouldn't be seeing any of these kinds.
+ case clang::CK_ArrayToPointerDecay:
+ case clang::CK_BooleanToSignedIntegral:
+ case clang::CK_FloatingCast:
+ case clang::CK_FloatingComplexCast:
+ case clang::CK_FloatingComplexToBoolean:
+ case clang::CK_FloatingComplexToIntegralComplex:
+ case clang::CK_FloatingComplexToReal:
+ case clang::CK_FloatingRealToComplex:
+ case clang::CK_FloatingToBoolean:
+ case clang::CK_FloatingToIntegral:
+ case clang::CK_FunctionToPointerDecay:
+ case clang::CK_IntegralCast:
+ case clang::CK_IntegralComplexCast:
+ case clang::CK_IntegralComplexToBoolean:
+ case clang::CK_IntegralComplexToFloatingComplex:
+ case clang::CK_IntegralComplexToReal:
+ case clang::CK_IntegralRealToComplex:
+ case clang::CK_IntegralToBoolean:
+ case clang::CK_IntegralToFloating:
+ case clang::CK_IntegralToPointer:
+ case clang::CK_MemberPointerToBoolean:
+ case clang::CK_NullToMemberPointer:
+ case clang::CK_NullToPointer:
+ case clang::CK_PointerToBoolean:
+ case clang::CK_PointerToIntegral:
+ case clang::CK_ToUnion:
+ case clang::CK_ToVoid:
+ // Due to a bug in clang, we sometimes get IntegralToPointer
+ // kinds for a cast that should be a NoOp kind:
+ // http://llvm.org/bugs/show_bug.cgi?id=8543
+ // It's possible clang mis-categorizes in other cases too. So
+ // I just log here, rather than asserting and possibly
+ // crashing iwyu.
+ VERRS(3) << "WARNING: Unexpected cast that involves a non-pointer: "
+ << expr->getCastKindName() << "\n";
+ break;
+ case clang::CK_AnyPointerToBlockPointerCast:
+ case clang::CK_ARCConsumeObject:
+ case clang::CK_ARCExtendBlockObject:
+ case clang::CK_ARCProduceObject:
+ case clang::CK_ARCReclaimReturnedObject:
+ case clang::CK_BlockPointerToObjCPointerCast:
+ case clang::CK_CopyAndAutoreleaseBlockObject:
+ case clang::CK_CPointerToObjCPointerCast:
+ case clang::CK_ObjCObjectLValueCast:
+ case clang::CK_VectorSplat:
+ CHECK_UNREACHABLE_(
+ "TODO(csilvers): for objc and clang lang extensions");
+ break;
+
+ // Kinds for reinterpret_cast and const_cast, which need no full types.
+ case clang::CK_BitCast: // used for reinterpret_cast
+ case clang::CK_LValueBitCast: // used for reinterpret_cast
+ case clang::CK_NoOp: // used for const_cast, etc
+ break;
+
+ // Need the full to-type so we can call its constructor.
+ case clang::CK_ConstructorConversion:
+ // 'Autocast' -- calling a one-arg, non-explicit constructor
+ // -- is a special case when it's done for a function call.
+ // iwyu requires the function-writer to provide the #include
+ // for the casted-to type, just so we don't have to require it
+ // here. *However*, the function-author can override this
+ // iwyu requirement, in which case we're responsible for the
+ // casted-to type. See IwyuBaseASTVisitor::VisitFunctionDecl.
+ if (!current_ast_node()->template HasAncestorOfType<CallExpr>() ||
+ ContainsKey(
+ GetCallerResponsibleTypesForAutocast(current_ast_node()),
+ deref_to_type)) {
+ need_full_deref_to_type = true;
+ }
+ break;
+ // Need the full from-type so we can call its 'operator <totype>()'.
+ case clang::CK_UserDefinedConversion:
+ need_full_deref_from_type = true;
+ break;
+
+ // Kinds that cast up or down an inheritance hierarchy.
+ case clang::CK_BaseToDerived:
+ case clang::CK_BaseToDerivedMemberPointer:
+ // Just 'to' type is enough: full type for derived gets base type too.
+ need_full_deref_to_type = true;
+ break;
+ case clang::CK_DerivedToBase:
+ case clang::CK_UncheckedDerivedToBase:
+ case clang::CK_DerivedToBaseMemberPointer:
+ need_full_deref_from_type = true;
+ break;
+ case clang::CK_Dynamic:
+ // Usually dynamic casting is a base-to-derived cast, but it is
+ // possible to dynamic-cast between siblings, in which case we
+ // need both types.
+ need_full_deref_from_type = true;
+ need_full_deref_to_type = true;
+ break;
+ }
+
+ // TODO(csilvers): test if we correctly say we use FooPtr for
+ // typedef Foo* FooPtr; ... static_cast<FooPtr>(...) ...
+ if (need_full_deref_from_type && !CanIgnoreType(deref_from_type)) {
+ ReportTypeUse(CurrentLoc(), deref_from_type);
+ }
+ if (need_full_deref_to_type && !CanIgnoreType(deref_to_type)) {
+ ReportTypeUse(CurrentLoc(), deref_to_type);
+ }
+ return true;
+ }
+
+ // Mark that we need the full type info for our base type -- the
+ // thing we're a member of -- and it's not just forward-declarable.
+ // For instance, for code 'Mytype* myvar; myvar->a;', we'll get a
+ // MemberExpr callback whose base has the type of myvar.
+ bool VisitMemberExpr(clang::MemberExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Expr* base_expr = expr->getBase()->IgnoreParenImpCasts();
+ const Type* base_type = GetTypeOf(base_expr);
+ CHECK_(base_type && "Member's base does not have a type?");
+ const Type* deref_base_type // For myvar->a, base-type will have a *
+ = expr->isArrow() ? RemovePointerFromType(base_type) : base_type;
+ if (CanIgnoreType(base_type) && CanIgnoreType(deref_base_type))
+ return true;
+ if (const TypedefType* typedef_type = DynCastFrom(deref_base_type)) {
+ deref_base_type = DesugarDependentTypedef(typedef_type);
+ }
+ // Technically, we should say the type is being used at the
+ // location of base_expr. That may be a different file than us in
+ // cases like MACRO.b(). However, while one can imagine
+ // situations where the base-type is the responsibility of the
+ // macro-author ('SOME_GLOBAL_OBJECT.a()'), the more common case
+ // is it's our responsibility ('CHECK_NOTNULL(x).a()'). Until we
+ // can better distinguish whether a macro body is an expression
+ // that's responsible for its type or not, we just assume it is.
+ // TODO(csilvers): fix when we can determine what the macro-text
+ // is responsible for and what we're responsible for.
+ // TODO(csilvers): we should be reporting a fwd-decl use for
+ // GetTypeOf(expr), not on deref_base_type.
+ ReportTypeUse(CurrentLoc(), deref_base_type);
+ return true;
+ }
+
+ // For a[4], report that we need the full type of *a (to get its
+ // size; otherwise the compiler can't tell the address of a[4]).
+ bool VisitArraySubscriptExpr(clang::ArraySubscriptExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* element_type = GetTypeOf(expr);
+ if (CanIgnoreType(element_type))
+ return true;
+ ReportTypeUse(CurrentLoc(), element_type);
+ return true;
+ }
+
+ // If a binary operator expression results in pointer arithmetic, we need the
+ // full types of all pointers involved.
+ bool VisitBinaryOperator(clang::BinaryOperator* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ // If it's not +, +=, - or -=, this can't be pointer arithmetic
+ clang::BinaryOperator::Opcode op = expr->getOpcode();
+ if (op != clang::BO_Add && op != clang::BO_Sub &&
+ op != clang::BO_AddAssign && op != clang::BO_SubAssign)
+ return true;
+
+ for (const Stmt* child : expr->children()) {
+ if (const PointerType* pointer_type =
+ dyn_cast<PointerType>(GetTypeOf(cast<Expr>(child)))) {
+ // It's a pointer-typed expression. Get the pointed-to type (which may
+ // itself be a pointer) and report it.
+ const Type* deref_type = pointer_type->getPointeeType().getTypePtr();
+ if (!CanIgnoreType(deref_type))
+ ReportTypeUse(CurrentLoc(), deref_type);
+ }
+ }
+
+ return true;
+ }
+
+ // Mark that we need the full type info for the thing we're taking
+ // sizeof of. Sometimes this is double-counting: for
+ // sizeof(some_type), RecursiveASTVisitor will visit some_type and
+ // say it needs the full type information there, and for
+ // sizeof(some_var), we'll report we need full type information when
+ // some_var is defined. But if the arg is a reference, nobody else
+ // will say we need full type info but us.
+ bool VisitUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ // Calling sizeof on a reference-to-X is the same as calling it on X.
+ // If sizeof() takes a type, this is easy to check. If sizeof()
+ // takes an expr, it's hard to tell -- GetTypeOf(expr) 'sees through'
+ // references. Luckily, we want to see through references, so we
+ // just use the GetTypeOf().
+ if (expr->isArgumentType()) {
+ const TypeLoc& arg_tl = expr->getArgumentTypeInfo()->getTypeLoc();
+ if (const ReferenceType* reftype = DynCastFrom(arg_tl.getTypePtr())) {
+ const Type* dereftype = reftype->getPointeeTypeAsWritten().getTypePtr();
+ if (!CanIgnoreType(reftype) || !CanIgnoreType(dereftype))
+ ReportTypeUse(GetLocation(&arg_tl), dereftype);
+ } else {
+ // No need to report on non-ref types, RecursiveASTVisitor will get 'em.
+ }
+ } else {
+ const Expr* arg_expr = expr->getArgumentExpr();
+ const Type* dereftype = arg_expr->getType().getTypePtr();
+ if (!CanIgnoreType(dereftype))
+ // This reports even if the expr ends up not being a reference, but
+ // that's ok (if potentially redundant).
+ ReportTypeUse(GetLocation(arg_expr->IgnoreParenImpCasts()), dereftype);
+ }
+ return true;
+ }
+
+ // We want to mark use of the base type For 'free function' operator
+ // overloads ('ostream& operator<<(ostream& o, int x)') just like we
+ // do for member functions ('ostream& ostream::operator<<(int x)')
+ // -- for iwyu purposes, 'x << 4' is just semantic sugar around
+ // x.operator<<(4).
+ bool VisitCXXOperatorCallExpr(clang::CXXOperatorCallExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (const Expr* owner_expr = GetFirstClassArgument(expr)) {
+ const Type* owner_type = GetTypeOf(owner_expr);
+ // Note we report the type use is the location of owner_expr
+ // (the 'a' in 'a << b' or the 'MACRO' in 'MACRO << b'), rather
+ // than our location (which is the '<<'). That way, we properly
+ // situate the owner when it's a macro.
+ if (!CanIgnoreType(owner_type))
+ ReportTypeUse(GetLocation(owner_expr), owner_type);
+ }
+ return true;
+ }
+
+ // We have to check the type being deleted is fully defined (the
+ // language doesn't require it, but bad things happen if it's not:
+ // the destructor isn't run).
+ bool VisitCXXDeleteExpr(clang::CXXDeleteExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Expr* delete_arg = expr->getArgument()->IgnoreParenImpCasts();
+ // We always delete a pointer, so do one dereference to get the
+ // actual type being deleted.
+ const Type* delete_ptr_type = GetTypeOf(delete_arg);
+ const Type* delete_type = RemovePointerFromType(delete_ptr_type);
+ if (CanIgnoreType(delete_ptr_type) && CanIgnoreType(delete_type))
+ return true;
+
+ if (delete_type && !IsPointerOrReferenceAsWritten(delete_type))
+ ReportTypeUse(CurrentLoc(), delete_type);
+
+ return true;
+ }
+
+ // Handle the case of passing references to variadic functions
+ // (those with '...'). We need the full type information for the
+ // reference in that case, since compilers seem to just deref the
+ // var before passing it in. Note we subclass all the
+ // function-calling methods rather than HandleFunctionCall, because
+ // a) we need type-specific caller information anyway, and b)
+ // HandleFunctionCall isn't called for calls via function-pointers,
+ // which we want.
+ void ReportIfReferenceVararg(const Expr* const* args, unsigned num_args,
+ const FunctionProtoType* callee_type) {
+ if (callee_type && callee_type->isVariadic()) {
+ const unsigned first_vararg_index = callee_type->getNumParams();
+ for (unsigned i = first_vararg_index; i < num_args; i++) {
+ // We only care about reporting for references, but it's ok if
+ // we catch a few non-ref types too (it's just redundant).
+ // All expressions that are references will have their
+ // valuekind be an LValue, so we use that as the test.
+ if (args[i]->getValueKind() == clang::VK_LValue) {
+ // The types of expressions 'see through' the reference to
+ // the underlying type, which is exactly what we want here.
+ ReportTypeUse(CurrentLoc(), GetTypeOf(args[i]));
+ }
+ }
+ }
+ }
+ void ReportIfReferenceVararg(const Expr* const* args, unsigned num_args,
+ const FunctionDecl* callee) {
+ if (callee) {
+ const FunctionProtoType* callee_type =
+ DynCastFrom(callee->getType().getTypePtr());
+ CHECK_(callee_type &&
+ "The type of a FunctionDecl must be a FunctionProtoType.");
+ ReportIfReferenceVararg(args, num_args, callee_type);
+ }
+ }
+
+ // We only need visitors for CallExpr, ConstructExpr, and NewExpr
+ // (which also captures their subclasses). We can ignore DeleteExpr
+ // since destructors never have arguments. NewExpr we treat below,
+ // since it requires other checks as well.
+ bool VisitCallExpr(clang::CallExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ // Nothing to do if the called function is an old K&R-style function.
+ const FunctionType* fn_type = GetCalleeFunctionType(expr);
+ if (const FunctionProtoType* fn_proto = DynCastFrom(fn_type))
+ ReportIfReferenceVararg(expr->getArgs(), expr->getNumArgs(), fn_proto);
+ return true;
+ }
+
+ bool VisitCXXConstructExpr(clang::CXXConstructExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ ReportIfReferenceVararg(expr->getArgs(), expr->getNumArgs(),
+ expr->getConstructor());
+ return true;
+ }
+
+ // An OverloadExpr is an overloaded function (or method) in an
+ // uninstantiated template, that can't be resolved until the
+ // template is instantiated. The simplest case is something like:
+ // void Foo(int) { ... }
+ // void Foo(float) { ... }
+ // template<typename T> Fn(T t) { Foo(t); }
+ // But by far the most common case is when the function-to-be-called
+ // is also a templated function:
+ // template<typename T> Fn1(T t) { ... }
+ // template<typename T> Fn2(T t) { Fn1(t); }
+ // In either case, we look at all the potential overloads. If they
+ // all exist in the same file -- which is pretty much always the
+ // case, especially with a template calling a template -- we can do
+ // an iwyu warning now, even without knowing the exact overload.
+ // In that case, we store the fact we warned, so we won't warn again
+ // when the template is instantiated.
+ // TODO(csilvers): to be really correct, we should report *every*
+ // overload that callers couldn't match via ADL.
+ bool VisitOverloadExpr(clang::OverloadExpr* expr) {
+ // No CanIgnoreCurrentASTNode() check here! It's later in the function.
+
+ // Make sure all overloads are in the same file.
+ if (expr->decls_begin() == expr->decls_end()) // not sure this is possible
+ return true;
+ const NamedDecl* first_decl = *expr->decls_begin();
+ const FileEntry* first_decl_file_entry = GetFileEntry(first_decl);
+ for (OverloadExpr::decls_iterator it = expr->decls_begin();
+ it != expr->decls_end(); ++it) {
+ if (GetFileEntry(*it) != first_decl_file_entry)
+ return true;
+ }
+
+ // For now, we're only worried about function calls.
+ // TODO(csilvers): are there other kinds of overloads we need to check?
+ const FunctionDecl* arbitrary_fn_decl = nullptr;
+ for (OverloadExpr::decls_iterator it = expr->decls_begin();
+ it != expr->decls_end(); ++it) {
+ const NamedDecl* decl = *it;
+ // Sometimes a UsingShadowDecl comes between us and the 'real' decl.
+ if (const UsingShadowDecl* using_shadow_decl = DynCastFrom(decl))
+ decl = using_shadow_decl->getTargetDecl();
+ if (const FunctionDecl* fn_decl = DynCastFrom(decl)) {
+ arbitrary_fn_decl = fn_decl;
+ break;
+ } else if (const FunctionTemplateDecl* tpl_decl = DynCastFrom(decl)) {
+ arbitrary_fn_decl = tpl_decl->getTemplatedDecl();
+ break;
+ }
+ }
+
+ // If we're an overloaded operator, we can never do the iwyu check
+ // before instantiation-time, because we don't know if we might
+ // end up being the built-in form of the operator. (Even if the
+ // only operator==() we see is in foo.h, we don't need to #include
+ // foo.h if the only call to operator== we see is on two integers.)
+ if (arbitrary_fn_decl && !arbitrary_fn_decl->isOverloadedOperator()) {
+ AddProcessedOverloadLoc(CurrentLoc());
+ VERRS(7) << "Adding to processed_overload_locs: "
+ << PrintableCurrentLoc() << "\n";
+ // Because processed_overload_locs might be set in one visitor
+ // but used in another, each with a different definition of
+ // CanIgnoreCurrentASTNode(), we have to be conservative and set
+ // the has-considered flag always. But of course we only
+ // actually report the function use if CanIgnoreCurrentASTNode()
+ // is *currently* false.
+ if (!CanIgnoreCurrentASTNode())
+ ReportDeclUse(CurrentLoc(), arbitrary_fn_decl);
+ }
+ return true;
+ }
+
+ // TODO(csilvers): handle some special cases when we're a
+ // CXXDependentScopeMemberExpr (e.g. vector<T>::resize().). If the
+ // base class is a TemplateSpecializationType, get its TemplateDecl
+ // and if all explicit specializations and patterns are defined in
+ // the same file, treat it as an expr with only one decl. May have
+ // trouble with methods defined in a different file than they're
+ // declared.
+
+ // If getOperatorNew() returns nullptr, it means the operator-new is
+ // overloaded, and technically we can't know which operator-new is
+ // being called until the template is instantiated. But if it looks
+ // like a placement-new, we handle it at template-writing time
+ // anyway.
+ bool VisitCXXNewExpr(clang::CXXNewExpr* expr) {
+ // Like in VisitOverloadExpr(), we update processed_overload_locs
+ // regardless of the value of CanIgnoreCurrentASTNode().
+
+ // We say it's placement-new if the (lone) placment-arg is a
+ // pointer. Unfortunately, often clang will just say it's a
+ // dependent type. In that case, we can still say it's a pointer
+ // in the (common) case the placement arg looks like '&something'.
+ // (This is possibly wrong for classes that override operator&, but
+ // those classes deserve what they get.)
+ if (!expr->getOperatorNew() &&
+ expr->getNumPlacementArgs() == 1 &&
+ (GetTypeOf(expr->getPlacementArg(0))->isPointerType() ||
+ GetTypeOf(expr->getPlacementArg(0))->isArrayType() ||
+ IsAddressOf(expr->getPlacementArg(0)))) {
+ // Treat this like an OverloadExpr.
+ AddProcessedOverloadLoc(CurrentLoc());
+ VERRS(7) << "Adding to processed_overload_locs (placement-new): "
+ << PrintableCurrentLoc() << "\n";
+ if (!CanIgnoreCurrentASTNode()) {
+ // We have to 'make up' a full file path for 'new'. We'll
+ // parse it to '<new>' before using, so any path that does
+ // that, and is clearly a c++ path, is fine; its exact
+ // contents don't matter that much.
+ const FileEntry* use_file = CurrentFileEntry();
+ preprocessor_info().FileInfoFor(use_file)->ReportFullSymbolUse(
+ CurrentLoc(), "<new>", "operator new");
+ }
+ }
+
+ // We also need to do a varargs check, like for other function calls.
+ if (CanIgnoreCurrentASTNode()) return true;
+ // ... only if this NewExpr involves a constructor call.
+ const Expr* initializer = expr->getInitializer();
+ if (const CXXConstructExpr* cce =
+ dyn_cast_or_null<CXXConstructExpr>(initializer)) {
+ ReportIfReferenceVararg(cce->getArgs(),
+ cce->getNumArgs(),
+ cce->getConstructor());
+ }
+ return true;
+ }
+
+ // When we call (or potentially call) a function, do an IWYU check
+ // via ReportDeclUse() to make sure the definition of the function
+ // is properly #included.
+ bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type,
+ const clang::Expr* calling_expr) {
+ if (!Base::HandleFunctionCall(callee, parent_type, calling_expr))
+ return false;
+ if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee))
+ return true;
+ // We may have already been checked in a previous
+ // VisitOverloadExpr() call. Don't check again in that case.
+ if (IsProcessedOverloadLoc(CurrentLoc()))
+ return true;
+
+ ReportDeclUse(CurrentLoc(), callee);
+
+ // Usually the function-author is responsible for providing the
+ // full type information for the return type of the function, but
+ // in cases where it's not, we have to take responsibility.
+ // TODO(csilvers): check the fn argument types as well.
+ const Type* return_type = callee->getReturnType().getTypePtr();
+ if (ContainsKey(GetCallerResponsibleTypesForFnReturn(callee),
+ return_type)) {
+ ReportTypeUse(CurrentLoc(), return_type);
+ }
+
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // Visitors of types derived from clang::Type.
+
+ bool VisitType(clang::Type* type) {
+ // In VisitFunctionDecl(), we say all children of function
+ // declarations are forward-declarable. This is true, *except*
+ // for the exception (throw) types. We clean that up here.
+ // TODO(csilvers): figure out how to do these two steps in one place.
+ const FunctionProtoType* fn_type = nullptr;
+ if (!fn_type) {
+ fn_type = current_ast_node()->template GetParentAs<FunctionProtoType>();
+ }
+ if (!fn_type) {
+ if (const FunctionDecl* fn_decl
+ = current_ast_node()->template GetParentAs<FunctionDecl>())
+ fn_type = dyn_cast<FunctionProtoType>(GetTypeOf(fn_decl));
+ }
+ if (fn_type) {
+ for (FunctionProtoType::exception_iterator it =
+ fn_type->exception_begin();
+ it != fn_type->exception_end(); ++it)
+ if (it->getTypePtr() == type) { // *we're* an exception decl
+ current_ast_node()->set_in_forward_declare_context(false);
+ break;
+ }
+ }
+
+ return Base::VisitType(type);
+ }
+
+ bool VisitTemplateSpecializationType(
+ clang::TemplateSpecializationType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (CanIgnoreType(type)) return true;
+
+ const NamedDecl* decl = TypeToDeclAsWritten(type);
+
+ // If we are forward-declarable, so are our template arguments.
+ if (CanForwardDeclareType(current_ast_node())) {
+ ReportDeclForwardDeclareUse(CurrentLoc(), decl);
+ current_ast_node()->set_in_forward_declare_context(true);
+ } else {
+ ReportDeclUse(CurrentLoc(), decl);
+ }
+
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // Visitors defined by BaseAstVisitor.
+
+ bool VisitNestedNameSpecifier(NestedNameSpecifier* nns) {
+ if (!Base::VisitNestedNameSpecifier(nns)) return false;
+ // If we're in an nns (e.g. the Foo in Foo::bar), we're never
+ // forward-declarable, even if we're part of a pointer type, or in
+ // a template argument, or whatever.
+ ASTNode* ast_node = current_ast_node();
+ ast_node->set_in_forward_declare_context(false);
+
+ // For method calls it doesn't matter if a method is defined inside
+ // a class or outside of it. We detect out-of-class method calls with
+ // the pattern
+ //
+ // CallExpr
+ // `-CXXMethodDecl
+ // `-NestedNameSpecifier
+ //
+ // and skip traversing method qualifier as in-class methods don't have it.
+ if (const CXXMethodDecl* parent = ast_node->GetParentAs<CXXMethodDecl>()) {
+ if ((nns == parent->getQualifier()) &&
+ ast_node->AncestorIsA<CallExpr>(2)) {
+ VERRS(7) << "Skipping traversal of CXXMethodDecl qualifier "
+ << PrintableNestedNameSpecifier(nns) << "\n";
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Template arguments are forward-declarable by default. However,
+ // default template template args shouldn't be: we're responsible for
+ // the full type info for default args. So no forward-declaring
+ // MyClass in 'template<template<typename A> class T = MyClass> C ...'
+ // We detect because MyClass's parent is TemplateTemplateParmDecl.
+ // TODO(csilvers): And not when they're a type that's in
+ // known_fully_used_tpl_type_args_. See if that solves the problem with
+ // I1_TemplateClass<std::vector<I1_Class>> i1_nested_templateclass(...)
+ void DetermineForwardDeclareStatusForTemplateArg(ASTNode* ast_node) {
+ CHECK_(ast_node->IsA<TemplateArgument>() &&
+ "Should only pass in a template arg to DFDSFTA");
+
+ if (!IsDefaultTemplateTemplateArg(ast_node)) {
+ ast_node->set_in_forward_declare_context(true);
+ return;
+ }
+ }
+
+ bool VisitTemplateArgument(const TemplateArgument& arg) {
+ if (!Base::VisitTemplateArgument(arg)) return false;
+ // Template arguments are forward-declarable...usually.
+ DetermineForwardDeclareStatusForTemplateArg(current_ast_node());
+ return true;
+ }
+
+ bool VisitTemplateArgumentLoc(const TemplateArgumentLoc& argloc) {
+ if (!Base::VisitTemplateArgumentLoc(argloc)) return false;
+ // Template arguments are forward-declarable...usually.
+ DetermineForwardDeclareStatusForTemplateArg(current_ast_node());
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // Helper routines for visiting and traversing. These helpers
+ // encode the logic of whether a particular type of object
+ // can be forward-declared or not.
+
+ // TODO(csilvers): get rid of in_forward_declare_context() and make
+ // this the canonical place to figure out if we can forward-declare.
+ bool CanForwardDeclareType(const ASTNode* ast_node) const {
+ CHECK_(ast_node->IsA<Type>());
+ // Cannot forward-declare an enum even if it's in a forward-declare context.
+ // TODO(vsapsai): make enums forward-declarable in C++11.
+ if (ast_node->IsA<EnumType>())
+ return false;
+ // If we're in a forward-declare context, well then, there you have it.
+ if (ast_node->in_forward_declare_context())
+ return true;
+ // If we're in a typedef, we don't want to forward-declare even if
+ // we're a pointer. ('typedef Foo* Bar; Bar x; x->a' needs full
+ // type of Foo.)
+ if (ast_node->ParentIsA<TypedefDecl>())
+ return false;
+
+ // If we ourselves are a forward-decl -- that is, we're the type
+ // component of a forward-declaration (which would be our parent
+ // AST node) -- then we're forward-declarable by definition.
+ if (const TagDecl* parent
+ = current_ast_node()->template GetParentAs<TagDecl>()) {
+ if (IsForwardDecl(parent))
+ return true;
+ }
+
+ // Another place we disregard what the language allows: if we're
+ // a dependent type, in theory we can be forward-declared. But
+ // we require the full definition anyway, so all the template
+ // callers don't have to provide it instead. Thus we don't
+ // run the following commented-out code (left here for reference):
+ //if (ast_node->GetAs<TemplateSpecializationType>()->isDependentType())
+ // return false;
+
+ // Read past elaborations like 'class' keyword or namespaces.
+ while (ast_node->ParentIsA<ElaboratedType>()) {
+ ast_node = ast_node->parent();
+ }
+
+ // Now there are two options: either we have a type or we have a declaration
+ // involving a type.
+ const Type* parent_type = ast_node->GetParentAs<Type>();
+ if (parent_type == nullptr) {
+ // Since it's not a type, it must be a decl.
+ // Our target here is record members, all of which derive from ValueDecl.
+ if (const ValueDecl *decl = ast_node->GetParentAs<ValueDecl>()) {
+ // We can shortcircuit static data member declarations immediately,
+ // they can always be forward-declared.
+ if (const VarDecl *var_decl = DynCastFrom(decl)) {
+ if (!var_decl->isThisDeclarationADefinition() &&
+ var_decl->isStaticDataMember()) {
+ return true;
+ }
+ }
+
+ parent_type = GetTypeOf(decl);
+ }
+ }
+
+ // TODO(csilvers): should probably just be IsPointerOrReference
+ return parent_type && IsPointerOrReferenceAsWritten(parent_type);
+ }
+
+ protected:
+ const IwyuPreprocessorInfo& preprocessor_info() const {
+ return visitor_state_->preprocessor_info;
+ }
+
+ void AddShadowDeclarations(const UsingDecl* using_decl) {
+ for (const UsingShadowDecl* shadow : using_decl->shadows()) {
+ visitor_state_->using_declarations.insert(
+ make_pair(shadow->getTargetDecl(), shadow->getUsingDecl()));
+ }
+ }
+
+ private:
+ template <typename T> friend class IwyuBaseAstVisitor;
+
+ bool IsProcessedOverloadLoc(SourceLocation loc) const {
+ return ContainsKey(visitor_state_->processed_overload_locs, loc);
+ }
+
+ void AddProcessedOverloadLoc(SourceLocation loc) {
+ visitor_state_->processed_overload_locs.insert(loc);
+ }
+
+ const UsingDecl* GetUsingDeclarationOf(const NamedDecl* decl,
+ const DeclContext* use_context) {
+ // First, if we have a UsingShadowDecl, then we don't need to do anything
+ // because we can just directly return the using decl from that.
+ if (const UsingShadowDecl* shadow = DynCastFrom(decl))
+ return shadow->getUsingDecl();
+
+ // But, if we don't have a UsingShadowDecl, then we need to look through
+ // all the using-decls of the given decl. We limit them to ones that are
+ // visible from the decl-context we're currently in (that is, what
+ // namespaces we're in), via the check through 'Encloses'. Of those, we
+ // pick the one that's in the same file as decl, if possible, otherwise we
+ // pick one arbitrarily.
+ const UsingDecl* retval = nullptr;
+ vector<const UsingDecl*> using_decls
+ = FindInMultiMap(visitor_state_->using_declarations, decl);
+ for (const UsingDecl* using_decl : using_decls) {
+ if (!using_decl->getDeclContext()->Encloses(use_context))
+ continue;
+ if (GetFileEntry(decl) == GetFileEntry(using_decl) || // prefer same file
+ retval == nullptr) { // not in same file, but better than nothing
+ retval = using_decl;
+ }
+ }
+ return retval;
+ }
+
+ // Do not add any variables here! If you do, they will not be shared
+ // between the normal iwyu ast visitor and the
+ // template-instantiation visitor, which is almost always a mistake.
+ // Instead, add them to the VisitorState struct, above.
+ VisitorState* const visitor_state_;
+};
+
+// ----------------------------------------------------------------------
+// --- InstantiatedTemplateVisitor
+// ----------------------------------------------------------------------
+//
+// This class is used to find all template-specified types used in an
+// instantiated template class, function, or method -- or rather, all
+// such types that are used in a way that can't be forward-declared.
+// That is, for
+// template<class T, class U> int Myfunc() { T* t; U u; Thirdclass z; }
+// if we saw an instantiation such as myfunc<Foo, Bar>, we would pass
+// that instantiation to this traversal class, and it would report
+// that Bar is used in a non-forward-declarable way. (It would not
+// report Foo, which is used only in a forward-declarable way, and
+// would not report Thirdclass, which is not a type specified in a
+// template.)
+//
+// This class has two main entry points: one for instantiated
+// template functions and methods (including static methods,
+// constructor calls, and operator overloads), and one for
+// instantiated template classes.
+//
+// In each case, it is given the appropriate node from the AST that
+// captures the instantiation (a TemplateSpecializationType or
+// CallExpr), and returns a set of Type* nodes of types that are used
+// in a non-forward-declarable way. Note it's safe to call this even
+// on non-templatized functions and classes; we'll just always return
+// the empty set in that case.
+//
+// The traversal of the AST is done via RecursiveASTVisitor, which uses
+// CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)
+// TODO(csilvers): move this to its own file?
+
+class InstantiatedTemplateVisitor
+ : public IwyuBaseAstVisitor<InstantiatedTemplateVisitor> {
+ public:
+ typedef IwyuBaseAstVisitor<InstantiatedTemplateVisitor> Base;
+
+ InstantiatedTemplateVisitor(VisitorState* visitor_state)
+ : Base(visitor_state) {
+ Clear();
+ }
+
+ //------------------------------------------------------------
+ // Public entry points
+
+ // ScanInstantiatedFunction() looks through the template definition of
+ // the given function as well as the definitions of all functions
+ // called from it (directly or indirectly) and records all template
+ // type arguments fully used by them and all methods used by them.
+ // The "fully used type arguments" are a subset of
+ // tpl_type_args_of_interest, which are the types we care about, and
+ // usually explicitly written at the call site.
+ //
+ // ScanInstantiatedType() is similar, except that it looks through
+ // the definition of a class template instead of a statement.
+
+ // resugar_map is a map from an unsugared (canonicalized) template
+ // type to the template type as written (or as close as we can find
+ // to it). If a type is not in resugar-map, it might be due to a
+ // recursive template call and encode a template type we don't care
+ // about ourselves. If it's in the resugar_map but with a nullptr
+ // value, it's a default template parameter, that the
+ // template-caller may or may not be responsible for.
+ void ScanInstantiatedFunction(
+ const FunctionDecl* fn_decl, const Type* parent_type,
+ const ASTNode* caller_ast_node,
+ const map<const Type*, const Type*>& resugar_map) {
+ Clear();
+ caller_ast_node_ = caller_ast_node;
+ resugar_map_ = resugar_map;
+
+ // Make sure that the caller didn't already put the decl on the ast-stack.
+ CHECK_(caller_ast_node->GetAs<Decl>() != fn_decl && "AST node already set");
+ // caller_ast_node requires a non-const ASTNode, but our node is
+ // const. This cast is safe because we don't do anything with this
+ // node (instead, we immediately push a new node on top of it).
+ set_current_ast_node(const_cast<ASTNode*>(caller_ast_node));
+
+ TraverseExpandedTemplateFunctionHelper(fn_decl, parent_type);
+ }
+
+ // This isn't a Stmt, but sometimes we need to fully instantiate
+ // a template class to get at a field of it, for instance:
+ // MyClass<T>::size_type s;
+ void ScanInstantiatedType(
+ const Type* type, const ASTNode* caller_ast_node,
+ const map<const Type*, const Type*>& resugar_map) {
+ Clear();
+ caller_ast_node_ = caller_ast_node;
+ resugar_map_ = resugar_map;
+
+ // Make sure that the caller didn't already put the type on the ast-stack.
+ CHECK_(caller_ast_node->GetAs<Type>() != type && "AST node already set");
+ // caller_ast_node requires a non-const ASTNode, but our node is
+ // const. This cast is safe because we don't do anything with this
+ // node (instead, we immediately push a new node on top of it).
+ set_current_ast_node(const_cast<ASTNode*>(caller_ast_node));
+
+ // As in TraverseExpandedTemplateFunctionHelper, we ignore all AST nodes
+ // that will be reported when we traverse the uninstantiated type.
+ if (const NamedDecl* type_decl_as_written = TypeToDeclAsWritten(type)) {
+ AstFlattenerVisitor nodeset_getter(compiler());
+ nodes_to_ignore_ = nodeset_getter.GetNodesBelow(
+ const_cast<NamedDecl*>(type_decl_as_written));
+ }
+
+ TraverseType(QualType(type, 0));
+ }
+
+ //------------------------------------------------------------
+ // Implements virtual methods from Base.
+
+ // When checking a template instantiation, we don't care where the
+ // template definition is, so we never have any reason to ignore a
+ // node.
+ bool CanIgnoreCurrentASTNode() const override {
+ // TODO(csilvers): call CanIgnoreType() if we're a type.
+ return nodes_to_ignore_.Contains(*current_ast_node());
+ }
+
+ // For template instantiations, we want to print the symbol even if
+ // it's not from the main compilation unit.
+ bool ShouldPrintSymbolFromCurrentFile() const override {
+ return GlobalFlags().verbose >= 5;
+ }
+
+ string GetSymbolAnnotation() const override { return " in tpl"; }
+
+ // We only care about types that would have been dependent in the
+ // uninstantiated template: that is, SubstTemplateTypeParmType types
+ // or types derived from them. We use nodes_to_ignore_ to select
+ // down to those. Even amongst subst-type, we only want ones in the
+ // resugar-map: the rest we have chosen to ignore for some reason.
+ bool CanIgnoreType(const Type* type) const override {
+ if (nodes_to_ignore_.Contains(type))
+ return true;
+
+ // If we're a default template argument, we should ignore the type
+ // if the template author intend-to-provide it, but otherwise we
+ // should not ignore it -- the caller is responsible for the type.
+ // This captures cases like hash_set<Foo>, where the caller is
+ // responsible for defining hash<Foo>.
+ // SomeInstantiatedTemplateIntendsToProvide handles the case we
+ // have a templated class that #includes "foo.h" and has a
+ // scoped_ptr<Foo>: we say the templated class provides Foo, even
+ // though it's scoped_ptr.h that's actually trying to call
+ // Foo::Foo and ::~Foo.
+ // TODO(csilvers): this isn't ideal: ideally we'd want
+ // 'TheInstantiatedTemplateForWhichTypeWasADefaultTemplateArgumentIntendsToProvide',
+ // but clang doesn't store that information.
+ if (IsDefaultTemplateParameter(type))
+ return SomeInstantiatedTemplateIntendsToProvide(type);
+
+ // If we're not in the resugar-map at all, we're not a type
+ // corresponding to the template being instantiated, so we
+ // can be ignored.
+ type = RemoveSubstTemplateTypeParm(type);
+ return !ContainsKey(resugar_map_, type);
+ }
+
+ // We ignore function calls in nodes_to_ignore_, which were already
+ // handled by the template-as-written, and function names that we
+ // are not responsible for because the template code is (for
+ // instance, we're not responsible for a vector's call to
+ // allocator::allocator(), because <vector> provides it for us).
+ bool CanIgnoreDecl(const Decl* decl) const override {
+ return nodes_to_ignore_.Contains(decl);
+ }
+
+ // We always attribute type uses to the template instantiator. For
+ // decls, we do unless it looks like the template "intends to
+ // provide" the decl, by #including the file that defines the decl
+ // (if templates call other templates, we have to find the right
+ // template).
+ void ReportDeclUseWithComment(SourceLocation used_loc, const NamedDecl* decl,
+ const char* comment) override {
+ const SourceLocation actual_used_loc = GetLocOfTemplateThatProvides(decl);
+ if (actual_used_loc.isValid()) {
+ // If a template is responsible for this decl, then we don't add
+ // it to the cache; the cache is only for decls that the
+ // original caller is responsible for.
+ Base::ReportDeclUseWithComment(actual_used_loc, decl, comment);
+ } else {
+ // Let all the currently active types and decls know about this
+ // report, so they can update their cache entries.
+ for (CacheStoringScope* storer : cache_storers_)
+ storer->NoteReportedDecl(decl);
+ Base::ReportDeclUseWithComment(caller_loc(), decl, comment);
+ }
+ }
+
+ void ReportTypeUseWithComment(SourceLocation used_loc, const Type* type,
+ const char* comment) override {
+ // clang desugars template types, so Foo<MyTypedef>() gets turned
+ // into Foo<UnderlyingType>(). Try to convert back.
+ type = ResugarType(type);
+ for (CacheStoringScope* storer : cache_storers_)
+ storer->NoteReportedType(type);
+ Base::ReportTypeUseWithComment(caller_loc(), type, comment);
+ }
+
+ //------------------------------------------------------------
+ // Overridden traverse-style methods from Base.
+
+ // The 'convenience' HandleFunctionCall is perfect for us!
+ bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type,
+ const clang::Expr* calling_expr) {
+ if (const Type* resugared_type = ResugarType(parent_type))
+ parent_type = resugared_type;
+ if (!Base::HandleFunctionCall(callee, parent_type, calling_expr))
+ return false;
+ if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee))
+ return true;
+ return TraverseExpandedTemplateFunctionHelper(callee, parent_type);
+ }
+
+ bool TraverseUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) {
+ if (!Base::TraverseUnaryExprOrTypeTraitExpr(expr)) return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+ const Type* arg_type = expr->getTypeOfArgument().getTypePtr();
+ // Calling sizeof on a reference-to-X is the same as calling it on X.
+ if (const ReferenceType* reftype = DynCastFrom(arg_type)) {
+ arg_type = reftype->getPointeeTypeAsWritten().getTypePtr();
+ }
+ if (const TemplateSpecializationType* type = DynCastFrom(arg_type)) {
+ // Even though sizeof(MyClass<T>) only requires knowing how much
+ // storage MyClass<T> takes, the language seems to require that
+ // MyClass<T> be fully instantiated, even typedefs. (Try
+ // compiling 'template<class T> struct C { typedef typename T::a t; };
+ // class S; int main() { return sizeof(C<S>); }'.)
+ return TraverseDataAndTypeMembersOfClassHelper(type);
+ }
+ return true;
+ }
+
+ bool TraverseTemplateSpecializationTypeHelper(
+ const clang::TemplateSpecializationType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (CanForwardDeclareType(current_ast_node()))
+ current_ast_node()->set_in_forward_declare_context(true);
+ return TraverseDataAndTypeMembersOfClassHelper(type);
+ }
+
+ bool TraverseTemplateSpecializationType(
+ clang::TemplateSpecializationType* type) {
+ if (!Base::TraverseTemplateSpecializationType(type)) return false;
+ return TraverseTemplateSpecializationTypeHelper(type);
+ }
+
+ bool TraverseTemplateSpecializationTypeLoc(
+ clang::TemplateSpecializationTypeLoc typeloc) {
+ if (!Base::TraverseTemplateSpecializationTypeLoc(typeloc)) return false;
+ return TraverseTemplateSpecializationTypeHelper(typeloc.getTypePtr());
+ }
+
+ bool TraverseSubstTemplateTypeParmTypeHelper(
+ const clang::SubstTemplateTypeParmType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (CanIgnoreType(type)) return true;
+ const Type* actual_type = ResugarType(type);
+ CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able");
+ return TraverseType(QualType(actual_type, 0));
+ }
+
+ // When we see a template argument used inside an instantiated
+ // template, we want to explore the type recursively. For instance
+ // if we see Inner<Outer<Foo>>(), we want to recurse onto Foo.
+ bool TraverseSubstTemplateTypeParmType(
+ clang::SubstTemplateTypeParmType* type) {
+ if (!Base::TraverseSubstTemplateTypeParmType(type))
+ return false;
+ return TraverseSubstTemplateTypeParmTypeHelper(type);
+ }
+
+ bool TraverseSubstTemplateTypeParmTypeLoc(
+ clang::SubstTemplateTypeParmTypeLoc typeloc) {
+ if (!Base::TraverseSubstTemplateTypeParmTypeLoc(typeloc))
+ return false;
+ return TraverseSubstTemplateTypeParmTypeHelper(typeloc.getTypePtr());
+ }
+
+ // These do the actual work of finding the types to return. Our
+ // task is made easier since (at least in theory), every time we
+ // instantiate a template type, the instantiation has type
+ // SubstTemplateTypeParmTypeLoc in the AST tree.
+ bool VisitSubstTemplateTypeParmType(clang::SubstTemplateTypeParmType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (CanIgnoreType(type)) return true;
+
+ // Figure out how this type was actually written. clang always
+ // canonicalizes SubstTemplateTypeParmType, losing typedef info, etc.
+ const Type* actual_type = ResugarType(type);
+ CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able");
+
+ // TODO(csilvers): whenever we report a type use here, we want to
+ // do an iwyu check on this type (to see if sub-types are used).
+
+ // If we're a nested-name-specifier class (the Foo in Foo::bar),
+ // we need our full type info no matter what the context (even if
+ // we're a pointer, or a template arg, or whatever).
+ // TODO(csilvers): consider encoding this logic via
+ // in_forward_declare_context. I think this will require changing
+ // in_forward_declare_context to yes/no/maybe.
+ if (current_ast_node()->ParentIsA<NestedNameSpecifier>()) {
+ ReportTypeUse(CurrentLoc(), actual_type);
+ return Base::VisitSubstTemplateTypeParmType(type);
+ }
+
+ // If we're inside a typedef, we don't need our full type info --
+ // in this case we follow what the C++ language allows and let
+ // the underlying type of a typedef be forward-declared. This has
+ // the effect that code like:
+ // class MyClass;
+ // template<class T> struct Foo { typedef T value_type; ... }
+ // Foo<MyClass> f;
+ // does not make us require the full type of MyClass. The idea
+ // is that using Foo<MyClass>::value_type already requires the
+ // type for MyClass, so it doesn't make sense for the typedef
+ // to require it as well. TODO(csilvers): this doesn't really
+ // make any sense. Who figures out we need the full type if
+ // you do 'Foo<MyClass>::value_type m;'?
+ for (const ASTNode* ast_node = current_ast_node();
+ ast_node != caller_ast_node_; ast_node = ast_node->parent()) {
+ if (ast_node->IsA<TypedefNameDecl>())
+ return Base::VisitSubstTemplateTypeParmType(type);
+ }
+
+ // sizeof(a reference type) is the same as sizeof(underlying type).
+ // We have to handle that specially here, or else we'll say the
+ // reference is forward-declarable, below.
+ if (current_ast_node()->ParentIsA<UnaryExprOrTypeTraitExpr>() &&
+ isa<ReferenceType>(actual_type)) {
+ const ReferenceType* actual_reftype = cast<ReferenceType>(actual_type);
+ ReportTypeUse(CurrentLoc(),
+ actual_reftype->getPointeeTypeAsWritten().getTypePtr());
+ return Base::VisitSubstTemplateTypeParmType(type);
+ }
+
+ // If we're used in a forward-declare context (MyFunc<T>() { T* t; }),
+ // or are ourselves a pointer type (MyFunc<Myclass*>()),
+ // we don't need to do anything: we're fine being forward-declared.
+ if (current_ast_node()->in_forward_declare_context())
+ return Base::VisitSubstTemplateTypeParmType(type);
+
+ if (current_ast_node()->ParentIsA<PointerType>() ||
+ current_ast_node()->ParentIsA<LValueReferenceType>() ||
+ IsPointerOrReferenceAsWritten(actual_type))
+ return Base::VisitSubstTemplateTypeParmType(type);
+
+ // We attribute all uses in an instantiated template to the
+ // template's caller.
+ ReportTypeUse(caller_loc(), actual_type);
+ return Base::VisitSubstTemplateTypeParmType(type);
+ }
+
+ // If constructing an object, check the type we're constructing.
+ // Normally we'd see that type later, when traversing the return
+ // type of the constructor-decl, but if we wait for that, we'll lose
+ // any SubstTemplateTypeParmType's we have (we lose all
+ // SubstTemplateTypeParmType's going from Expr to Decl).
+ // TODO(csilvers): This should maybe move to HandleFunctionCall.
+ bool VisitCXXConstructExpr(clang::CXXConstructExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ const Type* class_type = GetTypeOf(expr);
+ if (CanIgnoreType(class_type)) return true;
+
+ // If the ctor type is a SubstTemplateTypeParmType, get the type-as-written.
+ const Type* actual_type = ResugarType(class_type);
+ CHECK_(actual_type && "If !CanIgnoreType(), we should be resugar-able");
+ ReportTypeUse(caller_loc(), actual_type);
+ return Base::VisitCXXConstructExpr(expr);
+ }
+
+ private:
+ // Clears the state of the visitor.
+ void Clear() {
+ caller_ast_node_ = nullptr;
+ resugar_map_.clear();
+ traversed_decls_.clear();
+ nodes_to_ignore_.clear();
+ cache_storers_.clear();
+ }
+
+ // If we see the instantiated template using a type or decl (such as
+ // std::allocator), we want to know if the author of the template is
+ // providing the type or decl, so the code using the instantiated
+ // template doesn't have to. For instance:
+ // vector<int, /*allocator<int>*/> v; // in foo.cc
+ // Does <vector> provide the definition of allocator<int>? If not,
+ // foo.cc will have to #include <allocator>.
+ // We say the template-as-written does provide the decl if it, or
+ // any other header seen since we started instantiating the
+ // template, sees it. The latter requirement is to deal with a
+ // situation like this: we have a templated class that #includes
+ // "foo.h" and has a scoped_ptr<Foo>; we say the templated class
+ // provides Foo, even though it's scoped_ptr.h that's actually
+ // trying to call Foo::Foo and Foo::~Foo.
+ SourceLocation GetLocOfTemplateThatProvides(const NamedDecl* decl) const {
+ if (!decl)
+ return SourceLocation(); // an invalid source-loc
+ for (const ASTNode* ast_node = current_ast_node();
+ ast_node != caller_ast_node_; ast_node = ast_node->parent()) {
+ if (preprocessor_info().PublicHeaderIntendsToProvide(
+ GetFileEntry(ast_node->GetLocation()),
+ GetFileEntry(decl)))
+ return ast_node->GetLocation();
+ }
+ return SourceLocation(); // an invalid source-loc
+ }
+
+ bool SomeInstantiatedTemplateIntendsToProvide(const NamedDecl* decl) const {
+ return GetLocOfTemplateThatProvides(decl).isValid();
+ }
+ bool SomeInstantiatedTemplateIntendsToProvide(const Type* type) const {
+ type = RemoveSubstTemplateTypeParm(type);
+ type = RemovePointersAndReferences(type); // get down to the decl
+ if (const NamedDecl* decl = TypeToDeclAsWritten(type))
+ return GetLocOfTemplateThatProvides(decl).isValid();
+ return true; // we always provide non-decl types like int, etc.
+ }
+
+ // For a SubstTemplateTypeParmType, says whether it corresponds to a
+ // default template parameter (one not explicitly specified when the
+ // class was instantiated) or not. We store this in resugar_map by
+ // having the value be nullptr.
+ bool IsDefaultTemplateParameter(const Type* type) const {
+ type = RemoveSubstTemplateTypeParm(type);
+ return ContainsKeyValue(resugar_map_, type, static_cast<Type*>(nullptr));
+ }
+
+ // clang desugars template types, so Foo<MyTypedef>() gets turned
+ // into Foo<UnderlyingType>(). We can 'resugar' using resugar_map_.
+ // If we're not in the resugar-map, then we weren't canonicalized,
+ // so we can just use the input type unchanged.
+ const Type* ResugarType(const Type* type) const {
+ type = RemoveSubstTemplateTypeParm(type);
+ // If we're the resugar-map but with a value of nullptr, it means
+ // we're a default template arg, which means we don't have anything
+ // to resugar to. So just return the input type.
+ if (ContainsKeyValue(resugar_map_, type, static_cast<const Type*>(nullptr)))
+ return type;
+ return GetOrDefault(resugar_map_, type, type);
+ }
+
+ bool TraverseExpandedTemplateFunctionHelper(const FunctionDecl* fn_decl,
+ const Type* parent_type) {
+ if (!fn_decl || ContainsKey(traversed_decls_, fn_decl))
+ return true; // avoid recursion and repetition
+ traversed_decls_.insert(fn_decl);
+
+ // If we have cached the reporting done for this decl before,
+ // report again (but with the new caller_loc this time).
+ // Otherwise, for all reporting done in the rest of this scope,
+ // store in the cache for this function.
+ if (ReplayUsesFromCache(*FunctionCallsFullUseCache(),
+ fn_decl, caller_loc()))
+ return true;
+ // Make sure all the types we report in the recursive TraverseDecl
+ // calls, below, end up in the cache for fn_decl.
+ CacheStoringScope css(&cache_storers_, FunctionCallsFullUseCache(),
+ fn_decl, resugar_map_);
+
+ // We want to ignore all nodes that are the same in this
+ // instantiated function as they are in the uninstantiated version
+ // of the function. The latter will be reported when we traverse
+ // the uninstantiated function, so we don't need to re-traverse
+ // them here.
+ AstFlattenerVisitor nodeset_getter(compiler());
+ // This gets to the decl for the (uninstantiated) template-as-written:
+ const FunctionDecl* decl_as_written
+ = fn_decl->getTemplateInstantiationPattern();
+ if (!decl_as_written) {
+ if (fn_decl->isImplicit()) { // TIP not set up for implicit methods
+ // TODO(csilvers): handle implicit template methods
+ } else { // not a templated decl
+ decl_as_written = fn_decl;
+ }
+ }
+ if (decl_as_written) {
+ FunctionDecl* const daw = const_cast<FunctionDecl*>(decl_as_written);
+ nodes_to_ignore_.AddAll(nodeset_getter.GetNodesBelow(daw));
+ }
+
+ // We need to iterate over the function. We do so even if it's
+ // an implicit function.
+ if (fn_decl->isImplicit()) {
+ if (!TraverseImplicitDeclHelper(const_cast<FunctionDecl*>(fn_decl)))
+ return false;
+ } else {
+ if (!TraverseDecl(const_cast<FunctionDecl*>(fn_decl)))
+ return false;
+ }
+
+ // If we're a constructor, we also need to construct the entire class,
+ // even typedefs that aren't used at construct time. Try compiling
+ // template<class T> struct C { typedef typename T::a t; };
+ // class S; int main() { C<S> c; }
+ if (isa<CXXConstructorDecl>(fn_decl)) {
+ CHECK_(parent_type && "How can a constructor have no parent?");
+ parent_type = RemoveElaboration(parent_type);
+ if (!TraverseDataAndTypeMembersOfClassHelper(
+ dyn_cast<TemplateSpecializationType>(parent_type)))
+ return false;
+ }
+ return true;
+ }
+
+ // Does the actual recursing over data members and type members of
+ // the instantiated class. Unlike
+ // TraverseClassTemplateSpecializationDecl() in the base class, it
+ // does *not* traverse the methods.
+ bool TraverseDataAndTypeMembersOfClassHelper(
+ const TemplateSpecializationType* type) {
+ if (!type)
+ return true;
+
+ // No point in doing traversal if we're forward-declared
+ if (current_ast_node()->in_forward_declare_context())
+ return true;
+
+ while (type->isTypeAlias()) {
+ type = DynCastFrom(type->getAliasedType().getTypePtr());
+ if (!type)
+ return true;
+ }
+
+ // If we're a dependent type, we only try to be analyzed if we're
+ // in the precomputed list -- in general, the only thing clang
+ // tells us about dependent types is their name (which is all we
+ // need for the precomputed list!). This means iwyu will properly
+ // analyze the use of SomeClass in code like 'map<T, SomeClass>',
+ // but not in 'MyMap<T, SomeClass>', since we have precomputed
+ // information about the STL map<>, but not the user type MyMap.
+ // TODO(csilvers): do better here.
+ if (type->isDependentType()) {
+ // TODO(csilvers): This is currently always a noop; need to fix
+ // GetTplTypeResugarMapForClassNoComponentTypes to do something
+ // useful for dependent types.
+ ReplayClassMemberUsesFromPrecomputedList(type); // best-effort
+ return true;
+ }
+
+ const ClassTemplateSpecializationDecl* class_decl
+ = DynCastFrom(TypeToDeclAsWritten(type));
+ CHECK_(class_decl && "TemplateSpecializationType is not a TplSpecDecl?");
+ if (ContainsKey(traversed_decls_, class_decl))
+ return true; // avoid recursion & repetition
+ traversed_decls_.insert(class_decl);
+
+ // If we have cached the reporting done for this decl before,
+ // report again (but with the new caller_loc this time).
+ // Otherwise, for all reporting done in the rest of this scope,
+ // store in the cache for this function.
+ if (ReplayUsesFromCache(*ClassMembersFullUseCache(),
+ class_decl, caller_loc()))
+ return true;
+ if (ReplayClassMemberUsesFromPrecomputedList(type))
+ return true;
+
+ // Make sure all the types we report in the recursive TraverseDecl
+ // calls, below, end up in the cache for class_decl.
+ CacheStoringScope css(&cache_storers_, ClassMembersFullUseCache(),
+ class_decl, resugar_map_);
+
+ for (DeclContext::decl_iterator it = class_decl->decls_begin();
+ it != class_decl->decls_end(); ++it) {
+ if (isa<CXXMethodDecl>(*it) || isa<FunctionTemplateDecl>(*it))
+ continue;
+ if (!TraverseDecl(*it))
+ return false;
+ }
+
+ // Most methods on template classes are instantiated when they're
+ // called, and we don't need to deal with them here. But virtual
+ // methods are instantiated when the class's key method is
+ // instantiated, and since template classes rarely have a key
+ // method, it means they're instantiated whenever the class is
+ // instantiated. So we need to instantiate virtual methods here.
+ for (DeclContext::decl_iterator it = class_decl->decls_begin();
+ it != class_decl->decls_end(); ++it) {
+ if (const CXXMethodDecl* method_decl = DynCastFrom(*it)) {
+ if (method_decl->isVirtual()) {
+ if (!TraverseExpandedTemplateFunctionHelper(method_decl, type))
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // Cache methods. Caches hold the list of full uses found when we
+ // last instantiated a given decl, saving a lot of tree-walking if
+ // we have to do it again.
+
+ // Returns true if we replayed uses, false if key isn't in the cache.
+ bool ReplayUsesFromCache(const FullUseCache& cache, const NamedDecl* key,
+ SourceLocation use_loc) {
+ if (!cache.Contains(key, resugar_map_))
+ return false;
+ VERRS(6) << "(Replaying full-use information from the cache for "
+ << key->getQualifiedNameAsString() << ")\n";
+ ReportTypesUse(use_loc, cache.GetFullUseTypes(key, resugar_map_));
+ ReportDeclsUse(use_loc, cache.GetFullUseDecls(key, resugar_map_));
+ return true;
+ }
+
+ // We precompute (hard-code) results of calling
+ // TraverseDataAndTypeMembersOfClassHelper for some types (mostly
+ // STL types). This way we don't even need to traverse them once.
+ // Returns true iff we did appropriate reporting for this type.
+ bool ReplayClassMemberUsesFromPrecomputedList(
+ const TemplateSpecializationType* tpl_type) {
+ if (current_ast_node() && current_ast_node()->in_forward_declare_context())
+ return true; // never depend on any types if a fwd-decl
+
+ const NamedDecl* tpl_decl = TypeToDeclAsWritten(tpl_type);
+
+ // This says how the template-args are used by this hard-coded type
+ // (a set<>, or map<>, or ...), to avoid having to recurse into them.
+ const map<const Type*, const Type*>& resugar_map_for_precomputed_type =
+ FullUseCache::GetPrecomputedResugarMap(tpl_type);
+ // But we need to reconcile that with the types-of-interest, as
+ // stored in resugar_map_. To do this, we take only those entries
+ // from resugar_map_for_precomputed_type that are also present in
+ // resugar_map_. We consider type components, so if
+ // resugar_map_for_precomputed_type has less_than<Foo> or hash<Foo>,
+ // we'll add those in even if resugar_map_ only includes 'Foo'.
+ map<const Type*, const Type*> resugar_map;
+ for (const auto& item : resugar_map_for_precomputed_type) {
+ // TODO(csilvers): for default template args, item.first is sometimes
+ // a RecordType even when it's a template specialization. Figure out
+ // how to get the proper type components in that situation.
+ const set<const Type*> type_components = GetComponentsOfType(item.first);
+ if (ContainsAnyKey(resugar_map_, type_components)) {
+ resugar_map.insert(item);
+ }
+ }
+ if (resugar_map.empty())
+ return false;
+
+ VERRS(6) << "(Using pre-computed list of full-use information for "
+ << tpl_decl->getQualifiedNameAsString() << ")\n";
+ // For entries with a non-nullptr value, we report the value, which
+ // is the unsugared type, as being fully used. Entries with a
+ // nullptr value are default template args, and we only report them
+ // if the template class doesn't intend-to-provide them.
+ for (const auto& item : resugar_map) {
+ const Type* resugared_type = nullptr;
+ if (item.second) {
+ resugared_type = item.second;
+ } else {
+ const NamedDecl* resugared_decl = TypeToDeclAsWritten(item.first);
+ if (!preprocessor_info().PublicHeaderIntendsToProvide(
+ GetFileEntry(tpl_decl), GetFileEntry(resugared_decl)))
+ resugared_type = item.first;
+ }
+ if (resugared_type && !resugared_type->isPointerType()) {
+ ReportTypeUse(caller_loc(), resugared_type);
+ // For a templated type, check the template args as well.
+ if (const TemplateSpecializationType* spec_type
+ = DynCastFrom(resugared_type)) {
+ TraverseDataAndTypeMembersOfClassHelper(spec_type);
+ }
+ }
+ }
+ return true;
+ }
+
+ //------------------------------------------------------------
+ // Member accessors.
+
+ SourceLocation caller_loc() const {
+ return caller_ast_node_->GetLocation();
+ }
+
+ //------------------------------------------------------------
+ // Member variables.
+
+ // The AST-chain when this template was instantiated.
+ const ASTNode* caller_ast_node_;
+
+ // resugar_map is a map from an unsugared (canonicalized) template
+ // type to the template type as written (or as close as we can find
+ // to it). If a type is not in resugar-map, it might be due to a
+ // recursive template call and encode a template type we don't care
+ // about ourselves. If it's in the resugar_map but with a nullptr
+ // value, it's a default template parameter, that the
+ // template-caller may or may not be responsible for.
+ map<const Type*, const Type*> resugar_map_;
+
+ // Used to avoid recursion in the *Helper() methods.
+ set<const Decl*> traversed_decls_;
+
+ AstFlattenerVisitor::NodeSet nodes_to_ignore_;
+
+ // The current set of nodes we're updating cache entries for.
+ set<CacheStoringScope*> cache_storers_;
+}; // class InstantiatedTemplateVisitor
+
+// ----------------------------------------------------------------------
+// --- IwyuAstConsumer
+// ----------------------------------------------------------------------
+//
+// This class listens to Clang's events as the AST is generated.
+//
+// The traversal of the AST is done via RecursiveASTVisitor, which uses
+// CRTP (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)
+
+class IwyuAstConsumer
+ : public ASTConsumer, public IwyuBaseAstVisitor<IwyuAstConsumer> {
+ public:
+ typedef IwyuBaseAstVisitor<IwyuAstConsumer> Base;
+
+ IwyuAstConsumer(VisitorState* visitor_state)
+ : Base(visitor_state),
+ instantiated_template_visitor_(visitor_state) {}
+
+ //------------------------------------------------------------
+ // Implements pure virtual methods from Base.
+
+ // Returns true if we are not interested in symbols used in used_in
+ // for whatever reason. For instance, we can ignore nodes that are
+ // neither in the file we're compiling nor in its associated .h file.
+ bool CanIgnoreCurrentASTNode() const override {
+ // If we're outside of foo.{h,cc} and the set of check_also files,
+ // just ignore.
+ if (CanIgnoreLocation(current_ast_node()->GetLocation()))
+ return true;
+
+ // If we're a field of a typedef type, ignore us: our rule is that
+ // the author of the typedef is responsible for everything
+ // involving the typedef.
+ if (IsMemberOfATypedef(current_ast_node()))
+ return true;
+
+ // TODO(csilvers): if we're a type, call CanIgnoreType().
+
+ return false;
+ }
+
+ // We print symbols from files in the main compilation unit (foo.cc,
+ // foo.h, foo-inl.h) if the debug level is 5 or 6, for non-system
+ // files if the debug level is 7, and all files if the debug level
+ // is 8 or more.
+ bool ShouldPrintSymbolFromCurrentFile() const override {
+ return ShouldPrintSymbolFromFile(CurrentFileEntry());
+ }
+
+ string GetSymbolAnnotation() const override { return ""; }
+
+ // We are interested in all types for iwyu checking.
+ bool CanIgnoreType(const Type* type) const override {
+ return type == nullptr;
+ }
+
+ bool CanIgnoreDecl(const Decl* decl) const override {
+ return decl == nullptr;
+ }
+
+ //------------------------------------------------------------
+ // Parser event handlers. Clang will call them to notify this
+ // ASTConsumer as it parses the source code. See class ASTConsumer in
+ // clang/AST/ASTConsumer.h
+ // for all the handlers we can override.
+
+ // Called once at the beginning of the compilation.
+ void Initialize(ASTContext& context) override {} // NOLINT
+
+ // Called once at the end of the compilation.
+ void HandleTranslationUnit(ASTContext& context) override { // NOLINT
+ // TODO(csilvers): automatically detect preprocessing is done, somehow.
+ const_cast<IwyuPreprocessorInfo*>(&preprocessor_info())->
+ HandlePreprocessingDone();
+
+ // We run a separate pass to force parsing of late-parsed function
+ // templates.
+ ParseFunctionTemplates(context.getTranslationUnitDecl());
+
+ TraverseDecl(context.getTranslationUnitDecl());
+
+ const set<const FileEntry*>* const files_to_report_iwyu_violations_for
+ = preprocessor_info().files_to_report_iwyu_violations_for();
+
+ // Some analysis, such as UsingDecl resolution, is deferred until the
+ // entire AST is visited because it's only at that point that we know if
+ // the symbol was actually used or not.
+ // We perform that analysis here before CalculateAndReportIwyuViolations.
+ for (const FileEntry* file : *files_to_report_iwyu_violations_for) {
+ CHECK_(preprocessor_info().FileInfoFor(file));
+ preprocessor_info().FileInfoFor(file)->ResolvePendingAnalysis();
+ }
+
+ // We have to calculate the .h files before the .cc file, since
+ // the .cc file inherits #includes from the .h files, and we
+ // need to figure out what those #includes are going to be.
+ size_t num_edits = 0;
+ const FileEntry* const main_file = preprocessor_info().main_file();
+ for (const FileEntry* file : *files_to_report_iwyu_violations_for) {
+ if (file == main_file)
+ continue;
+ CHECK_(preprocessor_info().FileInfoFor(file));
+ num_edits += preprocessor_info().FileInfoFor(file)
+ ->CalculateAndReportIwyuViolations();
+ }
+ CHECK_(preprocessor_info().FileInfoFor(main_file));
+ num_edits += preprocessor_info().FileInfoFor(main_file)
+ ->CalculateAndReportIwyuViolations();
+
+ // We need to force the compile to fail so we can re-run.
+ exit(EXIT_SUCCESS_OFFSET + num_edits);
+ }
+
+ void ParseFunctionTemplates(TranslationUnitDecl* decl) {
+ set<FunctionDecl*> late_parsed_decls = GetLateParsedFunctionDecls(decl);
+ clang::Sema& sema = compiler()->getSema();
+
+ // If we have any late-parsed functions, make sure the
+ // -fdelayed-template-parsing flag is on. Otherwise we don't know where
+ // they came from.
+ CHECK_((compiler()->getLangOpts().DelayedTemplateParsing ||
+ late_parsed_decls.empty()) &&
+ "Should not have late-parsed decls without "
+ "-fdelayed-template-parsing.");
+
+ for (const FunctionDecl* fd : late_parsed_decls) {
+ CHECK_(fd->isLateTemplateParsed());
+
+ if (CanIgnoreLocation(GetLocation(fd)))
+ continue;
+
+ // Force parsing and AST building of the yet-uninstantiated function
+ // template body.
+ clang::LateParsedTemplate* lpt = sema.LateParsedTemplateMap[fd].get();
+ sema.LateTemplateParser(sema.OpaqueParser, *lpt);
+ }
+ }
+
+ //------------------------------------------------------------
+ // AST visitors. We start by adding a visitor callback for
+ // most of the subclasses of Decl/Stmt/Type listed in:
+ // clang/AST/DeclNodes.def
+ // clang/AST/StmtNodes.td
+ // clang/AST/TypeNodes.def
+ // We exclude only:
+ // 1) abstract declarations and types with no logic (e.g. NamedDecl)
+ // 2) ObjC declarations, statements, and types (e.g. ObjcIvarDecl)
+ // RecursiveASTVisitor defines specialized visitors for each specific
+ // math operation (MulAssign, OffsetOf, etc). We don't override
+ // those callbacks, but use their default behavior, which is to call
+ // back to VisitUnaryOperator, VisitBinaryOperator, etc.
+ //
+ // Over time, as we understand when a callback is called and
+ // which can be ignored by iwyu, we will pare down the list.
+ // Each of these returns a bool: false if we want to abort the
+ // traversal (we never do). For Visit*(), we can abort early if
+ // we're not in the main compilation-unit, since we only ever give
+ // iwyu warnings on symbols in those files.
+
+ // --- Visitors of types derived from clang::Decl.
+
+ bool VisitNamespaceAliasDecl(clang::NamespaceAliasDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ ReportDeclUse(CurrentLoc(), decl->getNamespace());
+ return Base::VisitNamespaceAliasDecl(decl);
+ }
+
+ bool VisitUsingDecl(clang::UsingDecl* decl) {
+ // If somebody in a different file tries to use one of these decls
+ // with the shortened name, then they had better #include us in
+ // order to get our using declaration. We store the necessary
+ // information here. Note: we have to store this even if this is
+ // an ast node we would otherwise ignore, since other AST nodes
+ // (which we might not ignore) can depend on it.
+ AddShadowDeclarations(decl);
+
+ // The shadow decls hold the declarations for the var/fn/etc we're
+ // using. (There may be more than one if, say, we're using an
+ // overloaded function.) We don't want to add all of them at once
+ // though, because that will drag in every overload even if we're
+ // only using one. Instead, we keep track of the using decl and
+ // mark it as touched when something actually uses it.
+ preprocessor_info().FileInfoFor(CurrentFileEntry())->AddUsingDecl(decl);
+
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ return Base::VisitUsingDecl(decl);
+ }
+
+ bool VisitTagDecl(clang::TagDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ if (IsForwardDecl(decl)) {
+ // If we're a templated class, make sure we add the whole template.
+ const NamedDecl* decl_to_fwd_declare = decl;
+ if (const CXXRecordDecl* cxx_decl = DynCastFrom(decl))
+ if (cxx_decl->getDescribedClassTemplate())
+ decl_to_fwd_declare = cxx_decl->getDescribedClassTemplate();
+
+ // We've found a forward-declaration. We'll report we've found
+ // it, but we also want to report if we know already that we
+ // should keep this forward-declaration around (and not consider
+ // it for deletion if it's never used). There are a few
+ // situations we can do this, described below.
+ bool definitely_keep_fwd_decl = false;
+
+ // (1) If the forward-decl has a linkage spec ('extern "C"')
+ // then it can't be removed, since that information probably
+ // isn't encoded anywhere else.
+ // (Surprisingly classes can have linkage specs! -- they are
+ // applied to all static methods of the class. See
+ // http://msdn.microsoft.com/en-us/library/ms882260.aspx.)
+ if (current_ast_node()->ParentIsA<LinkageSpecDecl>()) {
+ definitely_keep_fwd_decl = true;
+
+ // (2) GCC-style __attributes__ work the same way: we can't assume
+ // that attributes are consistent between declarations, so we can't
+ // remove a decl with attributes unless they're inherited, i.e. propagated
+ // from another redeclaration as opposed to explicitly written.
+ } else if (decl->hasAttrs()) {
+ for (const Attr* attr : decl->getAttrs()) {
+ if (!attr->isInherited()) {
+ definitely_keep_fwd_decl = true;
+ break;
+ }
+ }
+
+ // (3) If we're a nested class ("class A { class SubA; };"),
+ // then we can't necessary be removed either, since we're part
+ // of the public API of the enclosing class -- it's illegal to
+ // have a nested class and not at least declare it in the
+ // enclosing class. If the nested class is actually defined in
+ // the enclosing class, then we're fine; if not, we need to keep
+ // the first forward-declaration.
+ } else if (IsNestedClassAsWritten(current_ast_node())) {
+ if (!decl->getDefinition() || decl->getDefinition()->isOutOfLine()) {
+ // TODO(kimgr): Member class redeclarations are illegal, per C++
+ // standard DR85, so this check for first redecl can be removed.
+ // Nested classes should always be definitely kept. More details here:
+ // http://comments.gmane.org/gmane.comp.compilers.clang.scm/74782
+ // GCC and MSVC both still allow redeclarations of nested classes,
+ // though, so it seems hygienic to remove all but one.
+ if (const NamedDecl* first_decl = GetFirstRedecl(decl)) {
+ // Check if we're the decl with the smallest line number.
+ if (decl == first_decl)
+ definitely_keep_fwd_decl = true;
+ }
+ }
+ } else {
+ SourceLocation decl_end_location = decl->getSourceRange().getEnd();
+ if (LineHasText(decl_end_location, "// IWYU pragma: keep") ||
+ LineHasText(decl_end_location, "/* IWYU pragma: keep")) {
+ definitely_keep_fwd_decl = true;
+ }
+ }
+
+ preprocessor_info().FileInfoFor(CurrentFileEntry())->AddForwardDeclare(
+ decl_to_fwd_declare, definitely_keep_fwd_decl);
+ }
+ return Base::VisitTagDecl(decl);
+ }
+
+ // If you specialize a template, you need a declaration of the
+ // template you're specializing. That is, for code like this:
+ // template <class T> struct Foo;
+ // template<> struct Foo<int> { ... };
+ // we don't want iwyu to recommend removing the 'forward declare' of Foo.
+ bool VisitClassTemplateSpecializationDecl(
+ clang::ClassTemplateSpecializationDecl* decl) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ ClassTemplateDecl* specialized_decl = decl->getSpecializedTemplate();
+ ReportDeclForwardDeclareUse(CurrentLoc(), specialized_decl);
+ return Base::VisitClassTemplateSpecializationDecl(decl);
+ }
+
+ // If you say 'typedef Foo Bar', then clients can use Bar however
+ // they want without having to worry about #including anything
+ // except you. That puts you on the hook for all the #includes that
+ // Bar might need, for *anything* one might want to do to a Bar.
+ // TODO(csilvers): we can probably relax this rule in .cc files.
+ // TODO(csilvers): this should really move into IwyuBaseASTVisitor
+ // (that way we'll correctly identify need for hash<> in hash_set).
+ // This is a Traverse*() because Visit*() can't call HandleFunctionCall().
+ bool TraverseTypedefDecl(clang::TypedefDecl* decl) {
+ // Before we go up the tree, make sure the parents know we don't
+ // forward-declare the underlying type of a typedef decl.
+ current_ast_node()->set_in_forward_declare_context(false);
+ if (!Base::TraverseTypedefDecl(decl))
+ return false;
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* underlying_type = decl->getUnderlyingType().getTypePtr();
+ const Decl* underlying_decl = TypeToDeclAsWritten(underlying_type);
+
+ // We simulate a user calling all the methods in a class.
+ if (const CXXRecordDecl* record_decl = DynCastFrom(underlying_decl)) {
+ for (DeclContext::decl_iterator it = record_decl->decls_begin();
+ it != record_decl->decls_end(); ++it) {
+ FunctionDecl* fn_decl = nullptr;
+ if (CXXMethodDecl* method_decl = DynCastFrom(*it)) {
+ fn_decl = method_decl;
+ } else if (FunctionTemplateDecl* tpl_decl = DynCastFrom(*it)) {
+ fn_decl = tpl_decl->getTemplatedDecl(); // templated method decl
+ } else {
+ continue; // not a method or static method
+ }
+ if (!this->getDerived().HandleFunctionCall(
+ fn_decl, underlying_type, static_cast<Expr*>(nullptr)))
+ return false;
+ }
+ }
+ // We don't have to simulate a user instantiating the type, because
+ // RecursiveASTVisitor.h will recurse on the typedef'ed type for us.
+ return true;
+ }
+
+ // --- Visitors of types derived from clang::Stmt.
+
+ // Called whenever a variable, function, enum, etc is used.
+ bool VisitDeclRefExpr(clang::DeclRefExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ // Special case for UsingShadowDecl to track UsingDecls correctly. The
+ // actual decl will be reported by obtaining it from the UsingShadowDecl
+ // once we've tracked the UsingDecl use.
+ if (const UsingShadowDecl* found_decl = DynCastFrom(expr->getFoundDecl())) {
+ ReportDeclUse(CurrentLoc(), found_decl);
+ } else {
+ ReportDeclUse(CurrentLoc(), expr->getDecl());
+ }
+ return Base::VisitDeclRefExpr(expr);
+ }
+
+ // This Expr is for sizeof(), alignof() and similar. The compiler
+ // fully instantiates a template class before taking the size of it.
+ // So so do we.
+ bool VisitUnaryExprOrTypeTraitExpr(clang::UnaryExprOrTypeTraitExpr* expr) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ const Type* arg_type = expr->getTypeOfArgument().getTypePtr();
+ // Calling sizeof on a reference-to-X is the same as calling it on X.
+ if (const ReferenceType* reftype = DynCastFrom(arg_type)) {
+ arg_type = reftype->getPointeeTypeAsWritten().getTypePtr();
+ }
+ if (!IsTemplatizedType(arg_type))
+ return Base::VisitUnaryExprOrTypeTraitExpr(expr);
+
+ const map<const Type*, const Type*> resugar_map
+ = GetTplTypeResugarMapForClass(arg_type);
+ instantiated_template_visitor_.ScanInstantiatedType(
+ arg_type, current_ast_node(), resugar_map);
+
+ return Base::VisitUnaryExprOrTypeTraitExpr(expr);
+ }
+
+ // --- Visitors of types derived from clang::Type.
+
+ bool VisitTypedefType(clang::TypedefType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ // TypedefType::getDecl() returns the place where the typedef is defined.
+ if (CanForwardDeclareType(current_ast_node())) {
+ ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl());
+ } else {
+ ReportDeclUse(CurrentLoc(), type->getDecl());
+ }
+ return Base::VisitTypedefType(type);
+ }
+
+ // This is a superclass of RecordType and CXXRecordType.
+ bool VisitTagType(clang::TagType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ // If we're forward-declarable, then no complicated checking is
+ // needed: just forward-declare.
+ if (CanForwardDeclareType(current_ast_node())) {
+ current_ast_node()->set_in_forward_declare_context(true);
+ if (compiler()->getLangOpts().CPlusPlus) {
+ // In C++, if we're already elaborated ('class Foo x') but not
+ // a qualified name ('class ns::Foo x', 'class Class::Nested x') there's
+ // no need even to forward-declare.
+ // Note that enums are never forward-declarable, so elaborated enums are
+ // already short-circuited in CanForwardDeclareType.
+ const ASTNode* parent = current_ast_node()->parent();
+ if (!IsElaborationNode(parent) || IsQualifiedNameNode(parent))
+ ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl());
+ } else {
+ // In C, all struct references are elaborated, so we really never need
+ // to forward-declare. But there's one case where an elaborated struct
+ // decl in a parameter list causes Clang to warn about constrained
+ // visibility, so we recommend forward declaration to avoid the warning.
+ // E.g.
+ // void init(struct mystruct* s);
+ // warning: declaration of 'struct mystruct' will not be visible
+ // outside of this function [-Wvisibility]
+ if (current_ast_node()->HasAncestorOfType<ParmVarDecl>())
+ ReportDeclForwardDeclareUse(CurrentLoc(), type->getDecl());
+ }
+ return Base::VisitTagType(type);
+ }
+
+ // OK, seems to be a use that requires the full type.
+ ReportDeclUse(CurrentLoc(), type->getDecl());
+ return Base::VisitTagType(type);
+ }
+
+ // Like for CXXConstructExpr, etc., we sometimes need to instantiate
+ // a class when looking at TemplateSpecializationType -- for instance,
+ // when we need to access a class typedef: MyClass<A>::value_type.
+ bool VisitTemplateSpecializationType(
+ clang::TemplateSpecializationType* type) {
+ if (CanIgnoreCurrentASTNode()) return true;
+
+ // If we're not in a forward-declare context, use of a template
+ // specialization requires having the full type information.
+ if (!CanForwardDeclareType(current_ast_node())) {
+ const map<const Type*, const Type*> resugar_map
+ = GetTplTypeResugarMapForClass(type);
+ // ScanInstantiatedType requires that type not already be on the
+ // ast-stack that it sees, but in our case it will be. So we
+ // pass in the parent-node.
+ const ASTNode* ast_parent = current_ast_node()->parent();
+ instantiated_template_visitor_.ScanInstantiatedType(
+ type, ast_parent, resugar_map);
+ }
+
+ return Base::VisitTemplateSpecializationType(type);
+ }
+
+ // --- Visitors defined by BaseASTVisitor (not RecursiveASTVisitor).
+
+ bool VisitTemplateName(TemplateName template_name) {
+ if (CanIgnoreCurrentASTNode()) return true;
+ if (!Base::VisitTemplateName(template_name)) return false;
+ // The only time we can see a TemplateName not in the
+ // context of a TemplateSpecializationType is when it's
+ // the default argument of a template template arg:
+ // template<template<class T> class A = TplNameWithoutTST> class Foo ...
+ // So that's the only case we need to handle here.
+ // TODO(csilvers): check if this is really forward-declarable or
+ // not. You *could* do something like: 'template<template<class
+ // T> class A = Foo> class C { A<int>* x; };' and never
+ // dereference x, but that's pretty unlikely. So for now, we just
+ // assume these default template template args always need full
+ // type info.
+ if (IsDefaultTemplateTemplateArg(current_ast_node())) {
+ current_ast_node()->set_in_forward_declare_context(false);
+ ReportDeclUse(CurrentLoc(), template_name.getAsTemplateDecl());
+ }
+ return true;
+ }
+
+ // For expressions that require us to instantiate a template
+ // (CallExpr of a template function, or CXXConstructExpr of a
+ // template class, etc), we need to instantiate the template and
+ // check IWYU status of the template parameters *in the template
+ // code* (so for 'MyFunc<T>() { T t; ... }', the contents of
+ // MyFunc<MyClass> add an iwyu requirement on MyClass).
+ bool HandleFunctionCall(FunctionDecl* callee, const Type* parent_type,
+ const clang::Expr* calling_expr) {
+ if (!Base::HandleFunctionCall(callee, parent_type, calling_expr))
+ return false;
+ if (!callee || CanIgnoreCurrentASTNode() || CanIgnoreDecl(callee))
+ return true;
+
+ if (!IsTemplatizedFunctionDecl(callee) && !IsTemplatizedType(parent_type))
+ return true;
+
+ map<const Type*, const Type*> resugar_map
+ = GetTplTypeResugarMapForFunction(callee, calling_expr);
+
+ if (parent_type) { // means we're a method of a class
+ InsertAllInto(GetTplTypeResugarMapForClass(parent_type), &resugar_map);
+ }
+
+ instantiated_template_visitor_.ScanInstantiatedFunction(
+ callee, parent_type,
+ current_ast_node(), resugar_map);
+ return true;
+ }
+
+ private:
+ // Class we call to handle instantiated template functions and classes.
+ InstantiatedTemplateVisitor instantiated_template_visitor_;
+}; // class IwyuAstConsumer
+
+// We use an ASTFrontendAction to hook up IWYU with Clang.
+class IwyuAction : public ASTFrontendAction {
+ protected:
+ std::unique_ptr<ASTConsumer> CreateASTConsumer(
+ CompilerInstance& compiler, // NOLINT
+ llvm::StringRef /* dummy */) override {
+ // Do this first thing after getting our hands on a CompilerInstance.
+ InitGlobals(&compiler.getSourceManager(),
+ &compiler.getPreprocessor().getHeaderSearchInfo());
+
+ auto* const preprocessor_consumer = new IwyuPreprocessorInfo();
+ compiler.getPreprocessor().addPPCallbacks(
+ std::unique_ptr<PPCallbacks>(preprocessor_consumer));
+ compiler.getPreprocessor().addCommentHandler(preprocessor_consumer);
+
+ auto* const visitor_state
+ = new VisitorState(&compiler, *preprocessor_consumer);
+ return std::unique_ptr<IwyuAstConsumer>(new IwyuAstConsumer(visitor_state));
+ }
+};
+
+} // namespace include_what_you_use
+
+#include "iwyu_driver.h"
+#include "clang/Frontend/FrontendAction.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/TargetSelect.h"
+
+using include_what_you_use::OptionsParser;
+using include_what_you_use::IwyuAction;
+using include_what_you_use::CreateCompilerInstance;
+
+int main(int argc, char **argv) {
+ // Must initialize X86 target to be able to parse Microsoft inline
+ // assembly. We do this unconditionally, because it allows an IWYU
+ // built for non-X86 targets to parse MS inline asm without choking.
+ LLVMInitializeX86TargetInfo();
+ LLVMInitializeX86TargetMC();
+ LLVMInitializeX86AsmParser();
+
+ // The command line should look like
+ // path/to/iwyu -Xiwyu --verbose=4 [-Xiwyu --other_iwyu_flag]... CLANG_FLAGS... foo.cc
+ OptionsParser options_parser(argc, argv);
+
+ std::unique_ptr<clang::CompilerInstance> compiler(CreateCompilerInstance(
+ options_parser.clang_argc(), options_parser.clang_argv()));
+ if (compiler) {
+ // Create and execute the frontend to generate an LLVM bitcode module.
+ std::unique_ptr<clang::ASTFrontendAction> action(new IwyuAction);
+ compiler->ExecuteAction(*action);
+ }
+
+ llvm::llvm_shutdown();
+
+ // We always return a failure exit code, to indicate we didn't
+ // successfully compile (produce a .o for) the source files we were
+ // given.
+ return 1;
+}
diff --git a/iwyu.gcc.imp b/iwyu.gcc.imp
new file mode 100644
index 0000000..2889e77
--- /dev/null
+++ b/iwyu.gcc.imp
@@ -0,0 +1,8 @@
+# Default include mappings for IWYU with GCC
+[
+ { ref: gcc.libc.imp },
+ { ref: gcc.symbols.imp },
+ { ref: gcc.stl.headers.imp },
+ { ref: stl.c.headers.imp },
+ { ref: third_party.imp }
+]
diff --git a/iwyu_ast_util.cc b/iwyu_ast_util.cc
new file mode 100644
index 0000000..9578de6
--- /dev/null
+++ b/iwyu_ast_util.cc
@@ -0,0 +1,1384 @@
+//===--- iwyu_ast_util.cc - clang-AST utilities for include-what-you-use --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Utilities that make it easier to work with Clang's AST.
+
+#include "iwyu_ast_util.h"
+
+#include <set> // for set
+#include <string> // for string, operator+, etc
+#include <utility> // for pair
+
+#include "iwyu_globals.h"
+#include "iwyu_location_util.h"
+#include "iwyu_path_util.h"
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+#include "port.h" // for CHECK_
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/CanonicalType.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclCXX.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/ExprCXX.h"
+#include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/Stmt.h"
+#include "clang/AST/TemplateBase.h"
+#include "clang/AST/TemplateName.h"
+#include "clang/AST/Type.h"
+#include "clang/AST/TypeLoc.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
+
+namespace clang {
+class FileEntry;
+} // namespace clang
+
+using clang::BlockPointerType;
+using clang::CXXConstructExpr;
+using clang::CXXConstructorDecl;
+using clang::CXXDeleteExpr;
+using clang::CXXDependentScopeMemberExpr;
+using clang::CXXDestructorDecl;
+using clang::CXXMethodDecl;
+using clang::CXXNewExpr;
+using clang::CXXRecordDecl;
+using clang::CallExpr;
+using clang::CastExpr;
+using clang::ClassTemplateDecl;
+using clang::ClassTemplatePartialSpecializationDecl;
+using clang::ClassTemplateSpecializationDecl;
+using clang::Decl;
+using clang::DeclContext;
+using clang::DeclRefExpr;
+using clang::DeclaratorDecl;
+using clang::DependentNameType;
+using clang::DependentScopeDeclRefExpr;
+using clang::DependentTemplateName;
+using clang::DependentTemplateSpecializationType;
+using clang::ElaboratedType;
+using clang::EnumDecl;
+using clang::ExplicitCastExpr;
+using clang::Expr;
+using clang::ExprWithCleanups;
+using clang::FileEntry;
+using clang::FullSourceLoc;
+using clang::FunctionDecl;
+using clang::FunctionType;
+using clang::ImplicitCastExpr;
+using clang::InjectedClassNameType;
+using clang::LValueReferenceType;
+using clang::MemberExpr;
+using clang::MemberPointerType;
+using clang::NamedDecl;
+using clang::NestedNameSpecifier;
+using clang::ObjCObjectType;
+using clang::OverloadExpr;
+using clang::PointerType;
+using clang::QualType;
+using clang::QualifiedTemplateName;
+using clang::RecordDecl;
+using clang::RecordType;
+using clang::RecursiveASTVisitor;
+using clang::SourceLocation;
+using clang::SourceRange;
+using clang::Stmt;
+using clang::SubstTemplateTypeParmType;
+using clang::TagDecl;
+using clang::TagType;
+using clang::TemplateArgument;
+using clang::TemplateArgumentList;
+using clang::TemplateArgumentListInfo;
+using clang::TemplateArgumentLoc;
+using clang::TemplateDecl;
+using clang::TemplateName;
+using clang::TemplateParameterList;
+using clang::TemplateSpecializationType;
+using clang::TranslationUnitDecl;
+using clang::Type;
+using clang::TypeDecl;
+using clang::TypeLoc;
+using clang::TypedefNameDecl;
+using clang::TypedefType;
+using clang::UnaryOperator;
+using clang::UsingDirectiveDecl;
+using clang::ValueDecl;
+using clang::VarDecl;
+using llvm::ArrayRef;
+using llvm::PointerUnion;
+using llvm::cast;
+using llvm::dyn_cast;
+using llvm::dyn_cast_or_null;
+using llvm::errs;
+using llvm::isa;
+using llvm::raw_string_ostream;
+
+namespace include_what_you_use {
+
+namespace {
+
+void DumpASTNode(llvm::raw_ostream& ostream, const ASTNode* node) {
+ if (const Decl *decl = node->GetAs<Decl>()) {
+ ostream << "[" << decl->getDeclKindName() << "Decl] "
+ << PrintableDecl(decl);
+ } else if (const Stmt *stmt = node->GetAs<Stmt>()) {
+ ostream << "[" << stmt->getStmtClassName() << "] " << PrintableStmt(stmt);
+ } else if (const Type *type = node->GetAs<Type>()) { // +typeloc
+ ostream << "[" << type->getTypeClassName()
+ << (node->IsA<TypeLoc>() ? "TypeLoc" : "Type") << "] "
+ << PrintableType(type);
+ } else if (const NestedNameSpecifier *nns =
+ node->GetAs<NestedNameSpecifier>()) {
+ ostream << "[NestedNameSpecifier] " << PrintableNestedNameSpecifier(nns);
+ } else if (const TemplateName *tpl_name = node->GetAs<TemplateName>()) {
+ ostream << "[TemplateName] " << PrintableTemplateName(*tpl_name);
+ } else if (const TemplateArgumentLoc *tpl_argloc =
+ node->GetAs<TemplateArgumentLoc>()) {
+ ostream << "[TemplateArgumentLoc] "
+ << PrintableTemplateArgumentLoc(*tpl_argloc);
+ } else if (const TemplateArgument *tpl_arg =
+ node->GetAs<TemplateArgument>()) {
+ ostream << "[TemplateArgument] " << PrintableTemplateArgument(*tpl_arg);
+ } else {
+ CHECK_UNREACHABLE_("Unknown kind for ASTNode");
+ }
+}
+
+} // anonymous namespace
+
+//------------------------------------------------------------
+// ASTNode and associated utilities.
+
+SourceLocation ASTNode::GetLocation() const {
+ SourceLocation retval;
+ if (FillLocationIfKnown(&retval))
+ return retval;
+
+ // OK, let's ask a parent node.
+ for (const ASTNode* node = parent_; node != nullptr; node = node->parent_) {
+ if (node->FillLocationIfKnown(&retval))
+ break;
+ }
+ // If the parent node shows the spelling and instantiation
+ // locations are in a different file, then we're uncertain of our
+ // own location. Return an invalid location.
+ if (retval.isValid()) {
+ FullSourceLoc full_loc(retval, source_manager_);
+ const FileEntry* spelling_file =
+ source_manager_.getFileEntryForID(
+ source_manager_.getFileID(full_loc.getSpellingLoc()));
+ const FileEntry* instantiation_file =
+ source_manager_.getFileEntryForID(
+ source_manager_.getFileID(full_loc.getExpansionLoc()));
+ if (spelling_file != instantiation_file)
+ return SourceLocation();
+ }
+
+ return retval;
+}
+
+bool ASTNode::FillLocationIfKnown(SourceLocation* loc) const {
+ using include_what_you_use::GetLocation;
+ switch (kind_) {
+ case kDeclKind:
+ *loc = GetLocation(as_decl_); // in iwyu_location_util.h
+ return true;
+ case kStmtKind:
+ *loc = GetLocation(as_stmt_);
+ return true;
+ case kTypelocKind:
+ *loc = GetLocation(as_typeloc_);
+ return true;
+ case kNNSLocKind:
+ *loc = GetLocation(as_nnsloc_);
+ return true;
+ case kTemplateArgumentLocKind:
+ *loc = GetLocation(as_template_argloc_);
+ return true;
+ case kTypeKind:
+ case kNNSKind:
+ case kTemplateNameKind:
+ case kTemplateArgumentKind:
+ return false;
+ }
+ CHECK_UNREACHABLE_("Unexpected kind of ASTNode");
+}
+
+// --- Utilities for ASTNode.
+
+bool IsElaborationNode(const ASTNode* ast_node) {
+ if (ast_node == nullptr)
+ return false;
+ const ElaboratedType* elaborated_type = ast_node->GetAs<ElaboratedType>();
+ return elaborated_type && elaborated_type->getKeyword() != clang::ETK_None;
+}
+
+bool IsQualifiedNameNode(const ASTNode* ast_node) {
+ if (ast_node == nullptr)
+ return false;
+ const ElaboratedType* elaborated_type = ast_node->GetAs<ElaboratedType>();
+ if (elaborated_type == nullptr)
+ return false;
+ return elaborated_type->getQualifier() != nullptr;
+}
+
+bool IsNodeInsideCXXMethodBody(const ASTNode* ast_node) {
+ // If we're a destructor, we're definitely part of a method body;
+ // destructors don't have any other parts to them. This case is
+ // triggered when we see implicit destruction of member vars.
+ if (ast_node && ast_node->IsA<CXXDestructorDecl>())
+ return true;
+ for (; ast_node != nullptr; ast_node = ast_node->parent()) {
+ // If we're a constructor, check if we're part of the
+ // initializers, which also count as 'the body' of the method.
+ if (const CXXConstructorDecl* ctor =
+ ast_node->GetParentAs<CXXConstructorDecl>()) {
+ for (CXXConstructorDecl::init_const_iterator
+ it = ctor->init_begin(); it != ctor->init_end(); ++it) {
+ if (ast_node->ContentIs((*it)->getInit()))
+ return true;
+ }
+ // Now fall through to see if we're the body of the constructor.
+ }
+ if (const CXXMethodDecl* method_decl =
+ ast_node->GetParentAs<CXXMethodDecl>()) {
+ if (ast_node->ContentIs(method_decl->getBody())) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+bool IsNestedClassAsWritten(const ASTNode* ast_node) {
+ return (ast_node->IsA<RecordDecl>() &&
+ (ast_node->ParentIsA<CXXRecordDecl>() ||
+ // For templated nested-classes, a ClassTemplateDecl is interposed.
+ (ast_node->ParentIsA<ClassTemplateDecl>() &&
+ ast_node->AncestorIsA<CXXRecordDecl>(2))));
+}
+
+bool IsDefaultTemplateTemplateArg(const ASTNode* ast_node) {
+ // Is ast_node the 'D' in the following:
+ // template<template <typename A> class T = D> class C { ... }
+ // ('D' might be something like 'vector').
+ // D is a TemplateName, since it's a template, and its parent
+ // is a TemplateArgument, since D is inside a template argument.
+ // The only way a template name can be in a template argument
+ // is if it's a default parameter.
+ return (ast_node->IsA<TemplateName>() &&
+ ast_node->ParentIsA<TemplateArgument>());
+}
+
+bool IsCXXConstructExprInInitializer(const ASTNode* ast_node) {
+ if (!ast_node->IsA<CXXConstructExpr>())
+ return false;
+
+ CHECK_(ast_node->parent() && "Constructor should not be a top-level node!");
+
+ // Typically, you can tell an initializer because its parent is a
+ // constructor decl. But sometimes -- I'm not exactly sure when --
+ // there can be an ExprWithCleanups in the middle.
+ return ((ast_node->ParentIsA<CXXConstructorDecl>()) ||
+ (ast_node->ParentIsA<ExprWithCleanups>() &&
+ ast_node->AncestorIsA<CXXConstructorDecl>(2)));
+}
+
+bool IsCXXConstructExprInNewExpr(const ASTNode* ast_node) {
+ if (!ast_node->IsA<CXXConstructExpr>())
+ return false;
+
+ CHECK_(ast_node->parent() && "Constructor should not be a top-level node!");
+ return ast_node->ParentIsA<CXXNewExpr>();
+}
+
+template<typename T>
+NestedNameSpecifier* TryGetQualifier(const ASTNode* ast_node) {
+ if (ast_node->IsA<T>())
+ return ast_node->GetAs<T>()->getQualifier();
+ return nullptr;
+}
+
+const NestedNameSpecifier* GetQualifier(const ASTNode* ast_node) {
+ const NestedNameSpecifier* nns = nullptr;
+ if (ast_node->IsA<TemplateName>()) {
+ const TemplateName* tn = ast_node->GetAs<TemplateName>();
+ if (const DependentTemplateName* dtn
+ = tn->getAsDependentTemplateName())
+ nns = dtn->getQualifier();
+ else if (const QualifiedTemplateName* qtn
+ = tn->getAsQualifiedTemplateName())
+ nns = qtn->getQualifier();
+ }
+ if (!nns) nns = TryGetQualifier<ElaboratedType>(ast_node);
+ if (!nns) nns = TryGetQualifier<DependentNameType>(ast_node);
+ if (!nns)
+ nns = TryGetQualifier<DependentTemplateSpecializationType>(ast_node);
+ if (!nns) nns = TryGetQualifier<UsingDirectiveDecl>(ast_node);
+ if (!nns) nns = TryGetQualifier<EnumDecl>(ast_node);
+ if (!nns) nns = TryGetQualifier<RecordDecl>(ast_node);
+ if (!nns) nns = TryGetQualifier<DeclaratorDecl>(ast_node);
+ if (!nns) nns = TryGetQualifier<FunctionDecl>(ast_node);
+ if (!nns) nns = TryGetQualifier<CXXDependentScopeMemberExpr>(ast_node);
+ if (!nns) nns = TryGetQualifier<DeclRefExpr>(ast_node);
+ if (!nns) nns = TryGetQualifier<DependentScopeDeclRefExpr>(ast_node);
+ if (!nns) nns = TryGetQualifier<MemberExpr>(ast_node);
+ return nns;
+}
+
+bool IsMemberOfATypedef(const ASTNode* ast_node) {
+ // TODO(csilvers): is this ever triggered in practice?
+ if (ast_node->ParentIsA<TypedefType>()) { // my_typedef.a
+ return true;
+ }
+
+ // If we're one of those objects that exposes its qualifier
+ // (stuff before the ::), use that.
+ const NestedNameSpecifier* nns = GetQualifier(ast_node);
+
+ // If that doesn't work, see if our parent in the tree is an nns
+ // node. We have to be a bit careful here: 1) If we're a typedef
+ // ourselves, the nns-parent is just us. We have to go a level up
+ // to see our 'real' qualifier. 2) Often the parent will be an
+ // elaborated type, and we get to the qualifier that way.
+ if (!nns) {
+ nns = ast_node->GetParentAs<NestedNameSpecifier>();
+ if (nns && ast_node->IsA<TypedefType>()) {
+ nns = nns->getPrefix();
+ } else if (!nns) {
+ // nns will be non-nullptr when processing 'a' in MyTypedef::a::b
+ // But typically, such as processing 'a' in MyTypedef::a or 'b' in
+ // MyTypedef::a::b, the parent will be an ElaboratedType.
+ if (const ElaboratedType* elab_type =
+ ast_node->GetParentAs<ElaboratedType>())
+ nns = elab_type->getQualifier();
+ }
+ }
+
+ for (; nns; nns = nns->getPrefix()) {
+ if (nns->getAsType() && isa<TypedefType>(nns->getAsType()))
+ return true;
+ }
+ return false;
+}
+
+const DeclContext* GetDeclContext(const ASTNode* ast_node) {
+ for (; ast_node != nullptr; ast_node = ast_node->parent()) {
+ if (ast_node->IsA<Decl>())
+ return ast_node->GetAs<Decl>()->getDeclContext();
+ }
+ return nullptr;
+}
+
+//------------------------------------------------------------
+// Helper functions for working with raw Clang AST nodes.
+
+// --- Printers.
+
+string PrintableLoc(SourceLocation loc) {
+ if (loc.isInvalid()) {
+ return "Invalid location";
+ } else {
+ std::string buffer; // llvm wants regular string, not our versa-string
+ raw_string_ostream ostream(buffer);
+ loc.print(ostream, *GlobalSourceManager());
+ return NormalizeFilePath(ostream.str());
+ }
+}
+
+string PrintableSourceRange(SourceRange range) {
+ return PrintableLoc(range.getBegin()) + " - " + PrintableLoc(range.getEnd());
+}
+
+string PrintableDecl(const Decl* decl, bool terse/*=true*/) {
+ // Use the terse flag to limit the level of output to one line.
+ clang::PrintingPolicy policy = decl->getASTContext().getPrintingPolicy();
+ policy.TerseOutput = terse;
+ policy.SuppressInitializers = terse;
+ policy.PolishForDeclaration = terse;
+
+ std::string buffer;
+ raw_string_ostream ostream(buffer);
+ decl->print(ostream, policy);
+ return ostream.str();
+}
+
+string PrintableStmt(const Stmt* stmt) {
+ std::string buffer;
+ raw_string_ostream ostream(buffer);
+ stmt->dump(ostream, *GlobalSourceManager());
+ return ostream.str();
+}
+
+void PrintStmt(const Stmt* stmt) {
+ stmt->dump(*GlobalSourceManager()); // This prints to errs().
+}
+
+string PrintableType(const Type* type) {
+ return QualType(type, 0).getAsString();
+}
+
+string PrintableTypeLoc(const TypeLoc& typeloc) {
+ return PrintableType(typeloc.getTypePtr());
+}
+
+string PrintableNestedNameSpecifier(
+ const NestedNameSpecifier* nns) {
+ std::string buffer; // llvm wants regular string, not our versa-string
+ raw_string_ostream ostream(buffer);
+ nns->print(ostream, DefaultPrintPolicy());
+ return ostream.str();
+}
+
+string PrintableTemplateName(const TemplateName& tpl_name) {
+ std::string buffer; // llvm wants regular string, not our versa-string
+ raw_string_ostream ostream(buffer);
+ tpl_name.print(ostream, DefaultPrintPolicy());
+ return ostream.str();
+}
+
+string PrintableTemplateArgument(const TemplateArgument& arg) {
+ std::string buffer;
+ raw_string_ostream ostream(buffer);
+ TemplateSpecializationType::PrintTemplateArgumentList(
+ ostream, ArrayRef<TemplateArgument>(arg), DefaultPrintPolicy());
+ return ostream.str();
+}
+
+string PrintableTemplateArgumentLoc(const TemplateArgumentLoc& arg) {
+ std::string buffer;
+ raw_string_ostream ostream(buffer);
+ TemplateSpecializationType::PrintTemplateArgumentList(
+ ostream, ArrayRef<TemplateArgumentLoc>(arg), DefaultPrintPolicy());
+ return ostream.str();
+}
+
+string PrintableASTNode(const ASTNode* node) {
+ std::string buffer;
+ raw_string_ostream ostream(buffer);
+ DumpASTNode(ostream, node);
+ return ostream.str();
+}
+
+// This prints to errs(). It's useful for debugging (e.g. inside gdb).
+void PrintASTNode(const ASTNode* node) {
+ DumpASTNode(errs(), node);
+ errs() << "\n";
+}
+
+string GetWrittenQualifiedNameAsString(const NamedDecl* named_decl) {
+ std::string retval;
+ llvm::raw_string_ostream ostream(retval);
+ clang::PrintingPolicy printing_policy =
+ named_decl->getASTContext().getPrintingPolicy();
+ printing_policy.SuppressUnwrittenScope = true;
+ named_decl->printQualifiedName(ostream, printing_policy);
+ return ostream.str();
+}
+
+// --- Utilities for Template Arguments.
+
+// If the TemplateArgument is a type (and not an expression such as
+// 'true', or a template such as 'vector', etc), return it. Otherwise
+// return nullptr.
+static const Type* GetTemplateArgAsType(const TemplateArgument& tpl_arg) {
+ if (tpl_arg.getKind() == TemplateArgument::Type)
+ return tpl_arg.getAsType().getTypePtr();
+ return nullptr;
+}
+
+// These utilities figure out the template arguments that are
+// specified in various contexts: TemplateSpecializationType (for
+// template classes) and FunctionDecl (for template functions).
+//
+// For classes, we care only about explicitly specified template args,
+// not implicit, default args. For functions, we care about all
+// template args, since if not specified they're derived from the
+// function arguments. In either case, we only care about template
+// arguments that are types (including template types), not other
+// kinds of arguments such as built-in types.
+
+// This helper class visits a given AST node and finds all the types
+// beneath it, which it returns as a set. For example, if you have a
+// VarDecl 'vector<int(*)(const MyClass&)> x', it would return
+// (vector<int(*)(const MyClass&)>, int(*)(const MyClass&),
+// int(const MyClass&), int, const MyClass&, MyClass). Note that
+// this function only returns types-as-written, so it does *not* return
+// alloc<int(*)(const MyClass&)>, even though it's part of vector.
+class TypeEnumerator : public RecursiveASTVisitor<TypeEnumerator> {
+ public:
+ typedef RecursiveASTVisitor<TypeEnumerator> Base;
+
+ // --- Public interface
+ // We can add more entry points as needed.
+ set<const Type*> Enumerate(const Type* type) {
+ seen_types_.clear();
+ if (!type)
+ return seen_types_;
+ TraverseType(QualType(type, 0));
+ return seen_types_;
+ }
+
+ set<const Type*> Enumerate(const TemplateArgument& tpl_arg) {
+ seen_types_.clear();
+ TraverseTemplateArgument(tpl_arg);
+ return seen_types_;
+ }
+
+ // --- Methods on RecursiveASTVisitor
+ bool VisitType(Type* type) {
+ seen_types_.insert(type);
+ return true;
+ }
+
+ private:
+ set<const Type*> seen_types_;
+};
+
+// A 'component' of a type is a type beneath it in the AST tree.
+// So 'Foo*' has component 'Foo', as does 'vector<Foo>', while
+// vector<pair<Foo, Bar>> has components pair<Foo,Bar>, Foo, and Bar.
+set<const Type*> GetComponentsOfType(const Type* type) {
+ TypeEnumerator type_enumerator;
+ return type_enumerator.Enumerate(type);
+}
+
+// --- Utilities for Decl.
+
+bool IsTemplatizedFunctionDecl(const FunctionDecl* decl) {
+ return decl && decl->getTemplateSpecializationArgs() != nullptr;
+}
+
+bool HasImplicitConversionCtor(const CXXRecordDecl* cxx_class) {
+ for (CXXRecordDecl::ctor_iterator ctor = cxx_class->ctor_begin();
+ ctor != cxx_class->ctor_end(); ++ctor) {
+ if (ctor->isExplicit() || ctor->getNumParams() != 1 ||
+ ctor->isCopyConstructor() || ctor->isMoveConstructor())
+ continue;
+ return true;
+ }
+ return false;
+}
+
+// C++ [class.virtual]p8:
+// If the return type of D::f differs from the return type of B::f, the
+// class type in the return type of D::f shall be complete at the point of
+// declaration of D::f or shall be the class type D.
+bool HasCovariantReturnType(const CXXMethodDecl* method_decl) {
+ QualType derived_return_type = method_decl->getReturnType();
+
+ for (CXXMethodDecl::method_iterator
+ it = method_decl->begin_overridden_methods();
+ it != method_decl->end_overridden_methods(); ++it) {
+ // There are further constraints on covariant return types as such
+ // (e.g. parents must be related, derived override must have return type
+ // derived from base override, etc.) but the only _valid_ case I can think
+ // of where return type differs is when they're actually covariant.
+ // That is, if Clang can already compile this code without errors, and
+ // return types differ, it can only be due to covariance.
+ if ((*it)->getReturnType() != derived_return_type)
+ return true;
+ }
+
+ return false;
+}
+
+const RecordDecl* GetDefinitionForClass(const Decl* decl) {
+ const RecordDecl* as_record = DynCastFrom(decl);
+ const ClassTemplateDecl* as_tpl = DynCastFrom(decl);
+ if (as_tpl) { // Convert the template to its underlying class defn.
+ as_record = dyn_cast_or_null<RecordDecl>(as_tpl->getTemplatedDecl());
+ }
+ if (as_record) {
+ if (const RecordDecl* record_dfn = as_record->getDefinition()) {
+ return record_dfn;
+ }
+ // If we're a templated class that was never instantiated (because
+ // we were never "used"), then getDefinition() will return nullptr.
+ if (const ClassTemplateSpecializationDecl* spec_decl = DynCastFrom(decl)) {
+ PointerUnion<ClassTemplateDecl*,
+ ClassTemplatePartialSpecializationDecl*>
+ specialized_decl = spec_decl->getSpecializedTemplateOrPartial();
+ if (const ClassTemplatePartialSpecializationDecl*
+ partial_spec_decl =
+ specialized_decl.dyn_cast<
+ ClassTemplatePartialSpecializationDecl*>()) {
+ // decl would be instantiated from a template partial
+ // specialization.
+ CHECK_(partial_spec_decl->hasDefinition());
+ return partial_spec_decl->getDefinition();
+ } else if (const ClassTemplateDecl* tpl_decl =
+ specialized_decl.dyn_cast<ClassTemplateDecl*>()) {
+ // decl would be instantiated from a non-specialized
+ // template.
+ if (tpl_decl->getTemplatedDecl()->hasDefinition())
+ return tpl_decl->getTemplatedDecl()->getDefinition();
+ }
+ }
+ }
+ return nullptr;
+}
+
+SourceRange GetSourceRangeOfClassDecl(const Decl* decl) {
+ // If we're a templatized class, go 'up' a level to get the
+ // template<...> prefix as well.
+ if (const CXXRecordDecl* cxx_decl = DynCastFrom(decl)) {
+ if (cxx_decl->getDescribedClassTemplate())
+ return cxx_decl->getDescribedClassTemplate()->getSourceRange();
+ }
+ // We can get source ranges of classes and template classes.
+ if (const TagDecl* tag_decl = DynCastFrom(decl))
+ return tag_decl->getSourceRange();
+ if (const TemplateDecl* tpl_decl = DynCastFrom(decl))
+ return tpl_decl->getSourceRange();
+ CHECK_UNREACHABLE_("Cannot get source range for this decl type");
+}
+
+// Use a local RAV implementation to simply collect all FunctionDecls marked for
+// late template parsing. This happens with the flag -fdelayed-template-parsing,
+// which is on by default in MSVC-compatible mode.
+set<FunctionDecl*> GetLateParsedFunctionDecls(TranslationUnitDecl* decl) {
+ struct Visitor : public RecursiveASTVisitor<Visitor> {
+ bool VisitFunctionDecl(FunctionDecl* function_decl) {
+ if (function_decl->isLateTemplateParsed())
+ late_parsed_decls.insert(function_decl);
+ return true;
+ }
+
+ set<FunctionDecl*> late_parsed_decls;
+ };
+
+ Visitor v;
+ v.TraverseDecl(decl);
+
+ return v.late_parsed_decls;
+}
+
+// Helper for the Get*ResugarMap*() functions. Given a map from
+// desugared->resugared types, looks at each component of the
+// resugared type (eg, both hash_set<Foo>* and vector<hash_set<Foo>>
+// have two components: hash_set<Foo> and Foo), and returns a map that
+// contains the original map elements plus mapping for the components.
+// This is because when a type is 'owned' by the template
+// instantiator, all parts of the type are owned. We only consider
+// type-components as written.
+static map<const Type*, const Type*> ResugarTypeComponents(
+ const map<const Type*, const Type*>& resugar_map) {
+ map<const Type*, const Type*> retval = resugar_map;
+ for (const auto& types : resugar_map) {
+ const set<const Type*>& components = GetComponentsOfType(types.second);
+ for (const Type* component_type : components) {
+ const Type* desugared_type = GetCanonicalType(component_type);
+ if (!ContainsKey(retval, desugared_type)) {
+ retval[desugared_type] = component_type;
+ VERRS(6) << "Adding a type-components of interest: "
+ << PrintableType(component_type) << "\n";
+ }
+ }
+ }
+ return retval;
+}
+
+// Helpers for GetTplTypeResugarMapForFunction().
+static map<const Type*, const Type*> GetTplTypeResugarMapForFunctionNoCallExpr(
+ const FunctionDecl* decl, unsigned start_arg) {
+ map<const Type*, const Type*> retval;
+ if (!decl) // can be nullptr if the function call is via a function pointer
+ return retval;
+ if (const TemplateArgumentList* tpl_list
+ = decl->getTemplateSpecializationArgs()) {
+ for (unsigned i = start_arg; i < tpl_list->size(); ++i) {
+ if (const Type* arg_type = GetTemplateArgAsType(tpl_list->get(i))) {
+ retval[GetCanonicalType(arg_type)] = arg_type;
+ VERRS(6) << "Adding an implicit tpl-function type of interest: "
+ << PrintableType(arg_type) << "\n";
+ }
+ }
+ }
+ return retval;
+}
+
+static map<const Type*, const Type*>
+GetTplTypeResugarMapForFunctionExplicitTplArgs(
+ const FunctionDecl* decl,
+ const TemplateArgumentListInfo& explicit_tpl_list) {
+ map<const Type*, const Type*> retval;
+ for (const TemplateArgumentLoc& loc : explicit_tpl_list.arguments()) {
+ if (const Type* arg_type = GetTemplateArgAsType(loc.getArgument())) {
+ retval[GetCanonicalType(arg_type)] = arg_type;
+ VERRS(6) << "Adding an explicit template-function type of interest: "
+ << PrintableType(arg_type) << "\n";
+ }
+ }
+ return retval;
+}
+
+// Get the type of an expression while preserving as much type sugar as
+// possible. This was originally designed for use with function argument
+// expressions, and so might not work in a more general context.
+static const Type* GetSugaredTypeOf(const Expr* expr) {
+ // First, try to find an ImplicitCastExpr under the expr, and let that provide
+ // the type. This has a higher probability of yielding a sugared type.
+ for (const Stmt* child_expr : expr->children()) {
+ if (const auto* cast_expr = dyn_cast<ImplicitCastExpr>(child_expr)) {
+ return cast_expr->getType().getTypePtr();
+ }
+ }
+
+ // If we didn't find a type via ImplicitCastExpr, just return the type of the
+ // expr itself.
+ return GetTypeOf(expr);
+}
+
+map<const Type*, const Type*> GetTplTypeResugarMapForFunction(
+ const FunctionDecl* decl, const Expr* calling_expr) {
+ map<const Type*, const Type*> retval;
+
+ // If calling_expr is nullptr, then we can't find any explicit template
+ // arguments, if they were specified (e.g. 'Fn<int>()'), and we
+ // won't be able to get the function arguments as written. So we
+ // can't resugar at all. We just have to hope that the types happen
+ // to be already sugared, because the actual-type is already canonical.
+ if (calling_expr == nullptr) {
+ retval = GetTplTypeResugarMapForFunctionNoCallExpr(decl, 0);
+ retval = ResugarTypeComponents(retval); // add in retval's decomposition
+ return retval;
+ }
+
+ // If calling_expr is a CXXConstructExpr of CXXNewExpr, then it's
+ // impossible to explicitly specify template arguments; all we have
+ // to go on is function arguments. If it's a CallExpr, and some
+ // arguments might be explicit, and others implicit. Otherwise,
+ // it's a type that doesn't take function template args at all (like
+ // CXXDeleteExpr) or only takes explicit args (like DeclRefExpr).
+ const Expr* const* fn_args = nullptr;
+ unsigned num_args = 0;
+ unsigned start_of_implicit_args = 0;
+ if (const CXXConstructExpr* ctor_expr = DynCastFrom(calling_expr)) {
+ fn_args = ctor_expr->getArgs();
+ num_args = ctor_expr->getNumArgs();
+ } else if (const CallExpr* call_expr = DynCastFrom(calling_expr)) {
+ fn_args = call_expr->getArgs();
+ num_args = call_expr->getNumArgs();
+ const Expr* callee_expr = call_expr->getCallee()->IgnoreParenCasts();
+ const TemplateArgumentListInfo& explicit_tpl_args
+ = GetExplicitTplArgs(callee_expr);
+ if (explicit_tpl_args.size() > 0) {
+ retval = GetTplTypeResugarMapForFunctionExplicitTplArgs(
+ decl, explicit_tpl_args);
+ start_of_implicit_args = explicit_tpl_args.size();
+ }
+ } else {
+ // If calling_expr has explicit template args, then consider them.
+ const TemplateArgumentListInfo& explicit_tpl_args
+ = GetExplicitTplArgs(calling_expr);
+ if (explicit_tpl_args.size() > 0) {
+ retval = GetTplTypeResugarMapForFunctionExplicitTplArgs(
+ decl, explicit_tpl_args);
+ retval = ResugarTypeComponents(retval);
+ }
+ return retval;
+ }
+
+ // Now we have to figure out, as best we can, the sugar-mappings for
+ // compiler-deduced template args. We do this by looking at every
+ // type specified in any part of the function arguments as written.
+ // If any of these types matches a template type, then we take that
+ // to be the resugar mapping. If none of the types match, then we
+ // assume that the template is matching some desugared part of the
+ // type, and we ignore it. For instance:
+ // operator<<(basic_ostream<char, T>& o, int i);
+ // If I pass in an ostream as the first argument, then no part
+ // of the (sugared) argument types match T, so we ignore it.
+ const map<const Type*, const Type*>& desugared_types
+ = GetTplTypeResugarMapForFunctionNoCallExpr(decl, start_of_implicit_args);
+
+ // TODO(csilvers): SubstTemplateTypeParms are always desugared,
+ // making this less useful than it should be.
+ // TODO(csilvers): if the GetArg(i) expr has an implicit cast
+ // under it, take the pre-cast type instead?
+ set<const Type*> fn_arg_types;
+ for (unsigned i = 0; i < num_args; ++i) {
+ const Type* argtype = GetSugaredTypeOf(fn_args[i]);
+ // TODO(csilvers): handle RecordTypes that are a TemplateSpecializationDecl
+ InsertAllInto(GetComponentsOfType(argtype), &fn_arg_types);
+ }
+
+ for (const Type* type : fn_arg_types) {
+ // See if any of the template args in retval are the desugared form of us.
+ const Type* desugared_type = GetCanonicalType(type);
+ if (ContainsKey(desugared_types, desugared_type)) {
+ retval[desugared_type] = type;
+ if (desugared_type != type) {
+ VERRS(6) << "Remapping template arg of interest: "
+ << PrintableType(desugared_type) << " -> "
+ << PrintableType(type) << "\n";
+ }
+ }
+ }
+
+ // Log the types we never mapped.
+ for (const auto& types : desugared_types) {
+ if (!ContainsKey(retval, types.first)) {
+ VERRS(6) << "Ignoring unseen-in-fn-args template arg of interest: "
+ << PrintableType(types.first) << "\n";
+ }
+ }
+
+ retval = ResugarTypeComponents(retval); // add in the decomposition of retval
+ return retval;
+}
+
+const NamedDecl* GetInstantiatedFromDecl(const CXXRecordDecl* class_decl) {
+ if (const ClassTemplateSpecializationDecl* tpl_sp_decl =
+ DynCastFrom(class_decl)) { // an instantiated class template
+ PointerUnion<ClassTemplateDecl*, ClassTemplatePartialSpecializationDecl*>
+ instantiated_from = tpl_sp_decl->getInstantiatedFrom();
+ if (const ClassTemplateDecl* tpl_decl =
+ instantiated_from.dyn_cast<ClassTemplateDecl*>()) {
+ // class_decl is instantiated from a non-specialized template.
+ return tpl_decl;
+ } else if (const ClassTemplatePartialSpecializationDecl*
+ partial_spec_decl =
+ instantiated_from.dyn_cast<
+ ClassTemplatePartialSpecializationDecl*>()) {
+ // class_decl is instantiated from a template partial specialization.
+ return partial_spec_decl;
+ }
+ }
+ // class_decl is not instantiated from a template.
+ return class_decl;
+}
+
+const NamedDecl* GetDefinitionAsWritten(const NamedDecl* decl) {
+ // First, get to decl-as-written.
+ if (const CXXRecordDecl* class_decl = DynCastFrom(decl)) {
+ decl = GetInstantiatedFromDecl(class_decl);
+ if (const ClassTemplateDecl* tpl_decl = DynCastFrom(decl))
+ decl = tpl_decl->getTemplatedDecl(); // convert back to CXXRecordDecl
+ } else if (const FunctionDecl* func_decl = DynCastFrom(decl)) {
+ // If we're instantiated from a template, use the template pattern as the
+ // decl-as-written.
+ // But avoid friend declarations in templates, something happened in Clang
+ // r283207 that caused them to form a dedicated redecl chain, separate
+ // from all other redecls.
+ const FunctionDecl* tp_decl = func_decl->getTemplateInstantiationPattern();
+ if (tp_decl && tp_decl->getFriendObjectKind() == Decl::FOK_None)
+ decl = tp_decl;
+ }
+ // Then, get to definition.
+ if (const NamedDecl* class_dfn = GetDefinitionForClass(decl)) {
+ return class_dfn;
+ } else if (const FunctionDecl* fn_decl = DynCastFrom(decl)) {
+ for (FunctionDecl::redecl_iterator it = fn_decl->redecls_begin();
+ it != fn_decl->redecls_end(); ++it) {
+ if ((*it)->isThisDeclarationADefinition())
+ return *it;
+ }
+ }
+ // Couldn't find a definition, just return the original declaration.
+ return decl;
+}
+
+bool IsDefaultNewOrDelete(const FunctionDecl* decl,
+ const string& decl_loc_as_quoted_include) {
+ // Clang will report <new> as the location of the default new and
+ // delete operators if <new> is included. Otherwise, it reports the
+ // (fake) file "<built_in>".
+ if (decl_loc_as_quoted_include != "<new>" &&
+ !IsBuiltinFile(GetFileEntry(decl)))
+ return false;
+
+ const string decl_name = decl->getNameAsString();
+ if (!StartsWith(decl_name, "operator new") &&
+ !StartsWith(decl_name, "operator delete"))
+ return false;
+
+ // Placement-new/delete has 2 args, second is void*. The only other
+ // 2-arg overloads of new/delete in <new> take a const nothrow_t&.
+ if (decl->getNumParams() == 2 &&
+ !decl->getParamDecl(1)->getType().isConstQualified())
+ return false;
+
+ return true;
+}
+
+bool IsFriendDecl(const Decl* decl) {
+ // For 'template<...> friend class T', the decl will just be 'class T'.
+ // We need to go 'up' a level to check friendship in the right place.
+ if (const CXXRecordDecl* cxx_decl = DynCastFrom(decl))
+ if (cxx_decl->getDescribedClassTemplate())
+ decl = cxx_decl->getDescribedClassTemplate();
+ return decl->getFriendObjectKind() != Decl::FOK_None;
+}
+
+bool IsForwardDecl(const NamedDecl* decl) {
+ if (const auto* record_decl = dyn_cast<RecordDecl>(decl)) {
+ return (!record_decl->getName().empty() &&
+ !record_decl->isCompleteDefinition() &&
+ !record_decl->isEmbeddedInDeclarator() &&
+ !IsFriendDecl(record_decl));
+ }
+
+ return false;
+}
+
+// Two possibilities: it's written as a nested class (that is, with a
+// qualifier) or it's actually living inside another class.
+bool IsNestedClass(const TagDecl* decl) {
+ if (decl->getQualifier() &&
+ decl->getQualifier()->getKind() == NestedNameSpecifier::TypeSpec) {
+ return true;
+ }
+ return isa<RecordDecl>(decl->getDeclContext());
+}
+
+bool HasDefaultTemplateParameters(const TemplateDecl* decl) {
+ TemplateParameterList* tpl_params = decl->getTemplateParameters();
+ return tpl_params->getMinRequiredArguments() < tpl_params->size();
+}
+
+template <class T> inline set<const clang::NamedDecl*> GetRedeclsOfRedeclarable(
+ const clang::Redeclarable<T>* decl) {
+ return set<const clang::NamedDecl*>(decl->redecls_begin(),
+ decl->redecls_end());
+}
+
+// The only way to find out whether a decl can be dyn_cast to a
+// Redeclarable<T> and what T is is to enumerate the possibilities.
+// Hence we hard-code the list.
+set<const clang::NamedDecl*> GetNonclassRedecls(const clang::NamedDecl* decl) {
+ CHECK_(!isa<RecordDecl>(decl) && "For classes, call GetClassRedecls()");
+ CHECK_(!isa<ClassTemplateDecl>(decl) && "For tpls, call GetClassRedecls()");
+ if (const TagDecl* specific_decl = DynCastFrom(decl))
+ return GetRedeclsOfRedeclarable(specific_decl);
+ // TODO(wan): go through iwyu to replace TypedefDecl with
+ // TypedefNameDecl as needed.
+ if (const TypedefNameDecl* specific_decl = DynCastFrom(decl))
+ return GetRedeclsOfRedeclarable(specific_decl);
+ if (const FunctionDecl* specific_decl = DynCastFrom(decl))
+ return GetRedeclsOfRedeclarable(specific_decl);
+ if (const VarDecl* specific_decl = DynCastFrom(decl))
+ return GetRedeclsOfRedeclarable(specific_decl);
+ // Not redeclarable, so the output is just the input.
+ set<const clang::NamedDecl*> retval;
+ retval.insert(decl);
+ return retval;
+}
+
+set<const NamedDecl*> GetClassRedecls(const NamedDecl* decl) {
+ const RecordDecl* record_decl = DynCastFrom(decl);
+ const ClassTemplateDecl* tpl_decl = DynCastFrom(decl);
+ if (tpl_decl)
+ record_decl = tpl_decl->getTemplatedDecl();
+ if (!record_decl)
+ return set<const NamedDecl*>();
+
+ set<const NamedDecl*> redecls;
+ for (TagDecl::redecl_iterator it = record_decl->redecls_begin();
+ it != record_decl->redecls_end(); ++it) {
+ const RecordDecl* redecl = cast<RecordDecl>(*it);
+ // If this decl is a friend decl, don't count it: friend decls
+ // don't serve as forward-declarations. (This should never
+ // happen, I think, but it sometimes does due to a clang bug:
+ // http://llvm.org/bugs/show_bug.cgi?id=8669). The only exception
+ // is made because every decl is a redecl of itself.
+ if (IsFriendDecl(redecl) && redecl != decl)
+ continue;
+
+ if (tpl_decl) { // need to convert back to a ClassTemplateDecl
+ CHECK_(isa<CXXRecordDecl>(redecl) &&
+ cast<CXXRecordDecl>(redecl)->getDescribedClassTemplate());
+ const CXXRecordDecl* cxx_redecl = cast<CXXRecordDecl>(redecl);
+ redecls.insert(cxx_redecl->getDescribedClassTemplate());
+ } else {
+ redecls.insert(redecl);
+ }
+ }
+ return redecls;
+}
+
+const NamedDecl* GetFirstRedecl(const NamedDecl* decl) {
+ const NamedDecl* first_decl = decl;
+ FullSourceLoc first_decl_loc(GetLocation(first_decl), *GlobalSourceManager());
+ set<const NamedDecl*> all_redecls = GetClassRedecls(decl);
+ if (all_redecls.empty()) // input is not a class or class template
+ return nullptr;
+
+ for (const NamedDecl* redecl : all_redecls) {
+ const FullSourceLoc redecl_loc(GetLocation(redecl), *GlobalSourceManager());
+ if (redecl_loc.isBeforeInTranslationUnitThan(first_decl_loc)) {
+ first_decl = redecl;
+ first_decl_loc = redecl_loc;
+ }
+ }
+ return first_decl;
+}
+
+const NamedDecl* GetNonfriendClassRedecl(const NamedDecl* decl) {
+ const RecordDecl* record_decl = DynCastFrom(decl);
+ const ClassTemplateDecl* tpl_decl = DynCastFrom(decl);
+ if (tpl_decl)
+ record_decl = tpl_decl->getTemplatedDecl();
+ // This check is so we return the input decl whenever possible.
+ if (!record_decl || !IsFriendDecl(record_decl))
+ return decl;
+
+ set<const NamedDecl*> all_redecls = GetClassRedecls(decl);
+ CHECK_(!all_redecls.empty() && "Uncaught non-class decl");
+ return *all_redecls.begin(); // arbitrary choice
+}
+
+bool DeclsAreInSameClass(const Decl* decl1, const Decl* decl2) {
+ if (!decl1 || !decl2)
+ return false;
+ if (decl1->getDeclContext() != decl2->getDeclContext())
+ return false;
+ return decl1->getDeclContext()->isRecord();
+}
+
+// --- Utilities for Type.
+
+const Type* GetTypeOf(const Expr* expr) {
+ return expr->getType().getTypePtr();
+}
+
+const Type* GetTypeOf(const CXXConstructExpr* expr) {
+ const Type* type = expr->getType().getTypePtr();
+ if (const clang::ArrayType* array_type = type->getAsArrayTypeUnsafe()) {
+ type = array_type->getElementType().getTypePtr();
+ }
+ return type;
+}
+
+const Type* GetTypeOf(const ValueDecl* decl) {
+ return decl->getType().getTypePtr();
+}
+
+const Type* GetTypeOf(const TypeDecl* decl) {
+ return decl->getTypeForDecl();
+}
+
+const Type* GetCanonicalType(const Type* type) {
+ QualType canonical_type = type->getCanonicalTypeUnqualified();
+ return canonical_type.getTypePtr();
+}
+
+const Type* RemoveElaboration(const Type* type) {
+ if (const ElaboratedType* elaborated_type = DynCastFrom(type))
+ return elaborated_type->getNamedType().getTypePtr();
+ else
+ return type;
+}
+
+bool IsTemplatizedType(const Type* type) {
+ return (type && isa<TemplateSpecializationType>(RemoveElaboration(type)));
+}
+
+bool IsClassType(const clang::Type* type) {
+ return (type && (isa<TemplateSpecializationType>(RemoveElaboration(type)) ||
+ isa<RecordType>(RemoveElaboration(type))));
+}
+
+const Type* RemoveSubstTemplateTypeParm(const Type* type) {
+ if (const SubstTemplateTypeParmType* subst_type = DynCastFrom(type))
+ return subst_type->getReplacementType().getTypePtr();
+ else
+ return type;
+}
+
+bool IsPointerOrReferenceAsWritten(const Type* type) {
+ type = RemoveElaboration(type);
+ return isa<PointerType>(type) || isa<LValueReferenceType>(type);
+}
+
+const Type* RemovePointersAndReferencesAsWritten(const Type* type) {
+ type = RemoveElaboration(type);
+ while (isa<PointerType>(type) ||
+ isa<LValueReferenceType>(type)) {
+ type = type->getPointeeType().getTypePtr();
+ }
+ return type;
+}
+
+const Type* RemovePointerFromType(const Type* type) {
+ if (!IsPointerOrReferenceAsWritten(type)) { // ah well, have to desugar
+ type = type->getUnqualifiedDesugaredType();
+ }
+ if (!IsPointerOrReferenceAsWritten(type)) {
+ return nullptr;
+ }
+ type = RemoveElaboration(type);
+ type = type->getPointeeType().getTypePtr();
+ return type;
+}
+
+// This follows typedefs/etc to remove pointers, if necessary.
+const Type* RemovePointersAndReferences(const Type* type) {
+ while (true) {
+ const Type* deref_type = RemovePointerFromType(type);
+ if (deref_type == nullptr) // type wasn't a pointer (or reference) type
+ break; // removed all pointers
+ type = deref_type;
+ }
+ return type;
+}
+
+const NamedDecl* TypeToDeclAsWritten(const Type* type) {
+ // Get past all the 'class' and 'struct' prefixes, and namespaces.
+ type = RemoveElaboration(type);
+
+ // Read past SubstTemplateTypeParmType (this can happen if a
+ // template function returns the tpl-arg type: e.g. for
+ // 'T MyFn<T>() {...}; MyFn<X>.a', the type of MyFn<X> will be a Subst.
+ type = RemoveSubstTemplateTypeParm(type);
+
+ CHECK_(!isa<ObjCObjectType>(type) && "IWYU doesn't support Objective-C");
+
+ // We have to be a bit careful about the order, because we want
+ // to keep typedefs as typedefs, so we do the record check last.
+ // We use getAs<> when we can -- unfortunately, it only exists
+ // for a few types so far.
+ if (const TypedefType* typedef_type = DynCastFrom(type)) {
+ return typedef_type->getDecl();
+ } else if (const InjectedClassNameType* icn_type
+ = type->getAs<InjectedClassNameType>()) {
+ return icn_type->getDecl();
+ } else if (const RecordType* record_type
+ = type->getAs<RecordType>()) {
+ return record_type->getDecl();
+ } else if (const TagType* tag_type = DynCastFrom(type)) {
+ return tag_type->getDecl(); // probably just enums
+ } else if (const TemplateSpecializationType* template_spec_type
+ = DynCastFrom(type)) {
+ // A non-concrete template class, such as 'Myclass<T>'
+ return template_spec_type->getTemplateName().getAsTemplateDecl();
+ } else if (const FunctionType* function_type = DynCastFrom(type)) {
+ // TODO(csilvers): is it possible to map from fn type to fn decl?
+ (void)function_type;
+ return nullptr;
+ } else {
+ return nullptr;
+ }
+}
+
+const Type* RemoveReferenceAsWritten(const Type* type) {
+ if (const LValueReferenceType* ref_type = DynCastFrom(type))
+ return ref_type->getPointeeType().getTypePtr();
+ else
+ return type;
+}
+
+bool HasImplicitConversionConstructor(const Type* type) {
+ type = RemoveElaboration(type); // get rid of the class keyword
+ if (isa<PointerType>(type))
+ return false; // can't implicitly convert to a pointer
+ if (isa<LValueReferenceType>(type) &&
+ !type->getPointeeType().isConstQualified())
+ return false; // can't implicitly convert to a non-const reference
+
+ type = RemoveReferenceAsWritten(type);
+ const NamedDecl* decl = TypeToDeclAsWritten(type);
+ if (!decl) // not the kind of type that has a decl (e.g. built-in)
+ return false;
+
+ const CXXRecordDecl* cxx_class = DynCastFrom(decl);
+ if (!cxx_class)
+ return false; // can't implicitly convert to a non-class type
+
+ return HasImplicitConversionCtor(cxx_class);
+}
+
+map<const clang::Type*, const clang::Type*>
+GetTplTypeResugarMapForClassNoComponentTypes(const clang::Type* type) {
+ map<const Type*, const Type*> retval;
+ type = RemoveElaboration(type); // get rid of the class keyword
+ const TemplateSpecializationType* tpl_spec_type = DynCastFrom(type);
+ if (!tpl_spec_type)
+ return retval;
+
+ // Get the list of template args that apply to the decls.
+ const NamedDecl* decl = TypeToDeclAsWritten(tpl_spec_type);
+ const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(decl);
+ if (!tpl_decl) // probably because tpl_spec_type is a dependent type
+ return retval;
+ const TemplateArgumentList& tpl_args
+ = tpl_decl->getTemplateInstantiationArgs();
+
+ // TemplateSpecializationType only includes explicitly specified
+ // types in its args list, so we start with that. Note that an
+ // explicitly specified type may fulfill multiple template args:
+ // template <typename R, typename A1> struct Foo<R(A1)> { ... }
+ set<unsigned> explicit_args; // indices into tpl_args we've filled
+ TypeEnumerator type_enumerator;
+ for (unsigned i = 0; i < tpl_spec_type->getNumArgs(); ++i) {
+ set<const Type*> arg_components
+ = type_enumerator.Enumerate(tpl_spec_type->getArg(i));
+ // Go through all template types mentioned in the arg-as-written,
+ // and compare it against each of the types in the template decl
+ // (the latter are all desugared). If there's a match, update
+ // the mapping.
+ for (const Type* type : arg_components) {
+ for (unsigned i = 0; i < tpl_args.size(); ++i) {
+ if (const Type* arg_type = GetTemplateArgAsType(tpl_args[i])) {
+ if (GetCanonicalType(type) == arg_type) {
+ retval[arg_type] = type;
+ VERRS(6) << "Adding a template-class type of interest: "
+ << PrintableType(type) << "\n";
+ explicit_args.insert(i);
+ }
+ }
+ }
+ }
+ }
+
+ // Now take a look at the args that were not filled explicitly.
+ for (unsigned i = 0; i < tpl_args.size(); ++i) {
+ if (ContainsKey(explicit_args, i))
+ continue;
+ if (const Type* arg_type = GetTemplateArgAsType(tpl_args[i])) {
+ retval[arg_type] = nullptr;
+ VERRS(6) << "Adding a template-class default type of interest: "
+ << PrintableType(arg_type) << "\n";
+ }
+ }
+
+ return retval;
+}
+
+map<const clang::Type*, const clang::Type*> GetTplTypeResugarMapForClass(
+ const clang::Type* type) {
+ return ResugarTypeComponents( // add in the decomposition of retval
+ GetTplTypeResugarMapForClassNoComponentTypes(type));
+}
+
+// --- Utilities for Stmt.
+
+bool IsAddressOf(const Expr* expr) {
+ if (const UnaryOperator* unary = DynCastFrom(expr->IgnoreParens()))
+ return unary->getOpcode() == clang::UO_AddrOf;
+ return false;
+}
+
+const Type* TypeOfParentIfMethod(const CallExpr* expr) {
+ // callee_expr is a MemberExpr if we're a normal class method, or
+ // DeclRefExpr if we're a static class method or an overloaded operator.
+ const Expr* callee_expr = expr->getCallee()->IgnoreParenCasts();
+ if (const MemberExpr* member_expr = DynCastFrom(callee_expr)) {
+ const Type* class_type = GetTypeOf(member_expr->getBase());
+ // For class->member(), class_type is a pointer.
+ return RemovePointersAndReferencesAsWritten(class_type);
+ } else if (const DeclRefExpr* ref_expr = DynCastFrom(callee_expr)) {
+ if (ref_expr->getQualifier()) { // static methods like C<T>::a()
+ return ref_expr->getQualifier()->getAsType();
+ }
+ }
+ return nullptr;
+}
+
+const Expr* GetFirstClassArgument(CallExpr* expr) {
+ if (const FunctionDecl* callee_decl = expr->getDirectCallee()) {
+ if (isa<CXXMethodDecl>(callee_decl)) {
+ // If a method is called, return 'this'.
+ return expr->getArg(0);
+ }
+ // Handle free functions.
+ CHECK_(callee_decl->getNumParams() == expr->getNumArgs() &&
+ "Require one-to-one match between call arguments and decl parameters");
+ int params_count = callee_decl->getNumParams();
+ for (int i = 0; i < params_count; i++) {
+ // View argument types from the perspective of function declaration,
+ // not from the caller's perspective. For example, function parameter
+ // can have template type but function argument is not necessarily
+ // a template when the function is called.
+ const Type* param_type = GetTypeOf(callee_decl->getParamDecl(i));
+ param_type = RemovePointersAndReferencesAsWritten(param_type);
+ // Make sure we do the right thing given a function like
+ // template <typename T> void operator>>(const T& x, ostream& os);
+ // In this case ('myclass >> os'), we want to be returning the
+ // type of os, not of myclass, and we do, because myclass will be
+ // a SubstTemplateTypeParmType, not a RecordType.
+ if (isa<SubstTemplateTypeParmType>(param_type))
+ continue;
+ // See through typedefs.
+ param_type = param_type->getUnqualifiedDesugaredType();
+ if (isa<RecordType>(param_type) ||
+ isa<TemplateSpecializationType>(param_type)) {
+ return expr->getArg(i);
+ }
+ }
+ }
+ return nullptr;
+}
+
+const CXXDestructorDecl* GetDestructorForDeleteExpr(const CXXDeleteExpr* expr) {
+ const Type* type = expr->getDestroyedType().getTypePtrOrNull();
+ // type is nullptr when deleting a dependent type: 'T foo; delete foo'
+ if (type == nullptr)
+ return nullptr;
+ const NamedDecl* decl = TypeToDeclAsWritten(type);
+ if (const CXXRecordDecl* cxx_record = DynCastFrom(decl))
+ return cxx_record->getDestructor();
+ return nullptr;
+}
+
+const CXXDestructorDecl* GetSiblingDestructorFor(
+ const CXXConstructorDecl* ctor) {
+ return ctor ? ctor->getParent()->getDestructor() : nullptr;
+}
+
+const CXXDestructorDecl* GetSiblingDestructorFor(
+ const CXXConstructExpr* ctor_expr) {
+ return GetSiblingDestructorFor(ctor_expr->getConstructor());
+}
+
+const FunctionType* GetCalleeFunctionType(CallExpr* expr) {
+ const Type* callee_type = expr->getCallee()->getType().getTypePtr();
+ if (const PointerType* ptr_type
+ = callee_type->getAs<PointerType>()) {
+ callee_type = ptr_type->getPointeeType().getTypePtr();
+ } else if (const BlockPointerType* bptr_type
+ = callee_type->getAs<BlockPointerType>()) {
+ callee_type = bptr_type->getPointeeType().getTypePtr();
+ } else if (const MemberPointerType* mptr_type
+ = callee_type->getAs<MemberPointerType>()) {
+ callee_type = mptr_type->getPointeeType().getTypePtr();
+ }
+ return callee_type->getAs<FunctionType>();
+}
+
+bool IsCastToReferenceType(const CastExpr* expr) {
+ if (const ExplicitCastExpr* explicit_cast = DynCastFrom(expr)) {
+ return explicit_cast->getTypeAsWritten()->isReferenceType();
+ } else if (const ImplicitCastExpr* implicit_cast = DynCastFrom(expr)) {
+ return implicit_cast->getValueKind() == clang::VK_LValue;
+ }
+ CHECK_UNREACHABLE_("Unexpected type of cast expression");
+}
+
+TemplateArgumentListInfo GetExplicitTplArgs(const Expr* expr) {
+ TemplateArgumentListInfo explicit_tpl_args;
+ if (const DeclRefExpr* decl_ref = DynCastFrom(expr))
+ decl_ref->copyTemplateArgumentsInto(explicit_tpl_args);
+ else if (const MemberExpr* member_expr = DynCastFrom(expr))
+ member_expr->copyTemplateArgumentsInto(explicit_tpl_args);
+ else if (const OverloadExpr* overload_expr = DynCastFrom(expr))
+ overload_expr->copyTemplateArgumentsInto(explicit_tpl_args);
+ else if (const DependentScopeDeclRefExpr* dependent_decl_ref = DynCastFrom(expr))
+ dependent_decl_ref->copyTemplateArgumentsInto(explicit_tpl_args);
+ return explicit_tpl_args;
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_ast_util.h b/iwyu_ast_util.h
new file mode 100644
index 0000000..dd3f5e0
--- /dev/null
+++ b/iwyu_ast_util.h
@@ -0,0 +1,805 @@
+//===--- iwyu_ast_util.h - clang-AST utilities for include-what-you-use ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Utilities that make it easier to work with Clang's AST.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_AST_UTIL_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_AST_UTIL_H_
+
+#include <map> // for map
+#include <set> // for set
+#include <string> // for string
+
+#include "port.h" // for CHECK_
+#include "llvm/Support/Casting.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/Stmt.h"
+#include "clang/AST/TemplateBase.h"
+#include "clang/AST/Type.h"
+#include "clang/AST/TypeLoc.h"
+#include "clang/Basic/SourceLocation.h"
+
+namespace clang {
+class CXXConstructExpr;
+class CXXConstructorDecl;
+class CXXDeleteExpr;
+class CXXDestructorDecl;
+class CXXMethodDecl;
+class CXXRecordDecl;
+class CallExpr;
+class CastExpr;
+class ClassTemplateDecl;
+class Expr;
+class FunctionDecl;
+class NamedDecl;
+class SourceManager;
+class TagDecl;
+class TemplateDecl;
+class TemplateName;
+class TranslationUnitDecl;
+class TypeDecl;
+class ValueDecl;
+struct ASTTemplateArgumentListInfo;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::map;
+using std::set;
+using std::string;
+
+//------------------------------------------------------------
+// ASTNode and friends.
+
+// ASTNode represents a single node of the AST tree. An AST node may be
+// a statement, declaration, type, template-name, etc. ASTNode keeps
+// track of its parent node, as we do AST traversal, allowing queries
+// on the "context" of a node.
+//
+// We also store some state that's useful for iwyu. For instance,
+// we store whether a node is in a 'forward-declarable' context
+// (such as a function parameter), meaning all types seen below
+// that node are legal to fowrard-declare according to c++.
+class ASTNode {
+ public:
+ // In each case, the caller owns the object, and must guarantee it
+ // lives for at least as long as the ASTNode object does.
+ ASTNode(const clang::Decl* decl, const clang::SourceManager& sm)
+ : kind_(kDeclKind), as_decl_(decl),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::Stmt* stmt, const clang::SourceManager& sm)
+ : kind_(kStmtKind), as_stmt_(stmt),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::Type* type, const clang::SourceManager& sm)
+ : kind_(kTypeKind), as_type_(type),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::TypeLoc* typeloc, const clang::SourceManager& sm)
+ : kind_(kTypelocKind), as_typeloc_(typeloc),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::NestedNameSpecifier* nns, const clang::SourceManager& sm)
+ : kind_(kNNSKind), as_nns_(nns),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::NestedNameSpecifierLoc* nnsloc,
+ const clang::SourceManager& sm)
+ : kind_(kNNSLocKind), as_nnsloc_(nnsloc),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::TemplateName* template_name,
+ const clang::SourceManager& sm)
+ : kind_(kTemplateNameKind), as_template_name_(template_name),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::TemplateArgument* template_arg,
+ const clang::SourceManager& sm)
+ : kind_(kTemplateArgumentKind), as_template_arg_(template_arg),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+ ASTNode(const clang::TemplateArgumentLoc* template_argloc,
+ const clang::SourceManager& sm)
+ : kind_(kTemplateArgumentLocKind), as_template_argloc_(template_argloc),
+ parent_(nullptr), in_fwd_decl_context_(false), source_manager_(sm) { }
+
+ // A 'forward-declare' context means some parent of us can be
+ // forward-declared, which means we can be too. e.g. in
+ // MyClass<Foo>* x, Foo is fwd-declarable because MyClass<Foo> is.
+ bool in_forward_declare_context() const { return in_fwd_decl_context_; }
+ void set_in_forward_declare_context(bool b) { in_fwd_decl_context_ = b; }
+
+ const ASTNode* parent() const { return parent_; }
+ void SetParent(const ASTNode* parent) {
+ parent_ = parent;
+ if (parent) // We inherit this from parent.
+ set_in_forward_declare_context(parent->in_forward_declare_context());
+ }
+
+ // The number of nodes above this node in the AST tree.
+ int depth() const {
+ int depth = 0;
+ for (const ASTNode* node = this; node != nullptr; node = node->parent_)
+ depth++;
+ return depth - 1; // don't count "this"
+ }
+
+ // If this node knows its location, returns it. If not, and it's
+ // likely its location is very close (say, within a few lines) of
+ // its parent, ask its parent. Unfortunately, there's nothing which
+ // tells us whether a parent's location is very close to its child.
+ // We assume that they always are (empirically this is true)
+ // *except* for the case the parent is in a macro: then it often
+ // happens that the parent belongs at the spelling location, while
+ // the child is a macro arg and hence belongs in the instantiation
+ // location. Those could be far away, even in different files. For
+ // example: '#define NEW_FUNC(cls) void Func(cls* x) {}'. Func is
+ // at the spelling loc, but its child Type 'cls' is at the
+ // instantiation loc. In that case, or if *no* ancestor of the
+ // current node knows its location, returns an invalid SourceLocation.
+ clang::SourceLocation GetLocation() const;
+
+ // Returns true if this node points to the exact same
+ // decl/typeloc/etc as the one you pass in. For Decl/Stmt/Type, the
+ // pointer is canonical (every instance of type X has the same
+ // clang::Type*). But for most, the value is canonical (each type
+ // has the same QualType but not QualType*). The IsA<> checks are
+ // needed to avoid false matches when target_node is nullptr.
+ bool ContentIs(const clang::Decl* target_node) const {
+ return IsA<clang::Decl>() && GetAs<clang::Decl>() == target_node;
+ }
+ bool ContentIs(const clang::Stmt* target_node) const {
+ return IsA<clang::Stmt>() && GetAs<clang::Stmt>() == target_node;
+ }
+ bool ContentIs(const clang::Type* target_node) const {
+ return IsA<clang::Type>() && GetAs<clang::Type>() == target_node;
+ }
+ bool ContentIs(const clang::TypeLoc* target_node) const {
+ if (!IsA<clang::TypeLoc>())
+ return false;
+ const clang::TypeLoc* type_loc = GetAs<clang::TypeLoc>();
+ if (type_loc == nullptr || target_node == nullptr)
+ return type_loc == target_node;
+ return *type_loc == *target_node;
+ }
+ // We don't define ContentIs() for other kinds of AST nodes
+ // (e.g. TemplateName) as it's non-trivial (Clang doesn't define
+ // equality comparison functions for them) and we don't need that
+ // yet.
+
+ // Returns true if the current node or any ancestor of it contains
+ // the exact same thing as ptr. One use of this is to check for
+ // recursion.
+ template<typename T> bool StackContainsContent(const T* ptr) const {
+ for (const ASTNode* node = this; node != nullptr; node = node->parent_) {
+ if (node->ContentIs(ptr))
+ return true;
+ }
+ return false;
+ }
+
+ // Generation 0 == you, 1 == parent, etc.
+ template<typename To> const To* GetAncestorAs(int generation) const {
+ const ASTNode* target_node = this;
+ for (; generation > 0; --generation) {
+ if (target_node->parent_ == nullptr)
+ return nullptr;
+ target_node = target_node->parent_;
+ }
+ // DynCast needs a dummy argument of type To* to help its resolution.
+ const To* dummy = nullptr;
+ return target_node->DynCast<To>(dummy);
+ }
+
+ // Convenience methods.
+
+ template<typename To> bool AncestorIsA(int generation) const {
+ return GetAncestorAs<To>(generation) != nullptr;
+ }
+
+ // Returns true if this node or any of its ancestors contains a T*.
+ template<typename T> bool HasAncestorOfType() const {
+ for (const ASTNode* node = this; node != nullptr; node = node->parent_) {
+ if (node->IsA<T>())
+ return true;
+ }
+ return false;
+ }
+
+ template<typename To> const To* GetParentAs() const {
+ return GetAncestorAs<To>(1);
+ }
+
+ template<typename To> bool ParentIsA() const {
+ return AncestorIsA<To>(1);
+ }
+
+ template<typename To> const To* GetAs() const {
+ return GetAncestorAs<To>(0);
+ }
+
+ template<typename To> bool IsA() const {
+ return AncestorIsA<To>(0);
+ }
+
+ private:
+ enum NodeKind {
+ kDeclKind, kStmtKind, kTypeKind, kTypelocKind, kNNSKind, kNNSLocKind,
+ kTemplateNameKind, kTemplateArgumentKind, kTemplateArgumentLocKind
+ };
+
+ // Returns a casted pointer if this object actually is of the given
+ // type (or a subclass of the given type), and nullptr otherwise. We
+ // have to use overloading on To's kind_, in these helper
+ // methods, in order to get llvm's dyn_cast to compile -- it gets
+ // upset (at compile time, sadly) if from-type and to-type aren't in
+ // the same type hierarchy. So To must be specified both in the
+ // template arg and in the method parameter.
+ template<typename To> const To* DynCast(const clang::Decl*) const {
+ if (kind_ != kDeclKind) return nullptr;
+ return ::llvm::dyn_cast<To>(as_decl_);
+ }
+ template<typename To> const To* DynCast(const clang::Stmt*) const {
+ if (kind_ != kStmtKind) return nullptr;
+ return ::llvm::dyn_cast<To>(as_stmt_);
+ }
+ template<typename To> const To* DynCast(const clang::Type*) const {
+ // We also will cast ourselves to a type if we're a typeloc.
+ // This simplifies a lot of code lower down that doesn't care
+ // to distinguish. For code that *does* care to distinguish,
+ // it should check for typelocs first:
+ // if (node.IsA<FooTypeLoc>()) ... else if (node.IsA<FooType>()) ...
+ if (kind_ == kTypelocKind)
+ return ::llvm::dyn_cast<To>(as_typeloc_->getTypePtr());
+ if (kind_ != kTypeKind) return nullptr;
+ return ::llvm::dyn_cast<To>(as_type_);
+ }
+ template<typename To> const To* DynCast(const clang::TypeLoc*) const {
+ if (kind_ != kTypelocKind) return nullptr;
+ return ::llvm::dyn_cast<To>(as_typeloc_);
+ }
+ template<typename To> const To* DynCast(
+ const clang::NestedNameSpecifier*) const {
+ // Like Type, this will cast to NNS if we're an NNSLoc. For code
+ // that cares to distinguish, it should check for nnslocs first.
+ if (kind_ == kNNSLocKind)
+ return as_nnsloc_->getNestedNameSpecifier();
+ if (kind_ != kNNSKind) return nullptr;
+ return as_nns_;
+ }
+ template<typename To> const To* DynCast(
+ const clang::NestedNameSpecifierLoc*) const {
+ if (kind_ != kNNSLocKind) return nullptr;
+ return as_nnsloc_;
+ }
+ template<typename To> const To* DynCast(const clang::TemplateName*) const {
+ if (kind_ != kTemplateNameKind) return nullptr;
+ return as_template_name_;
+ }
+ template<typename To> const To* DynCast(
+ const clang::TemplateArgument*) const {
+ // We also will cast ourselves to a templateargument if we're a
+ // templateargumentloc. This simplifies a lot of code lower down
+ // that doesn't care to distinguish. For code that *does* care to
+ // distinguish, it should check for typelocs first.
+ if (kind_ == kTemplateArgumentLocKind)
+ return &as_template_argloc_->getArgument();
+ if (kind_ != kTemplateArgumentKind) return nullptr;
+ return as_template_arg_;
+ }
+ template<typename To> const To* DynCast(
+ const clang::TemplateArgumentLoc*) const {
+ if (kind_ != kTemplateArgumentLocKind) return nullptr;
+ return as_template_argloc_;
+ }
+ // We also allow casting to void*
+ template<typename Ignored> const void* DynCast(const void*) const {
+ switch (kind_) { // this is just to avoid aliasing violations.
+ case kDeclKind: return as_decl_;
+ case kStmtKind: return as_stmt_;
+ case kTypeKind: return as_type_;
+ case kTypelocKind: return as_typeloc_;
+ case kNNSKind: return as_nns_;
+ case kNNSLocKind: return as_nnsloc_;
+ case kTemplateNameKind: return as_template_name_;
+ case kTemplateArgumentKind: return as_template_arg_;
+ case kTemplateArgumentLocKind: return as_template_argloc_;
+ }
+ CHECK_UNREACHABLE_("Unknown kind");
+ }
+
+ // If this node is of a type that knows its location, sets loc and
+ // returns true, otherwise returns false and leaves loc unchanged.
+ bool FillLocationIfKnown(clang::SourceLocation* loc) const;
+
+ const NodeKind kind_;
+ union {
+ const clang::Decl* as_decl_;
+ const clang::Stmt* as_stmt_;
+ const clang::Type* as_type_;
+ const clang::TypeLoc* as_typeloc_;
+ const clang::NestedNameSpecifier* as_nns_;
+ const clang::NestedNameSpecifierLoc* as_nnsloc_;
+ const clang::TemplateName* as_template_name_;
+ const clang::TemplateArgument* as_template_arg_;
+ const clang::TemplateArgumentLoc* as_template_argloc_;
+ };
+ const ASTNode* parent_;
+ bool in_fwd_decl_context_;
+ const clang::SourceManager& source_manager_;
+};
+
+// --- Helper classes for ASTNode.
+
+// An object of this type modifies a given variable in the constructor
+// and restores its original value in the destructor.
+template<typename T> class ValueSaver {
+ public:
+ ValueSaver(T* p, const T& newval) : ptr_(p), oldval_(*ptr_) {
+ *ptr_ = newval;
+ }
+ // The one-arg version just uses the current value as newval.
+ explicit ValueSaver(T* p) : ptr_(p), oldval_(*ptr_) { }
+
+ ~ValueSaver() { *ptr_ = oldval_; }
+
+ private:
+ T* const ptr_;
+ const T oldval_;
+};
+
+// An object of this type updates current_ast_node_ to be the given
+// node, and sets the given node's parent to be the old
+// current_ast_node_. It then undoes this work in its destructor.
+// The caller owns both old_current_node and new_current_node, and
+// must make sure each of them lives at least as long as this object.
+class CurrentASTNodeUpdater {
+ public:
+ CurrentASTNodeUpdater(ASTNode** old_current_node,
+ ASTNode* new_current_node)
+ : old_current_node_value_(*old_current_node),
+ node_saver_(old_current_node, new_current_node) {
+ new_current_node->SetParent(old_current_node_value_);
+ }
+
+ private:
+ ASTNode* const old_current_node_value_;
+ const ValueSaver<ASTNode*> node_saver_;
+};
+
+// --- Utilities for ASTNode.
+
+// See if a given ast_node is a 'real' ElaboratedType(Loc). (An
+// elaboration is 'class Foo myvar' instead of just 'Foo myvar'.)
+// We avoid 'fake' elaborations that are caused because clang also
+// uses ElaboratedType for namespaces ('ns::Foo myvar').
+bool IsElaborationNode(const ASTNode* ast_node);
+
+// See if a given ast_node is a qualified name part of an ElaboratedType
+// node (e.g. 'class ns::Foo x', 'class ::Global x' or 'class Outer::Inner x'.)
+bool IsQualifiedNameNode(const ASTNode* ast_node);
+
+// Return true if the given ast_node is inside a C++ method body. Do
+// this by walking up the AST tree until you find a CXXMethodDecl,
+// then see if the node just before you reached it is the body. We
+// also check if the node is in an initializer (either explicitly or
+// implicitly), or the implicit (non-body) code of a destructor.
+bool IsNodeInsideCXXMethodBody(const ASTNode* ast_node);
+
+// Return true if we're a nested class as written, that is, we're a
+// class decl inside another class decl. The parent class may be
+// templated, but we should not be. (We could extend the function to
+// handle that case, but there's been no need yet.)
+bool IsNestedClassAsWritten(const ASTNode* ast_node);
+
+// Is ast_node the 'D' in the following:
+// template<template <typename A> class T = D> class C { ... }
+// ('D' might be something like 'vector').
+bool IsDefaultTemplateTemplateArg(const ASTNode* ast_node);
+
+// Returns true if this node is a ConstructExpr that is being used to
+// construct a field in a class (that is, it's part of a constructor
+// initializer list).
+bool IsCXXConstructExprInInitializer(const ASTNode* ast_node);
+
+// Returns true if this node is a CXXConstructExpr in CXXNewExpr.
+bool IsCXXConstructExprInNewExpr(const ASTNode* ast_node);
+
+// If ASTNode is of a kind that has a qualifier (something that
+// comes before the ::), return that, else return nullptr.
+const clang::NestedNameSpecifier* GetQualifier(const ASTNode* ast_node);
+
+// Returns true if any parent is a typedef: my_typedef.a, or
+// MyTypedef::a, or MyTypedef::subclass::a, etc. Note it does
+// *not* return true if the ast_node itself is a typedef.
+bool IsMemberOfATypedef(const ASTNode* ast_node);
+
+// Returns the decl-context of the deepest decl in the ast-chain.
+const clang::DeclContext* GetDeclContext(const ASTNode* ast_node);
+
+//------------------------------------------------------------
+// Helper functions for working with raw Clang AST nodes.
+
+// --- Printers.
+
+string PrintableLoc(clang::SourceLocation loc);
+string PrintableSourceRange(clang::SourceRange range);
+string PrintableDecl(const clang::Decl* decl, bool terse=true);
+string PrintableStmt(const clang::Stmt* stmt);
+string PrintableType(const clang::Type* type);
+string PrintableTypeLoc(const clang::TypeLoc& typeloc);
+string PrintableNestedNameSpecifier(const clang::NestedNameSpecifier* nns);
+string PrintableTemplateName(const clang::TemplateName& tpl_name);
+string PrintableTemplateArgument(const clang::TemplateArgument& arg);
+string PrintableTemplateArgumentLoc(const clang::TemplateArgumentLoc& arg);
+string PrintableASTNode(const ASTNode* node);
+// This prints to errs(). It's useful for debugging (e.g. inside gdb).
+void PrintASTNode(const ASTNode* node);
+void PrintStmt(const clang::Stmt* stmt);
+
+// Written name means name without unwritten scopes. Unwritten scopes are
+// anonymous and inline namespaces. Always consider using
+// GetWrittenQualifiedNameAsString instead of
+// NamedDecl::getQualifiedNameAsString.
+string GetWrittenQualifiedNameAsString(const clang::NamedDecl* named_decl);
+
+// --- Type conversion utilities.
+
+namespace internal {
+
+// For implementing DynCastFrom() -- don't use directly.
+template <typename T>
+class DynCastPtr {
+ public:
+ explicit DynCastPtr(T* ptr) : ptr_(ptr) { }
+
+ template <typename U> operator U*() const {
+ return ::llvm::dyn_cast_or_null<U>(ptr_);
+ }
+
+ private:
+ T* ptr_;
+};
+
+} // namespace internal
+
+// dyn_cast<> and dyn_cast_or_null<> require the user to write the
+// type of the target pointer, which is redundant when the result is
+// immediately assigned to a newly declared pointer variable of the
+// target type (the typical case). DynCastFrom() lets us omit the
+// target type, e.g.
+//
+// if (const CXXConstructExpr* expr = DynCastFrom(source_expr)) ...
+//
+// instead of
+//
+// if (const CXXConstructExpr* expr =
+// dyn_cast_or_null<CXXConstructExpr>(source_expr)) ...
+//
+// For readability, DynCastFrom() should only be used as the
+// initializer of a variable declaration, where the target type is
+// obvious.
+template <typename T>
+internal::DynCastPtr<T> DynCastFrom(T* ptr) {
+ return internal::DynCastPtr<T>(ptr);
+}
+
+// --- Utilities for Decl.
+
+// Returns true if the decl is for a templatized function.
+bool IsTemplatizedFunctionDecl(const clang::FunctionDecl* decl);
+
+// Returns true if the given class has at least one implicit
+// conversion constructor.
+bool HasImplicitConversionCtor(const clang::CXXRecordDecl* cxx_class);
+
+// Returns true if the given method is an override with covariant return type
+// compared to its base.
+bool HasCovariantReturnType(const clang::CXXMethodDecl* method_decl);
+
+// If this decl is a (possibly templatized) class, return the decl
+// that defines the class, if present. Otherwise return nullptr.
+const clang::RecordDecl* GetDefinitionForClass(const clang::Decl* decl);
+
+// Given a class, returns a SourceRange that encompasses the beginning
+// of the class declaration (including template<> prefix, etc) to the
+// class name. Used to determine where forward-declares are.
+clang::SourceRange GetSourceRangeOfClassDecl(const clang::Decl* decl);
+
+// Collect all late-parsed function templates in a translation unit.
+set<clang::FunctionDecl*> GetLateParsedFunctionDecls(
+ clang::TranslationUnitDecl* decl);
+
+// One can't have partial template specialization or default template
+// args for function templates, but they're complicated in their own
+// way: they can have deduced template arguments (deduced from the
+// function arguments). When a templated function call does not
+// specify the template arguments explicitly, but instead derives them
+// from the function arguments, clang canonicalizes (desugars) the
+// template args. For
+// template<class T> void MyFunc(T t) { ... }
+// MyFunc(typedef_type)
+// clang will say this is a call to MyFunc<canonical_type>(). Also:
+// MyFunc(my_int_vector)
+// clang will say this is MyFunc<vector<int, alloc<int>>(), with
+// no indication that alloc<int> is actually a default parameter.
+// Equally bad:
+// template<class T> void OtherFunc(MyClass<T> t) { ... }
+// typedef MyClass<Foo> FooClass;
+// OtherFunc(my_foo_class);
+// clang will see T as MyClass<Foo> even though my_foo_class hides the
+// use of Foo through the typedef.
+// This routine attempts to solve all these problems by looking at
+// the type-as-written for the actual arguments (and return value) to
+// try to reverse engineer the derived-argument matching that was
+// done. (It's easy in the rare cases the template args are
+// explicitly specified.) It returns a map from the unsugared
+// (canonical) types of each template argument to its sugared
+// (as-written) type. For now we ignore non-type template args.
+// We also include mappings for component types: if we have an entry
+// 'vector<TypedefType>' -> 'vector<Foo>', we also add an entry
+// 'TypedefType' -> 'Foo'.
+// NOTE: This routine is far from perfect. To really do this right,
+// we'd need to refactor SemaTemplateDeduction to take an argument to
+// not canonicalize deduced template arguments.
+// calling_expr should be a CallExpr, CXXConstructExpr, or DeclRefExpr.
+map<const clang::Type*, const clang::Type*> GetTplTypeResugarMapForFunction(
+ const clang::FunctionDecl* decl, const clang::Expr* calling_expr);
+
+// If class_decl is instantiated from a class template,
+// returns the decl for that template; otherwise returns class_decl.
+// As an example, consider this code:
+// template<class T> class Foo { ... }; // template decl
+// template<> class Foo<int> { ... }; // explicit specialization
+// template class Foo<char>; // note: no body specified
+// Foo<int> v1;
+// Foo<float> v2;
+// Foo<char> v3;
+// The types Foo<int>, Foo<float>, and Foo<char> all have a
+// corresponding decl. In the case of Foo<int>, the decl is the
+// explicit specialization. This is *not* a decl that this routine
+// deals with; the routine will just return its argument in this case.
+// But in the case of Foo<float>, the decl is an implicit
+// instantiation of Foo<T>, and this routine will return the decl for
+// Foo<T>. Foo<char> is a rarer corner case: an explicit
+// instantiation definition (it just causes code for that template
+// case to be generated). It is treated the same as Foo<float>: we
+// return the template decl, which provides the actual class body.
+// We try to return a decl that's also a definition, when possible.
+const clang::NamedDecl* GetInstantiatedFromDecl(
+ const clang::CXXRecordDecl* class_decl);
+
+// For an implicitly instantiated templated c++ class -- that is, a
+// class like vector<int> that isn't explicitly written in the source
+// code but instead derived from vector<T> -- returns the
+// class-as-written (vector<T>, in this case). For an implicitly
+// instantiated template function -- Fn<int> when all that is written
+// in the source code is Fn<T> -- returns the function-as-written.
+// (In each case, prefers the definition of the class or function
+// as-written, rather than a forward-declaration.) Otherwise, returns
+// the original input.
+const clang::NamedDecl* GetDefinitionAsWritten(const clang::NamedDecl* decl);
+
+// True if this decl is for default (not placement-new)
+// new/delete/new[]/delete[] from <new>. The second argument
+// is the quoted form of the file the decl comes from, e.g. '<new>'.
+bool IsDefaultNewOrDelete(const clang::FunctionDecl* decl,
+ const string& decl_loc_as_quoted_include);
+
+// Returns true if this decl is part of a friend decl.
+bool IsFriendDecl(const clang::Decl* decl);
+
+// Returns true if a named decl looks like a forward-declaration of a
+// class (rather than a definition, a friend declaration, or an 'in
+// place' declaration like 'struct Foo' in 'void MyFunc(struct Foo*);'
+// Always returns false for enums.
+bool IsForwardDecl(const clang::NamedDecl* decl);
+
+// Returns true if this decl is defined inside another class/struct.
+// Unlike IsNestedClassAsWritten(), which works on an ASTNode, this
+// function considers decl to be nested even if it's not syntactically
+// written inside its outer class (that is, 'class Foo::Bar {...}' is
+// considered nested, even though it's not written inside Foo).
+bool IsNestedClass(const clang::TagDecl* decl);
+
+bool HasDefaultTemplateParameters(const clang::TemplateDecl* decl);
+
+// For any decl that inherits from clang::Redeclarable *except* for
+// classes and class templates -- enums, typedefs, functions, vars --
+// returns all the declarations of decl. For any other decl, the
+// output is just the input decl. Output decls are guaranteed to be
+// of the same type as the input Decl. Because iwyu fundamentally
+// treats classes different from other redeclarable types, it has
+// its own separate function. (If that proves to be annoying, we
+// can merge them.)
+set<const clang::NamedDecl*> GetNonclassRedecls(const clang::NamedDecl* decl);
+
+// Given a class, returns a set of all declarations of that class
+// (forward-declarations and, if present, the definition). This
+// accepts both RecordDecls and ClassTemplateDecls -- the return Decls
+// are guaranteed to be of the same type as the input Decl. Returns
+// the empty set if the input is not a RecordDecl or
+// ClassTemplateDecl. Otherwise, always returns at least one element
+// (since the input decl is its own redecl).
+set<const clang::NamedDecl*> GetClassRedecls(const clang::NamedDecl* decl);
+
+// Returns the redecl of decl that occurs first in the translation
+// unit (that is, is the first one you'd see if you did 'cc -E').
+// Returns nullptr if the input is not a RecordDecl or ClassTemplateDecl.
+const clang::NamedDecl* GetFirstRedecl(const clang::NamedDecl* decl);
+
+// Given a class or class template, returns the declaration of that
+// class that specifies the values of the default template arguments.
+// If there are no default template arguments, returns nullptr.
+const clang::ClassTemplateDecl* GetClassRedeclSpecifyingDefaultTplArgs(
+ const clang::ClassTemplateDecl* decl);
+
+// Picks one redecl from GetClassRedecls() arbitrarily.
+// This is used to recover from the clang bug that mixes friend decls
+// with 'real' redecls (http://llvm.org/bugs/show_bug.cgi?id=8669);
+// this function returns a 'real' redecl. If the input decl is a
+// friend decl, returns an arbitrary non-friend redecl of it;
+// otherwise returns decl itself.
+// TODO(csilvers): remove once PR 8669 is fixed.
+const clang::NamedDecl* GetNonfriendClassRedecl(const clang::NamedDecl* decl);
+
+// Returns true if the innermost DeclContext for each decl is the
+// same, and it's a class (or struct).
+bool DeclsAreInSameClass(const clang::Decl* decl1, const clang::Decl* decl2);
+
+// --- Utilities for Type.
+
+const clang::Type* GetTypeOf(const clang::Expr* expr);
+// Returns the type of the constructed class.
+const clang::Type* GetTypeOf(const clang::CXXConstructExpr* expr);
+// Returns the type of the given variable, function, or enum declaration.
+const clang::Type* GetTypeOf(const clang::ValueDecl* decl);
+// ...or class, struct, union, enum, typedef, or template type.
+const clang::Type* GetTypeOf(const clang::TypeDecl* decl);
+
+// Template parameters are always reduced to the canonical type.
+const clang::Type* GetCanonicalType(const clang::Type* type);
+
+// A 'component' of a type is a type beneath it in the AST tree.
+// So 'Foo*' has component 'Foo', as does 'vector<Foo>', while
+// vector<pair<Foo, Bar>> has components pair<Foo,Bar>, Foo, and Bar.
+set<const clang::Type*> GetComponentsOfType(const clang::Type* type);
+
+// The ElaborationType -- which says whether a type is preceded by
+// 'class' or 'struct' ('class Foo'), or whether the type-name has a
+// namespace ('ns::Foo') -- often pops where it's not wanted. This
+// removes the elaboration if it exists, else it's a noop. Note that
+// if the type has both kinds of elaborations ('struct ns::Foo'), they
+// will both be removed.
+const clang::Type* RemoveElaboration(const clang::Type* type);
+
+// Returns true if the type has any template arguments.
+bool IsTemplatizedType(const clang::Type* type);
+
+// Returns true if the type is a RecordType or a TemplateSpecializationType.
+bool IsClassType(const clang::Type* type);
+
+// Read past SubstTemplateTypeParmType to the underlying type, if type
+// is itself a SubstTemplateTypeParmType. Thus: T is converted to int
+// if we are parsing a template instantiated with T being int.
+// However, vector<T> is *not* converted to vector<int>.
+const clang::Type* RemoveSubstTemplateTypeParm(const clang::Type* type);
+
+// Returns true if type is a pointer type (pointer or reference,
+// looking through elaborations like 'class Foo*' (vs 'Foo*'),
+// but *not* following typedefs (which is why we can't just use
+// type->isPointerType()).
+// TODO(csilvers): what about array-type?
+bool IsPointerOrReferenceAsWritten(const clang::Type* type);
+
+const clang::Type* RemoveReferenceAsWritten(const clang::Type* type);
+
+// Gets rid of all the pointers and references to get to the 'base'
+// type. Also removes all elaborations (like 'class' keyword). We
+// can't just use the default desugar() routine, because we *don't*
+// want to look through typedefs.
+const clang::Type* RemovePointersAndReferencesAsWritten(
+ const clang::Type* type);
+
+// Remove one layer of pointers (or references) from type. We go
+// through typedefs and the like, but only if we have to in order to
+// figure out the dereferenced type, which is why we don't just use
+// desugar(). Returns nullptr if not a pointer.
+const clang::Type* RemovePointerFromType(const clang::Type* type);
+
+// This follows typedefs/etc to remove pointers, if necessary.
+const clang::Type* RemovePointersAndReferences(const clang::Type* type);
+
+// To the best of our ability, maps a type to a declaration of that
+// type *that is written in the source code*. For most types, of
+// course, declarations are always written, but for implicit template
+// specializations they typically aren't. For instance, if the type
+// is vector<int>, there is a decl for 'class vector<int>', but it's
+// not written anywhere; what is written is generic code, for
+// 'class vector<T>'. 'class vector<int>' is an implicit declaration,
+// constructed at need. This routine does not return that implicit
+// declaration.
+// If the type is a substituted template parameter, we get a
+// decl for the substituted type. That is, for this code:
+// template<class T> void MyFunc() { T foo; }
+// MyFunc<MyClass>();
+// If we're evaluating MyFunc<MyClass>() and see the type that's in
+// the function body, this function returns a decl for MyClass.
+// If the type is built-in, or otherwise doesn't have a decl,
+// this function returns nullptr.
+const clang::NamedDecl* TypeToDeclAsWritten(const clang::Type* type);
+
+// Returns true if it's possible to implicitly convert a value of a
+// different type to 'type' via an implicit constructor.
+bool HasImplicitConversionConstructor(const clang::Type* type);
+
+// clang desugars template arguments: follows typedefs, etc. We
+// want the unsugared type, so this function provides a map from
+// the desugared type back to the original type-as-written, as
+// determined from the class's template arguments. For default
+// template arguments that are not specified by the caller, we
+// map the type to nullptr, to indicate there's no inherent sugaring.
+// We also include mappings for component types: if we have an entry
+// 'vector<TypedefType>' -> 'vector<Foo>', we also add an entry
+// 'TypedefType' -> 'Foo'.
+// For ease of calling, this accept any type, but will return an empty
+// map for any input that's not a template specialization type.
+map<const clang::Type*, const clang::Type*> GetTplTypeResugarMapForClass(
+ const clang::Type* type);
+
+// Like GetTplTypeResugarMapForClass, but if a type has
+// components (for instance, 'Foo*' and 'vector<Foo>' both
+// have a component Foo), we don't include the components
+// in the result-map.
+map<const clang::Type*, const clang::Type*>
+GetTplTypeResugarMapForClassNoComponentTypes(const clang::Type* type);
+
+// --- Utilities for Stmt.
+
+// Returns true if the given expr is '&<something>'.
+bool IsAddressOf(const clang::Expr* expr);
+
+// If this function call comes from a class method -- either a normal
+// one or a static one -- returns the type of the class. Otherwise,
+// returns nullptr. Note that static class methods do *not* have a
+// CXXMemberCallExpr type, which is why we take a CallExpr.
+const clang::Type* TypeOfParentIfMethod(const clang::CallExpr* expr);
+
+// Given a function call, return the first argument that's a class
+// (possibly a template specialization). Note we ignore pointers to a
+// class. This is used with 'free' overloaded operators ('ostream&
+// operator<<(ostream& a, int x)' to figure out what class the
+// operator 'logically' belongs to. This is a heuristic (the operator
+// may "belong" to more than one argument, for instance), but covers
+// all the common cases. Returns nullptr if no class-type argument is
+// found.
+const clang::Expr* GetFirstClassArgument(clang::CallExpr* expr);
+
+// Returns nullptr if we're deleting an argument that has no destructor.
+const clang::CXXDestructorDecl* GetDestructorForDeleteExpr(
+ const clang::CXXDeleteExpr* expr);
+
+// Returns nullptr if the constructor has no corresponding destructor.
+const clang::CXXDestructorDecl* GetSiblingDestructorFor(
+ const clang::CXXConstructorDecl* ctor);
+const clang::CXXDestructorDecl* GetSiblingDestructorFor(
+ const clang::CXXConstructExpr* ctor_expr);
+
+// Figuring out the function type is non-trivial because the callee
+// may be a function pointer. This code is based on clang's Expr.cpp.
+// Should never return nullptr.
+const clang::FunctionType* GetCalleeFunctionType(clang::CallExpr* expr);
+
+// Figuring out whether the to-type is a reference or not is different
+// depending on whether the cast is explicit or implicit. (You'd
+// think it would work to just look at expr->getSubExpr()->getType(),
+// but that seems to strip off the reference.)
+bool IsCastToReferenceType(const clang::CastExpr* expr);
+
+// Returns the list of explicit template args for all exprs that support
+// such a concept (declrefexpr, memberexpr), and empty list if none is present.
+clang::TemplateArgumentListInfo GetExplicitTplArgs(const clang::Expr* expr);
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_AST_UTIL_H_
diff --git a/iwyu_cache.cc b/iwyu_cache.cc
new file mode 100644
index 0000000..b409d2e
--- /dev/null
+++ b/iwyu_cache.cc
@@ -0,0 +1,91 @@
+//===--- iwyu_cache.cc - cache of AST-derived information, for iwyu -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_cache.h"
+
+#include <set>
+#include <string>
+
+#include "iwyu_ast_util.h"
+#include "iwyu_stl_util.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/TemplateBase.h"
+#include "clang/AST/Type.h"
+
+using clang::ClassTemplateSpecializationDecl;
+using clang::NamedDecl;
+using clang::Type;
+using clang::TemplateArgument;
+using clang::TemplateArgumentList;
+using clang::TemplateSpecializationType;
+using std::set;
+using std::string;
+
+namespace include_what_you_use {
+
+// These are types that all have the same property: instantiating
+// the type requires full use of all explicitly-listed template
+// arguments, and full use of all default templated arguments that
+// the class does not intend-to-provide. (So vector<MyClass>
+// required full use of MyClass, but not of allocator<MyClass>).
+// TODO(csilvers): put this somewhere easier to modify, and add to it.
+static const char* const kFullUseTypes[] = {
+ "__gnu_cxx::hash_map",
+ "__gnu_cxx::hash_multimap",
+ "__gnu_cxx::hash_multiset",
+ "__gnu_cxx::hash_set",
+ "std::deque",
+ "std::list",
+ "std::map",
+ "std::multimap",
+ "std::multiset",
+ "std::set",
+ "std::slist",
+ "std::vector",
+};
+
+// If the passed-in tpl_decl is one of the classes we have hard-coded
+// the full-use type information for, populate the cache with the
+// appropriate full-use type information for the given instantiation.
+// Note that we only populate the cache for class member uses, not
+// function calls -- that is, we can use the hard-coded data to say
+// full use-info for 'sizeof(vector<MyClass>)', but not for
+// 'myclass_vector.clear();'. This is because the former never tries
+// to instantiate methods, making the hard-coding much easier.
+map<const Type*, const Type*> FullUseCache::GetPrecomputedResugarMap(
+ const TemplateSpecializationType* tpl_type) {
+ static const int fulluse_size = (sizeof(kFullUseTypes) /
+ sizeof(*kFullUseTypes));
+ static const set<string> fulluse_types(kFullUseTypes,
+ kFullUseTypes + fulluse_size);
+
+ const NamedDecl* tpl_decl = TypeToDeclAsWritten(tpl_type);
+ if (!ContainsKey(fulluse_types, GetWrittenQualifiedNameAsString(tpl_decl)))
+ return map<const Type*, const Type*>();
+
+ // The code below doesn't handle template-template args/etc. None
+ // of the types in kFullUseTypes should have those. Just verify,
+ // when we can.
+ if (const ClassTemplateSpecializationDecl* tpl_spec_decl
+ = DynCastFrom(tpl_decl)) {
+ const TemplateArgumentList& all_tpl_args = tpl_spec_decl->getTemplateArgs();
+ for (unsigned i = 0; i < all_tpl_args.size(); ++i) {
+ CHECK_((all_tpl_args.get(i).getKind() == TemplateArgument::Type)
+ && "kFullUseType types must contain only 'type' template args");
+ }
+ }
+
+ // The default resugar-map works correctly for all these types (by
+ // design): we fully use all template types. (Note: we'll have to
+ // do something more clever here if any types in kFullUseTypes start
+ // accepting template-template types.)
+ return GetTplTypeResugarMapForClassNoComponentTypes(tpl_type);
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_cache.h b/iwyu_cache.h
new file mode 100644
index 0000000..4d696c2
--- /dev/null
+++ b/iwyu_cache.h
@@ -0,0 +1,171 @@
+//===--- iwyu_cache.h - cache of AST-derived information, for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file holds caches for information that clang might have to use
+// many times, but is expensive to compute. For now, the only cache
+// is the 'instantiation cache': when instantiating a template, what
+// methods are called, and what template arguments are fully used?
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_CACHE_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_CACHE_H_
+
+#include <map> // for map
+#include <set> // for set
+#include <utility> // for pair
+
+#include "iwyu_stl_util.h"
+#include "port.h" // for CHECK_
+
+namespace clang {
+class NamedDecl;
+class TemplateSpecializationType;
+class Type;
+}
+
+namespace include_what_you_use {
+
+using std::map;
+using std::pair;
+using std::set;
+
+// This cache is used to store 'full use information' for a given
+// templated function call or type instantiation:
+// 1) If you call MyClass<Foo, Bar>::baz(), what template arguments
+// do you need the full type information for? (Might be Foo, Bar,
+// both, or neither, depending on what baz() does.)
+// 2) If you do 'sizeof(MyClass<Foo, Bar>)', what template arguments
+// do you need the full type information for? (Might be Foo,
+// Bar, both, or neither, depending on what fields MyClass has.)
+// 3) If you call MyClass<Foo, Bar>::baz(), what methods are called
+// indirectly? (ie baz() might call another method MyClass::bar(),
+// or OtherClass::foo().) This is used to detect cases where we
+// call a method that is written in a different file from the
+// class it belongs to -- we will need to #include the file with
+// that method in it. The method called may well depend on the
+// template arguments, hence the need to instantiate.
+// For each of these, the answer is always the same for the given
+// Decl (function call or class instantiation) with the same template
+// args. So we store this info in a cache, since it's very expensive
+// to compute.
+
+class FullUseCache {
+ public:
+ // The first part of the key is the decl or type that we're
+ // caching reporting-info for. Since what we report depends on
+ // what the types-of-interest were, we store that in the key too.
+ typedef pair<const void*,
+ map<const clang::Type*, const clang::Type*>> Key;
+ // The value are the types and decls we reported.
+ typedef pair<const set<const clang::Type*>,
+ const set<const clang::NamedDecl*>> Value;
+
+ void Insert(const void* decl_or_type,
+ const map<const clang::Type*, const clang::Type*>& resugar_map,
+ const set<const clang::Type*>& reported_types,
+ const set<const clang::NamedDecl*>& reported_decls) {
+ // TODO(csilvers): should in_forward_declare_context() be in Key too?
+ cache_.insert(pair<Key,Value>(Key(decl_or_type, resugar_map),
+ Value(reported_types, reported_decls)));
+ }
+
+ // resguar_map is the 'uncanonicalize' map for the template
+ // arguments used to instantiate this template.
+ bool Contains(
+ const void* key,
+ const map<const clang::Type*, const clang::Type*>& resugar_map) const {
+ return ContainsKey(cache_, Key(key, resugar_map));
+ }
+
+ // You must call Contains() before calling these, to make sure the
+ // key is in the cache.
+ const set<const clang::Type*>& GetFullUseTypes(
+ const void* key,
+ const map<const clang::Type*, const clang::Type*>& resugar_map) const {
+ const Value* value = FindInMap(&cache_, Key(key, resugar_map));
+ CHECK_(value && "Must call Contains() before calling GetFullUseTypes()");
+ return value->first;
+ }
+
+ const set<const clang::NamedDecl*>& GetFullUseDecls(
+ const void* key,
+ const map<const clang::Type*, const clang::Type*>& resugar_map) const {
+ const Value* value = FindInMap(&cache_, Key(key, resugar_map));
+ CHECK_(value && "Must call Contains() before calling GetFullUseDecls()");
+ return value->second;
+ }
+
+ // In addition to the normal cache, which is filled via Insert()
+ // calls, we also have a special, hard-coded cache holding full-use
+ // type information for common STL types. Note that since we only
+ // have full-use type information, and not full-use decl
+ // information, this cache is only appropriate when instantiating a
+ // type ('sizeof(vector<MyClass>)'), not when making a function call
+ // ('myclass_vector->clear()').
+ // NOTE: because this cache is hard-coded, the types may not be
+ // sugared properly: the output might be 'MyUnderlyingType' when the
+ // input is 'vector<MyTypedef>'. You will have to resugar yourself.
+ // That is why this is implemented in a different function, and not
+ // available via GetFullUseType(), which does not have this problem
+ // with sugaring.
+ static map<const clang::Type*, const clang::Type*> GetPrecomputedResugarMap(
+ const clang::TemplateSpecializationType* tpl_type);
+
+ private:
+ map<Key, Value> cache_;
+};
+
+// This class allows us to update multiple cache entries at once.
+// For instance, suppose A<Foo, Bar>() calls B<Foo, Bar>(), which
+// requires the full type info for Foo. Then we want to add a cache
+// entry (B, Foo) ("B requires the full type info for Foo"), but we
+// also want to add a cache entry (A, Foo) ("A requires the full
+// type info for Foo", due to its calling B). The way we do this is
+// whenever we enter a function -- or instantiate a type -- we add
+// it to our set of 'currently active functions', cache_storers_.
+// Whenever we decide we need full type info for some type Foo, we
+// add a new cache entry for every function/type in cache_storers_.
+class CacheStoringScope {
+ public:
+ CacheStoringScope(set<CacheStoringScope*>* cache_storers,
+ FullUseCache* cache,
+ const void* key,
+ const map<const clang::Type*, const clang::Type*>& resugar)
+ : cache_storers_(cache_storers), cache_(cache),
+ key_(key), resugar_map_(resugar) {
+ // Register ourselves so ReportDeclUse() and ReportTypeUse()
+ // will call back to us.
+ cache_storers_->insert(this);
+ }
+
+ ~CacheStoringScope() {
+ cache_->Insert(key_, resugar_map_, reported_types_, reported_decls_);
+ cache_storers_->erase(this);
+ }
+
+ // These are what ReportDeclUse() and ReportTypeUse() call to
+ // populate this cache entry.
+ void NoteReportedType(const clang::Type* type) {
+ reported_types_.insert(type);
+ }
+ void NoteReportedDecl(const clang::NamedDecl* decl) {
+ reported_decls_.insert(decl);
+ }
+
+ private:
+ set<CacheStoringScope*>* const cache_storers_;
+ FullUseCache* const cache_;
+ const void* const key_;
+ const map<const clang::Type*, const clang::Type*>& resugar_map_;
+ set<const clang::Type*> reported_types_;
+ set<const clang::NamedDecl*> reported_decls_;
+};
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_CACHE_H_
diff --git a/iwyu_driver.cc b/iwyu_driver.cc
new file mode 100644
index 0000000..7eea196
--- /dev/null
+++ b/iwyu_driver.cc
@@ -0,0 +1,257 @@
+//===--- iwyu_driver.cc - iwyu driver implementation ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Driver, used to set up a clang CompilerInstance based on argc and
+// argv.
+
+// Everything below is adapted from clang/examples/clang-interpreter/main.cpp.
+
+#include <cctype>
+#include <cstdint>
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+
+#include "llvm/ADT/ArrayRef.h" // IWYU pragma: keep
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/ErrorOr.h"
+#include "llvm/Support/Host.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "clang/Basic/DiagnosticOptions.h"
+#include "clang/Driver/Compilation.h"
+#include "clang/Driver/Driver.h"
+#include "clang/Driver/Tool.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Frontend/FrontendAction.h"
+#include "clang/Frontend/FrontendDiagnostic.h" // IWYU pragma: keep
+#include "clang/Frontend/TextDiagnosticPrinter.h"
+
+namespace llvm {
+class LLVMContext;
+} // namespace llvm
+
+using clang::CompilerInstance;
+using clang::CompilerInvocation;
+using clang::DiagnosticIDs;
+using clang::DiagnosticOptions;
+using clang::DiagnosticsEngine;
+using clang::TextDiagnosticPrinter;
+using clang::driver::ArgStringList;
+using clang::driver::Command;
+using clang::driver::Compilation;
+using clang::driver::Driver;
+using clang::driver::JobList;
+using llvm::ErrorOr;
+using llvm::IntrusiveRefCntPtr;
+using llvm::SmallString;
+using llvm::SmallVector;
+using llvm::SmallVectorImpl;
+using llvm::MemoryBuffer;
+using llvm::StringRef;
+using llvm::cast;
+using llvm::errs;
+using llvm::isa;
+using llvm::raw_svector_ostream;
+using llvm::sys::getDefaultTargetTriple;
+using std::set;
+using std::unique_ptr;
+
+namespace include_what_you_use {
+
+namespace {
+
+std::string GetExecutablePath(const char *Argv0) {
+ // This just needs to be some symbol in the binary; C++ doesn't
+ // allow taking the address of ::main however.
+ void *main_addr = (void*) (intptr_t) GetExecutablePath;
+ return llvm::sys::fs::getMainExecutable(Argv0, main_addr);
+}
+
+const char *SaveStringInSet(std::set<std::string> &SavedStrings, StringRef S) {
+ return SavedStrings.insert(S).first->c_str();
+}
+
+void ExpandArgsFromBuf(const char *Arg,
+ SmallVectorImpl<const char*> &ArgVector,
+ set<std::string> &SavedStrings) {
+ const char *FName = Arg + 1;
+ ErrorOr<unique_ptr<MemoryBuffer>> MemBufOrErr = MemoryBuffer::getFile(FName);
+ if (!MemBufOrErr) {
+ ArgVector.push_back(SaveStringInSet(SavedStrings, Arg));
+ return;
+ }
+
+ const char *Buf = MemBufOrErr.get()->getBufferStart();
+ char InQuote = ' ';
+ std::string CurArg;
+
+ for (const char *P = Buf; ; ++P) {
+ if (*P == '\0' || (isspace(*P) && InQuote == ' ')) {
+ if (!CurArg.empty()) {
+
+ if (CurArg[0] != '@') {
+ ArgVector.push_back(SaveStringInSet(SavedStrings, CurArg));
+ } else {
+ ExpandArgsFromBuf(CurArg.c_str(), ArgVector, SavedStrings);
+ }
+
+ CurArg = "";
+ }
+ if (*P == '\0')
+ break;
+ else
+ continue;
+ }
+
+ if (isspace(*P)) {
+ if (InQuote != ' ')
+ CurArg.push_back(*P);
+ continue;
+ }
+
+ if (*P == '"' || *P == '\'') {
+ if (InQuote == *P)
+ InQuote = ' ';
+ else if (InQuote == ' ')
+ InQuote = *P;
+ else
+ CurArg.push_back(*P);
+ continue;
+ }
+
+ if (*P == '\\') {
+ ++P;
+ if (*P != '\0')
+ CurArg.push_back(*P);
+ continue;
+ }
+ CurArg.push_back(*P);
+ }
+}
+
+void ExpandArgv(int argc, const char **argv,
+ SmallVectorImpl<const char*> &ArgVector,
+ set<std::string> &SavedStrings) {
+ for (int i = 0; i < argc; ++i) {
+ const char *Arg = argv[i];
+ if (Arg[0] != '@') {
+ ArgVector.push_back(SaveStringInSet(SavedStrings, std::string(Arg)));
+ continue;
+ }
+
+ ExpandArgsFromBuf(Arg, ArgVector, SavedStrings);
+ }
+}
+
+} // anonymous namespace
+
+CompilerInstance* CreateCompilerInstance(int argc, const char **argv) {
+ void* main_addr = (void*) (intptr_t) GetExecutablePath;
+ std::string path = GetExecutablePath(argv[0]);
+ IntrusiveRefCntPtr<DiagnosticOptions> diagnostic_options =
+ new DiagnosticOptions;
+ auto* diagnostic_client =
+ new TextDiagnosticPrinter(errs(), &*diagnostic_options);
+
+ IntrusiveRefCntPtr<DiagnosticIDs> diagnostic_id(new DiagnosticIDs());
+ DiagnosticsEngine diagnostics(diagnostic_id, &*diagnostic_options,
+ diagnostic_client);
+ Driver driver(path, getDefaultTargetTriple(), diagnostics);
+ driver.setTitle("include what you use");
+
+ // Expand out any response files passed on the command line
+ set<std::string> SavedStrings;
+ SmallVector<const char*, 256> args;
+
+ ExpandArgv(argc, argv, args, SavedStrings);
+
+ // FIXME: This is a hack to try to force the driver to do something we can
+ // recognize. We need to extend the driver library to support this use model
+ // (basically, exactly one input, and the operation mode is hard wired).
+ args.push_back("-fsyntax-only");
+
+ unique_ptr<Compilation> compilation(driver.BuildCompilation(args));
+ if (!compilation)
+ return nullptr;
+
+ // FIXME: This is copied from ASTUnit.cpp; simplify and eliminate.
+
+ // We expect to get back exactly one command job, if we didn't something
+ // failed. Extract that job from the compilation.
+ const JobList& jobs = compilation->getJobs();
+ if (jobs.size() != 1 || !isa<Command>(*jobs.begin())) {
+ SmallString<256> msg;
+ raw_svector_ostream out(msg);
+ jobs.Print(out, "; ", true);
+ diagnostics.Report(clang::diag::err_fe_expected_compiler_job) << out.str();
+ return nullptr;
+ }
+
+ const Command& command = cast<Command>(*jobs.begin());
+ if (StringRef(command.getCreator().getName()) != "clang") {
+ diagnostics.Report(clang::diag::err_fe_expected_clang_command);
+ return nullptr;
+ }
+
+ // Initialize a compiler invocation object from the clang (-cc1) arguments.
+ const ArgStringList &cc_arguments = command.getArguments();
+ const char** args_start = const_cast<const char**>(cc_arguments.data());
+ const char** args_end = args_start + cc_arguments.size();
+ std::shared_ptr<CompilerInvocation> invocation(new CompilerInvocation);
+ CompilerInvocation::CreateFromArgs(*invocation,
+ args_start, args_end, diagnostics);
+ invocation->getFrontendOpts().DisableFree = false;
+
+ // Use libc++ headers bundled with Xcode.app on macOS.
+ llvm::Triple triple(invocation->getTargetOpts().Triple);
+ if (triple.isOSDarwin() && invocation->getHeaderSearchOpts().UseLibcxx) {
+ invocation->getHeaderSearchOpts().AddPath(
+ "/Library/Developer/CommandLineTools/usr/include/c++/v1/",
+ clang::frontend::CXXSystem,
+ /*IsFramework=*/false, /*IgnoreSysRoot=*/true);
+ invocation->getHeaderSearchOpts().AddPath(
+ "/Applications/Xcode.app/Contents/Developer/Toolchains/"
+ "XcodeDefault.xctoolchain/usr/include/c++/v1",
+ clang::frontend::CXXSystem,
+ /*IsFramework=*/false, /*IgnoreSysRoot=*/true);
+ }
+
+ // Show the invocation, with -v.
+ if (invocation->getHeaderSearchOpts().Verbose) {
+ errs() << "clang invocation:\n";
+ jobs.Print(errs(), "\n", true);
+ errs() << "\n";
+ }
+
+ // FIXME: This is copied from cc1_main.cpp; simplify and eliminate.
+
+ // Create a compiler instance to handle the actual work.
+ // The caller will be responsible for freeing this.
+ CompilerInstance* compiler = new CompilerInstance;
+ compiler->setInvocation(invocation);
+
+ // Create the compilers actual diagnostics engine.
+ compiler->createDiagnostics();
+ if (!compiler->hasDiagnostics())
+ return nullptr;
+
+ // Infer the builtin include path if unspecified.
+ if (compiler->getHeaderSearchOpts().UseBuiltinIncludes &&
+ compiler->getHeaderSearchOpts().ResourceDir.empty())
+ compiler->getHeaderSearchOpts().ResourceDir =
+ CompilerInvocation::GetResourcesPath(argv[0], main_addr);
+
+ return compiler;
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_driver.h b/iwyu_driver.h
new file mode 100644
index 0000000..73f5d26
--- /dev/null
+++ b/iwyu_driver.h
@@ -0,0 +1,25 @@
+//===--- iwyu_driver.h - iwyu driver implementation -----------*- C++ -*---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_DRIVER_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_DRIVER_H_
+
+namespace clang {
+class CompilerInstance;
+}
+
+namespace include_what_you_use {
+
+// Creates a CompilerInstance object based on the commandline
+// arguments, or NULL if there's an error of some sort.
+clang::CompilerInstance* CreateCompilerInstance(int argc, const char **argv);
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_DRIVER_H_
diff --git a/iwyu_getopt.cc b/iwyu_getopt.cc
new file mode 100644
index 0000000..d8fb391
--- /dev/null
+++ b/iwyu_getopt.cc
@@ -0,0 +1,220 @@
+//===--- iwyu_getopt.cc - OS-specific implementation of getopt for IWYU ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+// This code is used with permission from Kim Gräsman. The original is
+// maintained with tests at: https://github.com/kimgr/getopt_port
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_getopt.h"
+
+#if defined(_MSC_VER)
+
+#include <stddef.h>
+#include <string.h>
+
+const int no_argument = 0;
+const int required_argument = 1;
+const int optional_argument = 2;
+
+char* optarg;
+int optopt;
+/* The variable optind [...] shall be initialized to 1 by the system. */
+int optind = 1;
+int opterr;
+
+static char* optcursor = NULL;
+
+/* Implemented based on [1] and [2] for optional arguments.
+ optopt is handled FreeBSD-style, per [3].
+ Other GNU and FreeBSD extensions are purely accidental.
+
+[1] http://pubs.opengroup.org/onlinepubs/000095399/functions/getopt.html
+[2] http://www.kernel.org/doc/man-pages/online/pages/man3/getopt.3.html
+[3] http://www.freebsd.org/cgi/man.cgi?query=getopt&sektion=3&manpath=FreeBSD+9.0-RELEASE
+*/
+int getopt(int argc, char* const argv[], const char* optstring) {
+ int optchar = -1;
+ const char* optdecl = NULL;
+
+ optarg = NULL;
+ opterr = 0;
+ optopt = 0;
+
+ /* Unspecified, but we need it to avoid overrunning the argv bounds. */
+ if (optind >= argc)
+ goto no_more_optchars;
+
+ /* If, when getopt() is called argv[optind] is a null pointer, getopt()
+ shall return -1 without changing optind. */
+ if (argv[optind] == NULL)
+ goto no_more_optchars;
+
+ /* If, when getopt() is called *argv[optind] is not the character '-',
+ getopt() shall return -1 without changing optind. */
+ if (*argv[optind] != '-')
+ goto no_more_optchars;
+
+ /* If, when getopt() is called argv[optind] points to the string "-",
+ getopt() shall return -1 without changing optind. */
+ if (strcmp(argv[optind], "-") == 0)
+ goto no_more_optchars;
+
+ /* If, when getopt() is called argv[optind] points to the string "--",
+ getopt() shall return -1 after incrementing optind. */
+ if (strcmp(argv[optind], "--") == 0) {
+ ++optind;
+ goto no_more_optchars;
+ }
+
+ if (optcursor == NULL || *optcursor == '\0')
+ optcursor = argv[optind] + 1;
+
+ optchar = *optcursor;
+
+ /* FreeBSD: The variable optopt saves the last known option character
+ returned by getopt(). */
+ optopt = optchar;
+
+ /* The getopt() function shall return the next option character (if one is
+ found) from argv that matches a character in optstring, if there is
+ one that matches. */
+ optdecl = strchr(optstring, optchar);
+ if (optdecl) {
+ /* [I]f a character is followed by a colon, the option takes an
+ argument. */
+ if (optdecl[1] == ':') {
+ optarg = ++optcursor;
+ if (*optarg == '\0') {
+ /* GNU extension: Two colons mean an option takes an
+ optional arg; if there is text in the current argv-element
+ (i.e., in the same word as the option name itself, for example,
+ "-oarg"), then it is returned in optarg, otherwise optarg is set
+ to zero. */
+ if (optdecl[2] != ':') {
+ /* If the option was the last character in the string pointed to by
+ an element of argv, then optarg shall contain the next element
+ of argv, and optind shall be incremented by 2. If the resulting
+ value of optind is greater than argc, this indicates a missing
+ option-argument, and getopt() shall return an error indication.
+
+ Otherwise, optarg shall point to the string following the
+ option character in that element of argv, and optind shall be
+ incremented by 1.
+ */
+ if (++optind < argc) {
+ optarg = argv[optind];
+ } else {
+ /* If it detects a missing option-argument, it shall return the
+ colon character ( ':' ) if the first character of optstring
+ was a colon, or a question-mark character ( '?' ) otherwise.
+ */
+ optarg = NULL;
+ optchar = (optstring[0] == ':') ? ':' : '?';
+ }
+ } else {
+ optarg = NULL;
+ }
+ }
+
+ optcursor = NULL;
+ }
+ } else {
+ /* If getopt() encounters an option character that is not contained in
+ optstring, it shall return the question-mark ( '?' ) character. */
+ optchar = '?';
+ }
+
+ if (optcursor == NULL || *++optcursor == '\0')
+ ++optind;
+
+ return optchar;
+
+no_more_optchars:
+ optcursor = NULL;
+ return -1;
+}
+
+/* Implementation based on [1].
+
+[1] http://www.kernel.org/doc/man-pages/online/pages/man3/getopt.3.html
+*/
+int getopt_long(int argc, char* const argv[], const char* optstring,
+ const struct option* longopts, int* longindex) {
+ const struct option* o = longopts;
+ const struct option* match = NULL;
+ int num_matches = 0;
+ size_t argument_name_length = 0;
+ const char* current_argument = NULL;
+ int retval = -1;
+
+ optarg = NULL;
+ optopt = 0;
+
+ if (optind >= argc)
+ return -1;
+
+ if (strlen(argv[optind]) < 3 || strncmp(argv[optind], "--", 2) != 0)
+ return getopt(argc, argv, optstring);
+
+ /* It's an option; starts with -- and is longer than two chars. */
+ current_argument = argv[optind] + 2;
+ argument_name_length = strcspn(current_argument, "=");
+ for (; o->name; ++o) {
+ if (strncmp(o->name, current_argument, argument_name_length) == 0) {
+ match = o;
+ ++num_matches;
+ }
+ }
+
+ if (num_matches == 1) {
+ /* If longindex is not NULL, it points to a variable which is set to the
+ index of the long option relative to longopts. */
+ if (longindex)
+ *longindex = (match - longopts);
+
+ /* If flag is NULL, then getopt_long() shall return val.
+ Otherwise, getopt_long() returns 0, and flag shall point to a variable
+ which shall be set to val if the option is found, but left unchanged if
+ the option is not found. */
+ if (match->flag)
+ *(match->flag) = match->val;
+
+ retval = match->flag ? 0 : match->val;
+
+ if (match->has_arg != no_argument) {
+ optarg = strchr(argv[optind], '=');
+ if (optarg != NULL)
+ ++optarg;
+
+ if (match->has_arg == required_argument) {
+ /* Only scan the next argv for required arguments. Behavior is not
+ specified, but has been observed with Ubuntu and Mac OSX. */
+ if (optarg == NULL && ++optind < argc) {
+ optarg = argv[optind];
+ }
+
+ if (optarg == NULL)
+ retval = ':';
+ }
+ } else if (strchr(argv[optind], '=')) {
+ /* An argument was provided to a non-argument option.
+ I haven't seen this specified explicitly, but both GNU and BSD-based
+ implementations show this behavior.
+ */
+ retval = '?';
+ }
+ } else {
+ /* Unknown option or ambiguous match. */
+ retval = '?';
+ }
+
+ ++optind;
+ return retval;
+}
+
+#endif // #if defined(_MSC_VER)
diff --git a/iwyu_getopt.h b/iwyu_getopt.h
new file mode 100644
index 0000000..1a0c697
--- /dev/null
+++ b/iwyu_getopt.h
@@ -0,0 +1,41 @@
+//===--- iwyu_getopt.h - OS-specific implementation of getopt for IWYU ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_GETOPT_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_GETOPT_H_
+
+#if defined(_MSC_VER)
+
+// Hand-rolled implementation of getopt/getopt_long for Visual C++.
+extern const int no_argument;
+extern const int required_argument;
+extern const int optional_argument;
+
+extern char* optarg;
+extern int optind, opterr, optopt;
+
+struct option {
+ const char* name;
+ int has_arg;
+ int* flag;
+ int val;
+};
+
+int getopt(int argc, char* const argv[], const char* optstring);
+
+int getopt_long(int argc, char* const argv[],
+ const char* optstring, const struct option* longopts, int* longindex);
+
+#else // #if defined(_MSC_VER)
+
+#include <getopt.h> // IWYU pragma: export
+
+#endif // #if defined(_MSC_VER)
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_GETOPT_H_
diff --git a/iwyu_globals.cc b/iwyu_globals.cc
new file mode 100644
index 0000000..072f123
--- /dev/null
+++ b/iwyu_globals.cc
@@ -0,0 +1,417 @@
+//===--- iwyu_globals.cc - global variables for include-what-you-use ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_globals.h"
+
+#include <algorithm> // for sort, make_pair
+#include <cstdio> // for printf
+#include <cstdlib> // for atoi, exit, getenv
+#include <map> // for map
+#include <set> // for set
+#include <string> // for string, operator<, etc
+#include <utility> // for make_pair, pair
+
+#include "iwyu_cache.h"
+#include "iwyu_include_picker.h"
+#include "iwyu_getopt.h"
+#include "iwyu_lexer_utils.h"
+#include "iwyu_location_util.h"
+#include "iwyu_path_util.h"
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+#include "iwyu_version.h"
+#include "port.h" // for CHECK_, etc
+#include "llvm/Support/raw_ostream.h"
+#include "clang/AST/PrettyPrinter.h"
+#include "clang/Basic/FileManager.h"
+#include "clang/Basic/Version.h"
+#include "clang/Lex/HeaderSearch.h"
+
+using clang::DirectoryEntry;
+using std::make_pair;
+using std::map;
+using std::string;
+using std::vector;
+
+namespace include_what_you_use {
+
+static CommandlineFlags* commandline_flags = nullptr;
+static clang::SourceManager* source_manager = nullptr;
+static IncludePicker* include_picker = nullptr;
+static const clang::LangOptions default_lang_options;
+static const clang::PrintingPolicy default_print_policy(default_lang_options);
+static SourceManagerCharacterDataGetter* data_getter = nullptr;
+static FullUseCache* function_calls_full_use_cache = nullptr;
+static FullUseCache* class_members_full_use_cache = nullptr;
+static int ParseIwyuCommandlineFlags(int argc, char** argv);
+static int ParseInterceptedCommandlineFlags(int argc, char** argv);
+
+static void PrintHelp(const char* extra_msg) {
+ printf("USAGE: include-what-you-use [-Xiwyu --iwyu_opt]... <clang opts>"
+ " <source file>\n"
+ "Here are the <iwyu_opts> you can specify (e.g. -Xiwyu --verbose=3):\n"
+ " --check_also=<glob>: tells iwyu to print iwyu-violation info\n"
+ " for all files matching the given glob pattern (in addition\n"
+ " to the default of reporting for the input .cc file and its\n"
+ " associated .h files). This flag may be specified multiple\n"
+ " times to specify multiple glob patterns.\n"
+ " --cwd=<dir>: tells iwyu what the current working directory is.\n"
+ " --howtodebug[=<filename>]: with no arg, prints instructions on\n"
+ " how to run iwyu under gdb for the input file, and exits.\n"
+ " With an arg, prints only when input file matches the arg.\n"
+ " --mapping_file=<filename>: gives iwyu a mapping file.\n"
+ " --no_default_mappings: do not add iwyu's default mappings.\n"
+ " --pch_in_code: mark the first include in a translation unit as a\n"
+ " precompiled header. Use --pch_in_code to prevent IWYU from\n"
+ " removing necessary PCH includes. Though Clang forces PCHs\n"
+ " to be listed as prefix headers, the PCH-in-code pattern can\n"
+ " be used with GCC and is standard practice on MSVC\n"
+ " (e.g. stdafx.h).\n"
+ " --prefix_header_includes=<value>: tells iwyu what to do with\n"
+ " in-source includes and forward declarations involving\n"
+ " prefix headers. Prefix header is a file included via\n"
+ " command-line option -include. If prefix header makes\n"
+ " include or forward declaration obsolete, presence of such\n"
+ " include can be controlled with the following values\n"
+ " add: new lines are added\n"
+ " keep: new lines aren't added, existing are kept intact\n"
+ " remove: new lines aren't added, existing are removed\n"
+ " Default value is 'add'.\n"
+ " --transitive_includes_only: do not suggest that a file add\n"
+ " foo.h unless foo.h is already visible in the file's\n"
+ " transitive includes.\n"
+ " --max_line_length: maximum line length for includes.\n"
+ " Note that this only affects comments and alignment thereof,\n"
+ " the maximum line length can still be exceeded with long\n"
+ " file names (default: 80).\n"
+ " --no_comments: do not add 'why' comments.\n"
+ " --verbose=<level>: the higher the level, the more output.\n"
+ "\n"
+ "In addition to IWYU-specific options you can specify the following\n"
+ "options without -Xiwyu prefix:\n"
+ " --help: prints this help and exits.\n"
+ " --version: prints version and exits.\n");
+ if (extra_msg)
+ printf("\n%s\n\n", extra_msg);
+}
+
+static void PrintVersion() {
+ llvm::outs() << "include-what-you-use " << IWYU_VERSION_STRING;
+ // IWYU_GIT_REV should be provided by build system.
+ string iwyu_rev = IWYU_GIT_REV;
+ if (!iwyu_rev.empty()) {
+ llvm::outs() << " (git:" << iwyu_rev << ")";
+ }
+ llvm::outs() << " based on " << clang::getClangFullVersion()
+ << "\n";
+}
+
+OptionsParser::OptionsParser(int argc, char** argv) {
+ // Separate out iwyu-specific, intercepted, and clang flags. iwyu-specific
+ // flags are "-Xiwyu <iwyu_flag>", intercepted flags are usual clang flags
+ // like --version, --help, which we intercept to provide custom handling.
+ char** iwyu_argv = new char*[argc + 1];
+ iwyu_argv[0] = argv[0];
+ int iwyu_argc = 1;
+ char** intercepted_argv = new char*[argc + 1];
+ intercepted_argv[0] = argv[0];
+ int intercepted_argc = 1;
+ clang_argv_ = new const char*[argc + 1];
+ clang_argv_[0] = argv[0];
+ clang_argc_ = 1;
+ for (int i = 1; i < argc; ++i) {
+ if (i < argc - 1 && strcmp(argv[i], "-Xiwyu") == 0)
+ iwyu_argv[iwyu_argc++] = argv[++i]; // the word after -Xiwyu
+ else if (strcmp(argv[i], "--help") == 0)
+ intercepted_argv[intercepted_argc++] = argv[i]; // intercept --help
+ else if (strcmp(argv[i], "--version") == 0)
+ intercepted_argv[intercepted_argc++] = argv[i]; // intercept --version
+ else
+ clang_argv_[clang_argc_++] = argv[i];
+ }
+ // argv should be nullptr-terminated
+ iwyu_argv[iwyu_argc] = nullptr;
+ intercepted_argv[intercepted_argc] = nullptr;
+ clang_argv_[clang_argc_] = nullptr;
+
+ ParseInterceptedCommandlineFlags(intercepted_argc, intercepted_argv);
+ ParseIwyuCommandlineFlags(iwyu_argc, iwyu_argv);
+
+ delete [] iwyu_argv;
+ delete [] intercepted_argv;
+}
+
+OptionsParser::~OptionsParser() {
+ delete [] clang_argv_;
+}
+
+CommandlineFlags::CommandlineFlags()
+ : howtodebug(CommandlineFlags::kUnspecified),
+ transitive_includes_only(false),
+ verbose(getenv("IWYU_VERBOSE") ? atoi(getenv("IWYU_VERBOSE")) : 1),
+ no_default_mappings(false),
+ max_line_length(80),
+ prefix_header_include_policy(CommandlineFlags::kAdd),
+ pch_in_code(false),
+ no_comments(false) {
+}
+
+int CommandlineFlags::ParseArgv(int argc, char** argv) {
+ static const struct option longopts[] = {
+ {"check_also", required_argument, nullptr, 'c'}, // can be specified >once
+ {"howtodebug", optional_argument, nullptr, 'd'},
+ {"cwd", required_argument, nullptr, 'p'},
+ {"transitive_includes_only", no_argument, nullptr, 't'},
+ {"verbose", required_argument, nullptr, 'v'},
+ {"mapping_file", required_argument, nullptr, 'm'},
+ {"no_default_mappings", no_argument, nullptr, 'n'},
+ {"prefix_header_includes", required_argument, nullptr, 'x'},
+ {"pch_in_code", no_argument, nullptr, 'h'},
+ {"max_line_length", optional_argument, nullptr, 'l'},
+ {"no_comments", optional_argument, nullptr, 'o'},
+ {nullptr, 0, nullptr, 0}
+ };
+ static const char shortopts[] = "d::p:v:c:m:n";
+ while (true) {
+ switch (getopt_long(argc, argv, shortopts, longopts, nullptr)) {
+ case 'c': AddGlobToReportIWYUViolationsFor(optarg); break;
+ case 'd': howtodebug = optarg ? optarg : ""; break;
+ case 'p': cwd = optarg; break;
+ case 't': transitive_includes_only = true; break;
+ case 'v': verbose = atoi(optarg); break;
+ case 'm': mapping_files.push_back(optarg); break;
+ case 'n': no_default_mappings = true; break;
+ case 'o': no_comments = true; break;
+ case 'x':
+ if (strcmp(optarg, "add") == 0) {
+ prefix_header_include_policy = CommandlineFlags::kAdd;
+ } else if (strcmp(optarg, "keep") == 0) {
+ prefix_header_include_policy = CommandlineFlags::kKeep;
+ } else if (strcmp(optarg, "remove") == 0) {
+ prefix_header_include_policy = CommandlineFlags::kRemove;
+ } else {
+ PrintHelp("FATAL ERROR: unknown --prefix_header_includes value.");
+ exit(EXIT_INVALIDARGS);
+ }
+ break;
+ case 'h': pch_in_code = true; break;
+ case 'l':
+ max_line_length = atoi(optarg);
+ CHECK_((max_line_length >= 0) && "Max line length must be positive");
+ break;
+ case -1: return optind; // means 'no more input'
+ default:
+ PrintHelp("FATAL ERROR: unknown flag.");
+ exit(EXIT_INVALIDARGS);
+ break;
+ }
+ }
+ return optind; // unreachable
+}
+
+// Though option -v prints version too, it isn't intercepted because it also
+// provides other functionality like printing clang invocation, header search
+// paths.
+// TODO(vsapsai): provide IWYU version in Driver::PrintVersion when version
+// callbacks are supported (see FIXME in Driver::PrintVersion).
+static int ParseInterceptedCommandlineFlags(int argc, char** argv) {
+ static const struct option longopts[] = {
+ {"help", no_argument, nullptr, 'h'},
+ {"version", no_argument, nullptr, 'v'},
+ {nullptr, 0, nullptr, 0}
+ };
+ static const char shortopts[] = "";
+ while (true) {
+ switch (getopt_long(argc, argv, shortopts, longopts, nullptr)) {
+ case 'h': PrintHelp(""); exit(EXIT_SUCCESS); break;
+ case 'v': PrintVersion(); exit(EXIT_SUCCESS); break;
+ case -1: return optind; // means 'no more input'
+ default:
+ PrintHelp("FATAL ERROR: unknown flag.");
+ exit(EXIT_INVALIDARGS);
+ break;
+ }
+ }
+ return optind; // unreachable
+}
+
+// The default value for the --howtodebug flag. Indicates that the
+// flag isn't present. It's a special, reserved value, and a user
+// isn't expected to type it directly.
+const char CommandlineFlags::kUnspecified[] = "<flag-unspecified>";
+
+// Handles all iwyu-specific flags, like --verbose. Returns the index into
+// argv past all the iwyu commandline flags.
+static int ParseIwyuCommandlineFlags(int argc, char** argv) {
+ CHECK_(commandline_flags == nullptr && "Only parse commandline flags once");
+ commandline_flags = new CommandlineFlags;
+ const int retval = commandline_flags->ParseArgv(argc, argv);
+ SetVerboseLevel(commandline_flags->verbose);
+
+ if (!commandline_flags->cwd.empty()) {
+ printf("-p/--cwd not yet implemented\n");
+ exit(EXIT_INVALIDARGS);
+ }
+ if (commandline_flags->howtodebug != CommandlineFlags::kUnspecified) {
+ printf("-d/--howtodebug not yet implemented\n");
+ exit(EXIT_INVALIDARGS);
+ }
+
+ VERRS(4) << "Setting verbose-level to " << commandline_flags->verbose << "\n";
+
+ return retval;
+}
+
+// Make sure we put longer search-paths first, so iwyu will map
+// /usr/include/c++/4.4/foo to <foo> rather than <c++/4.4/foo>.
+static bool SortByDescendingLength(const HeaderSearchPath& left,
+ const HeaderSearchPath& right) {
+ return left.path.length() > right.path.length();
+}
+
+// Sorts them by descending length, does other kinds of cleanup.
+static vector<HeaderSearchPath> NormalizeHeaderSearchPaths(
+ const map<string, HeaderSearchPath::Type>& include_dirs_map) {
+ vector<HeaderSearchPath> include_dirs;
+ for (const pair<string, HeaderSearchPath::Type>& entry : include_dirs_map) {
+ include_dirs.push_back(HeaderSearchPath(entry.first, entry.second));
+ }
+
+ sort(include_dirs.begin(), include_dirs.end(), &SortByDescendingLength);
+ return include_dirs;
+}
+
+// Asks clang what the search-paths are for include files, normalizes
+// them, and returns them in a vector.
+static vector<HeaderSearchPath> ComputeHeaderSearchPaths(
+ clang::HeaderSearch* header_search) {
+ map<string, HeaderSearchPath::Type> search_path_map;
+ for (auto it = header_search->system_dir_begin();
+ it != header_search->system_dir_end(); ++it) {
+ if (const DirectoryEntry* entry = it->getDir()) {
+ const string path = NormalizeDirPath(MakeAbsolutePath(entry->getName()));
+ search_path_map[path] = HeaderSearchPath::kSystemPath;
+ }
+ }
+ for (auto it = header_search->search_dir_begin();
+ it != header_search->search_dir_end(); ++it) {
+ if (const DirectoryEntry* entry = it->getDir()) {
+ // search_dir_begin()/end() includes both system and user paths.
+ // If it's a system path, it's already in the map, so everything
+ // new is a user path. The insert only 'takes' for new entries.
+ const string path = NormalizeDirPath(MakeAbsolutePath(entry->getName()));
+ search_path_map.insert(make_pair(path, HeaderSearchPath::kUserPath));
+ }
+ }
+ return NormalizeHeaderSearchPaths(search_path_map);
+}
+
+void InitGlobals(clang::SourceManager* sm, clang::HeaderSearch* header_search) {
+ CHECK_(sm && "InitGlobals() needs a non-nullptr SourceManager");
+ source_manager = sm;
+ data_getter = new SourceManagerCharacterDataGetter(*source_manager);
+ vector<HeaderSearchPath> search_paths =
+ ComputeHeaderSearchPaths(header_search);
+ SetHeaderSearchPaths(search_paths);
+ include_picker = new IncludePicker(GlobalFlags().no_default_mappings);
+ function_calls_full_use_cache = new FullUseCache;
+ class_members_full_use_cache = new FullUseCache;
+
+ for (const HeaderSearchPath& entry : search_paths) {
+ const char* path_type_name =
+ (entry.path_type == HeaderSearchPath::kSystemPath ? "system" : "user");
+ VERRS(6) << "Search path: " << entry.path << " (" << path_type_name
+ << ")\n";
+ }
+
+ // Add mappings.
+ for (const string& mapping_file : GlobalFlags().mapping_files) {
+ include_picker->AddMappingsFromFile(mapping_file);
+ }
+}
+
+const CommandlineFlags& GlobalFlags() {
+ CHECK_(commandline_flags && "Call ParseIwyuCommandlineFlags() before this");
+ return *commandline_flags;
+}
+
+CommandlineFlags* MutableGlobalFlagsForTesting() {
+ CHECK_(commandline_flags && "Call ParseIwyuCommandlineFlags() before this");
+ return commandline_flags;
+}
+
+clang::SourceManager* GlobalSourceManager() {
+ CHECK_(source_manager && "Must call InitGlobals() before calling this");
+ return source_manager;
+}
+
+const IncludePicker& GlobalIncludePicker() {
+ CHECK_(include_picker && "Must call InitGlobals() before calling this");
+ return *include_picker;
+}
+
+IncludePicker* MutableGlobalIncludePicker() {
+ CHECK_(include_picker && "Must call InitGlobals() before calling this");
+ return include_picker;
+}
+
+const clang::PrintingPolicy& DefaultPrintPolicy() {
+ return default_print_policy;
+}
+
+const SourceManagerCharacterDataGetter& DefaultDataGetter() {
+ CHECK_(data_getter && "Must call InitGlobals() before calling this");
+ return *data_getter;
+}
+
+FullUseCache* FunctionCallsFullUseCache() {
+ return function_calls_full_use_cache;
+}
+
+FullUseCache* ClassMembersFullUseCache() {
+ return class_members_full_use_cache;
+}
+
+void AddGlobToReportIWYUViolationsFor(const string& glob) {
+ CHECK_(commandline_flags && "Call ParseIwyuCommandlineFlags() before this");
+ commandline_flags->check_also.insert(NormalizeFilePath(glob));
+}
+
+bool ShouldReportIWYUViolationsFor(const clang::FileEntry* file) {
+ const string filepath = GetFilePath(file);
+ for (const string& glob : GlobalFlags().check_also)
+ if (GlobMatchesPath(glob.c_str(), filepath.c_str()))
+ return true;
+ return false;
+}
+
+void InitGlobalsAndFlagsForTesting() {
+ CHECK_(commandline_flags == nullptr && "Only parse commandline flags once");
+ CHECK_(include_picker == nullptr && "Only call InitGlobals[ForTesting] once");
+ commandline_flags = new CommandlineFlags;
+ source_manager = nullptr;
+ data_getter = nullptr;
+ include_picker = new IncludePicker(GlobalFlags().no_default_mappings);
+ function_calls_full_use_cache = new FullUseCache;
+ class_members_full_use_cache = new FullUseCache;
+
+ // Use a reasonable default for the -I flags.
+ map<string, HeaderSearchPath::Type> search_path_map;
+ search_path_map["/usr/include/"] = HeaderSearchPath::kSystemPath;
+ search_path_map["/usr/include/c++/4.3/"] = HeaderSearchPath::kSystemPath;
+ search_path_map["/usr/include/c++/4.2/"] = HeaderSearchPath::kSystemPath;
+ search_path_map["./"] = HeaderSearchPath::kUserPath;
+ search_path_map["/usr/src/linux-headers-2.6.24-gg23/include/"] =
+ HeaderSearchPath::kSystemPath;
+
+ SetHeaderSearchPaths(NormalizeHeaderSearchPaths(search_path_map));
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_globals.h b/iwyu_globals.h
new file mode 100644
index 0000000..8514439
--- /dev/null
+++ b/iwyu_globals.h
@@ -0,0 +1,133 @@
+//===--- iwyu_globals.h - global variables for include-what-you-use -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// The source manager is used in just too many places.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_GLOBALS_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_GLOBALS_H_
+
+#include <set> // for set
+#include <string> // for string
+#include <vector> // for vector
+
+namespace clang {
+class FileEntry;
+class HeaderSearch;
+class SourceManager;
+struct PrintingPolicy;
+} // namespace clang
+
+namespace include_what_you_use {
+
+// Exit codes.
+// If invalid args are specified in any form, we return 1,
+// otherwise we return 2 + the number of edits suggested.
+// Of course, this means that IWYU always fails (i.e. never returns 0.)
+// This is intentional, so it can be used with make -k without ever being
+// considered up-to-date.
+static const int EXIT_INVALIDARGS = 1;
+static const int EXIT_SUCCESS_OFFSET = 2;
+
+using std::set;
+using std::string;
+using std::vector;
+
+class FullUseCache;
+class IncludePicker;
+class SourceManagerCharacterDataGetter;
+
+// To set up the global state you need to parse options with OptionsParser when
+// main starts and to call InitGlobals after the clang infrastructure is set up.
+// The rest of this file is accessors to the data structures set up by these two
+// routines.
+
+class OptionsParser {
+ public:
+ OptionsParser(int argc, char** argv);
+ ~OptionsParser();
+
+ int clang_argc() const { return clang_argc_; }
+ const char** clang_argv() const { return clang_argv_; }
+
+ private:
+ int clang_argc_;
+ const char** clang_argv_;
+};
+
+void InitGlobals(clang::SourceManager* sm, clang::HeaderSearch* header_search);
+
+// Can be called by tests -- doesn't need a SourceManager or
+// argc/argv. Note that GlobalSourceManager() and DefaultDataGetter()
+// will assert-fail if you call this instead of InitGlobals().
+void InitGlobalsAndFlagsForTesting();
+
+// TODO(csilvers): put all of these in the 'globals' namespace?
+
+// The verbose level indicates how chatty IWYU should be. The bigger
+// the chattier.
+// 0: just print the full list of header files.
+// 1: like 0, and also print new and deleted header files.
+// 2: like 1, and also print 'canonical' error line for each type.
+// 3: like 1, and also print *every* error line.
+// 4: like 3, but with sorted error lines, and print all 'reason' comments.
+// 5: like 4, and add tons of debug info.
+// 6: like 5, and print every symbol that's needed by main-cu files.
+// 7: like 6, and print pointers of AST nodes (and uninstantiated templates)
+// 8: like 7, and print all mappings, built-in and dynamic.
+// 10: like 8, and add tons more debug info (for all non-system header files).
+// 11: like 10, and add tons *more* debug info (for all header files).
+struct CommandlineFlags {
+ enum PrefixHeaderIncludePolicy { kAdd, kKeep, kRemove };
+ CommandlineFlags(); // sets flags to default values
+ int ParseArgv(int argc, char** argv); // parses flags from argv
+ static const char kUnspecified[]; // for -d, which takes an optional arg
+
+ set<string> check_also; // -c: globs to report iwyu violations for
+ string howtodebug; // -d: file to print gdb-invoking instruction for
+ string cwd; // -p: what directory was iwyu invoked from?
+ bool transitive_includes_only; // -t: don't add 'new' #includes to files
+ int verbose; // -v: how much information to emit as we parse
+ vector<string> mapping_files; // -m: mapping files
+ bool no_default_mappings; // -n: no default mappings
+ // Truncate output lines to this length. No short option.
+ int max_line_length;
+ // Policy regarding files included via -include option. No short option.
+ PrefixHeaderIncludePolicy prefix_header_include_policy;
+ bool pch_in_code; // Treat the first seen include as a PCH. No short option.
+ bool no_comments; // Disable 'why' comments. No short option.
+};
+
+const CommandlineFlags& GlobalFlags();
+// Used by tests as an easy way to simulate calling with different --flags.
+CommandlineFlags* MutableGlobalFlagsForTesting();
+
+clang::SourceManager* GlobalSourceManager();
+
+const IncludePicker& GlobalIncludePicker();
+IncludePicker* MutableGlobalIncludePicker(); // only use at great need!
+
+const clang::PrintingPolicy& DefaultPrintPolicy();
+
+const SourceManagerCharacterDataGetter& DefaultDataGetter();
+
+// These caches record what types and decls we reported when
+// instantiating a particular decl. That avoids extra work if we see
+// the same decl again -- we can replay those reports, just from a new
+// caller_loc.
+FullUseCache* FunctionCallsFullUseCache();
+FullUseCache* ClassMembersFullUseCache();
+
+// These files are based on the commandline (--check_also flag plus argv).
+// They are specified as glob file-patterns (which behave just as they
+// do in the shell). TODO(csilvers): use a prefix instead? allow '...'?
+void AddGlobToReportIWYUViolationsFor(const string& glob);
+bool ShouldReportIWYUViolationsFor(const clang::FileEntry* file);
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_GLOBALS_H_
diff --git a/iwyu_include_picker.cc b/iwyu_include_picker.cc
new file mode 100644
index 0000000..840057f
--- /dev/null
+++ b/iwyu_include_picker.cc
@@ -0,0 +1,1533 @@
+//===--- iwyu_include_picker.cc - map to canonical #includes for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_include_picker.h"
+
+#include <algorithm> // for find
+#include <cstddef> // for size_t
+// TODO(wan): make sure IWYU doesn't suggest <iterator>.
+#include <iterator> // for find
+// not hash_map: it's not as portable and needs hash<string>.
+#include <map> // for map, map<>::mapped_type, etc
+#include <memory>
+#include <ostream>
+#include <string> // for string, basic_string, etc
+#include <system_error> // for error_code
+#include <utility> // for pair, make_pair
+#include <vector> // for vector, vector<>::iterator
+
+#include "iwyu_location_util.h"
+#include "iwyu_path_util.h"
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+#include "port.h" // for CHECK_
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/ErrorOr.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Regex.h"
+#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/YAMLParser.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/Basic/FileManager.h"
+
+using std::find;
+using std::make_pair;
+using std::map;
+using std::pair;
+using std::string;
+using std::unique_ptr;
+using std::vector;
+
+using llvm::MemoryBuffer;
+using llvm::SourceMgr;
+using llvm::errs;
+using llvm::yaml::KeyValueNode;
+using llvm::yaml::MappingNode;
+using llvm::yaml::Node;
+using llvm::yaml::ScalarNode;
+using llvm::yaml::SequenceNode;
+using llvm::yaml::Stream;
+using llvm::yaml::document_iterator;
+
+namespace include_what_you_use {
+
+// If we map from A to B, it means that every time we need a
+// symbol from A, we can also get it from B. Another way
+// to think about it is that map_to "re-exports" all the
+// symbols from map_from.
+struct IncludeMapEntry { // A POD so we can make the input static
+ const char* map_from; // A quoted-include or a symbol name
+ IncludeVisibility from_visibility;
+ const char* map_to; // A quoted-include
+ IncludeVisibility to_visibility;
+};
+
+namespace {
+
+// Listed below are all IWYU's native symbol and include mappings,
+// loosely based on GCC 4.4's libc and libstdc++.
+
+// Symbol -> include mappings for GNU libc
+const IncludeMapEntry libc_symbol_map[] = {
+ // For library symbols that can be defined in more than one header
+ // file, maps from symbol-name to legitimate header files.
+ // This list was generated via
+ // grep -R '__.*_defined' /usr/include | perl -nle 'm,/usr/include/([^:]*):#\s*\S+ __(.*)_defined, and print qq@ { "$2", kPublic, "<$1>", kPublic },@' | sort -u
+ // I ignored all entries that only appeared once on the list (eg uint32_t).
+ // I then added in NULL, which according to [diff.null] C.2.2.3, can
+ // be defined in <clocale>, <cstddef>, <cstdio>, <cstdlib>,
+ // <cstring>, <ctime>, or <cwchar>. We also allow their C
+ // equivalents.
+ // In each case, I ordered them so <sys/types.h> was first, if it was
+ // an option for this type. That's the preferred #include all else
+ // equal. The visibility on the symbol-name is ignored; by convension
+ // we always set it to kPrivate.
+ { "blksize_t", kPrivate, "<sys/types.h>", kPublic },
+ { "blkcnt_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "blkcnt_t", kPrivate, "<sys/types.h>", kPublic },
+ { "blksize_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "daddr_t", kPrivate, "<sys/types.h>", kPublic },
+ { "daddr_t", kPrivate, "<rpc/types.h>", kPublic },
+ { "dev_t", kPrivate, "<sys/types.h>", kPublic },
+ { "dev_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "error_t", kPrivate, "<errno.h>", kPublic },
+ { "error_t", kPrivate, "<argp.h>", kPublic },
+ { "error_t", kPrivate, "<argz.h>", kPublic },
+ { "fsblkcnt_t", kPrivate, "<sys/types.h>", kPublic },
+ { "fsblkcnt_t", kPrivate, "<sys/statvfs.h>", kPublic },
+ { "fsfilcnt_t", kPrivate, "<sys/types.h>", kPublic },
+ { "fsfilcnt_t", kPrivate, "<sys/statvfs.h>", kPublic },
+ { "gid_t", kPrivate, "<sys/types.h>", kPublic },
+ { "gid_t", kPrivate, "<grp.h>", kPublic },
+ { "gid_t", kPrivate, "<pwd.h>", kPublic },
+ { "gid_t", kPrivate, "<stropts.h>", kPublic },
+ { "gid_t", kPrivate, "<sys/ipc.h>", kPublic },
+ { "gid_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "gid_t", kPrivate, "<unistd.h>", kPublic },
+ { "id_t", kPrivate, "<sys/types.h>", kPublic },
+ { "id_t", kPrivate, "<sys/resource.h>", kPublic },
+ { "ino64_t", kPrivate, "<sys/types.h>", kPublic },
+ { "ino64_t", kPrivate, "<dirent.h>", kPublic },
+ { "ino_t", kPrivate, "<sys/types.h>", kPublic },
+ { "ino_t", kPrivate, "<dirent.h>", kPublic },
+ { "ino_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "int8_t", kPrivate, "<sys/types.h>", kPublic },
+ { "int8_t", kPrivate, "<stdint.h>", kPublic },
+ { "intptr_t", kPrivate, "<stdint.h>", kPublic },
+ { "intptr_t", kPrivate, "<unistd.h>", kPublic },
+ { "key_t", kPrivate, "<sys/types.h>", kPublic },
+ { "key_t", kPrivate, "<sys/ipc.h>", kPublic },
+ { "mode_t", kPrivate, "<sys/types.h>", kPublic },
+ { "mode_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "mode_t", kPrivate, "<sys/ipc.h>", kPublic },
+ { "mode_t", kPrivate, "<sys/mman.h>", kPublic },
+ { "nlink_t", kPrivate, "<sys/types.h>", kPublic },
+ { "nlink_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "off64_t", kPrivate, "<sys/types.h>", kPublic },
+ { "off64_t", kPrivate, "<unistd.h>", kPublic },
+ { "off_t", kPrivate, "<sys/types.h>", kPublic },
+ { "off_t", kPrivate, "<unistd.h>", kPublic },
+ { "off_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "off_t", kPrivate, "<sys/mman.h>", kPublic },
+ { "pid_t", kPrivate, "<sys/types.h>", kPublic },
+ { "pid_t", kPrivate, "<unistd.h>", kPublic },
+ { "pid_t", kPrivate, "<signal.h>", kPublic },
+ { "pid_t", kPrivate, "<sys/msg.h>", kPublic },
+ { "pid_t", kPrivate, "<sys/shm.h>", kPublic },
+ { "pid_t", kPrivate, "<termios.h>", kPublic },
+ { "pid_t", kPrivate, "<time.h>", kPublic },
+ { "pid_t", kPrivate, "<utmpx.h>", kPublic },
+ { "sigset_t", kPrivate, "<signal.h>", kPublic },
+ { "sigset_t", kPrivate, "<sys/epoll.h>", kPublic },
+ { "sigset_t", kPrivate, "<sys/select.h>", kPublic },
+ { "socklen_t", kPrivate, "<bits/socket.h>", kPrivate },
+ { "socklen_t", kPrivate, "<unistd.h>", kPublic },
+ { "socklen_t", kPrivate, "<arpa/inet.h>", kPublic },
+ { "ssize_t", kPrivate, "<sys/types.h>", kPublic },
+ { "ssize_t", kPrivate, "<unistd.h>", kPublic },
+ { "ssize_t", kPrivate, "<monetary.h>", kPublic },
+ { "ssize_t", kPrivate, "<sys/msg.h>", kPublic },
+ { "suseconds_t", kPrivate, "<sys/types.h>", kPublic },
+ { "suseconds_t", kPrivate, "<sys/time.h>", kPublic },
+ { "suseconds_t", kPrivate, "<sys/select.h>", kPublic },
+ { "u_char", kPrivate, "<sys/types.h>", kPublic },
+ { "u_char", kPrivate, "<rpc/types.h>", kPublic },
+ { "uid_t", kPrivate, "<sys/types.h>", kPublic },
+ { "uid_t", kPrivate, "<unistd.h>", kPublic },
+ { "uid_t", kPrivate, "<pwd.h>", kPublic },
+ { "uid_t", kPrivate, "<signal.h>", kPublic },
+ { "uid_t", kPrivate, "<stropts.h>", kPublic },
+ { "uid_t", kPrivate, "<sys/ipc.h>", kPublic },
+ { "uid_t", kPrivate, "<sys/stat.h>", kPublic },
+ { "useconds_t", kPrivate, "<sys/types.h>", kPublic },
+ { "useconds_t", kPrivate, "<unistd.h>", kPublic },
+ // glob.h seems to define size_t if necessary, but it should come from stddef.
+ // It is unspecified if the cname headers provide ::size_t.
+ // <locale.h> is the one header which defines NULL but not size_t.
+ { "size_t", kPrivate, "<stddef.h>", kPublic }, // 'canonical' location for size_t
+ { "size_t", kPrivate, "<stdio.h>", kPublic },
+ { "size_t", kPrivate, "<stdlib.h>", kPublic },
+ { "size_t", kPrivate, "<string.h>", kPublic },
+ { "size_t", kPrivate, "<time.h>", kPublic },
+ { "size_t", kPrivate, "<wchar.h>", kPublic },
+ // Macros that can be defined in more than one file, don't have the
+ // same __foo_defined guard that other types do, so the grep above
+ // doesn't discover them. Until I figure out a better way, I just
+ // add them in by hand as I discover them.
+ { "EOF", kPrivate, "<stdio.h>", kPublic },
+ { "EOF", kPrivate, "<libio.h>", kPublic },
+ { "FILE", kPrivate, "<stdio.h>", kPublic },
+ { "va_list", kPrivate, "<stdarg.h>", kPublic },
+ // These are symbols that could be defined in either stdlib.h or
+ // malloc.h, but we always want the stdlib location.
+ { "malloc", kPrivate, "<stdlib.h>", kPublic },
+ { "calloc", kPrivate, "<stdlib.h>", kPublic },
+ { "realloc", kPrivate, "<stdlib.h>", kPublic },
+ { "free", kPrivate, "<stdlib.h>", kPublic },
+ // Entries for NULL
+ { "NULL", kPrivate, "<stddef.h>", kPublic }, // 'canonical' location for NULL
+ { "NULL", kPrivate, "<clocale>", kPublic },
+ { "NULL", kPrivate, "<cstddef>", kPublic },
+ { "NULL", kPrivate, "<cstdio>", kPublic },
+ { "NULL", kPrivate, "<cstdlib>", kPublic },
+ { "NULL", kPrivate, "<cstring>", kPublic },
+ { "NULL", kPrivate, "<ctime>", kPublic },
+ { "NULL", kPrivate, "<cwchar>", kPublic },
+ { "NULL", kPrivate, "<locale.h>", kPublic },
+ { "NULL", kPrivate, "<stdio.h>", kPublic },
+ { "NULL", kPrivate, "<stdlib.h>", kPublic },
+ { "NULL", kPrivate, "<string.h>", kPublic },
+ { "NULL", kPrivate, "<time.h>", kPublic },
+ { "NULL", kPrivate, "<wchar.h>", kPublic },
+};
+
+// Symbol -> include mappings for GNU libstdc++
+const IncludeMapEntry libstdcpp_symbol_map[] = {
+ // Kludge time: almost all STL types take an allocator, but they
+ // almost always use the default value. Usually we detect that
+ // and don't try to do IWYU, but sometimes it passes through.
+ // For instance, when adding two strings, we end up calling
+ // template<_CharT,_Traits,_Alloc> ... operator+(
+ // basic_string<_CharT,_Traits,_Alloc>, ...)
+ // These look like normal template args to us, so we see they're
+ // used and declare an iwyu dependency, even though we don't need
+ // to #include the traits or alloc type ourselves. The surest way
+ // to deal with this is to just say that everyone provides
+ // std::allocator. We can add more here at need.
+ { "std::allocator", kPrivate, "<memory>", kPublic },
+ { "std::allocator", kPrivate, "<string>", kPublic },
+ { "std::allocator", kPrivate, "<vector>", kPublic },
+ { "std::allocator", kPrivate, "<map>", kPublic },
+ { "std::allocator", kPrivate, "<set>", kPublic },
+ // A similar kludge for std::char_traits. basic_string,
+ // basic_ostream and basic_istream have this as a default template
+ // argument, and sometimes it bleeds through when clang desugars the
+ // string/ostream/istream type.
+ { "std::char_traits", kPrivate, "<string>", kPublic },
+ { "std::char_traits", kPrivate, "<ostream>", kPublic },
+ { "std::char_traits", kPrivate, "<istream>", kPublic },
+};
+
+// Private -> public include mappings for GNU libc
+const IncludeMapEntry libc_include_map[] = {
+ // ( cd /usr/include && grep '^ *# *include' {sys/,net/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | grep bits/ | sort )
+ // When I saw more than one mapping for these, I typically picked
+ // what I thought was the "best" one.
+ { "<bits/a.out.h>", kPrivate, "<a.out.h>", kPublic },
+ { "<bits/auxv.h>", kPrivate, "<sys/auxv.h>", kPublic },
+ { "<bits/byteswap.h>", kPrivate, "<byteswap.h>", kPublic },
+ { "<bits/cmathcalls.h>", kPrivate, "<complex.h>", kPublic },
+ { "<bits/confname.h>", kPrivate, "<unistd.h>", kPublic },
+ { "<bits/dirent.h>", kPrivate, "<dirent.h>", kPublic },
+ { "<bits/dlfcn.h>", kPrivate, "<dlfcn.h>", kPublic },
+ { "<bits/elfclass.h>", kPrivate, "<link.h>", kPublic },
+ { "<bits/endian.h>", kPrivate, "<endian.h>", kPublic },
+ { "<bits/environments.h>", kPrivate, "<unistd.h>", kPublic },
+ { "<bits/epoll.h>", kPrivate, "<sys/epoll.h>", kPublic },
+ { "<bits/errno.h>", kPrivate, "<errno.h>", kPublic },
+ { "<bits/error.h>", kPrivate, "<error.h>", kPublic },
+ { "<bits/eventfd.h>", kPrivate, "<sys/eventfd.h>", kPublic },
+ { "<bits/fcntl.h>", kPrivate, "<fcntl.h>", kPublic },
+ { "<bits/fcntl2.h>", kPrivate, "<fcntl.h>", kPublic },
+ { "<bits/fenv.h>", kPrivate, "<fenv.h>", kPublic },
+ { "<bits/fenvinline.h>", kPrivate, "<fenv.h>", kPublic },
+ { "<bits/huge_val.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/huge_valf.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/huge_vall.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/hwcap.h>", kPrivate, "<sys/auxv.h>", kPublic },
+ { "<bits/inf.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/inotify.h>", kPrivate, "<sys/inotify.h>", kPublic },
+ { "<bits/ioctl-types.h>", kPrivate, "<sys/ioctl.h>", kPublic },
+ { "<bits/ioctls.h>", kPrivate, "<sys/ioctl.h>", kPublic },
+ { "<bits/ipc.h>", kPrivate, "<sys/ipc.h>", kPublic },
+ { "<bits/ipctypes.h>", kPrivate, "<sys/ipc.h>", kPublic },
+ { "<bits/libio-ldbl.h>", kPrivate, "<libio.h>", kPublic },
+ { "<bits/link.h>", kPrivate, "<link.h>", kPublic },
+ { "<bits/locale.h>", kPrivate, "<locale.h>", kPublic },
+ { "<bits/math-finite.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mathcalls.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mathdef.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mathinline.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mman.h>", kPrivate, "<sys/mman.h>", kPublic },
+ { "<bits/monetary-ldbl.h>", kPrivate, "<monetary.h>", kPublic },
+ { "<bits/mqueue.h>", kPrivate, "<mqueue.h>", kPublic },
+ { "<bits/mqueue2.h>", kPrivate, "<mqueue.h>", kPublic },
+ { "<bits/msq.h>", kPrivate, "<sys/msg.h>", kPublic },
+ { "<bits/nan.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/netdb.h>", kPrivate, "<netdb.h>", kPublic },
+ { "<bits/param.h>", kPrivate, "<sys/param.h>", kPublic },
+ { "<bits/poll.h>", kPrivate, "<sys/poll.h>", kPrivate },
+ { "<bits/poll2.h>", kPrivate, "<sys/poll.h>", kPrivate },
+ { "<bits/posix1_lim.h>", kPrivate, "<limits.h>", kPublic },
+ { "<bits/posix2_lim.h>", kPrivate, "<limits.h>", kPublic },
+ { "<bits/posix_opt.h>", kPrivate, "<unistd.h>", kPublic },
+ { "<bits/printf-ldbl.h>", kPrivate, "<printf.h>", kPublic },
+ { "<bits/pthreadtypes.h>", kPrivate, "<pthread.h>", kPublic },
+ { "<bits/resource.h>", kPrivate, "<sys/resource.h>", kPublic },
+ { "<bits/sched.h>", kPrivate, "<sched.h>", kPublic },
+ { "<bits/select.h>", kPrivate, "<sys/select.h>", kPublic },
+ { "<bits/select2.h>", kPrivate, "<sys/select.h>", kPublic },
+ { "<bits/sem.h>", kPrivate, "<sys/sem.h>", kPublic },
+ { "<bits/semaphore.h>", kPrivate, "<semaphore.h>", kPublic },
+ { "<bits/setjmp.h>", kPrivate, "<setjmp.h>", kPublic },
+ { "<bits/setjmp2.h>", kPrivate, "<setjmp.h>", kPublic },
+ { "<bits/shm.h>", kPrivate, "<sys/shm.h>", kPublic },
+ { "<bits/sigaction.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/sigcontext.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/siginfo.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/signum.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/sigset.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/sigstack.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/sigthread.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/sockaddr.h>", kPrivate, "<sys/un.h>", kPublic },
+ { "<bits/socket.h>", kPrivate, "<sys/socket.h>", kPublic },
+ { "<bits/socket2.h>", kPrivate, "<sys/socket.h>", kPublic },
+ { "<bits/socket_type.h>", kPrivate, "<sys/socket.h>", kPublic },
+ { "<bits/stab.def>", kPrivate, "<stab.h>", kPublic },
+ { "<bits/stat.h>", kPrivate, "<sys/stat.h>", kPublic },
+ { "<bits/statfs.h>", kPrivate, "<sys/statfs.h>", kPublic },
+ { "<bits/statvfs.h>", kPrivate, "<sys/statvfs.h>", kPublic },
+ { "<bits/stdio-ldbl.h>", kPrivate, "<stdio.h>", kPublic },
+ { "<bits/stdio-lock.h>", kPrivate, "<libio.h>", kPublic },
+ { "<bits/stdio.h>", kPrivate, "<stdio.h>", kPublic },
+ { "<bits/stdio2.h>", kPrivate, "<stdio.h>", kPublic },
+ { "<bits/stdio_lim.h>", kPrivate, "<stdio.h>", kPublic },
+ { "<bits/stdlib-bsearch.h>", kPrivate, "<stdlib.h>", kPublic },
+ { "<bits/stdlib-float.h>", kPrivate, "<stdlib.h>", kPublic },
+ { "<bits/stdlib-ldbl.h>", kPrivate, "<stdlib.h>", kPublic },
+ { "<bits/stdlib.h>", kPrivate, "<stdlib.h>", kPublic },
+ { "<bits/string.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/string2.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/string3.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/stropts.h>", kPrivate, "<stropts.h>", kPublic },
+ { "<bits/sys_errlist.h>", kPrivate, "<stdio.h>", kPublic },
+ { "<bits/syscall.h>", kPrivate, "<sys/syscall.h>", kPrivate },
+ { "<bits/sysctl.h>", kPrivate, "<sys/sysctl.h>", kPublic },
+ { "<bits/syslog-ldbl.h>", kPrivate, "<sys/syslog.h>", kPrivate },
+ { "<bits/syslog-path.h>", kPrivate, "<sys/syslog.h>", kPrivate },
+ { "<bits/syslog.h>", kPrivate, "<sys/syslog.h>", kPrivate },
+ { "<bits/termios.h>", kPrivate, "<termios.h>", kPublic },
+ { "<bits/time.h>", kPrivate, "<sys/time.h>", kPublic },
+ { "<bits/timerfd.h>", kPrivate, "<sys/timerfd.h>", kPublic },
+ { "<bits/timex.h>", kPrivate, "<sys/timex.h>", kPublic },
+ { "<bits/types.h>", kPrivate, "<sys/types.h>", kPublic },
+ { "<bits/uio.h>", kPrivate, "<sys/uio.h>", kPublic },
+ { "<bits/unistd.h>", kPrivate, "<unistd.h>", kPublic },
+ { "<bits/ustat.h>", kPrivate, "<sys/ustat.h>", kPrivate },
+ { "<bits/utmp.h>", kPrivate, "<utmp.h>", kPublic },
+ { "<bits/utmpx.h>", kPrivate, "<utmpx.h>", kPublic },
+ { "<bits/utsname.h>", kPrivate, "<sys/utsname.h>", kPublic },
+ { "<bits/waitflags.h>", kPrivate, "<sys/wait.h>", kPublic },
+ { "<bits/waitstatus.h>", kPrivate, "<sys/wait.h>", kPublic },
+ { "<bits/wchar-ldbl.h>", kPrivate, "<wchar.h>", kPublic },
+ { "<bits/wchar.h>", kPrivate, "<wchar.h>", kPublic },
+ { "<bits/wchar2.h>", kPrivate, "<wchar.h>", kPublic },
+ { "<bits/wordsize.h>", kPrivate, "<limits.h>", kPublic },
+ { "<bits/xopen_lim.h>", kPrivate, "<limits.h>", kPublic },
+ { "<bits/xtitypes.h>", kPrivate, "<stropts.h>", kPublic },
+ // Sometimes libc tells you what mapping to do via an '#error':
+ // # error "Never use <bits/dlfcn.h> directly; include <dlfcn.h> instead."
+ // or
+ // # error "Never include <bits/socket_type.h> directly; use <sys/socket.h> instead."
+ // ( cd /usr/include && grep -R '^ *# *error "Never use\|include' * | perl -nle 'm/<([^>]+).*directly.*<([^>]+)/ && print qq@ { "<$1>", kPrivate, "<$2>", kPublic },@' | sort )
+ { "<bits/a.out.h>", kPrivate, "<a.out.h>", kPublic },
+ { "<bits/byteswap-16.h>", kPrivate, "<byteswap.h>", kPublic },
+ { "<bits/byteswap.h>", kPrivate, "<byteswap.h>", kPublic },
+ { "<bits/cmathcalls.h>", kPrivate, "<complex.h>", kPublic },
+ { "<bits/confname.h>", kPrivate, "<unistd.h>", kPublic },
+ { "<bits/dirent.h>", kPrivate, "<dirent.h>", kPublic },
+ { "<bits/dlfcn.h>", kPrivate, "<dlfcn.h>", kPublic },
+ { "<bits/elfclass.h>", kPrivate, "<link.h>", kPublic },
+ { "<bits/endian.h>", kPrivate, "<endian.h>", kPublic },
+ { "<bits/epoll.h>", kPrivate, "<sys/epoll.h>", kPublic },
+ { "<bits/eventfd.h>", kPrivate, "<sys/eventfd.h>", kPublic },
+ { "<bits/fcntl-linux.h>", kPrivate, "<fcntl.h>", kPublic },
+ { "<bits/fcntl.h>", kPrivate, "<fcntl.h>", kPublic },
+ { "<bits/fenv.h>", kPrivate, "<fenv.h>", kPublic },
+ { "<bits/huge_val.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/huge_valf.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/huge_vall.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/in.h>", kPrivate, "<netinet/in.h>", kPublic },
+ { "<bits/inf.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/inotify.h>", kPrivate, "<sys/inotify.h>", kPublic },
+ { "<bits/ioctl-types.h>", kPrivate, "<sys/ioctl.h>", kPublic },
+ { "<bits/ioctls.h>", kPrivate, "<sys/ioctl.h>", kPublic },
+ { "<bits/ipc.h>", kPrivate, "<sys/ipc.h>", kPublic },
+ { "<bits/ipctypes.h>", kPrivate, "<sys/ipc.h>", kPublic },
+ { "<bits/locale.h>", kPrivate, "<locale.h>", kPublic },
+ { "<bits/math-finite.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mathdef.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mathinline.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/mman-linux.h>", kPrivate, "<sys/mman.h>", kPublic },
+ { "<bits/mman.h>", kPrivate, "<sys/mman.h>", kPublic },
+ { "<bits/mqueue.h>", kPrivate, "<mqueue.h>", kPublic },
+ { "<bits/msq.h>", kPrivate, "<sys/msg.h>", kPublic },
+ { "<bits/nan.h>", kPrivate, "<math.h>", kPublic },
+ { "<bits/param.h>", kPrivate, "<sys/param.h>", kPublic },
+ { "<bits/poll.h>", kPrivate, "<sys/poll.h>", kPrivate },
+ { "<bits/predefs.h>", kPrivate, "<features.h>", kPublic },
+ { "<bits/resource.h>", kPrivate, "<sys/resource.h>", kPublic },
+ { "<bits/select.h>", kPrivate, "<sys/select.h>", kPublic },
+ { "<bits/semaphore.h>", kPrivate, "<semaphore.h>", kPublic },
+ { "<bits/sigcontext.h>", kPrivate, "<signal.h>", kPublic },
+ { "<bits/signalfd.h>", kPrivate, "<sys/signalfd.h>", kPublic },
+ { "<bits/stdlib-float.h>", kPrivate, "<stdlib.h>", kPublic },
+ { "<bits/string.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/string2.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/string3.h>", kPrivate, "<string.h>", kPublic },
+ { "<bits/syscall.h>", kPrivate, "<sys/syscall.h>", kPrivate },
+ { "<bits/timerfd.h>", kPrivate, "<sys/timerfd.h>", kPublic },
+ { "<bits/typesizes.h>", kPrivate, "<sys/types.h>", kPublic },
+ // Top-level #includes that just forward to another file:
+ // $ for i in /usr/include/*; do [ -f $i ] && [ `wc -l < $i` = 1 ] && echo $i; done
+ // (poll.h, syscall.h, syslog.h, ustat.h, wait.h).
+ // For each file, I looked at the list of canonical header files --
+ // http://www.opengroup.org/onlinepubs/9699919799/idx/head.html --
+ // to decide which of the two files is canonical. If neither is
+ // on the POSIX.1 1998 list, I just choose the top-level one.
+ { "<sys/poll.h>", kPrivate, "<poll.h>", kPublic },
+ { "<sys/syscall.h>", kPrivate, "<syscall.h>", kPublic },
+ { "<sys/syslog.h>", kPrivate, "<syslog.h>", kPublic },
+ { "<sys/ustat.h>", kPrivate, "<ustat.h>", kPublic },
+ { "<wait.h>", kPrivate, "<sys/wait.h>", kPublic },
+ // These are all files in bits/ that delegate to asm/ and linux/ to
+ // do all (or lots) of the work. Note these are private->private.
+ // $ for i in /usr/include/bits/*; do for dir in asm linux; do grep -H -e $dir/`basename $i` $i; done; done
+ { "<linux/errno.h>", kPrivate, "<bits/errno.h>", kPrivate },
+ { "<asm/ioctls.h>", kPrivate, "<bits/ioctls.h>", kPrivate },
+ { "<asm/socket.h>", kPrivate, "<bits/socket.h>", kPrivate },
+ { "<linux/socket.h>", kPrivate, "<bits/socket.h>", kPrivate },
+ // Some asm files have 32- and 64-bit variants:
+ // $ ls /usr/include/asm/*_{32,64}.h
+ { "<asm/posix_types_32.h>", kPrivate, "<asm/posix_types.h>", kPublic },
+ { "<asm/posix_types_64.h>", kPrivate, "<asm/posix_types.h>", kPublic },
+ { "<asm/unistd_32.h>", kPrivate, "<asm/unistd.h>", kPrivate },
+ { "<asm/unistd_64.h>", kPrivate, "<asm/unistd.h>", kPrivate },
+ // I don't know what grep would have found these. I found them
+ // via user report.
+ { "<asm/errno.h>", kPrivate, "<errno.h>", kPublic },
+ { "<asm/errno-base.h>", kPrivate, "<errno.h>", kPublic },
+ { "<asm/ptrace-abi.h>", kPrivate, "<asm/ptrace.h>", kPublic },
+ { "<asm/unistd.h>", kPrivate, "<syscall.h>", kPublic },
+ { "<linux/limits.h>", kPrivate, "<limits.h>", kPublic }, // PATH_MAX
+ { "<linux/prctl.h>", kPrivate, "<sys/prctl.h>", kPublic },
+ { "<sys/ucontext.h>", kPrivate, "<ucontext.h>", kPublic },
+};
+
+const IncludeMapEntry stdlib_c_include_map[] = {
+ // Allow the C++ wrappers around C files. Without these mappings,
+ // if you #include <cstdio>, iwyu will tell you to replace it with
+ // <stdio.h>, which is where the symbols are actually defined. We
+ // inhibit that behavior to keep the <cstdio> alone. Note this is a
+ // public-to-public mapping: we don't want to *replace* <assert.h>
+ // with <cassert>, we just want to avoid suggesting changing
+ // <cassert> back to <assert.h>. (If you *did* want to replace
+ // assert.h with cassert, you'd change it to a public->private
+ // mapping.) Here is how I identified the files to map:
+ // $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
+ //
+ // These headers are defined in C++14 [headers]p3. You can get them with
+ // $ sed -n '/begin{floattable}.*{tab:cpp.c.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{<c(.*)>}/ && print qq@ { "<$1.h>", kPublic, "<c$1>", kPublic },@' | sort
+ // on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
+ { "<assert.h>", kPublic, "<cassert>", kPublic },
+ { "<complex.h>", kPublic, "<ccomplex>", kPublic },
+ { "<ctype.h>", kPublic, "<cctype>", kPublic },
+ { "<errno.h>", kPublic, "<cerrno>", kPublic },
+ { "<fenv.h>", kPublic, "<cfenv>", kPublic },
+ { "<float.h>", kPublic, "<cfloat>", kPublic },
+ { "<inttypes.h>", kPublic, "<cinttypes>", kPublic },
+ { "<iso646.h>", kPublic, "<ciso646>", kPublic },
+ { "<limits.h>", kPublic, "<climits>", kPublic },
+ { "<locale.h>", kPublic, "<clocale>", kPublic },
+ { "<math.h>", kPublic, "<cmath>", kPublic },
+ { "<setjmp.h>", kPublic, "<csetjmp>", kPublic },
+ { "<signal.h>", kPublic, "<csignal>", kPublic },
+ { "<stdalign.h>", kPublic, "<cstdalign>", kPublic },
+ { "<stdarg.h>", kPublic, "<cstdarg>", kPublic },
+ { "<stdbool.h>", kPublic, "<cstdbool>", kPublic },
+ { "<stddef.h>", kPublic, "<cstddef>", kPublic },
+ { "<stdint.h>", kPublic, "<cstdint>", kPublic },
+ { "<stdio.h>", kPublic, "<cstdio>", kPublic },
+ { "<stdlib.h>", kPublic, "<cstdlib>", kPublic },
+ { "<string.h>", kPublic, "<cstring>", kPublic },
+ { "<tgmath.h>", kPublic, "<ctgmath>", kPublic },
+ { "<time.h>", kPublic, "<ctime>", kPublic },
+ { "<uchar.h>", kPublic, "<cuchar>", kPublic },
+ { "<wchar.h>", kPublic, "<cwchar>", kPublic },
+ { "<wctype.h>", kPublic, "<cwctype>", kPublic },
+};
+
+const char* stdlib_cpp_public_headers[] = {
+ // These headers are defined in C++14 [headers]p2. You can get them with
+ // $ sed -n '/begin{floattable}.*{tab:cpp.library.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{(.*)}/ && print qq@ "$1",@' | sort
+ // on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
+ "<algorithm>",
+ "<array>",
+ "<atomic>",
+ "<bitset>",
+ "<chrono>",
+ "<codecvt>",
+ "<complex>",
+ "<condition_variable>",
+ "<deque>",
+ "<exception>",
+ "<forward_list>",
+ "<fstream>",
+ "<functional>",
+ "<future>",
+ "<initializer_list>",
+ "<iomanip>",
+ "<ios>",
+ "<iosfwd>",
+ "<iostream>",
+ "<istream>",
+ "<iterator>",
+ "<limits>",
+ "<list>",
+ "<locale>",
+ "<map>",
+ "<memory>",
+ "<mutex>",
+ "<new>",
+ "<numeric>",
+ "<ostream>",
+ "<queue>",
+ "<random>",
+ "<ratio>",
+ "<regex>",
+ "<scoped_allocator>",
+ "<set>",
+ "<sstream>",
+ "<stack>",
+ "<stdexcept>",
+ "<streambuf>",
+ "<string>",
+ "<strstream>",
+ "<system_error>",
+ "<thread>",
+ "<tuple>",
+ "<type_traits>",
+ "<typeindex>",
+ "<typeinfo>",
+ "<unordered_map>",
+ "<unordered_set>",
+ "<utility>",
+ "<valarray>",
+ "<vector>",
+};
+
+// Private -> public include mappings for GNU libstdc++
+const IncludeMapEntry libstdcpp_include_map[] = {
+ // ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | grep -e bits/ -e tr1_impl/ | sort -u)
+ // I removed a lot of 'meaningless' dependencies -- for instance,
+ // <functional> #includes <bits/stringfwd.h>, but if someone is
+ // using strings, <functional> isn't enough to satisfy iwyu.
+ // We may need to add other dirs in future versions of gcc.
+ { "<bits/algorithmfwd.h>", kPrivate, "<algorithm>", kPublic },
+ { "<bits/allocator.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/atomic_word.h>", kPrivate, "<ext/atomicity.h>", kPublic },
+ { "<bits/basic_file.h>", kPrivate, "<fstream>", kPublic },
+ { "<bits/basic_ios.h>", kPrivate, "<ios>", kPublic },
+ { "<bits/basic_string.h>", kPrivate, "<string>", kPublic },
+ { "<bits/basic_string.tcc>", kPrivate, "<string>", kPublic },
+ { "<bits/boost_sp_shared_count.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/c++io.h>", kPrivate, "<ext/stdio_sync_filebuf.h>", kPublic },
+ { "<bits/c++config.h>", kPrivate, "<cstddef>", kPublic },
+ { "<bits/char_traits.h>", kPrivate, "<string>", kPublic },
+ { "<bits/cmath.tcc>", kPrivate, "<cmath>", kPublic },
+ { "<bits/codecvt.h>", kPrivate, "<fstream>", kPublic },
+ { "<bits/cxxabi_tweaks.h>", kPrivate, "<cxxabi.h>", kPublic },
+ { "<bits/deque.tcc>", kPrivate, "<deque>", kPublic },
+ { "<bits/fstream.tcc>", kPrivate, "<fstream>", kPublic },
+ { "<bits/functional_hash.h>", kPrivate, "<unordered_map>", kPublic },
+ { "<bits/gslice.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/gslice_array.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/hashtable.h>", kPrivate, "<unordered_map>", kPublic },
+ { "<bits/hashtable.h>", kPrivate, "<unordered_set>", kPublic },
+ { "<bits/indirect_array.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/ios_base.h>", kPrivate, "<iostream>", kPublic },
+ { "<bits/ios_base.h>", kPrivate, "<ios>", kPublic },
+ { "<bits/ios_base.h>", kPrivate, "<iomanip>", kPublic },
+ { "<bits/locale_classes.h>", kPrivate, "<locale>", kPublic },
+ { "<bits/locale_facets.h>", kPrivate, "<locale>", kPublic },
+ { "<bits/locale_facets_nonio.h>", kPrivate, "<locale>", kPublic },
+ { "<bits/localefwd.h>", kPrivate, "<locale>", kPublic },
+ { "<bits/mask_array.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/ostream.tcc>", kPrivate, "<ostream>", kPublic },
+ { "<bits/ostream_insert.h>", kPrivate, "<ostream>", kPublic },
+ { "<bits/postypes.h>", kPrivate, "<iostream>", kPublic },
+ { "<bits/slice_array.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/stl_algo.h>", kPrivate, "<algorithm>", kPublic },
+ { "<bits/stl_algobase.h>", kPrivate, "<algorithm>", kPublic },
+ { "<bits/stl_bvector.h>", kPrivate, "<vector>", kPublic },
+ { "<bits/stl_construct.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/stl_deque.h>", kPrivate, "<deque>", kPublic },
+ { "<bits/stl_function.h>", kPrivate, "<functional>", kPublic },
+ { "<bits/stl_heap.h>", kPrivate, "<queue>", kPublic },
+ { "<bits/stl_iterator.h>", kPrivate, "<iterator>", kPublic },
+ { "<bits/stl_iterator_base_funcs.h>", kPrivate, "<iterator>", kPublic },
+ { "<bits/stl_iterator_base_types.h>", kPrivate, "<iterator>", kPublic },
+ { "<bits/stl_list.h>", kPrivate, "<list>", kPublic },
+ { "<bits/stl_map.h>", kPrivate, "<map>", kPublic },
+ { "<bits/stl_multimap.h>", kPrivate, "<map>", kPublic },
+ { "<bits/stl_multiset.h>", kPrivate, "<set>", kPublic },
+ { "<bits/stl_numeric.h>", kPrivate, "<numeric>", kPublic },
+ { "<bits/stl_pair.h>", kPrivate, "<utility>", kPublic },
+ { "<bits/stl_pair.h>", kPrivate, "<tr1/utility>", kPublic },
+ { "<bits/stl_queue.h>", kPrivate, "<queue>", kPublic },
+ { "<bits/stl_raw_storage_iter.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/stl_relops.h>", kPrivate, "<utility>", kPublic },
+ { "<bits/stl_set.h>", kPrivate, "<set>", kPublic },
+ { "<bits/stl_stack.h>", kPrivate, "<stack>", kPublic },
+ { "<bits/stl_tempbuf.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/stl_tree.h>", kPrivate, "<map>", kPublic },
+ { "<bits/stl_tree.h>", kPrivate, "<set>", kPublic },
+ { "<bits/stl_uninitialized.h>", kPrivate, "<memory>", kPublic },
+ { "<bits/stl_vector.h>", kPrivate, "<vector>", kPublic },
+ { "<bits/stream_iterator.h>", kPrivate, "<iterator>", kPublic },
+ { "<bits/streambuf.tcc>", kPrivate, "<streambuf>", kPublic },
+ { "<bits/streambuf_iterator.h>", kPrivate, "<iterator>", kPublic },
+ { "<bits/stringfwd.h>", kPrivate, "<string>", kPublic },
+ { "<bits/valarray_after.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/valarray_array.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/valarray_before.h>", kPrivate, "<valarray>", kPublic },
+ { "<bits/vector.tcc>", kPrivate, "<vector>", kPublic },
+ { "<tr1_impl/array>", kPrivate, "<array>", kPublic },
+ { "<tr1_impl/array>", kPrivate, "<tr1/array>", kPublic },
+ { "<tr1_impl/boost_shared_ptr.h>", kPrivate, "<memory>", kPublic },
+ { "<tr1_impl/boost_shared_ptr.h>", kPrivate, "<tr1/memory>", kPublic },
+ { "<tr1_impl/boost_sp_counted_base.h>", kPrivate, "<memory>", kPublic },
+ { "<tr1_impl/boost_sp_counted_base.h>", kPrivate, "<tr1/memory>", kPublic },
+ { "<tr1_impl/cctype>", kPrivate, "<cctype>", kPublic },
+ { "<tr1_impl/cctype>", kPrivate, "<tr1/cctype>", kPublic },
+ { "<tr1_impl/cfenv>", kPrivate, "<cfenv>", kPublic },
+ { "<tr1_impl/cfenv>", kPrivate, "<tr1/cfenv>", kPublic },
+ { "<tr1_impl/cinttypes>", kPrivate, "<cinttypes>", kPublic },
+ { "<tr1_impl/cinttypes>", kPrivate, "<tr1/cinttypes>", kPublic },
+ { "<tr1_impl/cmath>", kPrivate, "<cmath>", kPublic },
+ { "<tr1_impl/cmath>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1_impl/complex>", kPrivate, "<complex>", kPublic },
+ { "<tr1_impl/complex>", kPrivate, "<tr1/complex>", kPublic },
+ { "<tr1_impl/cstdint>", kPrivate, "<cstdint>", kPublic },
+ { "<tr1_impl/cstdint>", kPrivate, "<tr1/cstdint>", kPublic },
+ { "<tr1_impl/cstdio>", kPrivate, "<cstdio>", kPublic },
+ { "<tr1_impl/cstdio>", kPrivate, "<tr1/cstdio>", kPublic },
+ { "<tr1_impl/cstdlib>", kPrivate, "<cstdlib>", kPublic },
+ { "<tr1_impl/cstdlib>", kPrivate, "<tr1/cstdlib>", kPublic },
+ { "<tr1_impl/cwchar>", kPrivate, "<cwchar>", kPublic },
+ { "<tr1_impl/cwchar>", kPrivate, "<tr1/cwchar>", kPublic },
+ { "<tr1_impl/cwctype>", kPrivate, "<cwctype>", kPublic },
+ { "<tr1_impl/cwctype>", kPrivate, "<tr1/cwctype>", kPublic },
+ { "<tr1_impl/functional>", kPrivate, "<functional>", kPublic },
+ { "<tr1_impl/functional>", kPrivate, "<tr1/functional>", kPublic },
+ { "<tr1_impl/random>", kPrivate, "<random>", kPublic },
+ { "<tr1_impl/random>", kPrivate, "<tr1/random>", kPublic },
+ { "<tr1_impl/regex>", kPrivate, "<regex>", kPublic },
+ { "<tr1_impl/regex>", kPrivate, "<tr1/regex>", kPublic },
+ { "<tr1_impl/type_traits>", kPrivate, "<tr1/type_traits>", kPublic },
+ { "<tr1_impl/type_traits>", kPrivate, "<type_traits>", kPublic },
+ { "<tr1_impl/unordered_map>", kPrivate, "<tr1/unordered_map>", kPublic },
+ { "<tr1_impl/unordered_map>", kPrivate, "<unordered_map>", kPublic },
+ { "<tr1_impl/unordered_set>", kPrivate, "<tr1/unordered_set>", kPublic },
+ { "<tr1_impl/unordered_set>", kPrivate, "<unordered_set>", kPublic },
+ { "<tr1_impl/utility>", kPrivate, "<tr1/utility>", kPublic },
+ { "<tr1_impl/utility>", kPrivate, "<utility>", kPublic },
+ // This didn't come from the grep, but seems to be where swap()
+ // is defined?
+ { "<bits/move.h>", kPrivate, "<algorithm>", kPublic }, // for swap<>()
+ // Hash and hashtable-based containers.
+ { "<tr1_impl/functional_hash.h>", kPrivate, "<tr1/functional>", kPublic },
+ { "<tr1_impl/functional_hash.h>", kPrivate, "<tr1/unordered_map>", kPublic },
+ { "<tr1_impl/functional_hash.h>", kPrivate, "<tr1/unordered_set>", kPublic },
+ { "<tr1/functional_hash.h>", kPrivate, "<tr1/functional>", kPublic },
+ { "<tr1/functional_hash.h>", kPrivate, "<tr1/unordered_map>", kPublic },
+ { "<tr1/functional_hash.h>", kPrivate, "<tr1/unordered_set>", kPublic },
+ { "<tr1_impl/hashtable>", kPrivate, "<tr1/unordered_map>", kPublic },
+ { "<tr1_impl/hashtable>", kPrivate, "<tr1/unordered_set>", kPublic },
+ { "<tr1/hashtable.h>", kPrivate, "<tr1/unordered_map>", kPublic },
+ { "<tr1/hashtable.h>", kPrivate, "<tr1/unordered_set>", kPublic },
+ // All .tcc files are gcc internal-include files. We get them from
+ // ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep -R '^ *# *include.*tcc' * | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | sort )
+ // I had to manually edit some of the entries to say the map-to is private.
+ { "<bits/basic_ios.tcc>", kPrivate, "<bits/basic_ios.h>", kPrivate },
+ { "<bits/basic_string.tcc>", kPrivate, "<string>", kPublic },
+ { "<bits/cmath.tcc>", kPrivate, "<cmath>", kPublic },
+ { "<bits/deque.tcc>", kPrivate, "<deque>", kPublic },
+ { "<bits/fstream.tcc>", kPrivate, "<fstream>", kPublic },
+ { "<bits/istream.tcc>", kPrivate, "<istream>", kPublic },
+ { "<bits/list.tcc>", kPrivate, "<list>", kPublic },
+ { "<bits/locale_classes.tcc>", kPrivate,
+ "<bits/locale_classes.h>", kPrivate },
+ { "<bits/locale_facets.tcc>", kPrivate, "<bits/locale_facets.h>", kPrivate },
+ { "<bits/locale_facets_nonio.tcc>", kPrivate,
+ "<bits/locale_facets_nonio.h>", kPrivate },
+ { "<bits/ostream.tcc>", kPrivate, "<ostream>", kPublic },
+ { "<bits/sstream.tcc>", kPrivate, "<sstream>", kPublic },
+ { "<bits/streambuf.tcc>", kPrivate, "<streambuf>", kPublic },
+ { "<bits/valarray_array.tcc>", kPrivate,
+ "<bits/valarray_array.h>", kPrivate },
+ { "<bits/vector.tcc>", kPrivate, "<vector>", kPublic },
+ { "<debug/safe_iterator.tcc>", kPrivate, "<debug/safe_iterator.h>", kPublic },
+ { "<tr1/bessel_function.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/beta_function.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/ell_integral.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/exp_integral.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/gamma.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/hypergeometric.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/legendre_function.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/modified_bessel_func.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/poly_hermite.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/poly_laguerre.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1/riemann_zeta.tcc>", kPrivate, "<tr1/cmath>", kPublic },
+ { "<tr1_impl/random.tcc>", kPrivate, "<tr1_impl/random>", kPrivate },
+ // Some bits->bits #includes: A few files in bits re-export
+ // symbols from other files in bits.
+ // ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include.*bits/' bits/* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPrivate },@' | grep bits/ | sort -u)
+ // and carefully picked reasonable-looking results (algorithm
+ // *uses* pair but doesn't *re-export* pair, for instance).
+ { "<bits/boost_concept_check.h>", kPrivate,
+ "<bits/concept_check.h>", kPrivate },
+ { "<bits/c++allocator.h>", kPrivate, "<bits/allocator.h>", kPrivate },
+ { "<bits/codecvt.h>", kPrivate, "<bits/locale_facets_nonio.h>", kPrivate },
+ { "<bits/ctype_base.h>", kPrivate, "<bits/locale_facets.h>", kPrivate },
+ { "<bits/ctype_inline.h>", kPrivate, "<bits/locale_facets.h>", kPrivate },
+ { "<bits/functexcept.h>", kPrivate, "<bits/stl_algobase.h>", kPrivate },
+ { "<bits/locale_classes.h>", kPrivate, "<bits/basic_ios.h>", kPrivate },
+ { "<bits/locale_facets.h>", kPrivate, "<bits/basic_ios.h>", kPrivate },
+ { "<bits/messages_members.h>", kPrivate,
+ "<bits/locale_facets_nonio.h>", kPrivate },
+ { "<bits/postypes.h>", kPrivate, "<bits/char_traits.h>", kPrivate },
+ { "<bits/slice_array.h>", kPrivate, "<bits/valarray_before.h>", kPrivate },
+ { "<bits/stl_construct.h>", kPrivate, "<bits/stl_tempbuf.h>", kPrivate },
+ { "<bits/stl_move.h>", kPrivate, "<bits/stl_algobase.h>", kPrivate },
+ { "<bits/stl_uninitialized.h>", kPrivate, "<bits/stl_tempbuf.h>", kPrivate },
+ { "<bits/stl_vector.h>", kPrivate, "<bits/stl_bvector.h>", kPrivate },
+ { "<bits/streambuf_iterator.h>", kPrivate, "<bits/basic_ios.h>", kPrivate },
+ // I don't think we want to be having people move to 'backward/'
+ // yet. (These hold deprecated STL classes that we still use
+ // actively.) These are the ones that turned up in an analysis of
+ { "<backward/auto_ptr.h>", kPrivate, "<memory>", kPublic },
+ { "<backward/binders.h>", kPrivate, "<functional>", kPublic },
+ { "<backward/hash_fun.h>", kPrivate, "<hash_map>", kPublic },
+ { "<backward/hash_fun.h>", kPrivate, "<hash_set>", kPublic },
+ { "<backward/hashtable.h>", kPrivate, "<hash_map>", kPublic },
+ { "<backward/hashtable.h>", kPrivate, "<hash_set>", kPublic },
+ { "<backward/strstream>", kPrivate, "<strstream>", kPublic },
+ // We have backward as part of the -I search path now, so have the
+ // non-backwards-prefix version as well.
+ { "<auto_ptr.h>", kPrivate, "<memory>", kPublic },
+ { "<binders.h>", kPrivate, "<functional>", kPublic },
+ { "<hash_fun.h>", kPrivate, "<hash_map>", kPublic },
+ { "<hash_fun.h>", kPrivate, "<hash_set>", kPublic },
+ { "<hashtable.h>", kPrivate, "<hash_map>", kPublic },
+ { "<hashtable.h>", kPrivate, "<hash_set>", kPublic },
+ // (This one should perhaps be found automatically somehow.)
+ { "<ext/sso_string_base.h>", kPrivate, "<string>", kPublic },
+ // The iostream .h files are confusing. Lots of private headers,
+ // which are handled above, but we also have public headers
+ // #including each other (eg <iostream> #includes <istream>). We
+ // are pretty forgiving: if a user specifies any public header, we
+ // generally don't require the others.
+ // ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && egrep '^ *# *include <(istream|ostream|iostream|fstream|sstream|streambuf|ios|iosfwd)>' *stream* ios | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ and print qq@ { "<$2>", kPublic, "<$1>", kPublic },@' | sort -u )
+ { "<ios>", kPublic, "<istream>", kPublic },
+ { "<ios>", kPublic, "<ostream>", kPublic },
+ { "<iosfwd>", kPublic, "<ios>", kPublic },
+ { "<iosfwd>", kPublic, "<streambuf>", kPublic },
+ { "<istream>", kPublic, "<fstream>", kPublic },
+ { "<istream>", kPublic, "<iostream>", kPublic },
+ { "<istream>", kPublic, "<sstream>", kPublic },
+ { "<ostream>", kPublic, "<fstream>", kPublic },
+ { "<ostream>", kPublic, "<iostream>", kPublic },
+ { "<ostream>", kPublic, "<istream>", kPublic },
+ { "<ostream>", kPublic, "<sstream>", kPublic },
+ { "<streambuf>", kPublic, "<ios>", kPublic },
+ // The location of exception_defines.h varies by GCC version. It should
+ // never be included directly.
+ { "<bits/exception_defines.h>", kPrivate, "<exception>", kPublic },
+ { "<exception_defines.h>", kPrivate, "<exception>", kPublic },
+};
+
+// Returns true if str is a valid quoted filepath pattern (i.e. either
+// a quoted filepath or "@" followed by a regex for matching a quoted
+// filepath).
+bool IsQuotedFilepathPattern(const string& str) {
+ return IsQuotedInclude(str) || StartsWith(str, "@");
+}
+
+// Given a vector of nodes, augment each node with its children, as
+// defined by m: nodes[i] is replaced by nodes[i] + m[nodes[i]],
+// ignoring duplicates. The input vector is modified in place.
+void ExpandOnce(const IncludePicker::IncludeMap& m, vector<string>* nodes) {
+ vector<string> nodes_and_children;
+ set<string> seen_nodes_and_children;
+ for (const string& node : *nodes) {
+ // First insert the node itself, then all its kids.
+ if (!ContainsKey(seen_nodes_and_children, node)) {
+ nodes_and_children.push_back(node);
+ seen_nodes_and_children.insert(node);
+ }
+ if (const vector<string>* children = FindInMap(&m, node)) {
+ for (const string& child : *children) {
+ if (!ContainsKey(seen_nodes_and_children, child)) {
+ nodes_and_children.push_back(child);
+ seen_nodes_and_children.insert(child);
+ }
+ }
+ }
+ }
+ nodes->swap(nodes_and_children); // modify nodes in-place
+}
+
+enum TransitiveStatus { kUnused = 0, kCalculating, kDone };
+
+// If the filename-map maps a.h to b.h, and also b.h to c.h, then
+// there's a transitive mapping of a.h to c.h. We want to add that
+// into the filepath map as well, to make lookups easier. We do this
+// by doing a depth-first search for a single mapping, recursing
+// whenever the value is itself a key in the map, and putting the
+// results in a vector of all values seen.
+// NOTE: This function updates values seen in filename_map, but
+// does not invalidate any filename_map iterators.
+void MakeNodeTransitive(IncludePicker::IncludeMap* filename_map,
+ map<string, TransitiveStatus>* seen_nodes,
+ vector<string>* node_stack, // used for debugging
+ const string& key) {
+ // If we've already calculated this node's transitive closure, we're done.
+ const TransitiveStatus status = (*seen_nodes)[key];
+ if (status == kCalculating) { // means there's a cycle in the mapping
+ // third-party code sometimes has #include cycles (*cough* boost
+ // *cough*). Because we add many implicit third-party mappings,
+ // we may add a cycle without meaning to. The best we can do is
+ // to ignore the mapping that causes the cycle. Same with code
+ // in /internal/. We could CHECK-fail in such a case, but it's
+ // probably better to just keep going.
+ if (StartsWith(key, "\"third_party/") ||
+ key.find("internal/") != string::npos) {
+ VERRS(4) << "Ignoring a cyclical mapping involving " << key << "\n";
+ return;
+ }
+ }
+ if (status == kCalculating) {
+ VERRS(0) << "Cycle in include-mapping:\n";
+ for (const string& node : *node_stack)
+ VERRS(0) << " " << node << " ->\n";
+ VERRS(0) << " " << key << "\n";
+ CHECK_UNREACHABLE_("Cycle in include-mapping"); // cycle is a fatal error
+ }
+ if (status == kDone)
+ return;
+
+ IncludePicker::IncludeMap::iterator node = filename_map->find(key);
+ if (node == filename_map->end()) {
+ (*seen_nodes)[key] = kDone;
+ return;
+ }
+
+ // Keep track of node->second as we update it, to avoid duplicates.
+ (*seen_nodes)[key] = kCalculating;
+ for (const string& child : node->second) {
+ node_stack->push_back(child);
+ MakeNodeTransitive(filename_map, seen_nodes, node_stack, child);
+ node_stack->pop_back();
+ }
+ (*seen_nodes)[key] = kDone;
+
+ // Our transitive closure is just the union of the closure of our
+ // children. This routine replaces our value with this closure,
+ // by replacing each of our values with its values. Since our
+ // values have already been made transitive, that is a closure.
+ ExpandOnce(*filename_map, &node->second);
+}
+
+// Updates the values in filename_map based on its transitive mappings.
+void MakeMapTransitive(IncludePicker::IncludeMap* filename_map) {
+ // Insert keys of filename_map here once we know their value is
+ // the complete transitive closure.
+ map<string, TransitiveStatus> seen_nodes;
+ vector<string> node_stack;
+ for (const IncludePicker::IncludeMap::value_type& includes : *filename_map)
+ MakeNodeTransitive(filename_map, &seen_nodes, &node_stack, includes.first);
+}
+
+// Get a scalar value from a YAML node.
+// Returns empty string if it's not of type ScalarNode.
+string GetScalarValue(Node* node) {
+ ScalarNode* scalar = llvm::dyn_cast<ScalarNode>(node);
+ if (scalar == nullptr)
+ return string();
+
+ llvm::SmallString<8> storage;
+ return scalar->getValue(storage).str();
+}
+
+// Get a sequence value from a YAML node.
+// Returns empty vector if it's not of type SequenceNode.
+vector<string> GetSequenceValue(Node* node) {
+ vector<string> result;
+
+ SequenceNode* sequence = llvm::dyn_cast<SequenceNode>(node);
+ if (sequence != nullptr) {
+ for (Node& node : *sequence) {
+ result.push_back(GetScalarValue(&node));
+ }
+ }
+
+ return result;
+}
+
+// If new_path doesn't already exist in search_path, makes a copy of search_path
+// and adds new_path to it.
+// Returns the original or extended search path.
+vector<string> ExtendMappingFileSearchPath(const vector<string>& search_path,
+ const string& new_path) {
+ CHECK_(IsAbsolutePath(new_path));
+
+ if (std::find(search_path.begin(),
+ search_path.end(),
+ new_path) == search_path.end()) {
+ vector<string> extended(search_path);
+ extended.push_back(new_path);
+ return extended;
+ }
+
+ return search_path;
+}
+
+// Scans search_path for existing files with filename.
+// If filename is absolute and exists, return it.
+// If filename is relative and exists based on cwd, return it in absolute form.
+// If filename is relative and doesn't exist, try to find it along search_path.
+// Returns an absolute filename if file is found, otherwise filename untouched.
+string FindFileInSearchPath(const vector<string>& search_path,
+ const string& filename) {
+ if (llvm::sys::fs::exists(filename)) {
+ // If the file exists, no matter if its path is relative or absolute,
+ // return it in absolute form.
+ return MakeAbsolutePath(filename);
+ } else if (!IsAbsolutePath(filename)) {
+ // If it's relative, scan search path.
+ for (const string& base_path : search_path) {
+ string candidate = MakeAbsolutePath(base_path, filename);
+ if (llvm::sys::fs::exists(candidate)) {
+ return candidate;
+ }
+ }
+ }
+
+ // This is proven not to exist, so handle the error when
+ // we attempt to open it.
+ return filename;
+}
+
+} // anonymous namespace
+
+IncludePicker::IncludePicker(bool no_default_mappings)
+ : has_called_finalize_added_include_lines_(false) {
+ if (!no_default_mappings) {
+ AddDefaultMappings();
+ }
+}
+
+void IncludePicker::AddDefaultMappings() {
+ AddSymbolMappings(libc_symbol_map, IWYU_ARRAYSIZE(libc_symbol_map));
+ AddSymbolMappings(libstdcpp_symbol_map, IWYU_ARRAYSIZE(libstdcpp_symbol_map));
+
+ AddIncludeMappings(libc_include_map,
+ IWYU_ARRAYSIZE(libc_include_map));
+ AddIncludeMappings(stdlib_c_include_map,
+ IWYU_ARRAYSIZE(stdlib_c_include_map));
+ AddIncludeMappings(libstdcpp_include_map,
+ IWYU_ARRAYSIZE(libstdcpp_include_map));
+
+ AddPublicIncludes(stdlib_cpp_public_headers,
+ IWYU_ARRAYSIZE(stdlib_cpp_public_headers));
+}
+
+void IncludePicker::MarkVisibility(const string& quoted_filepath_pattern,
+ IncludeVisibility visibility) {
+ CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
+
+ // insert() leaves any old value alone, and only inserts if the key is new.
+ filepath_visibility_map_.insert(
+ make_pair(quoted_filepath_pattern, visibility));
+ CHECK_(filepath_visibility_map_[quoted_filepath_pattern] == visibility)
+ << " Same file seen with two different visibilities: "
+ << quoted_filepath_pattern
+ << " Old vis: " << filepath_visibility_map_[quoted_filepath_pattern]
+ << " New vis: " << visibility;
+}
+
+// AddDirectInclude lets us use some hard-coded rules to add filepath
+// mappings at runtime. It includes, for instance, mappings from
+// 'project/internal/foo.h' to 'project/public/foo_public.h' in google
+// code (Google hides private headers in /internal/, much like glibc
+// hides them in /bits/.)
+void IncludePicker::AddDirectInclude(const string& includer_filepath,
+ const string& includee_filepath,
+ const string& quoted_include_as_written) {
+ CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
+
+ // Note: the includer may be a .cc file, which is unnecessary to add
+ // to our map, but harmless.
+ const string quoted_includer = ConvertToQuotedInclude(includer_filepath);
+ const string quoted_includee = ConvertToQuotedInclude(includee_filepath);
+
+ quoted_includes_to_quoted_includers_[quoted_includee].insert(quoted_includer);
+ const pair<string, string> key(includer_filepath, includee_filepath);
+ includer_and_includee_to_include_as_written_[key] = quoted_include_as_written;
+
+ // Mark the clang fake-file "<built-in>" as private, so we never try
+ // to map anything to it.
+ if (includer_filepath == "<built-in>")
+ MarkIncludeAsPrivate("\"<built-in>\"");
+
+ // Automatically mark files in foo/internal/bar as private, and map them.
+ // Then say that everyone else in foo/.* is a friend, who is allowed to
+ // include the otherwise-private header.
+ const size_t internal_pos = quoted_includee.find("internal/");
+ if (internal_pos != string::npos &&
+ (internal_pos == 0 || quoted_includee[internal_pos - 1] == '/')) {
+ MarkIncludeAsPrivate(quoted_includee);
+ // The second argument here is a regex for matching a quoted
+ // filepath. We get the opening quote from quoted_includee, and
+ // the closing quote as part of the .*.
+ AddFriendRegex(includee_filepath,
+ quoted_includee.substr(0, internal_pos) + ".*");
+ AddMapping(quoted_includee, quoted_includer);
+ }
+
+ // Automatically mark <asm-FOO/bar.h> as private, and map to <asm/bar.h>.
+ if (StartsWith(quoted_includee, "<asm-")) {
+ MarkIncludeAsPrivate(quoted_includee);
+ string public_header = quoted_includee;
+ StripPast(&public_header, "/"); // read past "asm-whatever/"
+ public_header = "<asm/" + public_header; // now it's <asm/something.h>
+ AddMapping(quoted_includee, public_header);
+ }
+}
+
+void IncludePicker::AddMapping(const string& map_from, const string& map_to) {
+ VERRS(8) << "Adding mapping from " << map_from << " to " << map_to << "\n";
+ CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
+ CHECK_(IsQuotedFilepathPattern(map_from)
+ && "All map keys must be quoted filepaths or @ followed by regex");
+ CHECK_(IsQuotedInclude(map_to) && "All map values must be quoted includes");
+ filepath_include_map_[map_from].push_back(map_to);
+}
+
+void IncludePicker::AddIncludeMapping(const string& map_from,
+ IncludeVisibility from_visibility,
+ const string& map_to,
+ IncludeVisibility to_visibility) {
+ AddMapping(map_from, map_to);
+ MarkVisibility(map_from, from_visibility);
+ MarkVisibility(map_to, to_visibility);
+}
+
+void IncludePicker::AddSymbolMapping(const string& map_from,
+ const string& map_to,
+ IncludeVisibility to_visibility) {
+ CHECK_(IsQuotedInclude(map_to) && "Map values must be quoted includes");
+ symbol_include_map_[map_from].push_back(map_to);
+
+ // Symbol-names are always marked as private (or GetPublicValues()
+ // will self-map them, below).
+ MarkVisibility(map_from, kPrivate);
+ MarkVisibility(map_to, to_visibility);
+}
+
+void IncludePicker::AddIncludeMappings(const IncludeMapEntry* entries,
+ size_t count) {
+ for (size_t i = 0; i < count; ++i) {
+ const IncludeMapEntry& e = entries[i];
+ AddIncludeMapping(e.map_from, e.from_visibility, e.map_to, e.to_visibility);
+ }
+}
+
+void IncludePicker::AddSymbolMappings(const IncludeMapEntry* entries,
+ size_t count) {
+ for (size_t i = 0; i < count; ++i) {
+ const IncludeMapEntry& e = entries[i];
+ AddSymbolMapping(e.map_from, e.map_to, e.to_visibility);
+ }
+}
+
+void IncludePicker::AddPublicIncludes(const char** includes, size_t count) {
+ for (size_t i = 0; i < count; ++i) {
+ const char* include = includes[i];
+ MarkVisibility(include, kPublic);
+ }
+}
+
+void IncludePicker::MarkIncludeAsPrivate(
+ const string& quoted_filepath_pattern) {
+ CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
+ CHECK_(IsQuotedFilepathPattern(quoted_filepath_pattern)
+ && "MIAP takes a quoted filepath pattern");
+ MarkVisibility(quoted_filepath_pattern, kPrivate);
+}
+
+void IncludePicker::AddFriendRegex(const string& includee_filepath,
+ const string& quoted_friend_regex) {
+ friend_to_headers_map_["@" + quoted_friend_regex].insert(includee_filepath);
+}
+
+namespace {
+
+// Given a map keyed by quoted filepath patterns, return a vector
+// containing the @-regexes among the keys.
+template <typename MapType>
+vector<string> ExtractKeysMarkedAsRegexes(const MapType& m) {
+ vector<string> regex_keys;
+ for (const typename MapType::value_type& item : m) {
+ if (StartsWith(item.first, "@"))
+ regex_keys.push_back(item.first);
+ }
+ return regex_keys;
+}
+
+} // anonymous namespace
+
+// Expands the regex keys in filepath_include_map_ and
+// friend_to_headers_map_ by matching them against all source files
+// seen by iwyu. For each include that matches the regex, we add it
+// to the map by copying the regex entry and replacing the key with
+// the seen #include.
+void IncludePicker::ExpandRegexes() {
+ // First, get the regex keys.
+ const vector<string> filepath_include_map_regex_keys =
+ ExtractKeysMarkedAsRegexes(filepath_include_map_);
+ const vector<string> friend_to_headers_map_regex_keys =
+ ExtractKeysMarkedAsRegexes(friend_to_headers_map_);
+
+ // Then, go through all #includes to see if they match the regexes,
+ // discarding the identity mappings. TODO(wan): to improve
+ // performance, don't construct more than one Regex object for each
+ // element in the above vectors.
+ for (const auto& incmap : quoted_includes_to_quoted_includers_) {
+ const string& hdr = incmap.first;
+ for (const string& regex_key : filepath_include_map_regex_keys) {
+ const vector<string>& map_to = filepath_include_map_[regex_key];
+ // Enclose the regex in ^(...)$ for full match.
+ llvm::Regex regex(std::string("^(" + regex_key.substr(1) + ")$"));
+ if (regex.match(hdr, nullptr) && !ContainsValue(map_to, hdr)) {
+ Extend(&filepath_include_map_[hdr], filepath_include_map_[regex_key]);
+ MarkVisibility(hdr, filepath_visibility_map_[regex_key]);
+ }
+ }
+ for (const string& regex_key : friend_to_headers_map_regex_keys) {
+ llvm::Regex regex(std::string("^(" + regex_key.substr(1) + ")$"));
+ if (regex.match(hdr, nullptr)) {
+ InsertAllInto(friend_to_headers_map_[regex_key],
+ &friend_to_headers_map_[hdr]);
+ }
+ }
+ }
+}
+
+// We treat third-party code specially, since it's difficult to add
+// iwyu pragmas to code we don't own. Basically, what we do is trust
+// the code authors when it comes to third-party code: if they
+// #include x.h to get symbols from y.h, then assume that's how the
+// third-party authors wanted it. This boils down to the following
+// rules:
+// 1) If there's already a mapping for third_party/y.h, do not
+// add any implicit maps for it.
+// 2) if not_third_party/x.{h,cc} #includes third_party/y.h,
+// assume y.h is supposed to be included directly, and do not
+// add any implicit maps for it.
+// 3) Otherwise, if third_party/x.h #includes third_party/y.h,
+// add a mapping from y.h to x.h. Unless y.h already has
+// a hard-coded visibility set, make y.h private. This
+// means iwyu will never suggest adding y.h.
+void IncludePicker::AddImplicitThirdPartyMappings() {
+ set<string> third_party_headers_with_explicit_mappings;
+ for (const IncludeMap::value_type& item : filepath_include_map_) {
+ if (IsThirdPartyFile(item.first))
+ third_party_headers_with_explicit_mappings.insert(item.first);
+ }
+
+ set<string> headers_included_from_non_third_party;
+ for (const auto& incmap : quoted_includes_to_quoted_includers_) {
+ for (const string& includer : incmap.second) {
+ if (!IsThirdPartyFile(includer)) {
+ headers_included_from_non_third_party.insert(incmap.first);
+ break;
+ }
+ }
+ }
+
+ for (const auto& incmap : quoted_includes_to_quoted_includers_) {
+ const string& includee = incmap.first;
+ if (!IsThirdPartyFile(includee) ||
+ ContainsKey(third_party_headers_with_explicit_mappings, includee) ||
+ ContainsKey(headers_included_from_non_third_party, includee)) {
+ continue;
+ }
+ for (const string& includer : incmap.second) {
+ // From the 'if' statement above, we already know that includee
+ // is not included from non-third-party code.
+ CHECK_(IsThirdPartyFile(includer) && "Why not nixed!");
+ CHECK_(IsThirdPartyFile(includee) && "Why not nixed!");
+ AddMapping(includee, includer);
+ if (GetVisibility(includee) == kUnusedVisibility) {
+ MarkIncludeAsPrivate(includee);
+ }
+ }
+ }
+}
+
+// Handle work that's best done after we've seen all the mappings
+// (including dynamically-added ones) and all the include files.
+// For instance, we can now expand all the regexes we've seen in
+// the mapping-keys, since we have the full list of #includes to
+// match them again. We also transitively-close the maps.
+void IncludePicker::FinalizeAddedIncludes() {
+ CHECK_(!has_called_finalize_added_include_lines_ && "Can't call FAI twice");
+
+ // The map keys may be regular expressions.
+ // Match those to seen #includes now.
+ ExpandRegexes();
+
+ // We treat third-party code specially, since it's difficult to add
+ // iwyu pragmas to code we don't own.
+ AddImplicitThirdPartyMappings();
+
+ // If a.h maps to b.h maps to c.h, we'd like an entry from a.h to c.h too.
+ MakeMapTransitive(&filepath_include_map_);
+ // Now that filepath_include_map_ is transitively closed, it's an
+ // easy task to get the values of symbol_include_map_ closed too.
+ for (IncludeMap::value_type& symbol_include : symbol_include_map_) {
+ ExpandOnce(filepath_include_map_, &symbol_include.second);
+ }
+
+ has_called_finalize_added_include_lines_ = true;
+}
+
+// For the given key, return the vector of values associated with that
+// key, or an empty vector if the key does not exist in the map.
+// *However*, we filter out all values that have private visibility
+// before returning the vector. *Also*, if the key is public in
+// the map, we insert the key as the first of the returned values,
+// this is an implicit "self-map."
+vector<string> IncludePicker::GetPublicValues(
+ const IncludePicker::IncludeMap& m, const string& key) const {
+ CHECK_(!StartsWith(key, "@"));
+ vector<string> retval;
+ const vector<string>* values = FindInMap(&m, key);
+ if (!values || values->empty())
+ return retval;
+
+ if (GetOrDefault(filepath_visibility_map_, key, kPublic) == kPublic)
+ retval.push_back(key); // we can map to ourself!
+ for (const string& value : *values) {
+ CHECK_(!StartsWith(value, "@"));
+ if (GetOrDefault(filepath_visibility_map_, value, kPublic) == kPublic)
+ retval.push_back(value);
+ }
+ return retval;
+}
+
+string IncludePicker::MaybeGetIncludeNameAsWritten(
+ const string& includer_filepath, const string& includee_filepath) const {
+ const pair<string, string> key(includer_filepath, includee_filepath);
+ // I want to use GetOrDefault here, but it has trouble deducing tpl args.
+ const string* value = FindInMap(&includer_and_includee_to_include_as_written_,
+ key);
+ return value ? *value : "";
+}
+
+vector<string> IncludePicker::GetCandidateHeadersForSymbol(
+ const string& symbol) const {
+ CHECK_(has_called_finalize_added_include_lines_ && "Must finalize includes");
+ return GetPublicValues(symbol_include_map_, symbol);
+}
+
+vector<string> IncludePicker::GetCandidateHeadersForFilepath(
+ const string& filepath, const string& including_filepath) const {
+ CHECK_(has_called_finalize_added_include_lines_ && "Must finalize includes");
+ const string quoted_header = ConvertToQuotedInclude(
+ filepath, MakeAbsolutePath(GetParentPath(including_filepath)));
+ vector<string> retval = GetPublicValues(filepath_include_map_, quoted_header);
+ if (retval.empty()) {
+ // the filepath isn't in include_map, so just quote and return it.
+ retval.push_back(quoted_header);
+ }
+ return retval;
+}
+
+// Except for the case that the includer is a 'friend' of the includee
+// (via an '// IWYU pragma: friend XXX'), the same as
+// GetCandidateHeadersForFilepath.
+vector<string> IncludePicker::GetCandidateHeadersForFilepathIncludedFrom(
+ const string& included_filepath, const string& including_filepath) const {
+ vector<string> retval;
+ // We pass the own files path to ConvertToQuotedInclude so the quoted include
+ // for the case that there is no matching `-I` option is just the filename
+ // (e.g. "foo.cpp") instead of the absolute file path.
+ const string quoted_includer = ConvertToQuotedInclude(
+ including_filepath, MakeAbsolutePath(GetParentPath(including_filepath)));
+ const string quoted_includee = ConvertToQuotedInclude(
+ included_filepath, MakeAbsolutePath(GetParentPath(including_filepath)));
+ const set<string>* headers_with_includer_as_friend =
+ FindInMap(&friend_to_headers_map_, quoted_includer);
+ if (headers_with_includer_as_friend != nullptr &&
+ ContainsKey(*headers_with_includer_as_friend, included_filepath)) {
+ retval.push_back(quoted_includee);
+ } else {
+ retval =
+ GetCandidateHeadersForFilepath(included_filepath, including_filepath);
+ if (retval.size() == 1) {
+ const string& quoted_header = retval[0];
+ if (GetVisibility(quoted_header) == kPrivate) {
+ VERRS(0) << "Warning: "
+ << "No public header found to replace the private header "
+ << quoted_header << "\n";
+ }
+ }
+ }
+
+ // We'll have called ConvertToQuotedInclude on members of retval,
+ // but sometimes we can do better -- if included_filepath is in
+ // retval, the iwyu-preprocessor may have stored the quoted-include
+ // as written in including_filepath. This is better to use than
+ // ConvertToQuotedInclude because it avoids trouble when the same
+ // file is accessible via different include search-paths, or is
+ // accessed via a symlink.
+ const string& quoted_include_as_written
+ = MaybeGetIncludeNameAsWritten(including_filepath, included_filepath);
+ if (!quoted_include_as_written.empty()) {
+ vector<string>::iterator it = std::find(retval.begin(), retval.end(),
+ quoted_includee);
+ if (it != retval.end())
+ *it = quoted_include_as_written;
+ }
+ return retval;
+}
+
+bool IncludePicker::HasMapping(const string& map_from_filepath,
+ const string& map_to_filepath) const {
+ CHECK_(has_called_finalize_added_include_lines_ && "Must finalize includes");
+ const string quoted_from = ConvertToQuotedInclude(map_from_filepath);
+ const string quoted_to = ConvertToQuotedInclude(map_to_filepath);
+ // We can't use GetCandidateHeadersForFilepath since includer might be private
+ const vector<string>* all_mappers = FindInMap(&filepath_include_map_,
+ quoted_from);
+ if (all_mappers) {
+ for (const string& mapper : *all_mappers) {
+ if (mapper == quoted_to)
+ return true;
+ }
+ }
+ return quoted_to == quoted_from; // indentity mapping, why not?
+}
+
+bool IncludePicker::IsPublic(const clang::FileEntry* file) const {
+ CHECK_(file && "Need existing FileEntry");
+ const string quoted_file = ConvertToQuotedInclude(GetFilePath(file));
+ return (GetVisibility(quoted_file) == kPublic);
+}
+
+// Parses a YAML/JSON file containing mapping directives of various types.
+void IncludePicker::AddMappingsFromFile(const string& filename) {
+ vector<string> default_search_path;
+ return AddMappingsFromFile(filename, default_search_path);
+}
+
+// Parses a YAML/JSON file containing mapping directives of various types:
+// symbol - symbol name -> quoted include
+// include - private quoted include -> public quoted include
+// ref - include mechanism for mapping files, to allow project-specific
+// groupings
+// This private implementation method is recursive and builds the search path
+// incrementally.
+void IncludePicker::AddMappingsFromFile(const string& filename,
+ const vector<string>& search_path) {
+ string absolute_path = FindFileInSearchPath(search_path, filename);
+
+ llvm::ErrorOr<unique_ptr<MemoryBuffer>> bufferOrError =
+ MemoryBuffer::getFile(absolute_path);
+ if (std::error_code error = bufferOrError.getError()) {
+ errs() << "Cannot open mapping file '" << absolute_path << "': "
+ << error.message() << ".\n";
+ return;
+ }
+
+ VERRS(5) << "Adding mappings from file '" << absolute_path << "'.\n";
+
+ SourceMgr source_manager;
+ Stream json_stream(bufferOrError.get()->getMemBufferRef(), source_manager);
+
+ document_iterator stream_begin = json_stream.begin();
+ if (stream_begin == json_stream.end())
+ return;
+
+ // Get root sequence.
+ Node* root = stream_begin->getRoot();
+ SequenceNode *array = llvm::dyn_cast<SequenceNode>(root);
+ if (array == nullptr) {
+ json_stream.printError(root, "Root element must be an array.");
+ return;
+ }
+
+ for (Node& array_item_node : *array) {
+ Node* current_node = &array_item_node;
+
+ // Every item must be a JSON object ("mapping" in YAML terms.)
+ MappingNode* mapping = llvm::dyn_cast<MappingNode>(current_node);
+ if (mapping == nullptr) {
+ json_stream.printError(current_node,
+ "Mapping directives must be objects.");
+ return;
+ }
+
+ for (KeyValueNode &mapping_item_node : *mapping) {
+ // General form is { directive: <data> }.
+ const string directive = GetScalarValue(mapping_item_node.getKey());
+
+ if (directive == "symbol") {
+ // Symbol mapping.
+ vector<string> mapping = GetSequenceValue(mapping_item_node.getValue());
+ if (mapping.size() != 4) {
+ json_stream.printError(current_node,
+ "Symbol mapping expects a value on the form "
+ "'[from, visibility, to, visibility]'.");
+ return;
+ }
+
+ // Ignore unused from-visibility, at some point maybe remove it from the
+ // mapping file format.
+
+ IncludeVisibility to_visibility = ParseVisibility(mapping[3]);
+ if (to_visibility == kUnusedVisibility) {
+ json_stream.printError(current_node,
+ "Unknown visibility '" + mapping[3] + "'.");
+ return;
+ }
+
+ if (!IsQuotedInclude(mapping[2])) {
+ json_stream.printError(
+ current_node,
+ "Expected to-entry to be quoted include, but was '" + mapping[2] +
+ "'");
+ return;
+ }
+
+ AddSymbolMapping(mapping[0], mapping[2], to_visibility);
+ } else if (directive == "include") {
+ // Include mapping.
+ vector<string> mapping = GetSequenceValue(mapping_item_node.getValue());
+ if (mapping.size() != 4) {
+ json_stream.printError(current_node,
+ "Include mapping expects a value on the form "
+ "'[from, visibility, to, visibility]'.");
+ return;
+ }
+
+ IncludeVisibility from_visibility = ParseVisibility(mapping[1]);
+ if (from_visibility == kUnusedVisibility) {
+ json_stream.printError(current_node,
+ "Unknown visibility '" + mapping[1] + "'.");
+ return;
+ }
+
+ IncludeVisibility to_visibility = ParseVisibility(mapping[3]);
+ if (to_visibility == kUnusedVisibility) {
+ json_stream.printError(current_node,
+ "Unknown visibility '" + mapping[3] + "'.");
+ return;
+ }
+
+ if (!IsQuotedFilepathPattern(mapping[0])) {
+ json_stream.printError(
+ current_node,
+ "Expected from-entry to be quoted filepath or @regex, but was '" +
+ mapping[0] + "'");
+ return;
+ }
+
+ if (!IsQuotedInclude(mapping[2])) {
+ json_stream.printError(
+ current_node,
+ "Expected to-entry to be quoted include, but was '" + mapping[2] +
+ "'");
+ return;
+ }
+
+ AddIncludeMapping(mapping[0],
+ from_visibility,
+ mapping[2],
+ to_visibility);
+ } else if (directive == "ref") {
+ // Mapping ref.
+ string ref_file = GetScalarValue(mapping_item_node.getValue());
+ if (ref_file.empty()) {
+ json_stream.printError(current_node,
+ "Mapping ref expects a single filename value.");
+ return;
+ }
+
+ // Add the path of the file we're currently processing
+ // to the search path. Allows refs to be relative to referrer.
+ vector<string> extended_search_path =
+ ExtendMappingFileSearchPath(search_path,
+ GetParentPath(absolute_path));
+
+ // Recurse.
+ AddMappingsFromFile(ref_file, extended_search_path);
+ } else {
+ json_stream.printError(current_node,
+ "Unknown directive '" + directive + "'.");
+ return;
+ }
+ }
+ }
+}
+
+IncludeVisibility IncludePicker::ParseVisibility(
+ const string& visibility) const {
+ if (visibility == "private")
+ return kPrivate;
+ else if (visibility == "public")
+ return kPublic;
+
+ return kUnusedVisibility;
+}
+
+IncludeVisibility IncludePicker::GetVisibility(
+ const string& quoted_include) const {
+ return GetOrDefault(
+ filepath_visibility_map_, quoted_include, kUnusedVisibility);
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_include_picker.h b/iwyu_include_picker.h
new file mode 100644
index 0000000..cefe991
--- /dev/null
+++ b/iwyu_include_picker.h
@@ -0,0 +1,253 @@
+//===--- iwyu_include_picker.h - map to canonical #includes for iwyu ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The include-picker provides a list of candidate #include-lines
+// that iwyu can suggest in order to include a particular symbol
+// or file.
+//
+// It seems like the 'file' case would be easy ("to include
+// /usr/include/math.h, say '#include <math.h>"), but it's
+// not because many header files are private, and should not
+// be included by users directly. A private header will have
+// one or (occassionally) more public headers that it maps to.
+// The include-picker keeps track of these mappings.
+//
+// It's also possible for a public file to have an include-picker
+// mapping. This means: "it's ok to #include this file directly, but
+// you can also get the contents of this file by #including this other
+// file as well." One example is that <ostream> maps to both
+// <ostream> and <iostream>. Other parts of iwyu can decide which
+// #include to suggest based on its own heuristics (whether the file
+// already needs to #include <iostream> for some other reason, for
+// instance).
+//
+// Some of these mappings are hard-coded, based on my own examination
+// of gcc headers on ubuntu. Some mappings are determined at runtime,
+// based on #pragmas or other writeup in the source files themselves.
+//
+// Mapping a symbol to a file has the same issues. In most cases, a
+// symbol maps to the file that defines it, and iwyu_include_picker
+// has nothing useful to say. But some symbols -- which we hard-code
+// -- can be provided by several files. NULL is a canonical example
+// of this.
+//
+// The include-picker also provides some helper functions for
+// converting from file-paths to #include paths, including, routines to
+// normalize a file-path to get rid of /usr/include/ prefixes.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_INCLUDE_PICKER_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_INCLUDE_PICKER_H_
+
+#include <map> // for map, map<>::value_compare
+#include <set> // for set
+#include <string> // for string
+#include <utility> // for pair
+#include <vector> // for vector
+
+namespace clang {
+class FileEntry;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::map;
+using std::pair;
+using std::set;
+using std::string;
+
+using std::vector;
+
+struct IncludeMapEntry;
+
+enum IncludeVisibility { kUnusedVisibility, kPublic, kPrivate };
+
+class IncludePicker {
+ public:
+ typedef map<string, vector<string>> IncludeMap; // map_from to <map_to,...>
+
+ explicit IncludePicker(bool no_default_mappings);
+
+ // ----- Routines to dynamically modify the include-picker
+
+ // Call this for every #include seen during iwyu analysis. The
+ // include-picker can use this data to better suggest #includes,
+ // perhaps.
+ void AddDirectInclude(const string& includer_filepath,
+ const string& includee_filepath,
+ const string& quoted_include_as_written);
+
+ // Add this to say "map_to re-exports everything in file map_from".
+ // Both map_to and map_from should be quoted includes.
+ void AddMapping(const string& map_from, const string& map_to);
+
+ // Indicate that the given quoted include should be considered
+ // a "private" include. If possible, we use the include-picker
+ // mappings to map such includes to public (not-private) includs.
+ void MarkIncludeAsPrivate(const string& quoted_include);
+
+ // Add this to say that "any file whose name matches the
+ // friend_regex is allowed to include includee_filepath". The regex
+ // uses the POSIX Entended Regular Expression syntax and should
+ // match a quoted-include (starting and ending with "" or <>).
+ void AddFriendRegex(const string& includee_filepath,
+ const string& quoted_friend_regex);
+
+ // Call this after iwyu preprocessing is done. No more calls to
+ // AddDirectInclude() or AddMapping() are allowed after this.
+ void FinalizeAddedIncludes();
+
+ // ----- Include-picking API
+
+ // Returns the set of all public header files that 'provide' the
+ // given symbol. For instance, NULL can map to stddef.h, stdlib.h,
+ // etc. Most symbols don't have pre-defined headers they map to,
+ // and we return the empty vector in that case. Ordering is
+ // important (which is why we return a vector, not a set): all else
+ // being equal, the first element of the vector is the "best" (or
+ // most standard) header for the symbol.
+ vector<string> GetCandidateHeadersForSymbol(const string& symbol) const;
+
+ // Returns the set of all public header files that a given header
+ // file -- specified as a full path -- would map to, as a set of
+ // quoted includes such as '<stdio.h>'. If the include-picker has
+ // no mapping information for this file, the return vector has just
+ // the input file (now include-quoted). Ordering is important
+ // (which is why we return a vector, not a set): all else being
+ // equal, the first element of the vector is the "best" (or most
+ // standard) header for the input header.
+ vector<string> GetCandidateHeadersForFilepath(
+ const string& filepath, const string& including_filepath = "") const;
+
+ // This allows for special-casing of GetCandidateHeadersForFilepath
+ // -- it's the same, but you give it the filepath that's doing the
+ // #including. This lets us give a different answer for different
+ // call-sites. For instance, "foo/internal/bar.h" is a fine
+ // candidate header when #included from "foo/internal/baz.h", but
+ // not when #included from "qux/quux.h". In the common case there's
+ // no special-casing, and this falls back on
+ // GetCandidateHeadersForFilepath().
+ vector<string> GetCandidateHeadersForFilepathIncludedFrom(
+ const string& included_filepath, const string& including_filepath) const;
+
+ // Returns true if there is a mapping (possibly indirect) from
+ // map_from to map_to. This means that to_file 're-exports' all the
+ // symbols from from_file. Both map_from_filepath and
+ // map_to_filepath should be full file-paths.
+ bool HasMapping(const string& map_from_filepath,
+ const string& map_to_filepath) const;
+
+ bool IsPublic(const clang::FileEntry* file) const;
+
+ // Parses a YAML/JSON file containing mapping directives of various types.
+ void AddMappingsFromFile(const string& filename);
+
+ private:
+ // Private implementation of mapping file parser, which takes
+ // mapping file search path to allow recursion that builds up
+ // search path incrementally.
+ void AddMappingsFromFile(const string& filename,
+ const vector<string>& search_path);
+
+ // Adds all hard-coded default mappings.
+ void AddDefaultMappings();
+
+ // Adds a mapping from a one header to another, typically
+ // from a private to a public quoted include.
+ void AddIncludeMapping(
+ const string& map_from, IncludeVisibility from_visibility,
+ const string& map_to, IncludeVisibility to_visibility);
+
+ // Adds a mapping from a a symbol to a quoted include. We use this to
+ // maintain mappings of documented types, e.g.
+ // For std::map<>, include <map>.
+ void AddSymbolMapping(
+ const string& map_from, const string& map_to,
+ IncludeVisibility to_visibility);
+
+ // Adds mappings from sized arrays of IncludeMapEntry.
+ void AddIncludeMappings(const IncludeMapEntry* entries, size_t count);
+ void AddSymbolMappings(const IncludeMapEntry* entries, size_t count);
+
+ void AddPublicIncludes(const char** includes, size_t count);
+
+ // Expands the regex keys in filepath_include_map_ and
+ // friend_to_headers_map_ by matching them against all source files
+ // seen by iwyu.
+ void ExpandRegexes();
+
+ // Figure out mappings to add between third-party files, that we
+ // guess based on the structure and use of third-party code.
+ void AddImplicitThirdPartyMappings();
+
+ // Adds an entry to filepath_visibility_map_, with error checking.
+ void MarkVisibility(const string& quoted_filepath_pattern,
+ IncludeVisibility visibility);
+
+ // Parse visibility from a string. Returns kUnusedVisibility if
+ // string is not recognized.
+ IncludeVisibility ParseVisibility(const string& visibility) const;
+
+ // Return the visibility of a given quoted_include if known, else
+ // kUnusedVisibility.
+ IncludeVisibility GetVisibility(const string& quoted_include) const;
+
+ // For the given key, return the vector of values associated with
+ // that key, or an empty vector if the key does not exist in the
+ // map, filtering out private files.
+ vector<string> GetPublicValues(const IncludeMap& m, const string& key) const;
+
+ // Given an includer-pathname and includee-pathname, return the
+ // quoted-include of the includee, as written in the includer, or
+ // "" if it's not found for some reason.
+ string MaybeGetIncludeNameAsWritten(const string& includer_filepath,
+ const string& includee_filepath) const;
+
+ // From symbols to includes.
+ IncludeMap symbol_include_map_;
+
+ // From quoted filepath patterns to includes, where a pattern can be
+ // either a quoted filepath (e.g. "foo/bar.h" or <a/b.h>) or @
+ // followed by a regular expression for matching a quoted filepath
+ // (e.g. @"foo/.*"). If key-value pair (pattern, headers) is in
+ // this map, it means that any header in 'headers' can be used to
+ // get symbols exported by a header matching 'pattern'.
+ IncludeMap filepath_include_map_;
+
+ // A map of all quoted-includes to whether they're public or private.
+ // Quoted-includes that are not present in this map are assumed public.
+ map<string, IncludeVisibility> filepath_visibility_map_;
+
+ // All the includes we've seen so far, to help with globbing and
+ // other dynamic mapping. For each file, we list who #includes it.
+ map<string, set<string>> quoted_includes_to_quoted_includers_;
+
+ // Given the filepaths of an includer and includee, give the
+ // include-as-written (including <>'s or ""'s) that the includer
+ // used to refer to the includee. We use this to return includes as
+ // they were written in the source, when possible.
+ map<pair<string, string>, string>
+ includer_and_includee_to_include_as_written_;
+
+ // Maps from a quoted filepath pattern to the set of files that used
+ // a pragma declaring it as a friend. That is, if foo/bar/x.h has a
+ // line "// IWYU pragma: friend foo/bar/.*" then "x.h" will be a
+ // member of friend_to_headers_map_["@\"foo/bar/.*\""]. In a
+ // postprocessing step, files friend_to_headers_map_ will have
+ // regular expressions expanded, e.g. if foo/bar/x.cc is processed,
+ // friend_to_headers_map_["foo/bar/x.cc"] will be augmented with the
+ // contents of friend_to_headers_map_["@\"foo/bar/.*\""].
+ map<string, set<string>> friend_to_headers_map_;
+
+ // Make sure we don't do any non-const operations after finalizing.
+ bool has_called_finalize_added_include_lines_;
+}; // class IncludePicker
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_INCLUDE_PICKER_H_
diff --git a/iwyu_lexer_utils.cc b/iwyu_lexer_utils.cc
new file mode 100644
index 0000000..9a3545f
--- /dev/null
+++ b/iwyu_lexer_utils.cc
@@ -0,0 +1,156 @@
+//===--- iwyu_lexer_utils.cc - clang-lexer utilities for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_lexer_utils.h"
+#include "iwyu_globals.h"
+
+#include <cstring>
+#include <string>
+#include <vector>
+
+#include "iwyu_verrs.h"
+#include "port.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/Basic/LangOptions.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Lex/Token.h"
+
+using clang::Lexer;
+using clang::LangOptions;
+using clang::SourceLocation;
+using clang::SourceManager;
+using clang::SourceRange;
+using clang::Token;
+using llvm::StringRef;
+using std::string;
+using std::vector;
+
+namespace include_what_you_use {
+
+bool LineHasText(SourceLocation source_location, StringRef text) {
+ const StringRef data =
+ GetSourceTextUntilEndOfLine(source_location, DefaultDataGetter());
+ return data.find(text) != StringRef::npos;
+}
+
+// SourceManagerCharacterDataGetter method implementations.
+SourceManagerCharacterDataGetter::SourceManagerCharacterDataGetter(
+ const SourceManager& source_manager)
+ : source_manager_(source_manager) {
+}
+
+const char* SourceManagerCharacterDataGetter::GetCharacterData(
+ SourceLocation loc) const {
+ bool invalid;
+ const char* data = source_manager_.getCharacterData(loc, &invalid);
+ CHECK_(!invalid);
+ CHECK_(data);
+ return data;
+}
+
+StringRef GetSourceTextUntilEndOfLine(
+ SourceLocation start_loc, const CharacterDataGetterInterface& data_getter) {
+ const char* data = data_getter.GetCharacterData(start_loc);
+ const char* line_end = strchr(data, '\n');
+ if (!line_end)
+ return data;
+ return StringRef(data, line_end - data);
+}
+
+SourceLocation GetLocationAfter(
+ SourceLocation start_loc, const string& needle,
+ const CharacterDataGetterInterface& data_getter) {
+ CHECK_(start_loc.isValid() && "GetLocationAfter takes only valid locations");
+ const char* data = data_getter.GetCharacterData(start_loc);
+ const char* needle_loc = strstr(data, needle.c_str());
+ if (!needle_loc)
+ return SourceLocation(); // invalid source location
+ return start_loc.getLocWithOffset(needle_loc - data + needle.length());
+}
+
+string GetIncludeNameAsWritten(
+ SourceLocation include_loc,
+ const CharacterDataGetterInterface& data_getter) {
+ const string data = GetSourceTextUntilEndOfLine(include_loc, data_getter);
+ if (data.empty())
+ return data;
+ string::size_type endpos = string::npos;
+ if (data[0] == '<') {
+ endpos = data.find('>', 1);
+ } else if (data[0] == '"') {
+ endpos = data.find('"', 1);
+ } else {
+ CHECK_UNREACHABLE_("Unexpected token being #included");
+ }
+ CHECK_(endpos != string::npos && "No end-character found for #include");
+ return data.substr(0, endpos+1);
+}
+
+// Get the text of a given token.
+string GetTokenText(const Token& token,
+ const CharacterDataGetterInterface& data_getter) {
+ const char* text = data_getter.GetCharacterData(token.getLocation());
+ return string(text, token.getLength());
+}
+
+// Given the range of an #if or #elif statement, determine the
+// symbols which are arguments to "defined". This allows iwyu to
+// treat these symbols as if #ifdef was used instead.
+vector<Token> FindArgumentsToDefined(
+ SourceRange range,
+ const CharacterDataGetterInterface& data_getter) {
+ const char* text = data_getter.GetCharacterData(range.getBegin());
+ const char* text_end = data_getter.GetCharacterData(range.getEnd());
+
+ // Ugh. The lexer wants the text to be nul-terminated. Make a copy.
+ const unsigned range_length = text_end - text;
+ const string range_str(text, range_length);
+ const char* range_cstr = range_str.c_str();
+
+ VERRS(8) << "Lexing: " << range_str << "\n";
+ Lexer lexer(range.getBegin(), LangOptions(), range_cstr, range_cstr,
+ range_cstr + range_length);
+
+ vector<Token> ret;
+ Token token;
+ enum { kLookingForDefined,
+ kExpectingLeftParenOrDefinedIdentifier,
+ kExpectingDefinedIdentifier } state = kLookingForDefined;
+ while (!lexer.LexFromRawLexer(token)) {
+ VERRS(8) << "Processing token \""
+ << GetTokenText(token, data_getter)
+ << "\" of type " << token.getName()
+ << " in state " << state << "\n";
+ switch (state) {
+ case kLookingForDefined:
+ if (token.getKind() == clang::tok::raw_identifier) {
+ if (GetTokenText(token, data_getter) == "defined") {
+ state = kExpectingLeftParenOrDefinedIdentifier;
+ }
+ }
+ break;
+ case kExpectingLeftParenOrDefinedIdentifier:
+ if (token.getKind() == clang::tok::l_paren) {
+ state = kExpectingDefinedIdentifier;
+ continue;
+ }
+ // Fall through.
+ case kExpectingDefinedIdentifier:
+ CHECK_(token.getKind() == clang::tok::raw_identifier);
+ ret.push_back(token);
+ state = kLookingForDefined;
+ break;
+ }
+ }
+ return ret;
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_lexer_utils.h b/iwyu_lexer_utils.h
new file mode 100644
index 0000000..872b5e5
--- /dev/null
+++ b/iwyu_lexer_utils.h
@@ -0,0 +1,87 @@
+//===--- iwyu_lexer_utils.h - clang-lexer utilities for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_
+
+#include <string> // for string
+#include <vector> // for vector
+
+#include "clang/Basic/SourceLocation.h"
+
+namespace clang {
+class SourceManager;
+class Token;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::string;
+using std::vector;
+
+// For a particular source line that source_location points to,
+// returns true if the given text occurs on the line.
+// (Case sensitive.)
+bool LineHasText(clang::SourceLocation source_location, llvm::StringRef text);
+
+// Interface to get character data from a SourceLocation. This allows
+// tests to avoid constructing a SourceManager yet still allow iwyu to
+// get the character data from SourceLocations.
+class CharacterDataGetterInterface {
+ public:
+ virtual ~CharacterDataGetterInterface() = default;
+ virtual const char* GetCharacterData(clang::SourceLocation loc) const = 0;
+};
+
+// Implementation of CharacterDataGetterInterface that uses a SourceManager.
+class SourceManagerCharacterDataGetter : public CharacterDataGetterInterface {
+ public:
+ explicit SourceManagerCharacterDataGetter(
+ const clang::SourceManager& source_manager);
+ const char* GetCharacterData(clang::SourceLocation loc) const override;
+
+ private:
+ const clang::SourceManager& source_manager_;
+};
+
+// Returns the source-code line from the current location until \n.
+llvm::StringRef GetSourceTextUntilEndOfLine(
+ clang::SourceLocation start_loc,
+ const CharacterDataGetterInterface& data_getter);
+
+// Returns the location right *after* the first occurrence of needle
+// after start_loc, if any. (If none, returns an invalid source-loc.)
+// start_loc must be a valid source location.
+clang::SourceLocation GetLocationAfter(
+ clang::SourceLocation start_loc, const string& needle,
+ const CharacterDataGetterInterface& data_getter);
+
+// Returns the include-name as written, including <>'s and ""'s.
+// Resolved computed includes first, so given
+// #define INC <stdio.h>
+// #include INC
+// If include_loc points to the second INC, we'll return '<stdio.h>'.
+string GetIncludeNameAsWritten(
+ clang::SourceLocation include_loc,
+ const CharacterDataGetterInterface& data_getter);
+
+// Given the range of an #if or #elif statement, determine the
+// symbols which are arguments to "defined". This allows iwyu to
+// treat these symbols as if #ifdef was used instead.
+vector<clang::Token> FindArgumentsToDefined(
+ clang::SourceRange range,
+ const CharacterDataGetterInterface& data_getter);
+
+// Get the text of a given token.
+string GetTokenText(const clang::Token& token,
+ const CharacterDataGetterInterface& data_getter);
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_LEXER_UTILS_H_
diff --git a/iwyu_location_util.cc b/iwyu_location_util.cc
new file mode 100644
index 0000000..aa00ac7
--- /dev/null
+++ b/iwyu_location_util.cc
@@ -0,0 +1,173 @@
+//===--- iwyu_location_util.cc - SourceLoc-related utilities for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_location_util.h"
+
+#include "iwyu_ast_util.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclCXX.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/Expr.h"
+#include "clang/AST/ExprCXX.h"
+#include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/Stmt.h"
+#include "clang/AST/TemplateBase.h"
+#include "clang/AST/TypeLoc.h"
+#include "clang/Basic/SourceLocation.h"
+
+using clang::BinaryOperator;
+using clang::CXXDependentScopeMemberExpr;
+using clang::CXXMethodDecl;
+using clang::CXXOperatorCallExpr;
+using clang::ClassTemplateSpecializationDecl;
+using clang::ConditionalOperator;
+using clang::FunctionDecl;
+using clang::MemberExpr;
+using clang::SourceLocation;
+using clang::UnaryOperator;
+using clang::UnresolvedMemberExpr;
+
+namespace include_what_you_use {
+
+// This works around two bugs(?) in clang where decl->getLocation()
+// can be wrong for implicit template instantiations and functions.
+// (1) Consider the following code:
+// template<class T> hash { ... }; // tpl decl
+// template<class T> hash<basic_string<T>> { ... }; // partial spec decl
+// hash<basic_string<char>> myhash;
+// The decl associated with hash<basic_string<char>> is a third decl
+// that is formed implicitly from the partial-spec decl. The bug(?) is
+// that clang gives the third decl the wrong location: it should have
+// the location of the partial-spec decl it is instantiating, but
+// instead it has the location of original tpl decl. (clang gets
+// everything else right -- PrintableDecl(third_decl) shows the right
+// class body -- but the location is wrong.) We work around that here
+// by using GetInstantiatedFromDecl to map an implicit decl back to
+// the appropriate decl that actually defines the class.
+// (2) Consider this code:
+// struct A { ... };
+// struct A; // a little late, but a forward-declaration
+// clang will associate the implicit constructors and destructor with
+// the last declaration, which is the forward-declare, rather than the
+// actual definition. Luckily, the implicit constructor's parent is
+// still correct, so we just use that as the location. Implicit
+// methods don't have their own location anyway.
+// Note the two issues can both be present, if an implicit method's
+// parent is an implicit instantiation.
+SourceLocation GetLocation(const clang::Decl* decl) {
+ if (decl == nullptr) return SourceLocation();
+
+ if (const CXXMethodDecl* method_decl = DynCastFrom(decl)) {
+ if (method_decl->isImplicit())
+ decl = method_decl->getParent();
+ }
+ if (const ClassTemplateSpecializationDecl* spec = DynCastFrom(decl)) {
+ decl = GetDefinitionAsWritten(spec); // templated class
+ } else if (const FunctionDecl* fn_decl = DynCastFrom(decl)) {
+ if (fn_decl->getTemplateInstantiationPattern()) // templated function
+ decl = GetDefinitionAsWritten(fn_decl);
+ }
+ return decl->getLocation();
+}
+
+// Unfortunately member_expr doesn't expose the location of the . or
+// ->. If the base is implicit, there is no . or ->, and we just
+// return the member loc. Otherwise, we have to guess if the entire
+// member-expression (all of 'b.m') is in a macro or not. We look at
+// getMemberLoc(), the start of the member ('m') , and
+// getBase()->getLocEnd(), the end of the base ('b'). If they're both
+// on the same line of the same file, then the . or -> must be there
+// too, and return that as the location. Otherwise, we assume that
+// one or the other is in a macro, but the . or -> is not, and use the
+// instantiation (not spelling) location of the macro.
+static SourceLocation GetMemberExprLocation(const MemberExpr* member_expr) {
+ const SourceLocation member_start = member_expr->getMemberLoc();
+ const SourceLocation base_end = member_expr->getBase()->getLocEnd();
+
+ if (member_expr->isImplicitAccess() || base_end.isInvalid())
+ return member_start;
+ // Weird: member_start can be 'invalid' for calls like bool(x),
+ // where bool() is a class's own operator bool. Shrug.
+ if (member_start.isInvalid())
+ return base_end;
+
+ // If either the base or the member is not a macro, then we consider
+ // the location of this member-expr to be outside the macro.
+ if (!IsInMacro(member_start))
+ return member_start;
+ if (!IsInMacro(base_end))
+ return base_end;
+
+ // Now figure out if the base and member are in the same macro. If
+ // so, we say the whole member-expr is part of that macro.
+ // Otherwise, we just say the member-expr is in the file where the
+ // member and base macros are called.
+ if (GetFileEntry(member_start) == GetFileEntry(base_end) &&
+ GetLineNumber(member_start) == GetLineNumber(base_end)) {
+ return member_start;
+ }
+
+ return GetInstantiationLoc(member_start);
+}
+
+SourceLocation GetLocation(const clang::Stmt* stmt) {
+ if (stmt == nullptr) return SourceLocation();
+ // For some expressions, we take the location to be the 'key' part
+ // of the expression, not the beginning. For instance, the
+ // location of 'a << b' is the '<<', not the 'a'. This is
+ // important for code like 'MACRO << 5', where we want to make
+ // sure the location we return is "here", and not inside MACRO.
+ // (The price is we do worse for '#define OP <<; a OP b;'.)
+ if (const CXXOperatorCallExpr* call_expr = DynCastFrom(stmt)) {
+ return call_expr->getOperatorLoc();
+ } else if (const MemberExpr* member_expr = DynCastFrom(stmt)) {
+ return GetMemberExprLocation(member_expr);
+ } else if (const UnresolvedMemberExpr* member_expr
+ = DynCastFrom(stmt)) {
+ if (member_expr->getOperatorLoc().isValid())
+ return member_expr->getOperatorLoc();
+ } else if (const CXXDependentScopeMemberExpr* member_expr
+ = DynCastFrom(stmt)) {
+ if (member_expr->getOperatorLoc().isValid())
+ return member_expr->getOperatorLoc();
+ } else if (const BinaryOperator* binary_op = DynCastFrom(stmt)) {
+ return binary_op->getOperatorLoc();
+ } else if (const ConditionalOperator* conditional_op =
+ DynCastFrom(stmt)) {
+ return conditional_op->getQuestionLoc();
+ } else if (const UnaryOperator* unary_op = DynCastFrom(stmt)) {
+ // Drill through unary operators and parentheses, to get at the underlying
+ // DeclRefExpr or whatever, e.g. '*(x)' should give the location of 'x'
+ stmt = unary_op->getSubExpr()->IgnoreParenImpCasts();
+ }
+
+ return stmt->getLocStart();
+}
+
+SourceLocation GetLocation(const clang::TypeLoc* typeloc) {
+ if (typeloc == nullptr) return SourceLocation();
+ return typeloc->getBeginLoc();
+}
+
+SourceLocation GetLocation(const clang::NestedNameSpecifierLoc* nnsloc) {
+ if (nnsloc == nullptr) return SourceLocation();
+ return nnsloc->getBeginLoc();
+}
+
+SourceLocation GetLocation(const clang::TemplateArgumentLoc* argloc) {
+ if (argloc == nullptr) return SourceLocation();
+ return argloc->getLocation();
+}
+
+bool IsInScratchSpace(SourceLocation loc) {
+ return StartsWith(PrintableLoc(GetSpellingLoc(loc)), "<scratch space>");
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_location_util.h b/iwyu_location_util.h
new file mode 100644
index 0000000..3892a42
--- /dev/null
+++ b/iwyu_location_util.h
@@ -0,0 +1,233 @@
+//===--- iwyu_location_util.h - SourceLoc-related utilities for iwyu ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// clang-File utilities for the IWYU checker.
+//
+// This file deals with clang's FileEntry and SourceLocation classes,
+// and useful utilities on them. It does not deal with file paths
+// per se; for that, see iwyu_path_util.h
+//
+// In addition to some ad hoc helper routines, in general, for every
+// type we consider, we try to provide 3 routines (as appropriate):
+// GetLocation(): convert the object to an appropriate SourceLocation
+// GetFileEntry(): convert the object to the file it's in
+// GetFilePath(): convert the object to the filename it's in
+//
+//
+// Background on Clang data structures:
+//
+// Clang uses the type FileEntry to identify a physical file in the
+// file system. A FileEntry is created for each source file Clang
+// processes. Clang never creates two FileEntry objects for the same
+// file. Therefore we use const FileEntry* in IWYU as unique IDs for
+// files.
+//
+// Clang's FileID type is a misnomer. It's actually an ID of a
+// particular #include statement. If a file is #included in two
+// places, it will have two different FildIDs.
+//
+// A SourceLocation is a compact encoding of a location in a
+// particular #include of a source file. From it you can find the
+// file path, line number, column number, and which file (if any)
+// #includes the file.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_LOCATION_UTIL_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_LOCATION_UTIL_H_
+
+#include <string> // for string
+
+#include "iwyu_globals.h"
+#include "iwyu_path_util.h"
+#include "clang/Basic/FileManager.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/Token.h"
+
+namespace clang {
+class Decl;
+class NestedNameSpecifierLoc;
+class Stmt;
+class TemplateArgumentLoc;
+class TypeLoc;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::string;
+
+//------------------------------------------------------------
+// Helper functions for FileEntry.
+
+// Some symbols are directly defined by the compiler. For them, the
+// definition location points to the "<built-in>" file.
+inline bool IsBuiltinFile(const clang::FileEntry* file) {
+ return file == nullptr;
+}
+
+// There are two kinds of symbols that are not defined in the source
+// files: the compiler can define some standard symbols
+// (e.g. __FILE__), and the user can define macros on the command line
+// of the compiler using -D. A symbol appears to be defined in file
+// "<built-in>" in the first case, and "<command line>" in the second.
+// IsBuiltinOrCommandLineFile(file) returns true if it's either of the
+// two cases.
+inline bool IsBuiltinOrCommandLineFile(const clang::FileEntry* file) {
+ return IsBuiltinFile(file) || file->getName().equals("<command line>");
+}
+
+// When macro args are concatenated e.g. '#define CAT(A, B) A##B', their
+// location ends up outside the source text, in what the compiler calls
+// "<scratch space>".
+// This function returns true if the provided loc is in scratch space.
+bool IsInScratchSpace(clang::SourceLocation loc);
+
+inline string GetFilePath(const clang::FileEntry* file) {
+ return (IsBuiltinFile(file) ? "<built-in>" :
+ NormalizeFilePath(file->getName()));
+}
+
+//------------------------------------------------------------
+// Helper functions for SourceLocation
+
+inline clang::SourceLocation GetSpellingLoc(clang::SourceLocation loc) {
+ return loc.isValid() ? GlobalSourceManager()->getSpellingLoc(loc) : loc;
+}
+
+inline clang::SourceLocation GetInstantiationLoc(clang::SourceLocation loc) {
+ return loc.isValid() ? GlobalSourceManager()->getExpansionLoc(loc) : loc;
+}
+
+inline bool IsInMacro(clang::SourceLocation loc) {
+ return GetSpellingLoc(loc) != GetInstantiationLoc(loc);
+}
+
+// Returns the line number corresponding to a source location.
+// Prefers the spelling line number, but if it's not useful (because
+// the location is in <scratch space> for instance, due to macro token
+// concatenation), uses the instantiation line number. Returns -1 if
+// we can't figure out the line #.
+inline int GetLineNumber(clang::SourceLocation loc) {
+ if (!loc.isValid())
+ return -1;
+ const clang::FullSourceLoc fullloc(loc, *GlobalSourceManager());
+ bool invalid = false;
+ int retval = fullloc.getSpellingLineNumber(&invalid);
+ if (invalid)
+ retval = fullloc.getExpansionLineNumber(&invalid);
+ if (invalid)
+ retval = -1;
+ return retval;
+}
+
+// The rest of this section of the file is for returning the
+// FileEntry* corresponding to a source location: the file that the
+// location is in. This is a surprising amount of work.
+
+// Tells which #include loc comes from.
+// This is the most basic FileEntry getter, it only does a simple lookup in
+// SourceManager to determine which file the location is associated with.
+inline const clang::FileEntry* GetLocFileEntry(clang::SourceLocation loc) {
+ // clang uses the name FileID to mean 'a filename that was reached via
+ // a particular series of #includes.' (What one might think a FileID
+ // might be -- a unique reference to a filesystem object -- is
+ // actually a FileEntry*.)
+ const clang::SourceManager& source_manager = *GlobalSourceManager();
+ return source_manager.getFileEntryForID(source_manager.getFileID(loc));
+}
+
+inline const clang::FileEntry* GetFileEntry(clang::SourceLocation loc) {
+ if (!loc.isValid())
+ return nullptr;
+
+ // We want where the user actually writes the token, instead of
+ // where it appears as part of a macro expansion. For example, in:
+ //
+ // file foo.h, line 5: #define FOO(x) x + y
+ // file bar.cc, line 10: FOO(z)
+ //
+ // FOO(z) will expand to 'z + y', where symbol z's location is
+ // foo.h, line 5, and its spelling location is bar.cc, line 10.
+ const clang::FileEntry* retval = GetLocFileEntry(GetSpellingLoc(loc));
+
+ // Sometimes the spelling location is NULL, because the symbol is
+ // 'spelled' via macro concatenation. For instance, all the
+ // __gthrw3 symbols in
+ // /usr/include/c++/4.2/x86_64-linux-gnu/bits/gthr-default.h.
+ // In that case, fall back on the instantiation location.
+ if (!retval) {
+ retval = GetLocFileEntry(GetInstantiationLoc(loc));
+ }
+ return retval;
+}
+
+//------------------------------------------------------------
+// GetFileEntry(), GetFilePath(), and GetLocation().
+
+inline clang::SourceLocation GetLocation(const clang::Token& token) {
+ return token.getLocation();
+}
+
+inline clang::SourceLocation GetLocation(clang::SourceLocation loc) {
+ return loc; // the identity location-getter, useful with templates
+}
+clang::SourceLocation GetLocation(const clang::Decl* decl);
+clang::SourceLocation GetLocation(const clang::Stmt* stmt);
+clang::SourceLocation GetLocation(const clang::TypeLoc* typeloc);
+clang::SourceLocation GetLocation(const clang::NestedNameSpecifierLoc* nnsloc);
+clang::SourceLocation GetLocation(const clang::TemplateArgumentLoc* argloc);
+
+// These define default implementations of GetFileEntry() and
+// GetPath() in terms of GetLocation(). As long as an object defines
+// its own GetLocation(), it will get these other two for free.
+template<typename T> const clang::FileEntry* GetFileEntry(const T& obj) {
+ return GetFileEntry(GetLocation(obj));
+}
+template<typename T> const string GetFilePath(const T& obj) {
+ return GetFilePath(GetFileEntry(obj));
+}
+
+//------------------------------------------------------------
+// Some utility, location-based routines.
+
+// Given any two objects that have instantiation-locations, says
+// whether one occurs before the other in the translation unit (using
+// instantiated locations). This means that one would occur before
+// the other looking at the output of cc -E or equivalent.
+template<typename T, typename U>
+inline bool IsBeforeInTranslationUnit(const T& a, const U& b) {
+ const clang::FullSourceLoc a_loc(GetLocation(a), *GlobalSourceManager());
+ const clang::FullSourceLoc b_loc(GetLocation(b), *GlobalSourceManager());
+ // Inside a macro, everything has the same instantiation location.
+ // We'd like to use spelling-location to break that tie, but it's
+ // unreliable since a or b might be spelled in "<scratch space>".
+ // So we're just conservative and return true always if the two have
+ // an equal location and are in a macro. (Because we check the
+ // instantiation-location is equal, it's enough that one of the two
+ // be in a macro; we prefer that since IsInMacro fails if T or U is
+ // the wrong type.) TODO(csilvers): see if's possible to get
+ // isBeforeInTranslationUnitThan working properly. This may require
+ // storing source-locations better in OneUse.
+ if ((IsInMacro(a_loc) || IsInMacro(b_loc)) &&
+ GetInstantiationLoc(a_loc) == GetInstantiationLoc(b_loc))
+ return true;
+ return a_loc.isBeforeInTranslationUnitThan(b_loc);
+}
+
+// Like IsBeforeInTranslationUnit, but both a and b must be
+// instantiated in the same file as well.
+template<typename T, typename U>
+inline bool IsBeforeInSameFile(const T& a, const U& b) {
+ if (GetFileEntry(a) != GetFileEntry(b))
+ return false;
+ return IsBeforeInTranslationUnit(a, b);
+}
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_LOCATION_UTIL_H_
diff --git a/iwyu_output.cc b/iwyu_output.cc
new file mode 100644
index 0000000..a96be06
--- /dev/null
+++ b/iwyu_output.cc
@@ -0,0 +1,2000 @@
+//===--- iwyu_output.cc - output-emitting code for include-what-you-use ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_output.h"
+
+#include <algorithm> // for sort, find
+#include <cstdio> // for snprintf
+// TODO(wan): make sure IWYU doesn't suggest <iterator>.
+#include <iterator> // for find
+#include <map> // for _Rb_tree_const_iterator, etc
+#include <utility> // for pair, make_pair, operator>
+#include <vector> // for vector, vector<>::iterator, etc
+
+#include "iwyu_ast_util.h"
+#include "iwyu_globals.h"
+#include "iwyu_include_picker.h"
+#include "iwyu_location_util.h"
+#include "iwyu_path_util.h"
+#include "iwyu_preprocessor.h" // IWYU pragma: keep
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+// TODO(wan): remove this once the IWYU bug is fixed.
+// IWYU pragma: no_include "foo/bar/baz.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/Basic/SourceLocation.h"
+
+namespace include_what_you_use {
+
+using clang::ClassTemplateDecl;
+using clang::ClassTemplateSpecializationDecl;
+using clang::CXXMethodDecl;
+using clang::CXXRecordDecl;
+using clang::Decl;
+using clang::DeclContext;
+using clang::FileEntry;
+using clang::FunctionDecl;
+using clang::NamedDecl;
+using clang::NamespaceDecl;
+using clang::RecordDecl;
+using clang::SourceLocation;
+using clang::SourceRange;
+using clang::TemplateDecl;
+using clang::UsingDecl;
+using llvm::cast;
+using llvm::errs;
+using llvm::isa;
+using llvm::raw_string_ostream;
+using std::map;
+using std::multimap;
+using std::pair;
+using std::sort;
+using std::to_string;
+using std::vector;
+
+namespace internal {
+
+namespace {
+
+class OutputLine {
+ public:
+ OutputLine() = default;
+ explicit OutputLine(const string& line)
+ : line_(line) {}
+ OutputLine(const string& line, const vector<string>& symbols)
+ : line_(line),
+ symbols_(symbols) {
+ symbols_.erase(std::remove_if(symbols_.begin(), symbols_.end(),
+ [](const string& v) { return v.empty(); }),
+ symbols_.end());
+ }
+
+ size_t line_length() const { return line_.size(); }
+ bool needs_alignment() const { return !symbols_.empty(); }
+ void add_prefix(const string& prefix) { line_ = prefix + line_; }
+ string printable_line(size_t min_length, size_t max_length) const;
+
+ private:
+ string line_; // '#include XXX' or 'class YYY;'
+ vector<string> symbols_; // symbols used from included header
+};
+
+// Append a helpful 'why' comment to the include line, containing the symbols
+// used from the header. Align nicely at lower verbosity levels.
+string OutputLine::printable_line(size_t min_length, size_t max_length) const {
+ // If there are no symbols to mention, return the line as-is.
+ if (symbols_.empty())
+ return line_;
+
+ CHECK_(max_length > 0);
+ --max_length; // Spare a char for newline character.
+
+ // Before first symbol, print ' // for ' and pad it so 'why' comments are
+ // nicely aligned.
+ string symbol_prefix = " // for ";
+ if (line_.length() < min_length)
+ symbol_prefix.insert(0, min_length - line_.length(), ' ');
+
+ string result = line_;
+ for (string symbol : symbols_) {
+ // At verbose levels 0-2, truncate output to max_length columns.
+ if (!ShouldPrint(3)) {
+ // Calculate number of chars remaining.
+ size_t remaining = 0;
+ size_t result_length = result.length() + symbol_prefix.length();
+ if (result_length < max_length)
+ remaining = max_length - result_length;
+
+ // Ellipsize, and if we can't fit any fragment of the symbol, give up.
+ symbol = Ellipsize(symbol, remaining);
+ if (symbol.empty())
+ break;
+ }
+
+ result += symbol_prefix;
+ result += symbol;
+ symbol_prefix = ", ";
+ }
+
+ return result;
+}
+
+// A map that effectively allows us to dynamic cast from a NamedDecl
+// to a FakeNamedDecl. When a FakeNamedDecl is created, it will be
+// inserted into the map with itself as the key (implicitly casted to
+// a NamedDecl).
+std::map<const clang::NamedDecl*, const FakeNamedDecl*>
+g_fake_named_decl_map;
+
+// Since dynamic casting is not an option, this method is provided to
+// determine if a decl is actually a FakeNamedDecl.
+const FakeNamedDecl* FakeNamedDeclIfItIsOne(const clang::NamedDecl* decl) {
+ return GetOrDefault(g_fake_named_decl_map, decl, nullptr);
+}
+
+} // anonymous namespace
+
+FakeNamedDecl::FakeNamedDecl(const string& kind_name, const string& qual_name,
+ const string& decl_filepath, int decl_linenum)
+ : clang::NamedDecl(clang::Decl::Record, nullptr, clang::SourceLocation(),
+ clang::DeclarationName()),
+ kind_name_(kind_name),
+ qual_name_(qual_name),
+ decl_filepath_(decl_filepath), decl_linenum_(decl_linenum) {
+ g_fake_named_decl_map[this] = this;
+}
+
+// When testing IWYU, we provide a fake object (FakeNamedDecl) that
+// needs to provide its own version of NamedDecl::getKindName() and
+// NamedDecl::getQualifiedNameAsString(). Unfortunately they aren't
+// virtual. Hence we define the following helpers to dispatch the
+// call ourselves.
+
+string GetKindName(const clang::TagDecl* tag_decl) {
+ const clang::NamedDecl* const named_decl = tag_decl;
+ if (const FakeNamedDecl* fake = FakeNamedDeclIfItIsOne(named_decl)) {
+ return fake->kind_name();
+ }
+ return tag_decl->getKindName();
+}
+
+string GetQualifiedNameAsString(const clang::NamedDecl* named_decl) {
+ if (const FakeNamedDecl* fake = FakeNamedDeclIfItIsOne(named_decl)) {
+ return fake->qual_name();
+ }
+ return GetWrittenQualifiedNameAsString(named_decl);
+}
+
+// Name we put in the comments next to an #include.
+string GetShortNameAsString(const clang::NamedDecl* named_decl) {
+ if (const FakeNamedDecl* fake = FakeNamedDeclIfItIsOne(named_decl)) {
+ return fake->qual_name();
+ }
+
+ // This is modified from NamedDecl::getQualifiedNameAsString:
+ // http://clang.llvm.org/doxygen/Decl_8cpp_source.html#l00742
+ const DeclContext *decl_context = named_decl->getDeclContext();
+ if (decl_context->isFunctionOrMethod())
+ return named_decl->getNameAsString();
+
+ vector<const DeclContext*> contexts;
+ while (decl_context && isa<NamedDecl>(decl_context)) {
+ contexts.push_back(decl_context);
+ decl_context = decl_context->getParent();
+ };
+
+ std::string retval;
+ raw_string_ostream ostream(retval);
+
+ for (vector<const DeclContext*>::reverse_iterator it = contexts.rbegin();
+ it != contexts.rend(); ++it) {
+ if (const ClassTemplateSpecializationDecl* tpl_decl = DynCastFrom(*it)) {
+ ostream << tpl_decl->getName() << "<>::";
+ } else if (isa<NamespaceDecl>(*it)) {
+ // We don't want to include namespaces in our shortname.
+ } else if (const RecordDecl *record_decl = DynCastFrom(*it)) {
+ if (!record_decl->getIdentifier())
+ ostream << "(anonymous " << record_decl->getKindName() << ")::";
+ else
+ ostream << *record_decl << "::";
+ } else if (const FunctionDecl *function_decl = DynCastFrom(*it)) {
+ ostream << *function_decl << "::"; // could also add in '<< "()"'
+ } else {
+ ostream << *(cast<NamedDecl>(*it)) << "::";
+ }
+ }
+ // Due to the way DeclarationNameInfo::printName() is written, this
+ // will show template arguments for templated constructors and
+ // destructors. Since iwyu only shows these when they're defined in
+ // a -inl.h file, I'm not going to worry about it.
+ if (named_decl->getDeclName())
+ ostream << *named_decl;
+ else
+ ostream << "(anonymous)";
+
+ return ostream.str();
+}
+
+} // namespace internal
+
+// Holds information about a single full or fwd-decl use of a symbol.
+OneUse::OneUse(const NamedDecl* decl, SourceLocation use_loc,
+ OneUse::UseKind use_kind, bool in_cxx_method_body,
+ const char* comment)
+ : symbol_name_(internal::GetQualifiedNameAsString(decl)),
+ short_symbol_name_(internal::GetShortNameAsString(decl)),
+ decl_(decl),
+ decl_loc_(GetInstantiationLoc(GetLocation(decl))),
+ decl_file_(GetFileEntry(decl_loc_)),
+ decl_filepath_(GetFilePath(decl_file_)),
+ use_loc_(use_loc),
+ use_kind_(use_kind), // full use or fwd-declare use
+ in_cxx_method_body_(in_cxx_method_body),
+ comment_(comment ? comment : ""),
+ ignore_use_(false),
+ is_iwyu_violation_(false) {
+}
+
+// This constructor always creates a full use.
+OneUse::OneUse(const string& symbol_name, const FileEntry* dfn_file,
+ const string& dfn_filepath, SourceLocation use_loc)
+ : symbol_name_(symbol_name),
+ short_symbol_name_(symbol_name),
+ decl_(nullptr),
+ decl_file_(dfn_file),
+ decl_filepath_(dfn_filepath),
+ use_loc_(use_loc),
+ use_kind_(kFullUse),
+ in_cxx_method_body_(false),
+ ignore_use_(false),
+ is_iwyu_violation_(false) {
+ // Sometimes dfn_filepath is actually a fully quoted include. In
+ // that case, we take that as an unchangable mapping that we
+ // should never remove, so we make it the suggested header.
+ CHECK_(!decl_filepath_.empty() && "Must pass a real filepath to OneUse");
+ if (decl_filepath_[0] == '"' || decl_filepath_[0] == '<')
+ suggested_header_ = decl_filepath_;
+}
+
+void OneUse::reset_decl(const clang::NamedDecl* decl) {
+ CHECK_(decl_ && "Need existing decl to reset it");
+ CHECK_(decl && "Need to reset decl with existing decl");
+ decl_ = decl;
+ decl_file_ = GetFileEntry(decl);
+ decl_filepath_ = GetFilePath(decl);
+}
+
+int OneUse::UseLinenum() const {
+ return GetLineNumber(use_loc_);
+}
+
+string OneUse::PrintableUseLoc() const {
+ return PrintableLoc(use_loc());
+}
+
+void OneUse::SetPublicHeaders() {
+ // We should never need to deal with public headers if we already know
+ // who we map to.
+ CHECK_(suggested_header_.empty() && "Should not need a public header here");
+ const IncludePicker& picker = GlobalIncludePicker(); // short alias
+ // If the symbol has a special mapping, use it, otherwise map its file.
+ public_headers_ = picker.GetCandidateHeadersForSymbol(symbol_name_);
+ if (public_headers_.empty())
+ public_headers_ = picker.GetCandidateHeadersForFilepathIncludedFrom(
+ decl_filepath_, GetFilePath(use_loc_));
+ if (public_headers_.empty())
+ public_headers_.push_back(ConvertToQuotedInclude(decl_filepath_));
+}
+
+const vector<string>& OneUse::public_headers() {
+ if (public_headers_.empty()) {
+ SetPublicHeaders();
+ CHECK_(!public_headers_.empty() && "Should always have at least one hdr");
+ }
+ return public_headers_;
+}
+
+bool OneUse::PublicHeadersContain(const string& elt) {
+ // TODO(csilvers): get rid of this method.
+ return ContainsValue(public_headers(), elt);
+}
+
+bool OneUse::NeedsSuggestedHeader() const {
+ return (!ignore_use() && is_full_use() && suggested_header_.empty());;
+}
+
+namespace internal {
+
+// At verbose level 7 and above, returns a printable version of
+// the pointer, suitable for being emitted after AnnotatedName.
+// At lower verbose levels, returns the empty string.
+string PrintablePtr(const void* ptr) {
+ if (ShouldPrint(7)) {
+ char buffer[32];
+ snprintf(buffer, sizeof(buffer), "%p ", ptr);
+ return buffer;
+ }
+ return "";
+}
+
+// Helpers for printing a forward declaration of a record type or
+// record type template that can be put in source code. The hierarchy
+// of the Decl classes used in these helpers looks like:
+//
+// NamedDecl
+// |-- NamespaceDecl
+// |-- TemplateDecl
+// `-- TypeDecl
+// `-- TagDecl (class, struct, union, enum)
+// `-- RecordDecl (class, struct, union)
+
+// Given a NamedDecl that presents a (possibly template) record
+// (i.e. class, struct, or union) type declaration, and the print-out
+// of its (possible) template parameters and kind (e.g. "template
+// <typename T> struct"), returns its forward declaration line.
+string PrintForwardDeclare(const NamedDecl* decl,
+ const string& tpl_params_and_kind) {
+ // We need to short-circuit the logic for testing.
+ if (const FakeNamedDecl* fake = FakeNamedDeclIfItIsOne(decl)) {
+ return tpl_params_and_kind + " " + fake->qual_name() + ";";
+ }
+
+ CHECK_((isa<RecordDecl>(decl) || isa<TemplateDecl>(decl)) &&
+ "IWYU only allows forward declaring (possibly template) record types");
+
+ std::string fwd_decl = std::string(decl->getName()) + ";";
+ bool seen_namespace = false;
+ for (const DeclContext* ctx = decl->getDeclContext();
+ ctx && isa<NamedDecl>(ctx); ctx = ctx->getParent()) {
+ if (const RecordDecl* rec = DynCastFrom(ctx)) {
+ fwd_decl = std::string(rec->getName()) + "::" + fwd_decl;
+ } else if (const NamespaceDecl* ns = DynCastFrom(ctx)) {
+ if (!seen_namespace) {
+ seen_namespace = true;
+ fwd_decl = tpl_params_and_kind + " " + fwd_decl;
+ }
+
+ const std::string ns_name = ns->isAnonymousNamespace() ?
+ "" : (std::string(ns->getName()) + " ");
+ fwd_decl = "namespace " + ns_name + "{ " + fwd_decl + " }";
+ } else if (const FunctionDecl* fn = DynCastFrom(ctx)) {
+ // A local class (class defined inside a function).
+ fwd_decl = std::string(fn->getName()) + "::" + fwd_decl;
+ } else {
+ CHECK_UNREACHABLE_("Unexpected decoration for type");
+ }
+ }
+
+ if (!seen_namespace) {
+ fwd_decl = tpl_params_and_kind + " " + fwd_decl;
+ }
+ return fwd_decl;
+}
+
+// Given a RecordDecl, return the line that could be put in source
+// code to forward-declare the record type, e.g. "namespace ns { class Foo; }".
+string MungedForwardDeclareLineForNontemplates(const RecordDecl* decl) {
+ return PrintForwardDeclare(decl, GetKindName(decl));
+}
+
+// Given a TemplateDecl representing a class|struct|union template
+// declaration, return the line that could be put in source code to
+// forward-declare the template, e.g.
+// "namespace ns { template <typename T> class Foo; }".
+string MungedForwardDeclareLineForTemplates(const TemplateDecl* decl) {
+ // DeclPrinter prints the class name just as we like it (with
+ // default args and everything) -- with logic that doesn't exist
+ // elsewhere in clang that I can see. Unfortunately, it also prints
+ // the full class body. So, as a hack, we use PrintableDecl to get
+ // the full declaration, and then hack off everything after the
+ // template name. We also have to replace the name with the fully
+ // qualified name. TODO(csilvers): prepend namespaces instead.
+ std::string line; // llvm wants regular string, not our versa-string
+ raw_string_ostream ostream(line);
+ decl->print(ostream); // calls DeclPrinter
+ line = ostream.str();
+ string::size_type endpos = line.length();
+ // Get rid of the superclasses, if any (this will nix the body too).
+ line = Split(line, " :", 2)[0];
+ // Get rid of the template body, if any (true if no superclasses).
+ line = Split(line, " {", 2)[0];
+ // The template name is now the last word on the line. Replace it
+ // by its fully-qualified form. Apparently rfind's endpos
+ // argument is inclusive, so substract one to get past the end-space.
+ const string::size_type name = line.rfind(' ', endpos - 1);
+ CHECK_(name != string::npos && "Unexpected printable template-type");
+ return PrintForwardDeclare(decl, line.substr(0, name));
+}
+
+string MungedForwardDeclareLine(const NamedDecl* decl) {
+ if (const RecordDecl* rec_decl = DynCastFrom(decl))
+ return MungedForwardDeclareLineForNontemplates(rec_decl);
+ else if (const TemplateDecl* template_decl = DynCastFrom(decl))
+ return MungedForwardDeclareLineForTemplates(template_decl);
+ CHECK_UNREACHABLE_("Unexpected decl type for MungedForwardDeclareLine");
+}
+
+} // namespace internal
+
+OneIncludeOrForwardDeclareLine::OneIncludeOrForwardDeclareLine(
+ const NamedDecl* fwd_decl)
+ : line_(internal::MungedForwardDeclareLine(fwd_decl)),
+ start_linenum_(-1), // set 'for real' below
+ end_linenum_(-1), // set 'for real' below
+ is_desired_(false),
+ is_present_(false),
+ included_file_(nullptr),
+ fwd_decl_(fwd_decl) {
+ const SourceRange decl_lines = GetSourceRangeOfClassDecl(fwd_decl);
+ // We always want to use the instantiation line numbers: for code like
+ // FORWARD_DECLARE_CLASS(MyClass);
+ // we care about where this macro is called, not where it's defined.
+ start_linenum_ = GetLineNumber(GetInstantiationLoc(decl_lines.getBegin()));
+ end_linenum_ = GetLineNumber(GetInstantiationLoc(decl_lines.getEnd()));
+}
+
+OneIncludeOrForwardDeclareLine::OneIncludeOrForwardDeclareLine(
+ const FileEntry* included_file, const string& quoted_include, int linenum)
+ : line_("#include " + quoted_include),
+ start_linenum_(linenum),
+ end_linenum_(linenum),
+ is_desired_(false),
+ is_present_(false),
+ quoted_include_(quoted_include),
+ included_file_(included_file),
+ fwd_decl_(nullptr) {
+}
+
+bool OneIncludeOrForwardDeclareLine::HasSymbolUse(const string& symbol_name)
+ const {
+ return ContainsKey(symbol_counts_, symbol_name);
+}
+
+void OneIncludeOrForwardDeclareLine::AddSymbolUse(const string& symbol_name) {
+ ++symbol_counts_[symbol_name];
+}
+
+bool OneIncludeOrForwardDeclareLine::IsIncludeLine() const {
+ // Since we construct line_, we know it's in canonical form, and
+ // can't look like ' # include <foo.h>' or some such.
+ return StartsWith(line_, "#include");
+}
+
+string OneIncludeOrForwardDeclareLine::LineNumberString() const {
+ char buf[64]; // big enough for any two numbers
+ snprintf(buf, sizeof(buf), "%d-%d", start_linenum_, end_linenum_);
+ return buf;
+}
+
+IwyuFileInfo::IwyuFileInfo(const clang::FileEntry* this_file,
+ const IwyuPreprocessorInfo* preprocessor_info,
+ const string& quoted_include_name)
+ : file_(this_file),
+ preprocessor_info_(preprocessor_info),
+ quoted_file_(quoted_include_name),
+ is_prefix_header_(false),
+ is_pch_in_code_(false),
+ desired_includes_have_been_calculated_(false)
+{}
+
+void IwyuFileInfo::AddAssociatedHeader(const IwyuFileInfo* other) {
+ VERRS(6) << "Adding " << GetFilePath(other->file_)
+ << " as associated header for " << GetFilePath(file_) << "\n";
+ associated_headers_.insert(other);
+}
+
+void IwyuFileInfo::AddInclude(const clang::FileEntry* includee,
+ const string& quoted_includee, int linenumber) {
+ OneIncludeOrForwardDeclareLine new_include(includee, quoted_includee,
+ linenumber);
+ new_include.set_present();
+
+ // It's possible for the same #include to be seen multiple times
+ // (for instance, if we include a .h file twice, and that .h file
+ // does not have a header guard). Ignore all but the first.
+ // TODO(csilvers): could rewrite this so it's constant-time.
+ for (const OneIncludeOrForwardDeclareLine& line : lines_) {
+ if (line.LineNumbersMatch(new_include)) {
+ VERRS(6) << "Ignoring repeated include: "
+ << GetFilePath(file_) << ":" << linenumber
+ << " -> " << GetFilePath(includee) << "\n";
+ return;
+ }
+ }
+
+ lines_.push_back(new_include);
+ // Store in a few other ways as well.
+ direct_includes_as_fileentries_.insert(includee);
+ direct_includes_.insert(quoted_includee);
+ VERRS(6) << "Found include: "
+ << GetFilePath(file_) << ":" << linenumber
+ << " -> " << GetFilePath(includee) << "\n";
+}
+
+void IwyuFileInfo::AddForwardDeclare(const clang::NamedDecl* fwd_decl,
+ bool definitely_keep_fwd_decl) {
+ CHECK_(fwd_decl && "forward_declare_decl unexpectedly nullptr");
+ CHECK_((isa<ClassTemplateDecl>(fwd_decl) || isa<RecordDecl>(fwd_decl))
+ && "Can only forward declare classes and class templates");
+ lines_.push_back(OneIncludeOrForwardDeclareLine(fwd_decl));
+ lines_.back().set_present();
+ if (definitely_keep_fwd_decl)
+ lines_.back().set_desired();
+ direct_forward_declares_.insert(fwd_decl); // store in another way as well
+ VERRS(6) << "Found forward-declare: "
+ << GetFilePath(file_) << ":" << lines_.back().LineNumberString()
+ << ": " << internal::PrintablePtr(fwd_decl)
+ << internal::GetQualifiedNameAsString(fwd_decl) << "\n";
+}
+
+void IwyuFileInfo::AddUsingDecl(const UsingDecl* using_decl) {
+ CHECK_(using_decl && "using_decl unexpectedly nullptr");
+ using_decl_referenced_.insert(std::make_pair(using_decl, false));
+ const SourceRange decl_lines = using_decl->getSourceRange();
+ int start_linenum = GetLineNumber(GetInstantiationLoc(decl_lines.getBegin()));
+ int end_linenum = GetLineNumber(GetInstantiationLoc(decl_lines.getEnd()));
+ VERRS(6) << "Found using-decl: "
+ << GetFilePath(file_) << ":"
+ << to_string(start_linenum) << "-" << to_string(end_linenum) << ": "
+ << internal::PrintablePtr(using_decl)
+ << internal::GetQualifiedNameAsString(using_decl) << "\n";
+}
+
+static void LogSymbolUse(const string& prefix, const OneUse& use) {
+ string decl_loc;
+ string printable_ptr;
+ if (use.decl()) {
+ decl_loc = PrintableLoc(GetLocation(use.decl()));
+ printable_ptr = internal::PrintablePtr(use.decl());
+ } else {
+ decl_loc = use.decl_filepath();
+ }
+ VERRS(6) << prefix << " " << printable_ptr << use.symbol_name()
+ << " (from " << decl_loc << ")"
+ << " at " << use.PrintableUseLoc() << "\n";
+}
+
+void IwyuFileInfo::ReportFullSymbolUse(SourceLocation use_loc,
+ const NamedDecl* decl,
+ bool in_cxx_method_body,
+ const char* comment) {
+ if (decl) {
+ // Since we need the full symbol, we need the decl's definition-site.
+ decl = GetDefinitionAsWritten(decl);
+ symbol_uses_.push_back(OneUse(decl, use_loc, OneUse::kFullUse,
+ in_cxx_method_body, comment));
+ LogSymbolUse("Marked full-info use of decl", symbol_uses_.back());
+ }
+}
+
+void IwyuFileInfo::ReportFullSymbolUse(SourceLocation use_loc,
+ const string& dfn_filepath,
+ const string& symbol) {
+ symbol_uses_.push_back(OneUse(symbol, nullptr, dfn_filepath, use_loc));
+ LogSymbolUse("Marked full-info use of symbol", symbol_uses_.back());
+}
+
+void IwyuFileInfo::ReportMacroUse(clang::SourceLocation use_loc,
+ clang::SourceLocation dfn_loc,
+ const string& symbol) {
+ symbol_uses_.push_back(OneUse(symbol, GetFileEntry(dfn_loc),
+ GetFilePath(dfn_loc), use_loc));
+ LogSymbolUse("Marked full-info use of macro", symbol_uses_.back());
+}
+
+void IwyuFileInfo::ReportDefinedMacroUse(const clang::FileEntry* used_in) {
+ macro_users_.insert(used_in);
+}
+
+void IwyuFileInfo::ReportIncludeFileUse(const clang::FileEntry* included_file,
+ const string& quoted_include) {
+ symbol_uses_.push_back(OneUse("", included_file, quoted_include,
+ SourceLocation()));
+ LogSymbolUse("Marked use of include-file", symbol_uses_.back());
+}
+
+void IwyuFileInfo::ReportKnownDesiredFile(const FileEntry* included_file) {
+ kept_includes_.insert(included_file);
+}
+
+void IwyuFileInfo::ReportForwardDeclareUse(SourceLocation use_loc,
+ const NamedDecl* decl,
+ bool in_cxx_method_body,
+ const char* comment) {
+ if (!decl)
+ return;
+ // Sometimes, a bug in clang (http://llvm.org/bugs/show_bug.cgi?id=8669)
+ // combines friend decls with true forward-declare decls. If that
+ // happened here, replace the friend with a real fwd decl.
+ decl = GetNonfriendClassRedecl(decl);
+ symbol_uses_.push_back(OneUse(decl, use_loc, OneUse::kForwardDeclareUse,
+ in_cxx_method_body, comment));
+ LogSymbolUse("Marked fwd-decl use of decl", symbol_uses_.back());
+}
+
+void IwyuFileInfo::ReportUsingDeclUse(SourceLocation use_loc,
+ const UsingDecl* using_decl,
+ bool in_cxx_method_body,
+ const char* comment) {
+ // If accessing a symbol through a using decl in the same file that contains
+ // the using decl, we must mark the using decl as referenced. At the end of
+ // traversing the AST, we check to see if a using decl is unreferenced and
+ // add a full use of one of its shadow decls so that the source file
+ // continues to compile.
+ auto using_decl_status = using_decl_referenced_.find(using_decl);
+
+ if (using_decl_status != using_decl_referenced_.end()) {
+ using_decl_status->second = true;
+ }
+
+ // When a symbol is accessed through a using decl, we must report
+ // that as a full use of the using decl because whatever file that
+ // using decl is in is now required.
+ ReportFullSymbolUse(use_loc, using_decl, in_cxx_method_body, comment);
+}
+
+// Given a collection of symbol-uses for symbols defined in various
+// files, figures out the minimal set of #includes needed to get those
+// definitions. Typically this is a trivial task: if we need the full
+// information from a decl, we just have to #include the header file
+// with the decl's definition. But if that header file is a private
+// decl -- e.g. <bits/stl_vector.h> -- we need to map that to a public
+// decl first. And if more than one public decl fits the bill, we
+// want to pick the one that minimizes the number of new #includes
+// added. Stores its results by updating the input vector of
+// OneUse's. For convenience, returns the set of "desired" includes:
+// all includes that were added to suggested_header.
+
+static void LogIncludeMapping(const string& reason, const OneUse& use) {
+ VERRS(6) << "Mapped " << use.decl_filepath() << " to "
+ << use.suggested_header() << " for " << use.symbol_name()
+ << " (" << reason << ")\n";
+}
+
+namespace internal {
+
+bool DeclCanBeForwardDeclared(const Decl* decl) {
+ // Class templates can always be forward-declared.
+ if (isa<ClassTemplateDecl>(decl))
+ return true;
+
+ // Other record decls can be forward-declared unless they denote a lambda
+ // expression; these have no type name to forward-declare.
+ if (const RecordDecl* record = DynCastFrom(decl)) {
+ return !record->isLambda();
+ }
+
+ return false;
+}
+
+// Helper to tell whether a forward-declare use is 'preceded' by a
+// declaration inside the same file. 'Preceded' is in quotes, because
+// it's actually ok if the declaration follows the use, inside a
+// class. (You can write a method using a Foo* before defining the
+// nested class Foo later in the class.)
+bool DeclIsVisibleToUseInSameFile(const Decl* decl, const OneUse& use) {
+ if (GetFileEntry(decl) != GetFileEntry(use.use_loc()))
+ return false;
+
+ // If the decl comes before the use, it's visible to it. (The
+ // decl can also be at the same location as the use, e.g. for
+ // struct Foo { int x, y; } myvar
+ // ) It can even be visible if the decl comes after, if the decl
+ // is inside the class definition and the use is in the body of a
+ // method.
+ return (IsBeforeInSameFile(decl, use.use_loc()) ||
+ GetLocation(decl) == use.use_loc() ||
+ (DeclsAreInSameClass(decl, use.decl()) && !decl->isOutOfLine()
+ && use.in_cxx_method_body()));
+}
+
+// This makes a best-effort attempt to find the smallest set of
+// #include files that satisfy all uses. A more accurate name
+// might be "calculate minimal-ish includes". :-) It populates
+// each OneUse in uses with the best #include for that use.
+// direct_includes: this file's direct includes only.
+// associated_direct_includes: direct includes for 'associated'
+// files. For everything but foo.cc, this is empty; for foo.cc it's
+// foo.h's includes and foo-inl.h's includes.
+set<string> CalculateMinimalIncludes(
+ const set<string>& direct_includes,
+ const set<string>& associated_direct_includes,
+ vector<OneUse>* uses) {
+ set<string> desired_headers;
+
+ // TODO(csilvers): if a use's decl supports equivalent redecls
+ // (such as a FunctionDecl or TypedefDecl), pick the redecl
+ // that yields the "best" #include.
+
+ // Step (1) The easy case: decls that map to just one file. This
+ // captures both decls that aren't in private header files, and
+ // those in private header files that only map to one public file.
+ // For every other decl, we store the (decl, public-headers) pair.
+ for (OneUse& use : *uses) {
+ // We don't need to add any #includes for non-full-use.
+ if (use.ignore_use() || !use.is_full_use())
+ continue;
+ // Special case #1: Some uses come with a suggested header already picked.
+ if (use.has_suggested_header()) {
+ desired_headers.insert(use.suggested_header());
+ continue;
+ }
+ // Special case #2: if the dfn-file maps to the use-file, then
+ // this is a file that the use-file is re-exporting symbols for,
+ // and we should keep the #include as-is.
+ const string use_file = ConvertToQuotedInclude(GetFilePath(use.use_loc()));
+ if (use.PublicHeadersContain(use_file)) {
+ use.set_suggested_header(ConvertToQuotedInclude(use.decl_filepath()));
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("private header", use);
+ } else if (use.public_headers().size() == 1) {
+ use.set_suggested_header(use.public_headers()[0]);
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("only candidate", use);
+ }
+ }
+
+ // Steps (2): Go through the needed private-includes that map to
+ // more than one public #include. First choice: an include in
+ // associated_direct_includes (those are includes that are not going
+ // away, since we can't change associated files). Second choice,
+ // includes in direct_includes that are also already in
+ // desired_headers. Third choice, includes in desired_headers.
+ // Fourth choice, includes in direct_includes. Picking in
+ // this order minimizes the number of #includes we add, while
+ // allowing us to remove #includes if need be.
+ for (OneUse& use : *uses) {
+ if (!use.NeedsSuggestedHeader())
+ continue;
+ const vector<string>& public_headers = use.public_headers();
+ // TODO(csilvers): write ElementInBoth() in iwyu_stl_util.h
+ for (const string& choice : public_headers) {
+ if (use.has_suggested_header())
+ break;
+ if (ContainsKey(associated_direct_includes, choice)) {
+ use.set_suggested_header(choice);
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("in associated header", use);
+ }
+ }
+ for (const string& choice : public_headers) {
+ if (use.has_suggested_header())
+ break;
+ if (ContainsKey(direct_includes, choice) &&
+ ContainsKey(desired_headers, choice)) {
+ use.set_suggested_header(choice);
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("#include already present and needed", use);
+ }
+ }
+ for (const string& choice : public_headers) {
+ if (use.has_suggested_header())
+ break;
+ if (ContainsKey(desired_headers, choice)) {
+ use.set_suggested_header(choice);
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("#include already needed", use);
+ }
+ }
+ for (const string& choice : public_headers) {
+ if (use.has_suggested_header())
+ break;
+ if (ContainsKey(direct_includes, choice)) {
+ use.set_suggested_header(choice);
+ desired_headers.insert(use.suggested_header());
+ LogIncludeMapping("#include already present", use);
+ }
+ }
+ }
+
+ // Step (3): Now we have a set-cover problem: we need to end up with
+ // a set of headers, called cover, so that for every i:
+ // intersection(cover, public_headers[i]) != empty_set
+ // We do this greedily: we find the header that's listed the most
+ // often. Among those, we prefer the one that's listed first in
+ // public_headers[i] the most often (each list is in approximate
+ // best-fit order). Among those, we choose arbitrarily. We repeat
+ // until we cover all sets.
+ set<OneUse*> unmapped_uses;
+ for (OneUse& use : *uses) {
+ if (use.NeedsSuggestedHeader())
+ unmapped_uses.insert(&use);
+ }
+ while (!unmapped_uses.empty()) {
+ map<string, pair<int,int>> header_counts; // total appearances, 1st's
+ for (OneUse* use : unmapped_uses) {
+ CHECK_(!use->has_suggested_header());
+ const vector<string>& public_headers = use->public_headers();
+ for (const string& choice : public_headers) {
+ if (use->has_suggested_header())
+ break;
+ ++header_counts[choice].first; // increment total count
+ if (choice == use->public_headers()[0])
+ ++header_counts[choice].second; // increment first-in-list count
+ }
+ }
+ pair<string, pair<int, int>> best = *header_counts.begin();
+ for (const auto& header_count : header_counts) {
+ // Use pair<>'s operator> to order for us.
+ if (header_count.second > best.second)
+ best = header_count;
+ }
+ const string hdr = best.first;
+ desired_headers.insert(hdr);
+
+ // Now go through and assign to symbols satisfied by this header.
+ for (set<OneUse*>::iterator it = unmapped_uses.begin();
+ it != unmapped_uses.end(); ) {
+ if ((*it)->NeedsSuggestedHeader() && (*it)->PublicHeadersContain(hdr)) {
+ (*it)->set_suggested_header(hdr);
+ LogIncludeMapping("set cover", *(*it));
+ // set<> has nice property that erasing doesn't invalidate iterators.
+ unmapped_uses.erase(it++); // because we just mapped it!
+ } else {
+ ++it;
+ }
+ }
+ }
+ return desired_headers;
+}
+
+// Calculating iwyu violations is a multi-step process. The basic
+// idea is we trim the existing uses to ones that might plausibly be
+// iwyu violations, for both forward-declares (A) and full uses (B).
+// Then we calculate the desired (end-result) set of #includes (C).
+// After that we can do suggested trimming, with knowledge of all
+// #includes, to reduce to full-use (D) and forward-declare uses (E)
+// that are actually iwyu violations.
+//
+// Trimming forward-declare uses (1st pass):
+// A1) If not a class or a templated class, recategorize as a full use.
+// A2) If a templated class with default template params, recategorize
+// as a full use (forward-declaring in that case is too error-prone).
+// A3) If a symbol in std, __gnu_cxx, or another system namespace,
+// recategorize as a full use. This is entirely a policy
+// decision: we've decided never to forward-declare anything in
+// a system namespace, because it's best not to expose the internals
+// of system headers in user code, if possible.
+// A4) If the file containing the use has a pragma inhibiting the forward
+// declaration of the symbol, change the use to a full info use in order
+// to make sure that the compiler can see some declaration of the symbol.
+// A5) If a nested class, discard this use (the parent class declaration
+// is sufficient).
+// A6) If any of the redeclarations of this declaration is in the same
+// file as the use (and before it), and is actually a definition,
+// discard the forward-declare use.
+
+// Trimming symbol uses (1st pass):
+// B1) If the definition of a full use comes after the use, change the
+// full use to a forward-declare use that points to a fwd-decl
+// that comes before the use. (This is for cases like typedefs
+// where iwyu demands a full use but the language allows a
+// forward-declare.)
+// B2) Discard symbol uses of a symbol defined in the same file it's used.
+// If the symbol is an enum, typedef, function, or var -- every decl
+// that is re-declarable except for RecordDecl -- discard if *any*
+// declaration is in the same file as the use.
+// B3) Discard symbol uses for builtin symbols ('__builtin_memcmp') and
+// for operator new and operator delete (excluding placement new),
+// which are effectively built-in even though they're in <new>.
+// B4) Discard symbol uses for member functions that live in the same
+// file as the class they're part of (the parent check suffices).
+// B5) Sanity check: Discard 'backwards' #includes. These are
+// #includes where we say a.h should #include b.h, but b.h is
+// already #including a.h. This happens when iwyu attributes a
+// use to the wrong file.
+// B6) In --transitive_includes_only mode, discard 'new' #includes.
+// These are #includes where we say a.h should #include b.h, but
+// a.h does not see b.h in its transitive #includes. (Note: This
+// happens before include-picker mapping, so it's still possible to
+// see 'new' includes via a manual mapping.)
+// B1') Discard macro uses in the same file as the definition (B2 redux).
+// B2') Discard macro uses that form a 'backwards' #include (B5 redux).
+// B3') Discard macro uses from a 'new' #include (B6 redux).
+
+// Determining 'desired' #includes:
+// C1) Get a list of 'effective' direct includes. For most files, it's
+// the same as the actual direct includes, but for the main .cc
+// file it also gets 'free' includes from its associated .h files.
+// C2) For each symbol-use, calculate the set of public header files that
+// 'provide' that symbol (e.g. <stddef.h> and <stdlib.h> for NULL).
+// C3) Find the minimal 'set cover' over these sets: find a "add-minimal"
+// collection of files that has overlap with every set from (1).
+// "Add-minimal" means that the collection should have as few
+// files in it as possible *that we are not already #including*.
+// C4) Sanity check: remove any .cc files from desired-includes unless
+// they're already in actual-includes.
+//
+// Calculate IWYU violations for forward-declares:
+// D1) If the definition of the forward-declaration lives in a desired
+// include, or any redecl lives in the current file (and earlier
+// in the file), reassign decl_ to point to that redecl; if the
+// decl is not in the current file, mark the filename the decl
+// comes from.
+// D2) If the definition is not in current includes, and no redecl is
+// in the current file (and earlier in the file), mark as an iwyu
+// violation.
+//
+// Calculate IWYU violations for full uses:
+// E1) Sanity check: ignore the use if it would require adding an
+// #include of a .cc file.
+// E2) If the desired include-file for this symbols is not in the
+// current includes, mark as an iwyu violation.
+
+void ProcessForwardDeclare(OneUse* use,
+ const IwyuPreprocessorInfo* preprocessor_info) {
+ CHECK_(use->decl() && "Must call ProcessForwardDeclare on a decl");
+ CHECK_(!use->is_full_use() && "Must call ProcessForwardDeclare on fwd-decl");
+ if (use->ignore_use()) // we're already ignoring it
+ return;
+
+ // (A1) If not a class or a templated class, recategorize as a full use.
+ if (!DeclCanBeForwardDeclared(use->decl())) {
+ VERRS(6) << "Moving " << use->symbol_name()
+ << " from fwd-decl use to full use: not a class"
+ << " (" << use->PrintableUseLoc() << ")\n";
+ use->set_full_use();
+ return;
+ }
+ // This is useful for the subsequent tests -- let's normalize some types.
+ const RecordDecl* record_decl = DynCastFrom(use->decl());
+ const ClassTemplateDecl* tpl_decl = DynCastFrom(use->decl());
+ const ClassTemplateSpecializationDecl* spec_decl = DynCastFrom(use->decl());
+ if (spec_decl)
+ tpl_decl = spec_decl->getSpecializedTemplate();
+ if (tpl_decl)
+ record_decl = tpl_decl->getTemplatedDecl();
+
+ // (A2) If it has default template parameters, recategorize as a full use.
+ // Suppress this if there's no definition for this class (so can't full-use).
+ if (tpl_decl && HasDefaultTemplateParameters(tpl_decl) &&
+ GetDefinitionForClass(tpl_decl) != nullptr) {
+ VERRS(6) << "Moving " << use->symbol_name()
+ << " from fwd-decl use to full use: has default template param"
+ << " (" << use->PrintableUseLoc() << ")\n";
+ use->set_full_use();
+ // No return here: (A4) or (A5) may cause us to ignore this decl entirely.
+ }
+
+ // (A3) If it is in namespace std or a system ns, recategorize as a full use.
+ // We can add new system namespaces here as needed.
+ // TODO(csilvers): if someone has specialized a class in std, the
+ // specialization should be treated as in user-space and
+ // forward-declarable. Check for that case.
+ if (StartsWith(use->symbol_name(), "std::") ||
+ StartsWith(use->symbol_name(), "__gnu_cxx::")) {
+ VERRS(6) << "Moving " << use->symbol_name()
+ << " from fwd-decl use to full use: in a system namespace "
+ << " (" << use->PrintableUseLoc() << ")\n";
+ use->set_full_use();
+ // No return here: (A4) or (A5) may cause us to ignore this decl entirely.
+ }
+
+ // (A4) If the file containing the use has a pragma inhibiting the forward
+ // declaration of the symbol, change the use to a full info use in order
+ // to make sure that the compiler can see some declaration of the symbol.
+ if (!use->is_full_use()) {
+ if (preprocessor_info->ForwardDeclareIsInhibited(
+ GetFileEntry(use->use_loc()), use->symbol_name())) {
+ VERRS(6) << "Changing fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc()
+ << ") to a full-info use: no_forward_declare pragma\n";
+ use->set_full_use();
+ }
+ }
+
+ // (A5) If using a nested class, discard this use.
+ if (IsNestedClass(record_decl)) {
+ // iwyu will require the full type of the parent class when it
+ // recurses on the qualifier (any use of Foo::Bar requires the
+ // full type of Foo). So if we're forward-declared inside Foo,
+ // the user will get that forward-declaration for free when
+ // it gets the full definition of Foo. The one exception is
+ // when the use is itself inside the class, in which case it
+ // sometimes needs the forward-declaration: for instance
+ // class Foo { class Nested; Nested* Fn(); class Nested { ... } };
+ // This exception applies only when the use is in the same class
+ // as the decl; we'll be conservative and apply it whenever
+ // they're in the same file.
+ if (GetFileEntry(use->use_loc()) != GetFileEntry(use->decl())) {
+ VERRS(6) << "Ignoring fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): nested class\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+
+ // (A6) If a definition exists earlier in this file, discard this use.
+ // Note: for the 'earlier' checks, what matters is the *instantiation*
+ // location.
+ const set<const NamedDecl*> redecls = GetClassRedecls(record_decl);
+ for (const NamedDecl* redecl : redecls) {
+ CHECK_(isa<RecordDecl>(redecl) &&
+ "GetClassRedecls has redecls of wrong type");
+ const SourceLocation defined_loc = GetLocation(redecl);
+ if (cast<RecordDecl>(redecl)->isCompleteDefinition() &&
+ DeclIsVisibleToUseInSameFile(redecl, *use)) {
+ VERRS(6) << "Ignoring fwd-decl use of " << use->symbol_name() << " ("
+ << use->PrintableUseLoc()
+ << "): dfn is present: " << PrintableLoc(defined_loc) << "\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+}
+
+void ProcessFullUse(OneUse* use,
+ const IwyuPreprocessorInfo* preprocessor_info) {
+ CHECK_(use->decl() && "Must call ProcessFullUse on a decl");
+ CHECK_(use->is_full_use() && "Must not call ProcessFullUse on fwd-decl");
+ if (use->ignore_use()) // we're already ignoring it
+ return;
+
+ // (B1) If the definition is after the use, re-point to a prior decl.
+ // If iwyu followed the language precisely, this wouldn't be
+ // necessary: code wouldn't compile if a full-use didn't have the
+ // definition handy yet. But in fact, iwyu sometimes requires a full
+ // type when the language doesn't, notably with typedefs. For code
+ // like 'struct f; typedef f g; struct f {};', iwyu will say the
+ // typedef requires a definition of f, and as a result will say the
+ // forward-decl is unnecessary (who cares about forward-decls when
+ // we need a definition?), when in fact it's crucial.
+ // For now, we assume a 'later' usage must be in the same file.
+ if (GetFileEntry(use->use_loc()) == GetFileEntry(use->decl()) &&
+ !DeclIsVisibleToUseInSameFile(use->decl(), *use) &&
+ DeclCanBeForwardDeclared(use->decl())) {
+ if (preprocessor_info->ForwardDeclareIsInhibited(
+ GetFileEntry(use->use_loc()), use->symbol_name())) {
+ // There is no include we could recommend for any full use, so just
+ // ignore the use.
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << ": definition found later in file"
+ << " and no_forward_declare pragma present("
+ << use->PrintableUseLoc() << ")\n";
+ use->set_ignore_use();
+ return;
+ }
+ // Just change us to a forward-declare use. Later, we'll decide
+ // which forward-declare is the best one to keep.
+ VERRS(6) << "Moving " << use->symbol_name()
+ << " from full use to fwd-decl: definition found later in file"
+ << " (" << use->PrintableUseLoc() << ")\n";
+ use->set_forward_declare_use();
+ return;
+ }
+
+ // (B2) Discard symbol uses of a symbol defined in the same file it's used.
+ // If the symbol can be declared in multiple places, we count it if
+ // *any* declaration is in the same file, unless the symbol is a
+ // class. (Every other kind of redeclarable symbol, such as
+ // functions, have the property that a decl is the same as a
+ // definition from iwyu's point of view.) We don't bother with
+ // RedeclarableTemplate<> types (FunctionTemplateDecl), since for
+ // those types, iwyu *does* care about the definition vs declaration.
+ set<const NamedDecl*> all_redecls;
+ if (isa<RecordDecl>(use->decl()) || isa<ClassTemplateDecl>(use->decl()))
+ all_redecls.insert(use->decl()); // for classes, just consider the dfn
+ else
+ all_redecls = GetNonclassRedecls(use->decl());
+ for (const NamedDecl* redecl : all_redecls) {
+ if (DeclIsVisibleToUseInSameFile(redecl, *use)) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): definition is present: "
+ << PrintableLoc(GetLocation(use->decl())) << "\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+
+ // (B3) Discard symbol uses for builtin symbols, including new/delete.
+ // TODO(csilvers): we could use getBuiltinID(), but it returns
+ // non-zero for things like malloc. Figure out how to use it.
+ if (const FunctionDecl* fn_decl = DynCastFrom(use->decl())) {
+ if (StartsWith(use->symbol_name(), "__builtin_")) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): built-in function\n";
+ use->set_ignore_use();
+ return;
+ }
+ const string dfn_file = GetFilePath(fn_decl);
+ if (IsDefaultNewOrDelete(fn_decl, ConvertToQuotedInclude(dfn_file))) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): built-in new/delete\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+
+ // (B4) Discard symbol uses for member functions in the same file as parent.
+ if (const CXXMethodDecl* method_dfn = DynCastFrom(use->decl())) {
+ // See if we also recorded a use of the parent.
+ const NamedDecl* parent_dfn
+ = GetDefinitionAsWritten(method_dfn->getParent());
+
+ const FileEntry* decl_file_entry = GetFileEntry(use->decl_loc());
+ const FileEntry* parent_file_entry =
+ GetFileEntry(GetInstantiationLoc(GetLocation(parent_dfn)));
+
+ // We want to map the definition-files to their public headers if
+ // they're private headers (so bits/stl_vector.h and
+ // bits/vector.tcc are counted as the "same" file for this test).
+ // To be safe, we only do the mapping if both files have at most
+ // one public file they map to (otherwise we don't know which
+ // mapping to choose, and it's important we use the one that iwyu
+ // will pick later). TODO(csilvers): figure out that case too.
+ const IncludePicker& picker = GlobalIncludePicker();
+ const vector<string>& method_dfn_files =
+ picker.GetCandidateHeadersForFilepath(GetFilePath(decl_file_entry));
+ const vector<string>& parent_dfn_files =
+ picker.GetCandidateHeadersForFilepath(GetFilePath(parent_file_entry));
+ bool same_file;
+ if (method_dfn_files.size() == 1 && parent_dfn_files.size() == 1) {
+ same_file = (method_dfn_files[0] == parent_dfn_files[0]);
+ } else {
+ // Fall back on just checking the filenames: can't figure out public.
+ same_file = (decl_file_entry == parent_file_entry);
+ }
+ if (same_file) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): member of class\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+
+ // (B5) Discard uses of symbols that form a 'backwards' #include.
+ // This means that we say a.h is using a symbol in b.h, but b.h
+ // already #includes a.h (either directly or indirectly). Since the
+ // include graph should be acyclic, this means that iwyu messed up,
+ // either by incorrectly saying it was a.h that is using the symbol
+ // (this can happen trying to figure out who 'owns' macro code), or
+ // by incorrectly saying it was a use (this can happen with typedefs
+ // -- we say the underlying type is 'used' in a different way than
+ // the language requires).
+ // TODO(csilvers): remove this when we resolve the bugs with macros/typedefs.
+ if (preprocessor_info->FileTransitivelyIncludes(
+ GetFileEntry(use->decl()), GetFileEntry(use->use_loc()))) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): 'backwards' #include\n";
+ use->set_ignore_use();
+ return;
+ }
+
+ // (B6) In --transitive_includes_only mode, discard 'new' #includes.
+ // In practice, if we tell a.h to add an #include that is not in its
+ // transitive includes, it's usually (but not always) an iwyu error
+ // of some sort. So we allow a flag to discard such recommendations.
+ if (GlobalFlags().transitive_includes_only) {
+ if (!preprocessor_info->FileTransitivelyIncludes(
+ GetFileEntry(use->use_loc()), GetFileEntry(use->decl()))) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "):"
+ << " non-transitive #include\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+}
+
+void ProcessSymbolUse(OneUse* use,
+ const IwyuPreprocessorInfo* preprocessor_info) {
+ if (use->ignore_use()) // we're already ignoring it
+ return;
+
+ const FileEntry* use_file = GetFileEntry(use->use_loc());
+ const string quoted_decl_file = ConvertToQuotedInclude(use->decl_filepath());
+
+ // (B1') Like (B2), discard symbol uses in the same file as their definition.
+ if (GetFilePath(use->use_loc()) == use->decl_filepath()) {
+ VERRS(6) << "Ignoring symbol use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): defined in same file\n";
+ use->set_ignore_use();
+ return;
+ }
+
+ // (B2') Like (B5), discard uses of symbols that create 'backwards' includes.
+ // Note we suppress this check if suggested_header_ is already set:
+ // that only happens with hard-coded uses, which we shouldn't second guess.
+ // TODO(csilvers): like (B5), remove this when we have 'soft' uses.
+ if (!use->has_suggested_header() &&
+ preprocessor_info->FileTransitivelyIncludes(quoted_decl_file, use_file)) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): 'backwards' #include\n";
+ use->set_ignore_use();
+ return;
+ }
+
+ // (B3') Like (B6), discard uses of symbols that create 'new' includes.
+ if (GlobalFlags().transitive_includes_only) {
+ if (!use->has_suggested_header() &&
+ !preprocessor_info->FileTransitivelyIncludes(use_file,
+ quoted_decl_file)) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "):"
+ << " non-transitive #include\n";
+ use->set_ignore_use();
+ return;
+ }
+ }
+}
+
+void CalculateIwyuForForwardDeclareUse(
+ OneUse* use,
+ const set<string>& actual_includes,
+ const set<string>& desired_includes,
+ const set<const FileEntry*>& associated_includes) {
+ CHECK_(!use->ignore_use() && "Trying to calculate on an ignored use");
+ CHECK_(use->decl() && "CalculateIwyuForForwardDeclareUse takes a fwd-decl");
+ CHECK_(!use->is_full_use() && "ForwardDeclareUse are not full uses");
+
+ const NamedDecl* same_file_decl = nullptr;
+ const RecordDecl* record_decl = DynCastFrom(use->decl());
+ const ClassTemplateDecl* tpl_decl = DynCastFrom(use->decl());
+ const ClassTemplateSpecializationDecl* spec_decl = DynCastFrom(use->decl());
+ if (spec_decl)
+ tpl_decl = spec_decl->getSpecializedTemplate();
+ if (tpl_decl)
+ record_decl = tpl_decl->getTemplatedDecl();
+ CHECK_(record_decl && "Non-records should have been handled already");
+
+ // If this record is defined in one of the desired_includes, mark that
+ // fact. Also if it's defined in one of the actual_includes.
+ const NamedDecl* dfn = GetDefinitionForClass(use->decl());
+ // If we are, ourselves, a template specialization, then the definition
+ // we use is not the definition of the specialization (that's us), but
+ // the definition of the template we're specializing.
+ if (spec_decl && dfn == spec_decl)
+ dfn = GetDefinitionForClass(spec_decl->getSpecializedTemplate());
+ bool dfn_is_in_desired_includes = false;
+ bool dfn_is_in_actual_includes = false;
+ if (dfn) {
+ vector<string> headers
+ = GlobalIncludePicker().GetCandidateHeadersForFilepathIncludedFrom(
+ GetFilePath(dfn), GetFilePath(use->use_loc()));
+ for (const string& header : headers) {
+ if (ContainsKey(desired_includes, header))
+ dfn_is_in_desired_includes = true;
+ if (ContainsKey(actual_includes, header))
+ dfn_is_in_actual_includes = true;
+ }
+ // We ourself are always a 'desired' and 'actual' include (though
+ // only if the definition is visible from the use location).
+ if (DeclIsVisibleToUseInSameFile(dfn, *use)) {
+ dfn_is_in_desired_includes = true;
+ dfn_is_in_actual_includes = true;
+ }
+ }
+
+ // We also want to know if *any* redecl of this record is defined
+ // in the same file as the use (and before it).
+ const set<const NamedDecl*>& redecls = GetClassRedecls(record_decl);
+ for (const NamedDecl* redecl : redecls) {
+ if (DeclIsVisibleToUseInSameFile(redecl, *use)) {
+ same_file_decl = redecl;
+ break;
+ }
+ }
+ // If there's no redecl in the .cc file, we'll accept a redecl in
+ // an associated .h file. Since associated .h files are always
+ // desired includes, we don't need to check for that.
+ if (!same_file_decl) {
+ for (const NamedDecl* redecl : redecls) {
+ if (ContainsKey(associated_includes, GetFileEntry(redecl))) {
+ same_file_decl = redecl;
+ break;
+ }
+ }
+ }
+
+ // (D1) Mark that the fwd-declare is satisfied by dfn in desired include.
+ const NamedDecl* providing_decl = nullptr;
+ if (dfn_is_in_desired_includes) {
+ providing_decl = dfn;
+ VERRS(6) << "Noting fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << ") is satisfied by dfn in "
+ << PrintableLoc(GetLocation(providing_decl)) << "\n";
+ // Mark that this use is another reason we want this header.
+ const string file = GetFilePath(dfn);
+ const string quoted_hdr = ConvertToQuotedInclude(file);
+ use->set_suggested_header(quoted_hdr);
+ } else if (same_file_decl) {
+ providing_decl = same_file_decl;
+ VERRS(6) << "Noting fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << ") is declared at "
+ << PrintableLoc(GetLocation(providing_decl)) << "\n";
+ // If same_file_decl is actually in an associated .h, mark our use
+ // of that. No need to map-to-public for associated .h files.
+ if (GetFileEntry(same_file_decl) != GetFileEntry(use->use_loc()))
+ use->set_suggested_header(GetFilePath(same_file_decl));
+ }
+ if (providing_decl) {
+ // Change decl_ to point to this "better" redecl.
+ use->reset_decl(providing_decl);
+ }
+
+ // Be sure to store as a TemplateClassDecl if we're a templated
+ // class.
+ if (const ClassTemplateSpecializationDecl* spec_decl
+ = DynCastFrom(use->decl())) {
+ use->reset_decl(spec_decl->getSpecializedTemplate());
+ } else if (const CXXRecordDecl* cxx_decl = DynCastFrom(use->decl())) {
+ if (cxx_decl->getDescribedClassTemplate())
+ use->reset_decl(cxx_decl->getDescribedClassTemplate());
+ }
+
+ // (D2) Mark iwyu violation unless defined in a current #include.
+ if (dfn_is_in_actual_includes) {
+ VERRS(6) << "Ignoring fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): have definition at "
+ << PrintableLoc(GetLocation(dfn)) << "\n";
+ } else if (same_file_decl) {
+ VERRS(6) << "Ignoring fwd-decl use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): have earlier fwd-decl at "
+ << PrintableLoc(GetLocation(same_file_decl)) << "\n";
+ } else {
+ use->set_is_iwyu_violation();
+ }
+}
+
+void CalculateIwyuForFullUse(OneUse* use,
+ const set<string>& actual_includes,
+ const set<string>& desired_includes) {
+ CHECK_(!use->ignore_use() && "Trying to calculate on an ignored use");
+ CHECK_(use->is_full_use() && "CalculateIwyuForFullUse requires a full use");
+ CHECK_(use->has_suggested_header() && "All full uses must have a header");
+
+ // (E1) Discard uses of a symbol declared in a .cc and used
+ // elsewhere. Unless that 'elsewhere' is #including the .cc file,
+ // then something is wrong: we're using a symbol from a file we
+ // can't possibly be #including. There are several ways this could
+ // happen:
+ // (1)
+ // foo.h: #ifdef FOO ...
+ // foo-inl.cc: #define FOO
+ // foo.cc: #include "foo-inl.cc"
+ // #include "foo.h" // foo.h 'uses' FOO from foo-inl.cc
+ // (Though this is arguably a bug in iwyu, and FOO should be treated as
+ // a 'soft' use here; see comments in iwyu_preprocessor.cc:ReportMacroUse.)
+ // (2)
+ // foo.h: #define DEFINE_CLASS(classname) <backslash>
+ // struct classname { classname() { Init(); } void Init() {} }
+ // foo.cc: DEFINE_CLASS(Foo);
+ // iwyu will say "Init() is a member function, so say we need the
+ // full type information of the method's class." The method's class
+ // is Foo, which iwyu correctly declares lives in foo.cc. But
+ // iwyu also correctly says that Init() lives in foo.h (Except for
+ // the macro arguments, macro code belongs to the macro definer,
+ // not to every macro caller). Put those together, though, and
+ // iwyu says foo.h needs to #include foo.cc.
+ // TODO(csilvers): it's probably more correct to check if
+ // suggested_header() is in the transitive closure of actual_includes.
+ // TODO(csilvers): this could cause breakage for code like this:
+ // x.cc: class X {};
+ // y.h: #include "x.cc"
+ // z.cc: #include "y.h"; X x;
+ // iwyu will say 'replace the #include of y.h with an #include of
+ // x.cc,' which the code below will then strip. The end result is
+ // z.cc will not #include anything, and will fail to compile.
+ if (!IsHeaderFile(use->suggested_header()) &&
+ !ContainsKey(actual_includes, use->suggested_header())) {
+ VERRS(6) << "Ignoring use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): #including .cc\n";
+ use->set_ignore_use();
+ return;
+ }
+
+ // (E2) Mark iwyu violation unless in a current #include.
+ if (ContainsKey(actual_includes, use->suggested_header())) {
+ VERRS(6) << "Ignoring full use of " << use->symbol_name()
+ << " (" << use->PrintableUseLoc() << "): #including dfn from "
+ << use->suggested_header() << "\n";
+ } else {
+ use->set_is_iwyu_violation();
+ }
+}
+
+} // namespace internal
+
+void IwyuFileInfo::CalculateIwyuViolations(vector<OneUse>* uses) {
+ VERRS(6) << "--- Calculating IWYU violations for "
+ << GetFilePath(file_) << " ---\n";
+
+ // We have to do the steps in order, because a forward-declare use may
+ // turn into a full use, and need to be processed in the full-use step
+ // too.
+ for (OneUse& use : *uses) {
+ if (!use.is_full_use() && use.decl())
+ internal::ProcessForwardDeclare(&use, preprocessor_info_);
+ }
+ for (OneUse& use : *uses) {
+ if (use.is_full_use() && use.decl())
+ internal::ProcessFullUse(&use, preprocessor_info_);
+ }
+ for (OneUse& use : *uses) {
+ if (use.is_full_use() && !use.decl())
+ internal::ProcessSymbolUse(&use, preprocessor_info_);
+ }
+
+ // (C1) Compute the direct includes of 'associated' files.
+ set<string> associated_direct_includes;
+ for (const IwyuFileInfo* associated : associated_headers_) {
+ ReportIncludeFileUse(associated->file_, associated->quoted_file_);
+ InsertAllInto(associated->direct_includes(), &associated_direct_includes);
+ }
+ // The 'effective' direct includes are defined to be the current
+ // includes of associated, plus us. This is only used to decide
+ // when to give iwyu warnings.
+ const set<string> effective_direct_includes
+ = Union(associated_direct_includes, direct_includes());
+
+ // (C2) + (C3) Find the minimal 'set cover' for all symbol uses.
+ const set<string>& desired_set_cover = internal::CalculateMinimalIncludes(
+ direct_includes(), associated_direct_includes, uses);
+
+ // (C4) Remove .cc files from desired-includes unless they're in actual-inc.
+ for (const string& header_name : desired_set_cover) {
+ if (IsHeaderFile(header_name) ||
+ ContainsKey(direct_includes(), header_name))
+ desired_includes_.insert(header_name);
+ }
+ desired_includes_have_been_calculated_ = true;
+
+ // The 'effective' desired includes are defined to be the desired
+ // includes of associated, plus us. These are used to decide if a
+ // particular use will be satisfied after fixing the #includes.
+ // NOTE: this depends on our associated headers having had their
+ // iwyu analysis done before us.
+ set<string> effective_desired_includes = desired_includes();
+ InsertAllInto(AssociatedDesiredIncludes(), &effective_desired_includes);
+
+ // Now that we've figured out desired_includes, figure out iwyu violations.
+ for (OneUse& use : *uses) {
+ if (use.ignore_use()) {
+ // Do nothing, we're ignoring the use
+ } else if (!use.is_full_use()) {
+ internal::CalculateIwyuForForwardDeclareUse(
+ &use, effective_direct_includes, effective_desired_includes,
+ AssociatedFileEntries());
+ } else {
+ internal::CalculateIwyuForFullUse(
+ &use, effective_direct_includes, effective_desired_includes);
+ }
+ }
+}
+
+static string GetWarningMsg(const OneUse& use) {
+ const SourceLocation spelling_loc = GetSpellingLoc(use.use_loc());
+ const SourceLocation instantiation_loc = GetInstantiationLoc(use.use_loc());
+ string warning = PrintableLoc(spelling_loc) + ": warning: ";
+ if (use.is_full_use()) {
+ warning += (use.symbol_name() + " is defined in " + use.suggested_header()
+ + ", which isn't directly #included");
+ } else {
+ warning += (use.symbol_name() + " needs a declaration"
+ + ", but does not provide or directly #include one");
+ }
+ if (!use.comment().empty()) {
+ warning += " " + use.comment();
+ }
+ warning += ".\n";
+ if (instantiation_loc != spelling_loc) {
+ // Only set/print this if it's different from the spelling location.
+ warning += PrintableLoc(instantiation_loc) + ": note: used here.\n";
+ }
+ return warning;
+}
+
+int IwyuFileInfo::EmitWarningMessages(const vector<OneUse>& uses) {
+ set<pair<int, string>> iwyu_warnings; // line-number, warning-msg.
+ for (const OneUse& use : uses) {
+ if (use.is_iwyu_violation())
+ iwyu_warnings.insert(make_pair(use.UseLinenum(), GetWarningMsg(use)));
+ }
+ // Nice that set<> automatically sorts things for us!
+ for (const pair<int, string>& warning : iwyu_warnings) {
+ if (ShouldPrint(3)) {
+ errs() << warning.second;
+ } else if (ShouldPrint(2)) {
+ // TODO(csilvers): print one warning per sym per file.
+ }
+ }
+ return iwyu_warnings.size();
+}
+
+namespace internal {
+
+template <class IncludeOrFwdDecl>
+bool Contains(const vector<OneIncludeOrForwardDeclareLine>& lines,
+ const IncludeOrFwdDecl& item) {
+ return std::any_of(lines.begin(), lines.end(),
+ [&](const OneIncludeOrForwardDeclareLine& line) {
+ return line.matches(item);
+ });
+}
+
+template <class ContainerType>
+void ClearDesiredForSurplusIncludesOrForwardDeclares(ContainerType& container) {
+ // Traverse multimap key by key.
+ for (typename ContainerType::iterator k = container.begin();
+ k != container.end(); k = container.upper_bound(k->first)) {
+ // For each key, mark all but the first value as undesirable.
+ typename ContainerType::iterator v = ++container.lower_bound(k->first);
+ typename ContainerType::iterator vend = container.upper_bound(k->first);
+ for (; v != vend; ++v) {
+ v->second->clear_desired();
+ }
+ }
+}
+
+void CalculateDesiredIncludesAndForwardDeclares(
+ const vector<OneUse>& uses,
+ const set<string>& associated_desired_includes,
+ const set<const FileEntry*>& kept_includes,
+ vector<OneIncludeOrForwardDeclareLine>* lines) {
+ // First make sure all uses' includes and fwd decls are reflected in lines.
+ for (const OneUse& use : uses) {
+ if (use.ignore_use())
+ continue;
+
+ if (use.is_full_use()) {
+ CHECK_(use.has_suggested_header() && "Full uses should have #includes");
+ if (!Contains(*lines, use.suggested_header())) { // must be added
+ lines->push_back(OneIncludeOrForwardDeclareLine(
+ use.decl_file(), use.suggested_header(), -1));
+ }
+ } else if (!use.has_suggested_header()) {
+ // Forward-declare uses that are already satisfied by an #include
+ // have that as their suggested_header. For the rest, we need to
+ // make sure there's a forward-declare in the current file.
+ if (!Contains(*lines, use.decl())) { // must be added
+ // The OneIncludeOrForwardDeclareLine ctor sets up line
+ // numbers, but they're for some other file! Clear them.
+ lines->push_back(OneIncludeOrForwardDeclareLine(use.decl()));
+ lines->back().clear_line_numbers();
+ }
+ }
+ }
+
+ // From this point on, lines is stable and we can refer to its
+ // OneIncludeOrForwardDeclareLine objects by pointer.
+
+ // We'll want to be able to map from an include or fwd-declare to the
+ // lines where we found them. There can be multiple includes or fwd-declares
+ // providing the same symbol, so use multimaps for these reverse lookups.
+ typedef multimap<string, OneIncludeOrForwardDeclareLine*> IncludeMap;
+ typedef multimap<const NamedDecl*, OneIncludeOrForwardDeclareLine*>
+ FwdDeclMap;
+
+ IncludeMap include_map;
+ FwdDeclMap fwd_decl_map;
+ for (OneIncludeOrForwardDeclareLine& line : *lines) {
+ if (line.IsIncludeLine())
+ include_map.insert(std::make_pair(line.quoted_include(), &line));
+ else
+ fwd_decl_map.insert(std::make_pair(line.fwd_decl(), &line));
+ }
+
+ // Now run over all full uses and mark used includes as desired.
+ for (const OneUse& use : uses) {
+ if (use.ignore_use())
+ continue;
+
+ if (use.is_full_use()) {
+ // Full uses need a proper include, so mark all corresponding include
+ // lines as desired.
+ auto range = include_map.equal_range(use.suggested_header());
+ for (auto it = range.first; it != range.second; ++it) {
+ it->second->set_desired();
+ it->second->AddSymbolUse(use.short_symbol_name());
+ }
+ }
+ }
+
+ // Mark forward-decl uses. We need to do this in a separate pass because
+ // we need to be sure include_map is fully populated -- we don't want
+ // to bother with a "(ptr only)" use if there's already a full use.
+ for (const OneUse& use : uses) {
+ if (use.ignore_use() || use.is_full_use())
+ continue;
+
+ if (!use.has_suggested_header()) {
+ // A forward-declare for a use where there is no suggested header to
+ // provide the symbol is very much desired.
+ auto range = fwd_decl_map.equal_range(use.decl());
+ for (auto it = range.first; it != range.second; ++it) {
+ it->second->set_desired();
+ }
+ } else if (ContainsKey(include_map, use.suggested_header())) {
+ // If we satisfy a forward-declare use from a file, let the file
+ // know (this is just for logging).
+ const string symbol_name = use.short_symbol_name();
+
+ auto range = include_map.equal_range(use.suggested_header());
+ for (auto it = range.first; it != range.second; ++it) {
+ if (!it->second->HasSymbolUse(symbol_name))
+ it->second->AddSymbolUse(symbol_name + " (ptr only)");
+ }
+ }
+ }
+
+ // If we #include a .h through an associated file (foo.h) rather
+ // than directly (foo.cc), we don't want to say that .h is desired
+ // -- that will cause us to add it when it's unnecessary. We could
+ // choose to actually *remove* the .h here if it's present, to keep
+ // #includes to a minimum, but for now we just decline to add it.
+ for (OneIncludeOrForwardDeclareLine& line : *lines) {
+ if (line.is_desired() && !line.is_present() && line.IsIncludeLine() &&
+ ContainsKey(associated_desired_includes, line.quoted_include())) {
+ line.clear_desired();
+ }
+ }
+
+ // Clear desired for all duplicates.
+ ClearDesiredForSurplusIncludesOrForwardDeclares(include_map);
+ ClearDesiredForSurplusIncludesOrForwardDeclares(fwd_decl_map);
+
+ // Now reset all files included with "IWYU pragma: keep" as desired.
+ for (OneIncludeOrForwardDeclareLine& line : *lines) {
+ if (!line.is_desired() && line.IsIncludeLine() &&
+ ContainsKey(kept_includes, line.included_file())) {
+ line.set_desired();
+ }
+ }
+}
+
+bool IsRemovablePrefixHeader(const FileEntry* file_entry,
+ const IwyuPreprocessorInfo* preprocessor_info) {
+ if (file_entry) {
+ IwyuFileInfo* file_info = preprocessor_info->FileInfoFor(file_entry);
+ if (file_info)
+ return file_info->is_prefix_header() && !file_info->is_pch_in_code();
+ }
+ return false;
+}
+
+void CleanupPrefixHeaderIncludes(
+ const IwyuPreprocessorInfo* preprocessor_info,
+ vector<OneIncludeOrForwardDeclareLine>* lines) {
+ CommandlineFlags::PrefixHeaderIncludePolicy policy =
+ GlobalFlags().prefix_header_include_policy;
+ if (policy == CommandlineFlags::kAdd)
+ return;
+
+ for (OneIncludeOrForwardDeclareLine& line : *lines) {
+ if (!line.is_desired())
+ continue;
+ if (line.is_present() && (policy == CommandlineFlags::kKeep))
+ continue; // Keep present line according to policy.
+
+ const FileEntry* file_entry = nullptr;
+ if (line.IsIncludeLine()) {
+ file_entry = line.included_file();
+ if (!file_entry)
+ file_entry = preprocessor_info->IncludeToFileEntry(
+ line.quoted_include());
+ // At this point it's OK if file_entry is nullptr. It means we've never
+ // seen quoted_include. And that's why it cannot be prefix header.
+ } else {
+ const RecordDecl* dfn = GetDefinitionForClass(line.fwd_decl());
+ file_entry = GetFileEntry(dfn);
+ }
+ if (IsRemovablePrefixHeader(file_entry, preprocessor_info)) {
+ CHECK_(file_entry && "FileEntry should exist to be prefix header");
+ line.clear_desired();
+ VERRS(6) << "Ignoring '" << line.line()
+ << "': is superseded by command line include "
+ << file_entry->getName() << "\n";
+ }
+ }
+}
+
+// Used by GetSymbolsSortedByFrequency().
+class CountGt {
+ public:
+ bool operator()(const pair<string, int>& a,
+ const pair<string, int>& b) const {
+ if (a.second != b.second)
+ return a.second > b.second; // sort by decreasing count
+ return a.first < b.first; // within a count, sort alphabetically
+ }
+};
+
+// Given a map from string to count, creates a vector of the string
+// keys, sorted by decreasing count (highest first), then alphabetically.
+// We also can take a vector of forward-declared symbols used by this
+// file. For all symbols in this vector but not in m, we add them to
+// the end of the output as well, with a "(ptr only)" suffix.
+vector<string> GetSymbolsSortedByFrequency(const map<string, int>& m) {
+ vector<pair<string, int>> count_vector(m.begin(), m.end());
+ sort(count_vector.begin(), count_vector.end(), CountGt());
+
+ vector<string> retval;
+ for (const pair<string, int>& count : count_vector)
+ retval.push_back(count.first);
+ return retval;
+}
+
+OutputLine PrintableIncludeOrForwardDeclareLine(
+ const OneIncludeOrForwardDeclareLine& line,
+ const set<string>& associated_quoted_includes) {
+ // If we don't want any comments, always use the line as-is.
+ if (GlobalFlags().no_comments) {
+ return OutputLine(line.line());
+ }
+
+ // Print the line number where we saw this forward-declare or
+ // #include, as a comment, if we don't have anything better to show.
+ // (For instance, when we want to delete this line.)
+ if (line.symbol_counts().empty() && !line.is_present()) {
+ return OutputLine(line.line()); // if not present, doesn't have a line #
+ }
+ if (line.symbol_counts().empty() || !line.is_desired()) {
+ CHECK_(!StartsWith(line.LineNumberString(), "-"));
+ return OutputLine(line.line() + " // lines " + line.LineNumberString());
+ }
+ // We don't need to explain why foo.cc #includes foo.h
+ if (line.IsIncludeLine() &&
+ ContainsKey(associated_quoted_includes, line.quoted_include())) {
+ return OutputLine(line.line());
+ }
+
+ return OutputLine(line.line(),
+ GetSymbolsSortedByFrequency(line.symbol_counts()));
+}
+
+typedef pair<int, string> LineSortKey;
+
+// The sort key of an include/forward-declare line is an (int, string)
+// pair. The string is always the line itself. The int is a category:
+// 0: PCH in code, 1: associated .h, 2: associated -inl.h, 3: C header,
+// 4: c++ header, 5: other header, 6: forward-declare.
+LineSortKey GetSortKey(const OneIncludeOrForwardDeclareLine& line,
+ const set<string>& associated_quoted_includes,
+ const IwyuFileInfo* file_info) {
+ if (!line.IsIncludeLine())
+ return LineSortKey(6, line.line());
+ if (file_info && file_info->is_pch_in_code())
+ return LineSortKey(0, line.line());
+ if (ContainsKey(associated_quoted_includes, line.quoted_include())) {
+ if (EndsWith(line.quoted_include(), "-inl.h\""))
+ return LineSortKey(2, line.line());
+ return LineSortKey(1, line.line());
+ }
+ if (EndsWith(line.quoted_include(), ".h>"))
+ return LineSortKey(3, line.line());
+ if (EndsWith(line.quoted_include(), ">"))
+ return LineSortKey(4, line.line());
+ return LineSortKey(5, line.line());
+}
+
+// filename is "this" filename: the file being emitted.
+// associated_filepaths are the quoted-include form of associated_headers_.
+size_t PrintableDiffs(const string& filename,
+ const IwyuPreprocessorInfo* preprocessor_info,
+ const set<string>& associated_quoted_includes,
+ const vector<OneIncludeOrForwardDeclareLine>& lines,
+ string* diff_output) {
+ CHECK_(diff_output && "Must provide diff_output");
+
+ string& output = *diff_output;
+ vector<OutputLine> output_lines;
+
+ const set<string>& aqi = associated_quoted_includes; // short alias
+
+ // Sort all the output-lines: system headers before user headers
+ // before forward-declares, etc. The easiest way to do this is to
+ // just put them all in multimap whose key is a sort-order (multimap
+ // because some headers might be listed twice in the source file.)
+ multimap<LineSortKey, const OneIncludeOrForwardDeclareLine*> sorted_lines;
+ for (const OneIncludeOrForwardDeclareLine& line : lines) {
+ const IwyuFileInfo* file_info = nullptr;
+ if (line.IsIncludeLine())
+ file_info = preprocessor_info->FileInfoFor(line.included_file());
+
+ sorted_lines.insert(make_pair(GetSortKey(line, aqi, file_info), &line));
+ }
+
+ // First, check if there are no adds or deletes. If so, we print a
+ // shorter summary line.
+ bool no_adds_or_deletes = true;
+ for (const auto& key_line : sorted_lines) {
+ const OneIncludeOrForwardDeclareLine* line = key_line.second;
+ if ((line->is_desired() && !line->is_present()) || // add
+ (line->is_present() && !line->is_desired())) { // delete
+ no_adds_or_deletes = false;
+ break;
+ }
+ }
+ if (no_adds_or_deletes) {
+ output = "\n(" + filename + " has correct #includes/fwd-decls)\n";
+ return 0;
+ }
+
+ size_t num_edits = 0;
+
+ // First, new desired includes and forward-declares.
+ if (ShouldPrint(1)) {
+ output_lines.push_back(
+ OutputLine("\n" + filename + " should add these lines:"));
+ for (const auto& key_line : sorted_lines) {
+ const OneIncludeOrForwardDeclareLine* line = key_line.second;
+ if (line->is_desired() && !line->is_present()) {
+ output_lines.push_back(
+ PrintableIncludeOrForwardDeclareLine(*line, aqi));
+ ++num_edits;
+ }
+ }
+ }
+
+ // Second, includes and forward-declares that should be removed.
+ if (ShouldPrint(1)) {
+ output_lines.push_back(
+ OutputLine("\n" + filename + " should remove these lines:"));
+ for (const auto& key_line : sorted_lines) {
+ const OneIncludeOrForwardDeclareLine* line = key_line.second;
+ if (line->is_present() && !line->is_desired()) {
+ output_lines.push_back(
+ PrintableIncludeOrForwardDeclareLine(*line, aqi));
+ output_lines.back().add_prefix("- ");
+
+ ++num_edits;
+ }
+ }
+ }
+
+ // Finally, print the final, complete include-and-forward-declare list.
+ if (ShouldPrint(0)) {
+ output_lines.push_back(
+ OutputLine("\nThe full include-list for " + filename + ":"));
+ for (const auto& key_line : sorted_lines) {
+ const OneIncludeOrForwardDeclareLine* line = key_line.second;
+ if (line->is_desired()) {
+ output_lines.push_back(
+ PrintableIncludeOrForwardDeclareLine(*line, aqi));
+ }
+ }
+ }
+
+ // Compute max width of lines with comments so we can align them nicely.
+ // This is not strictly necessary if comments have been disabled,
+ // but it won't have any effect in that case anyway.
+ size_t line_length = 0;
+ size_t max_line_length = GlobalFlags().max_line_length;
+
+ for (const OutputLine& line : output_lines) {
+ // Only consider lines that need alignment.
+ if (line.needs_alignment())
+ line_length = std::max(line.line_length(), line_length);
+ }
+
+ // Align lines and produce final output.
+ for (const OutputLine& line : output_lines) {
+ output += line.printable_line(line_length, max_line_length);
+ output += "\n";
+ }
+
+ // Let's print a helpful separator as well.
+ output += "---\n";
+
+ return num_edits;
+}
+
+} // namespace internal
+
+void IwyuFileInfo::HandlePreprocessingDone() {
+ // Check macros defined by includer. Requires file preprocessing to be
+ // finished to know all direct includes and all macro usages.
+ //
+ // Exclude prefix headers from mapping heuristics. Includes in prefix
+ // headers are kept regardless of their usage in includer. And the entire
+ // include-what-you-use principle isn't really applicable to prefix headers.
+ if (is_prefix_header()) {
+ return;
+ }
+ bool should_report_violations = ShouldReportIWYUViolationsFor(file_);
+ std::list<const FileEntry*> direct_macro_use_includees;
+ std::set_intersection(macro_users_.begin(), macro_users_.end(),
+ direct_includes_as_fileentries_.begin(),
+ direct_includes_as_fileentries_.end(),
+ std::inserter(direct_macro_use_includees,
+ direct_macro_use_includees.end()));
+ for (const FileEntry* macro_use_includee : direct_macro_use_includees) {
+ if (should_report_violations) {
+ ERRSYM(file_) << "Keep #include " << macro_use_includee->getName()
+ << " in " << file_->getName()
+ << " because used macro is defined by includer.\n";
+ ReportKnownDesiredFile(macro_use_includee);
+ } else {
+ string private_include =
+ ConvertToQuotedInclude(GetFilePath(macro_use_includee));
+ if (GlobalIncludePicker().IsPublic(macro_use_includee)) {
+ ERRSYM(file_) << "Skip marking " << quoted_file_
+ << " as public header for " << private_include
+ << " because latter is already marked as public,"
+ << " though uses macro defined by includer.\n";
+ } else {
+ ERRSYM(file_) << "Mark " << quoted_file_
+ << " as public header for " << private_include
+ << " because used macro is defined by includer.\n";
+ MutableGlobalIncludePicker()->AddMapping(private_include, quoted_file_);
+ MutableGlobalIncludePicker()->MarkIncludeAsPrivate(private_include);
+ }
+ }
+ }
+}
+
+void IwyuFileInfo::ResolvePendingAnalysis() {
+ // Resolve using declarations: This handles the case where there's a using
+ // declaration in the file but no code is actually using it. If that
+ // happens, we might try to remove all of the headers with the decls that
+ // the using decl is referencing, which would result in a compilation error
+ // at best. A possible solution is to remove the using decl if it's not
+ // used, but that doesn't work for header files because a using decl in a
+ // header is an exported symbol, so we don't want to do that either. As a
+ // compromise, we arbitrarily add the first shadow decl to make sure
+ // everything still compiles instead of removing the using decl. A more
+ // thorough approach would be to scan the current list of includes that
+ // already name this decl (like in the overloaded function case) and include
+ // one of those so we don't include a file we don't actually need.
+ for (map<const UsingDecl*, bool>::value_type using_decl_status
+ : using_decl_referenced_) {
+ if (!using_decl_status.second) {
+ // There are valid cases where there is no shadow decl, e.g. if a derived
+ // class has a using declaration for a member, but also hides it.
+ // Only report the target if we have a shadow decl.
+ const UsingDecl* using_decl = using_decl_status.first;
+ if (using_decl->shadow_size() > 0) {
+ ReportForwardDeclareUse(using_decl->getUsingLoc(),
+ using_decl->shadow_begin()->getTargetDecl(),
+ /* in_cxx_method_body */ false,
+ "(for un-referenced using)");
+ }
+ }
+ }
+}
+
+size_t IwyuFileInfo::CalculateAndReportIwyuViolations() {
+ // This is used to calculate our own desired includes. That depends
+ // on what our associated files' desired includes are: if we use
+ // bar.h and foo.h is adding it, we don't need to add it ourself.
+ // On the other hand, if foo.h used to have it but is removing it,
+ // we *do* need to add it.
+ set<string> associated_desired_includes = AssociatedDesiredIncludes();
+
+ CalculateIwyuViolations(&symbol_uses_);
+ EmitWarningMessages(symbol_uses_);
+ internal::CalculateDesiredIncludesAndForwardDeclares(
+ symbol_uses_, associated_desired_includes, kept_includes_, &lines_);
+
+ // Remove desired inclusions that have been inhibited by pragma
+ // "no_include".
+ for (OneIncludeOrForwardDeclareLine& line : lines_) {
+ if (line.IsIncludeLine() &&
+ preprocessor_info_->IncludeIsInhibited(file_, line.quoted_include())) {
+ line.clear_desired();
+ }
+ }
+
+ internal::CleanupPrefixHeaderIncludes(preprocessor_info_, &lines_);
+
+ string diff_output;
+ size_t num_edits = internal::PrintableDiffs(
+ GetFilePath(file_), preprocessor_info_, AssociatedQuotedIncludes(),
+ lines_, &diff_output);
+ errs() << diff_output;
+
+ return num_edits;
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_output.h b/iwyu_output.h
new file mode 100644
index 0000000..190a0f6
--- /dev/null
+++ b/iwyu_output.h
@@ -0,0 +1,399 @@
+//===--- iwyu_output.h - output-emitting code for include-what-you-use ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file contains routines to deal with all output emitted by
+// iwyu plug-in. This includes functions to sanitize include-files
+// (though most of the underlying logic is in iwyu_sanitize_filepath),
+// to sanitize symbol names, to emit desired include-lines properly,
+// etc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_OUTPUT_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_OUTPUT_H_
+
+#include <map> // for map
+#include <set> // for set
+#include <string> // for string, operator<
+#include <vector> // for vector
+
+#include "iwyu_stl_util.h"
+#include "port.h" // for CHECK_
+#include "clang/AST/Decl.h"
+#include "clang/Basic/SourceLocation.h"
+
+namespace clang {
+class FileEntry;
+class UsingDecl;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::map;
+using std::pair;
+using std::set;
+using std::string;
+using std::vector;
+
+class IwyuPreprocessorInfo;
+
+// This data structure holds information about a single use. Not all
+// fields will be filled for all uses.
+class OneUse {
+ public:
+ enum UseKind { kFullUse, kForwardDeclareUse };
+
+ OneUse(const clang::NamedDecl* decl,
+ clang::SourceLocation use_loc,
+ UseKind use_kind,
+ bool in_cxx_method_body,
+ const char* comment);
+ // Both dfn_file and dfn_filepath are specified to allow to create OneUse
+ // with dfn_filepath and without dfn_file. For example, in
+ // IwyuBaseAstVisitor::VisitCXXNewExpr we make a guess that placement
+ // operator new is called (which is defined in <new>), but we don't have
+ // <new> FileEntry.
+ OneUse(const string& symbol_name,
+ const clang::FileEntry* dfn_file,
+ const string& dfn_filepath,
+ clang::SourceLocation use_loc);
+
+ const string& symbol_name() const { return symbol_name_; }
+ const string& short_symbol_name() const { return short_symbol_name_; }
+ const clang::NamedDecl* decl() const { return decl_; }
+ const clang::FileEntry* decl_file() const { return decl_file_; }
+ const string& decl_filepath() const { return decl_filepath_; }
+ clang::SourceLocation use_loc() const { return use_loc_; }
+ clang::SourceLocation decl_loc() const { return decl_loc_; }
+ bool is_full_use() const { return use_kind_ == kFullUse; }
+ bool in_cxx_method_body() const { return in_cxx_method_body_; }
+ const string& comment() const { return comment_; }
+ bool ignore_use() const { return ignore_use_; }
+ bool is_iwyu_violation() const { return is_iwyu_violation_; }
+ bool has_suggested_header() const { return !suggested_header_.empty(); }
+
+ const string& suggested_header() const {
+ CHECK_(has_suggested_header() && "Must assign suggested_header first");
+ CHECK_(!ignore_use() && "Ignored uses have no suggested header");
+ return suggested_header_;
+ }
+
+ void reset_decl(const clang::NamedDecl* decl);
+ void set_full_use() { use_kind_ = kFullUse; }
+ void set_forward_declare_use() { use_kind_ = kForwardDeclareUse; }
+ void set_ignore_use() { ignore_use_ = true; }
+ void set_is_iwyu_violation() { is_iwyu_violation_ = true; }
+ void set_suggested_header(const string& fh) { suggested_header_ = fh; }
+
+ string PrintableUseLoc() const;
+ const vector<string>& public_headers(); // not const because we fill lazily
+ bool PublicHeadersContain(const string& elt);
+ bool NeedsSuggestedHeader() const; // not true for fwd-declare uses, e.g.
+ int UseLinenum() const;
+
+ private:
+ void SetPublicHeaders(); // sets based on decl_filepath_
+
+ string symbol_name_; // the symbol being used
+ string short_symbol_name_; // 'short' form of the symbol being used
+ const clang::NamedDecl* decl_; // decl of the symbol, if we know it
+ clang::SourceLocation decl_loc_; // where the decl is attributed to live
+ const clang::FileEntry* decl_file_; // file entry where the symbol lives
+ string decl_filepath_; // filepath where the symbol lives
+ clang::SourceLocation use_loc_; // where the symbol is used from
+ UseKind use_kind_; // kFullUse or kForwardDeclareUse
+ bool in_cxx_method_body_; // true if use is inside a C++ method body
+ string comment_; // If not empty, append to clang warning msg
+ vector<string> public_headers_; // header to #include if dfn hdr is private
+ string suggested_header_; // header that allows us to satisfy use
+ bool ignore_use_; // set to true if use is discarded
+ bool is_iwyu_violation_; // set to false when we figure out it's not
+};
+
+class OneIncludeOrForwardDeclareLine {
+ public:
+ explicit OneIncludeOrForwardDeclareLine(const clang::NamedDecl* fwd_decl);
+ OneIncludeOrForwardDeclareLine(const clang::FileEntry* included_file,
+ const string& quoted_include, int linenum);
+
+ const string& line() const { return line_; }
+ bool IsIncludeLine() const; // vs forward-declare line
+ string LineNumberString() const; // <startline>-<endline>
+ bool is_desired() const { return is_desired_; }
+ bool is_present() const { return is_present_; }
+ const map<string, int>& symbol_counts() const { return symbol_counts_; }
+
+ string quoted_include() const {
+ CHECK_(IsIncludeLine() && "Must call quoted_include() on include lines");
+ CHECK_(!fwd_decl_ && "quoted_include and fwd_decl are mutually exclusive");
+ return quoted_include_;
+ }
+
+ const clang::FileEntry* included_file() const {
+ CHECK_(IsIncludeLine() && "Must call included_file() on include lines");
+ CHECK_(!fwd_decl_ && "included_file and fwd_decl are mutually exclusive");
+ return included_file_;
+ }
+
+ const clang::NamedDecl* fwd_decl() const {
+ CHECK_(!IsIncludeLine() && "Must call fwd_decl() on forward-declare lines");
+ CHECK_(quoted_include_.empty() && !included_file_ &&
+ "quoted_include and fwd_decl don't mix");
+ return fwd_decl_;
+ }
+
+ bool matches(const string& quoted_include) const {
+ return IsIncludeLine() && (quoted_include_ == quoted_include);
+ }
+
+ bool matches(const clang::NamedDecl* decl) const {
+ return !IsIncludeLine() && (fwd_decl_ == decl);
+ }
+
+ void set_present() { is_present_ = true; }
+ void set_desired() { is_desired_ = true; }
+ void clear_desired() { is_desired_ = false; }
+ void clear_line_numbers() { start_linenum_ = end_linenum_ = -1; }
+ // Another symbol we're using that's defined in this file.
+ void AddSymbolUse(const string& symbol_name);
+ bool HasSymbolUse(const string& symbol_name) const;
+
+ bool LineNumbersMatch(const OneIncludeOrForwardDeclareLine& that) const {
+ return (this->start_linenum_ == that.start_linenum_ &&
+ this->end_linenum_ == that.end_linenum_);
+ }
+
+ private:
+ string line_; // '#include XXX' or 'class YYY;'
+ int start_linenum_;
+ int end_linenum_;
+ bool is_desired_; // IWYU will recommend this line
+ bool is_present_; // line was present before the IWYU run
+ map<string, int> symbol_counts_; // how many times we referenced each symbol
+ // Only either two following members are set for includes
+ string quoted_include_; // quoted file name we're including
+ const clang::FileEntry* included_file_; // the file we're including
+ // ...or this member is set for the fwd-decl we're emitting.
+ const clang::NamedDecl* fwd_decl_;
+};
+
+// This class holds IWYU information about a single file (FileEntry)
+// -- referred to, in the comments below, as "this file." The keys to
+// most of these methods are all quoted header paths, which are the
+// include names as they would occur in a source file, including <> or
+// "". For instance, '<string>' or '"ads/test.h"'.
+// TODO(csilvers): add unitests for this class.
+class IwyuFileInfo {
+ public:
+ // TODO(csilvers): also take iwyufileinfos for 'associated' files (.h's).
+ // And a source-manager.
+ IwyuFileInfo(const clang::FileEntry* this_file,
+ const IwyuPreprocessorInfo* preprocessor_info,
+ const string& quoted_include_name);
+
+ bool is_prefix_header() const { return is_prefix_header_; }
+ void set_prefix_header() { is_prefix_header_ = true; }
+
+ bool is_pch_in_code() const { return is_pch_in_code_; }
+ void set_pch_in_code() { is_pch_in_code_ = true; }
+
+ // An 'associated' header is a header that this file #includes
+ // (possibly indirectly) that we should treat as being logically
+ // part of this file. In particular, when computing the direct
+ // includes of this file, we also include the direct includes of all
+ // associated headers. Examples: vector has bits/stl_vector.h as an
+ // associated header; foo.cc has foo.h and foo-inl.h as associated
+ // headers.
+ void AddAssociatedHeader(const IwyuFileInfo* other);
+
+ // Use these to register an iwyu declaration: either an #include,
+ // a forward-declaration or a using-declaration.
+
+ void AddInclude(const clang::FileEntry* includee,
+ const string& quoted_includee, int linenumber);
+ // definitely_keep_fwd_decl tells us that we should never suggest
+ // the fwd-decl be removed, even if we don't see any uses of it.
+ void AddForwardDeclare(const clang::NamedDecl* fwd_decl,
+ bool definitely_keep_fwd_decl);
+
+ void AddUsingDecl(const clang::UsingDecl* using_decl);
+
+ // Use these to register an iwyu 'use'. It's preferable to indicate
+ // an explicit type or decl being used, but if that's not available,
+ // a symbol-name is acceptable as well. There are two forms of each
+ // registration routine, one for when we need the full symbol info
+ // (via an #include), and one when forward-declaring is enough.
+
+ void ReportFullSymbolUse(clang::SourceLocation use_loc,
+ const clang::NamedDecl* decl,
+ bool in_cxx_method_body, const char* comment);
+ // This is used for symbols with a made up dfn_filepath. Currently it's used
+ // only for placement operator new in templates (see
+ // IwyuBaseAstVisitor::VisitCXXNewExpr).
+ void ReportFullSymbolUse(clang::SourceLocation use_loc,
+ const string& dfn_filepath,
+ const string& symbol);
+ // TODO(dsturtevant): Can we determine in_cxx_method_body? Do we care?
+
+ // Called when using a macro in this file.
+ void ReportMacroUse(clang::SourceLocation use_loc,
+ clang::SourceLocation dfn_loc,
+ const string& symbol);
+
+ // Called when somebody uses a macro defined in this file.
+ void ReportDefinedMacroUse(const clang::FileEntry* used_in);
+
+ // We only allow forward-declaring of decls, not arbitrary symbols.
+ void ReportForwardDeclareUse(clang::SourceLocation use_loc,
+ const clang::NamedDecl* decl,
+ bool in_cxx_method_body, const char* comment);
+
+ // Called whenever a NamedDecl is accessed through a UsingDecl.
+ // ie: using std::swap; swap(a, b);
+ void ReportUsingDeclUse(clang::SourceLocation use_loc,
+ const clang::UsingDecl* using_decl,
+ bool in_cxx_method_body, const char* comment);
+
+ // This is used when we see a // NOLINT comment, for instance. It says
+ // '#include this header file as-is, without any public-header mapping.'
+ // Input is the include-line as desired: '<string.h>' or '"ads/foo.h"'.
+ void ReportIncludeFileUse(const clang::FileEntry* included_file,
+ const string& quoted_include);
+
+ // This is used when we see a file we want to keep not due to symbol-use
+ // reasons. For example, it can be #included with an "IWYU pragma: keep"
+ // comment or it can be an x-macro.
+ void ReportKnownDesiredFile(const clang::FileEntry* included_file);
+
+ // This is used only in iwyu_preprocessor.cc. TODO(csilvers): revamp?
+ const set<const clang::FileEntry*>& direct_includes_as_fileentries() const {
+ return direct_includes_as_fileentries_;
+ }
+
+ // Called when all macros in the file are processed.
+ void HandlePreprocessingDone();
+
+ // Resolve and pending analysis that needs to occur between AST traversal
+ // and CalculateAndReportIwyuViolations.
+ void ResolvePendingAnalysis();
+
+ // The meat of iwyu: compare the actual includes and forward-declares
+ // against the symbol uses, and report which uses are iwyu violations.
+ // Reports violations on errs(), and returns the number of violations.
+ size_t CalculateAndReportIwyuViolations();
+
+ private:
+ const set<string>& direct_includes() const { return direct_includes_; }
+
+ const set<string>& desired_includes() const {
+ CHECK_(desired_includes_have_been_calculated_ &&
+ "Must calculate desired includes before calling desired_includes()");
+ return desired_includes_;
+ }
+
+ set<string> AssociatedQuotedIncludes() const {
+ set<string> associated_quoted_includes;
+ for (const IwyuFileInfo* associated : associated_headers_)
+ associated_quoted_includes.insert(associated->quoted_file_);
+ return associated_quoted_includes;
+ }
+
+ set<const clang::FileEntry*> AssociatedFileEntries() const {
+ set<const clang::FileEntry*> associated_file_entries;
+ for (const IwyuFileInfo* associated : associated_headers_)
+ associated_file_entries.insert(associated->file_);
+ return associated_file_entries;
+ }
+
+ set<string> AssociatedDesiredIncludes() const {
+ set<string> associated_desired_includes;
+ for (const IwyuFileInfo* associated : associated_headers_)
+ InsertAllInto(associated->desired_includes(),
+ &associated_desired_includes);
+ return associated_desired_includes;
+ }
+
+ // Populates uses with full data, including is_iwyu_violation_.
+ void CalculateIwyuViolations(vector<OneUse>* uses);
+ // Uses uses to emit warning messages (at high enough verbosity).
+ // Returns the number of warning messages found.
+ int EmitWarningMessages(const vector<OneUse>& uses);
+
+ // The constructor arguments. file_ is 'this file'.
+ const clang::FileEntry* file_;
+ const IwyuPreprocessorInfo* preprocessor_info_;
+
+ string quoted_file_;
+
+ // Prefix header means included from command line via -include option.
+ bool is_prefix_header_;
+
+ // PCH in code refers to an #include directive that acts as a marker for
+ // precompiled header inclusion. This pattern can be used with GCC and is
+ // standard practice on MSVC, whereas Clang forces PCHs to be listed as prefix
+ // headers.
+ bool is_pch_in_code_;
+
+ // associated_headers_ are the files 'associated' with this file: if
+ // this file is foo.cc, associated_headers_ are the IwyuFileInfo's for
+ // foo.h and foo-inl.h, if present.
+ set<const IwyuFileInfo*> associated_headers_;
+
+ // Holds all the uses that are reported.
+ vector<OneUse> symbol_uses_;
+
+ // Holds all the lines (#include and fwd-declare) that are reported.
+ vector<OneIncludeOrForwardDeclareLine> lines_;
+
+ // Maps all the using-decls that are reported to a bool indicating whether
+ // or not a the using decl has been referenced in this file.
+ map<const clang::UsingDecl*, bool> using_decl_referenced_;
+
+ // We also hold the line information in a few other data structures,
+ // for ease of references.
+ set<string> direct_includes_; // key is the quoted include, eg '<set>'
+ set<const clang::FileEntry*> direct_includes_as_fileentries_;
+ set<const clang::NamedDecl*> direct_forward_declares_;
+
+ // Holds files forced to be kept. For example, files included with the
+ // "IWYU pragma: keep" comment and x-macros.
+ set<const clang::FileEntry*> kept_includes_;
+
+ // Holds files using macros defined in this file.
+ set<const clang::FileEntry*> macro_users_;
+
+ // What we will recommend the #includes to be.
+ set<string> desired_includes_;
+ bool desired_includes_have_been_calculated_;
+};
+
+// Helpers for testing.
+
+namespace internal {
+
+class FakeNamedDecl : public clang::NamedDecl {
+ public:
+ FakeNamedDecl(const string& kind_name, const string& qual_name,
+ const string& decl_filepath, int decl_linenum);
+
+ string kind_name() const { return kind_name_; }
+ string qual_name() const { return qual_name_; }
+ string decl_filepath() const { return decl_filepath_; }
+ int decl_linenum() const { return decl_linenum_; }
+
+ private:
+ string kind_name_;
+ string qual_name_;
+ string decl_filepath_;
+ int decl_linenum_;
+};
+
+} // namespace internal
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_OUTPUT_H_
diff --git a/iwyu_path_util.cc b/iwyu_path_util.cc
new file mode 100644
index 0000000..cc8eed6
--- /dev/null
+++ b/iwyu_path_util.cc
@@ -0,0 +1,244 @@
+//===--- iwyu_path_util.cc - file-path utilities for include-what-you-use -===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_path_util.h"
+
+#include <algorithm> // for std::replace
+#include <cstddef>
+#include <cstring> // for strlen
+#include <system_error>
+
+#include "iwyu_stl_util.h"
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+
+namespace include_what_you_use {
+
+namespace {
+
+vector<HeaderSearchPath>* header_search_paths;
+
+// Please keep this in sync with _SOURCE_EXTENSIONS in fix_includes.py.
+const char* source_extensions[] = {
+ ".c",
+ ".C",
+ ".cc",
+ ".CC",
+ ".cxx",
+ ".CXX",
+ ".cpp",
+ ".CPP",
+ ".c++",
+ ".C++",
+ ".cp"
+};
+
+} // anonymous namespace
+
+void SetHeaderSearchPaths(const vector<HeaderSearchPath>& search_paths) {
+ if (header_search_paths != nullptr) {
+ delete header_search_paths;
+ }
+ header_search_paths = new vector<HeaderSearchPath>(search_paths);
+}
+
+const vector<HeaderSearchPath>& HeaderSearchPaths() {
+ if (header_search_paths == nullptr) {
+ header_search_paths = new vector<HeaderSearchPath>();
+ }
+ return *header_search_paths;
+}
+
+bool IsHeaderFile(string path) {
+ if (EndsWith(path, "\"") || EndsWith(path, ">"))
+ path = path.substr(0, path.length() - 1);
+
+ // Some headers don't have an extension (e.g. <string>), or have an
+ // unusual one (the compiler doesn't care), so it's safer to
+ // enumerate non-header extensions instead.
+ // for (size_t i = 0; i < llvm::array_lengthof(source_extensions); ++i) {
+ for (const char* source_extension : source_extensions) {
+ if (EndsWith(path, source_extension))
+ return false;
+ }
+
+ return true;
+}
+
+string Basename(const string& path) {
+ string::size_type last_slash = path.rfind('/');
+ if (last_slash != string::npos) {
+ return path.substr(last_slash + 1);
+ }
+ return path;
+}
+
+string GetCanonicalName(string file_path) {
+ // For this special 'path' we just return it.
+ // Note that we leave the 'quotes' to make it different from regular paths.
+ if (file_path == "<built-in>")
+ return file_path;
+
+ CHECK_(!IsQuotedInclude(file_path));
+
+ file_path = NormalizeFilePath(file_path);
+
+ bool stripped_ext = StripRight(&file_path, ".h")
+ || StripRight(&file_path, ".H")
+ || StripRight(&file_path, ".hpp")
+ || StripRight(&file_path, ".hxx")
+ || StripRight(&file_path, ".hh")
+ || StripRight(&file_path, ".inl");
+ if (!stripped_ext) {
+ for (const char* source_extension : source_extensions) {
+ if (StripRight(&file_path, source_extension))
+ break;
+ }
+ }
+
+ StripRight(&file_path, "_unittest")
+ || StripRight(&file_path, "_regtest")
+ || StripRight(&file_path, "_test")
+ || StripLeft(&file_path, "test_headercompile_");
+ StripRight(&file_path, "-inl");
+ // .h files in /public/ match .cc files in /internal/
+ const string::size_type internal_pos = file_path.find("/internal/");
+ if (internal_pos != string::npos)
+ file_path = (file_path.substr(0, internal_pos) + "/public/" +
+ file_path.substr(internal_pos + strlen("/internal/")));
+
+ // .h files in /include/ match .cc files in /src/
+ const string::size_type include_pos = file_path.find("/include/");
+ if (include_pos != string::npos)
+ file_path = (file_path.substr(0, include_pos) + "/src/" +
+ file_path.substr(include_pos + strlen("/include/")));
+ return file_path;
+}
+
+string NormalizeFilePath(const string& path) {
+ llvm::SmallString<128> normalized(path);
+ llvm::sys::path::remove_dots(normalized);
+
+#ifdef _WIN32
+ // Canonicalize directory separators (forward slashes considered canonical.)
+ std::replace(normalized.begin(), normalized.end(), '\\', '/');
+#endif
+
+ return normalized.str();
+}
+
+string NormalizeDirPath(const string& path) {
+ string result = NormalizeFilePath(path);
+ // Ensure trailing slash.
+ if (!result.empty() && result.back() != '/')
+ result += '/';
+ return result;
+}
+
+bool IsAbsolutePath(const string& path) {
+ return llvm::sys::path::is_absolute(path);
+}
+
+string MakeAbsolutePath(const string& path) {
+ llvm::SmallString<128> absolute_path(path);
+ std::error_code error = llvm::sys::fs::make_absolute(absolute_path);
+ CHECK_(!error);
+
+ return absolute_path.str();
+}
+
+string MakeAbsolutePath(const string& base_path, const string& relative_path) {
+ llvm::SmallString<128> absolute_path(base_path);
+ llvm::sys::path::append(absolute_path, relative_path);
+
+ return absolute_path.str();
+}
+
+string GetParentPath(const string& path) {
+ llvm::StringRef parent = llvm::sys::path::parent_path(path);
+ return parent.str();
+}
+
+bool StripPathPrefix(string* path, const string& prefix_path) {
+ // Only makes sense if both are absolute or both are relative (to same dir).
+ CHECK_(IsAbsolutePath(*path) == IsAbsolutePath(prefix_path));
+ return StripLeft(path, prefix_path);
+}
+
+// Converts a file-path, such as /usr/include/stdio.h, to a
+// quoted include, such as <stdio.h>.
+string ConvertToQuotedInclude(const string& filepath,
+ const string& includer_path) {
+ // includer_path must be given as an absolute path.
+ CHECK_(includer_path.empty() || IsAbsolutePath(includer_path));
+
+ if (filepath == "<built-in>")
+ return filepath;
+
+ // Get path into same format as header search paths: Absolute and normalized.
+ string path = NormalizeFilePath(MakeAbsolutePath(filepath));
+
+ // Case 1: Uses an explicit entry on the search path (-I) list.
+ const vector<HeaderSearchPath>& search_paths = HeaderSearchPaths();
+ // HeaderSearchPaths is sorted to be longest-first, so this
+ // loop will prefer the longest prefix: /usr/include/c++/4.4/foo
+ // will be mapped to <foo>, not <c++/4.4/foo>.
+ for (const HeaderSearchPath& entry : search_paths) {
+ // All header search paths have a trailing "/", so we'll get a perfect
+ // quoted include by just stripping the prefix.
+
+ if (StripPathPrefix(&path, entry.path)) {
+ if (entry.path_type == HeaderSearchPath::kSystemPath)
+ return "<" + path + ">";
+ else
+ return "\"" + path + "\"";
+ }
+ }
+
+ // Case 2:
+ // Uses the implicit "-I <basename current file>" entry on the search path.
+ if (!includer_path.empty())
+ StripPathPrefix(&path, NormalizeDirPath(includer_path));
+ return "\"" + path + "\"";
+}
+
+bool IsQuotedInclude(const string& s) {
+ if (s.size() < 2)
+ return false;
+ return ((StartsWith(s, "<") && EndsWith(s, ">")) ||
+ (StartsWith(s, "\"") && EndsWith(s, "\"")));
+}
+
+// Returns whether this is a system (as opposed to user) include file,
+// based on where it lives.
+bool IsSystemIncludeFile(const string& filepath) {
+ return ConvertToQuotedInclude(filepath)[0] == '<';
+}
+
+// Returns true if the given file is third-party. Google-authored
+// code living in third_party/ is not considered third-party.
+bool IsThirdPartyFile(string quoted_path) {
+ if (!StripLeft(&quoted_path, "\"third_party/"))
+ return false;
+
+ // These are Google-authored libraries living in third_party/
+ // because of old licensing constraints.
+ if (StartsWith(quoted_path, "car/") ||
+ StartsWith(quoted_path, "gtest/") ||
+ StartsWith(quoted_path, "gmock/"))
+ return false;
+
+ return true;
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_path_util.h b/iwyu_path_util.h
new file mode 100644
index 0000000..c75667a
--- /dev/null
+++ b/iwyu_path_util.h
@@ -0,0 +1,97 @@
+//===--- iwyu_path_util.h - file-path utilities for include-what-you-use --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// File-path utilities for the IWYU checker.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_PATH_UTIL_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_PATH_UTIL_H_
+
+#include <string> // for string, allocator, etc
+#include <vector>
+
+#include "iwyu_string_util.h"
+
+namespace include_what_you_use {
+
+using std::string;
+using std::vector;
+
+
+// One entry in the search-path list of where to find #include files.
+struct HeaderSearchPath {
+ enum Type { kUnusedPath = 0, kSystemPath, kUserPath };
+ HeaderSearchPath(const string& p, Type pt) : path(p), path_type(pt) { }
+ string path; // the path-entry as specified on the commandline (via -I)
+ Type path_type;
+};
+
+// The directories to look for #includes in, including from -I, -isystem, etc.
+void SetHeaderSearchPaths(const vector<HeaderSearchPath>& search_paths);
+const vector<HeaderSearchPath>& HeaderSearchPaths();
+
+// Returns true if 'path' is a path of a (possibly enclosed in double
+// quotes or <>) C++ header file.
+bool IsHeaderFile(string path);
+
+// If the path has a slash, return the part after the last slash,
+// else return the input path.
+string Basename(const string& path);
+
+// Normalizes the file path, then strips uninteresting suffixes from
+// the file name. Replaces "/internal/" with "/public/" and
+// "/include/" with "/src".
+string GetCanonicalName(string file_path);
+
+// Replaces "\" by "/" (Microsoft platform paths) and collapses all dot
+// components in path.
+string NormalizeFilePath(const string& path);
+
+// Normalizes like NormalizeFilePath and ensures trailing slash.
+// Hence use only for directories!
+string NormalizeDirPath(const string& path);
+
+// Is path absolute?
+bool IsAbsolutePath(const string& path);
+
+// Get absolute version of path.
+string MakeAbsolutePath(const string& path);
+string MakeAbsolutePath(const string& base_path, const string& relative_path);
+
+// Get the parent of path.
+string GetParentPath(const string& path);
+
+// Try to strip the prefix_path from the front of path.
+// The path assumed to be normalized but either absolute or relative.
+// Return true if path was stripped.
+bool StripPathPrefix(string* path, const string& prefix_path);
+
+// Below, we talk 'quoted' includes. A quoted include is something
+// that would be written on an #include line, complete with the <> or
+// "". In the line '#include <time.h>', "<time.h>" is the quoted
+// include.
+
+// Converts a file-path, such as /usr/include/stdio.h, to a
+// quoted include, such as <stdio.h>.
+string ConvertToQuotedInclude(const string& filepath,
+ const string& includer_path = "");
+
+// Returns true if the string is a quoted include.
+bool IsQuotedInclude(const string& s);
+
+// Returns whether this is a system (as opposed to user) include
+// file, based on where it lives.
+bool IsSystemIncludeFile(const string& filepath);
+
+// Returns true if the given file is third-party. Google-authored
+// code living in third_party/ is not considered third-party.
+bool IsThirdPartyFile(string quoted_path);
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_PATH_UTIL_H_
diff --git a/iwyu_preprocessor.cc b/iwyu_preprocessor.cc
new file mode 100644
index 0000000..00bcb32
--- /dev/null
+++ b/iwyu_preprocessor.cc
@@ -0,0 +1,1085 @@
+//===--- iwyu_preprocessor.cc - handle #includes/#defines for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_preprocessor.h"
+
+#include <cstddef> // for size_t
+#include <cstring>
+#include <algorithm>
+#include <iterator>
+#include <string> // for string, basic_string, etc
+#include <utility> // for pair, make_pair
+
+#include "iwyu_ast_util.h"
+#include "iwyu_globals.h"
+#include "iwyu_include_picker.h"
+#include "iwyu_lexer_utils.h"
+#include "iwyu_location_util.h"
+#include "iwyu_output.h"
+#include "iwyu_path_util.h"
+#include "iwyu_stl_util.h"
+#include "iwyu_string_util.h"
+#include "iwyu_verrs.h"
+#include "port.h" // for CHECK_
+// TODO(wan): remove this once the IWYU bug is fixed.
+// IWYU pragma: no_include "foo/bar/baz.h"
+#include "llvm/Support/raw_ostream.h"
+#include "clang/Basic/IdentifierTable.h"
+#include "clang/Lex/MacroInfo.h"
+
+using clang::FileEntry;
+using clang::FileID;
+using clang::MacroDefinition;
+using clang::MacroDirective;
+using clang::MacroInfo;
+using clang::Preprocessor;
+using clang::SourceLocation;
+using clang::SourceRange;
+using clang::Token;
+using llvm::errs;
+using llvm::StringRef;
+using std::make_pair;
+using std::string;
+
+namespace SrcMgr = clang::SrcMgr;
+
+namespace include_what_you_use {
+
+namespace {
+// TODO(dsturtevant): Perhaps make this method accessible iwyu-wide.
+// At first blush, iwyu_output is the place to put it, but that would
+// introduce a circular dependency between iwyu_output and
+// iwyu_ast_util.
+void Warn(SourceLocation loc, const string& message) {
+ errs() << PrintableLoc(loc) << ": warning: " << message << "\n";
+}
+
+// For use with no_forward_declare. Allow people to specify forward
+// declares with or without the leading "::", and don't make them use
+// (anonymous namespace).
+string NormalizeNamespaces(string symbol) {
+ if (StartsWith(symbol, "::")) {
+ symbol = symbol.substr(2);
+ }
+ const char kAnonymousNamespaceQualifier[] = "(anonymous namespace)::";
+ for (;;) {
+ const string::size_type index = symbol.find(kAnonymousNamespaceQualifier);
+ if (index == string::npos) {
+ break;
+ }
+ symbol = (symbol.substr(0, index) +
+ symbol.substr(index + strlen(kAnonymousNamespaceQualifier)));
+ }
+ return symbol;
+}
+
+} // namespace
+
+//------------------------------------------------------------
+// Utilities for examining source files.
+
+// For a particular #include line that include_loc points to,
+// returns the include as written by the user, including <> or "".
+// This works even for computed #includes ('#include MACRO'): we
+// point to the string the macro expands to.
+// Simplifying wrapper around the iwyu_lexer function.
+static string GetIncludeNameAsWritten(SourceLocation include_loc) {
+ return GetIncludeNameAsWritten(include_loc, DefaultDataGetter());
+}
+
+//------------------------------------------------------------
+// Utilities on macros.
+
+static string GetName(const Token& token) {
+ return token.getIdentifierInfo()->getName().str();
+}
+
+//------------------------------------------------------------
+// Utilities for handling iwyu-specific pragma comments.
+
+namespace {
+
+// Given a vector of tokens, a token to match, and an expected number
+// of tokens, return true if the number of tokens is at least the
+// expected number and the first token matches the given token, else
+// false. In addition, if in the 'return true' case there are more
+// tokens than expected, warn if the first one doesn't start "//" or
+// "*/", the latter presumably closing a C-style comment.
+// <loc>, which is only used for a warning message, should refer
+// to the beginning of the comment containing the tokens.
+bool MatchOneToken(const vector<string>& tokens,
+ const string& token,
+ size_t num_expected_tokens,
+ SourceLocation loc) {
+ if (tokens.size() < num_expected_tokens) {
+ return false;
+ }
+ if (tokens[0] != token) {
+ return false;
+ }
+ if (tokens.size() > num_expected_tokens &&
+ !StartsWith(tokens[num_expected_tokens], "//") &&
+ !StartsWith(tokens[num_expected_tokens], "*/")) {
+ Warn(loc, "Extra tokens on pragma line");
+ }
+ return true;
+}
+
+// Given a vector of tokens, two tokens to match, and an expected
+// number of tokens, return true if the number of tokens is at least
+// the expected number and the first two tokens match the given
+// tokens, else false. In addition, if in the 'return true' case there
+// are more tokens than expected, warn if the first one doesn't start
+// "//".
+// <loc>, which is only used for a warning message, should refer
+// to the beginning of the comment containing the tokens.
+bool MatchTwoTokens(const vector<string>& tokens,
+ const string& token1,
+ const string& token2,
+ size_t num_expected_tokens,
+ SourceLocation loc) {
+ if (tokens.size() < num_expected_tokens) {
+ return false;
+ }
+ if (tokens[0] != token1) {
+ return false;
+ }
+ if (tokens[1] != token2) {
+ return false;
+ }
+ if (tokens.size() > num_expected_tokens &&
+ !StartsWith(tokens[num_expected_tokens], "//") &&
+ !StartsWith(tokens[num_expected_tokens], "*/")) {
+ // Accept but warn.
+ Warn(loc, "Extra tokens on pragma line");
+ }
+ return true;
+}
+
+} // namespace
+
+// Call this function only when the given file is the one currently
+// being processed (or a file directly including it, when the current
+// file has not processed any comments yet). Return true if only if
+// there is an open begin_exports pragma in the current state of the
+// parse of the given file. Note that there may be open begin_exports
+// in including files. They don't matter for this function.
+bool IwyuPreprocessorInfo::HasOpenBeginExports(const FileEntry* file) const {
+ return !begin_exports_location_stack_.empty() &&
+ GetFileEntry(begin_exports_location_stack_.top()) == file;
+}
+
+bool IwyuPreprocessorInfo::HandleComment(Preprocessor& pp,
+ SourceRange comment_range) {
+ HandlePragmaComment(comment_range);
+ return false; // No tokens pushed.
+}
+
+void IwyuPreprocessorInfo::HandlePragmaComment(SourceRange comment_range) {
+ const SourceLocation begin_loc = comment_range.getBegin();
+ const SourceLocation end_loc = comment_range.getEnd();
+ const char* begin_text = DefaultDataGetter().GetCharacterData(begin_loc);
+ const char* end_text = DefaultDataGetter().GetCharacterData(end_loc);
+ string pragma_text(begin_text, end_text);
+ const FileEntry* const this_file_entry = GetFileEntry(begin_loc);
+
+ // Pragmas must start comments.
+ if (!StripLeft(&pragma_text, "// IWYU pragma: ") &&
+ !StripLeft(&pragma_text, "/* IWYU pragma: ")) {
+ return;
+ }
+ const vector<string> tokens =
+ SplitOnWhiteSpacePreservingQuotes(pragma_text, 0);
+ if (HasOpenBeginExports(this_file_entry)) {
+ if (MatchOneToken(tokens, "end_exports", 1, begin_loc)) {
+ ERRSYM(this_file_entry) << "end_exports pragma seen\n";
+ begin_exports_location_stack_.pop();
+ } else {
+ // No pragma allowed within "begin_exports" - "end_exports"
+ Warn(begin_loc, "Expected end_exports pragma");
+ }
+ return;
+ }
+
+ if (MatchOneToken(tokens, "begin_exports", 1, begin_loc)) {
+ ERRSYM(this_file_entry) << "begin_exports pragma seen\n";
+ begin_exports_location_stack_.push(begin_loc);
+ return;
+ }
+
+ if (MatchOneToken(tokens, "end_exports", 1, begin_loc)) {
+ Warn(begin_loc, "end_exports without a begin_exports");
+ return;
+ }
+
+ if (MatchTwoTokens(tokens, "private,", "include", 3, begin_loc)) {
+ // 3rd token should be a quoted header.
+ const string& suggested = tokens[2];
+ if (!IsQuotedInclude(suggested)) {
+ Warn(begin_loc, "Suggested include must be a quoted header");
+ return;
+ }
+
+ const string quoted_this_file
+ = ConvertToQuotedInclude(GetFilePath(begin_loc));
+ MutableGlobalIncludePicker()->AddMapping(quoted_this_file, suggested);
+ MutableGlobalIncludePicker()->MarkIncludeAsPrivate(quoted_this_file);
+ ERRSYM(this_file_entry) << "Adding private pragma-mapping: "
+ << quoted_this_file << " -> "
+ << suggested << "\n";
+ return;
+ }
+
+ if (MatchOneToken(tokens, "private", 1, begin_loc)) {
+ const string quoted_this_file
+ = ConvertToQuotedInclude(GetFilePath(begin_loc));
+ MutableGlobalIncludePicker()->MarkIncludeAsPrivate(quoted_this_file);
+ ERRSYM(this_file_entry) << "Adding private include: "
+ << quoted_this_file << "\n";
+ return;
+ }
+
+ if (MatchOneToken(tokens, "no_include", 2, begin_loc)) {
+ // 2nd token should be an quoted header.
+ const string& inhibited = tokens[1];
+ if (!IsQuotedInclude(inhibited)) {
+ Warn(begin_loc, "Inhibited include must be a quoted header");
+ return;
+ }
+
+ no_include_map_[this_file_entry].insert(inhibited);
+ ERRSYM(this_file_entry) << "Inhibiting include of "
+ << inhibited << "\n";
+ return;
+ }
+
+ if (MatchOneToken(tokens, "no_forward_declare", 2, begin_loc)) {
+ // 2nd token should be the qualified name of a symbol.
+ const string normalized_symbol = NormalizeNamespaces(tokens[1]);
+ no_forward_declare_map_[this_file_entry].insert(normalized_symbol);
+ ERRSYM(this_file_entry) << "Inhibiting forward-declare of "
+ << normalized_symbol << "\n";
+ return;
+ }
+
+ if (MatchOneToken(tokens, "friend", 2, begin_loc)) {
+ // 2nd token should be a regex.
+ string regex = tokens[1];
+ // The regex is expected to match a quoted include. If the user
+ // didn't put quotes, assume they wanted a non-system file.
+ if (!IsQuotedInclude(regex))
+ regex = "\"(" + regex + ")\"";
+ ERRSYM(this_file_entry) << GetFilePath(begin_loc)
+ << " adding friend regex " << regex << "\n";
+ MutableGlobalIncludePicker()->AddFriendRegex(
+ GetFilePath(begin_loc), regex);
+ return;
+ }
+
+ if (MatchOneToken(tokens, "associated", 1, begin_loc)) {
+ if (associated_pragma_location_.isInvalid()) {
+ associated_pragma_location_ = begin_loc;
+ }
+ return;
+ }
+
+ // "keep" and "export" are handled in MaybeProtectInclude.
+ if (!MatchOneToken(tokens, "keep", 1, begin_loc)
+ && !MatchOneToken(tokens, "export", 1, begin_loc)) {
+ Warn(begin_loc, "Unknown or malformed pragma (" + pragma_text + ")");
+ return;
+ }
+}
+
+void IwyuPreprocessorInfo::ProcessHeadernameDirectivesInFile(
+ SourceLocation file_beginning) {
+ SourceLocation current_loc = file_beginning;
+ SourceLocation begin_exports_location;
+
+ while (true) {
+ // Figure out the canonical name of this file. We can't use
+ // GetFilePath() because it may not interact properly with -I.
+ current_loc = GetLocationAfter(current_loc,
+ "@file ",
+ DefaultDataGetter());
+ if (!current_loc.isValid()) {
+ break;
+ }
+ const string filename = GetSourceTextUntilEndOfLine(current_loc,
+ DefaultDataGetter());
+ // Use "" or <> based on where the file lives.
+ string quoted_private_include;
+ if (IsSystemIncludeFile(GetFilePath(current_loc)))
+ quoted_private_include = "<" + filename + ">";
+ else
+ quoted_private_include = "\"" + filename + "\"";
+
+ // TODO(dsturtevant): Maybe place restrictions on the
+ // placement. E.g., in a comment, before any code, or perhaps only
+ // when in the same comment as an @file directive.
+ current_loc = GetLocationAfter(current_loc,
+ "@headername{",
+ DefaultDataGetter());
+ if (!current_loc.isValid()) {
+ break;
+ }
+
+ string after_text = GetSourceTextUntilEndOfLine(current_loc,
+ DefaultDataGetter());
+ const string::size_type close_brace_pos = after_text.find('}');
+ if (close_brace_pos == string::npos) {
+ Warn(current_loc, "@headername directive missing a closing brace");
+ continue;
+ }
+ after_text = after_text.substr(0, close_brace_pos);
+ vector<string> public_includes = Split(after_text, ",", 0);
+
+ for (string& public_include : public_includes) {
+ StripWhiteSpace(&public_include);
+ const string quoted_header_name = "<" + public_include + ">";
+ MutableGlobalIncludePicker()->AddMapping(quoted_private_include,
+ quoted_header_name);
+ MutableGlobalIncludePicker()->MarkIncludeAsPrivate(
+ quoted_private_include);
+ ERRSYM(GetFileEntry(current_loc)) << "Adding @headername mapping: "
+ << quoted_private_include << "->"
+ << quoted_header_name << "\n";
+ }
+ break; // No more than one @headername directive allowed.
+ }
+}
+
+//------------------------------------------------------------
+// Utilities for adding #includes.
+
+// Helper function that returns iwyu_file_info_map_[file_entry] if
+// it already exists, or creates a new one and returns it otherwise.
+IwyuFileInfo* IwyuPreprocessorInfo::GetFromFileInfoMap(const FileEntry* file) {
+ IwyuFileInfo* iwyu_file_info = FindInMap(&iwyu_file_info_map_, file);
+ if (!iwyu_file_info) {
+ const string quoted_include = ConvertToQuotedInclude(GetFilePath(file));
+ iwyu_file_info_map_.insert(
+ make_pair(file, IwyuFileInfo(file, this, quoted_include)));
+ iwyu_file_info = FindInMap(&iwyu_file_info_map_, file);
+ CHECK_(iwyu_file_info); // should succeed this time!
+ }
+ return iwyu_file_info;
+}
+
+void IwyuPreprocessorInfo::InsertIntoFileInfoMap(
+ const FileEntry* file, const string& quoted_include_name) {
+ if (!FindInMap(&iwyu_file_info_map_, file)) {
+ iwyu_file_info_map_.insert(
+ make_pair(file, IwyuFileInfo(file, this, quoted_include_name)));
+ }
+}
+
+// Sometimes, we can tell just by looking at an #include line
+// that iwyu should never recommend removing the #include. For
+// instance, if it has an IWYU pragma saying to keep it.
+void IwyuPreprocessorInfo::MaybeProtectInclude(
+ SourceLocation includer_loc, const FileEntry* includee,
+ const string& include_name_as_written) {
+ const FileEntry* includer = GetFileEntry(includer_loc);
+ if (IsBuiltinOrCommandLineFile(includer))
+ return;
+
+ string protect_reason;
+ // We always keep lines with pragmas "keep" or "export".
+ // TODO(dsturtevant): As written "// // IWYU pragma: keep" is incorrectly
+ // interpreted as a pragma. Maybe do "keep" and "export" pragma handling
+ // in HandleComment?
+ if (LineHasText(includer_loc, "// IWYU pragma: keep") ||
+ LineHasText(includer_loc, "/* IWYU pragma: keep")) {
+ protect_reason = "pragma_keep";
+ FileInfoFor(includer)->ReportKnownDesiredFile(includee);
+
+ } else if (LineHasText(includer_loc, "// IWYU pragma: export") ||
+ LineHasText(includer_loc, "/* IWYU pragma: export") ||
+ HasOpenBeginExports(includer)) {
+ protect_reason = "pragma_export";
+ const string quoted_includer =
+ ConvertToQuotedInclude(GetFilePath(includer));
+ MutableGlobalIncludePicker()->AddMapping(include_name_as_written,
+ quoted_includer);
+ ERRSYM(includer) << "Adding pragma-export mapping: "
+ << include_name_as_written << " -> " << quoted_includer
+ << "\n";
+
+ // We also always keep #includes of .c files: iwyu doesn't touch those.
+ // TODO(csilvers): instead of IsHeaderFile, check if the file has
+ // any "non-inlined" definitions.
+ } else if (!IsHeaderFile(GetFilePath(includee))) {
+ protect_reason = ".cc include";
+
+ // If the includee is marked as pch-in-code, it can never be removed.
+ } else if (FileInfoFor(includee)->is_pch_in_code()) {
+ protect_reason = "pch in code";
+
+ // There's one more place we keep the #include: if our file re-exports it.
+ // (A decision to re-export an #include counts as a "use" of it.)
+ // But we need to finalize all #includes before we can test that,
+ // so we do it in a separate function, ProtectReexportIncludes, below.
+
+ }
+
+ if (!protect_reason.empty()) {
+ CHECK_(ContainsKey(iwyu_file_info_map_, includer));
+ GetFromFileInfoMap(includer)->ReportIncludeFileUse(includee,
+ include_name_as_written);
+ ERRSYM(includer) << "Marked dep: " << GetFilePath(includer)
+ << " needs to keep " << include_name_as_written
+ << " (reason: " << protect_reason << ")\n";
+ }
+}
+
+static void ProtectReexportIncludes(
+ map<const FileEntry*, IwyuFileInfo>* file_info_map) {
+ for (map<const FileEntry*, IwyuFileInfo>::iterator
+ it = file_info_map->begin(); it != file_info_map->end(); ++it) {
+ IwyuFileInfo& includer = it->second;
+ set<const FileEntry*> incs = includer.direct_includes_as_fileentries();
+ const string includer_path = GetFilePath(it->first);
+ for (const FileEntry* include : incs) {
+ const string includee_path = GetFilePath(include);
+ if (GlobalIncludePicker().HasMapping(includee_path, includer_path)) {
+ includer.ReportIncludeFileUse(include,
+ ConvertToQuotedInclude(includee_path));
+ ERRSYM(it->first) << "Marked dep: " << includer_path << " needs to keep"
+ << " " << includee_path << " (reason: re-exports)\n";
+ }
+ }
+ }
+}
+
+// Called when a #include is encountered. i_n_a_t includes <> or "".
+// We keep track of this information in two places:
+// 1) iwyu_file_info_map_ maps the includer as a FileEntry* to the
+// includee both as the literal name used and as a FileEntry*.
+// 2) include_to_fileentry_map_ maps the includee's literal name
+// as written to the FileEntry* used. This can be used (in a
+// limited way, due to non-uniqueness concerns) to map between
+// names and FileEntries.
+// We also tell this #include to the include-picker, which may
+// use it to fine-tune its include-picking algorithms.
+void IwyuPreprocessorInfo::AddDirectInclude(
+ SourceLocation includer_loc, const FileEntry* includee,
+ const string& include_name_as_written) {
+ if (IsBuiltinOrCommandLineFile(includee))
+ return;
+
+ // For files we're going to be reporting IWYU errors for, we need
+ // both forms of the includee to be specified. For other files, we
+ // don't care as much.
+ const FileEntry* includer = GetFileEntry(includer_loc);
+ if (ShouldReportIWYUViolationsFor(includer)) {
+ CHECK_(includee != nullptr);
+ CHECK_(!include_name_as_written.empty());
+ }
+ ++num_includes_seen_[includer];
+
+ GetFromFileInfoMap(includer)->AddInclude(
+ includee, include_name_as_written, GetLineNumber(includer_loc));
+ // Make sure the includee has a file-info-map entry too.
+ InsertIntoFileInfoMap(includee, include_name_as_written);
+
+ // The first #include in every translation unit might be a precompiled header
+ // and we need to mark it as such for later analysis.
+ bool is_includer_main_compilation_unit = main_file_ && includer == main_file_;
+ if (is_includer_main_compilation_unit && num_includes_seen_[includer] == 1) {
+ CHECK_(includee && "The first #include must be an actual file.");
+
+ // Now we know includee is the first included header file. Mark it as
+ // pch-in-code if the user requested it on command-line.
+ if (GlobalFlags().pch_in_code) {
+ IwyuFileInfo *includee_file_info = GetFromFileInfoMap(includee);
+ includee_file_info->set_pch_in_code();
+ includee_file_info->set_prefix_header();
+ VERRS(4) << "Marked " << GetFilePath(includee) << " as pch-in-code.\n";
+ }
+ }
+
+ // We have a rule that if foo.h #includes bar.h, foo.cc doesn't need
+ // to #include bar.h as well, but instead gets it 'automatically'
+ // via foo.h. We say that 'foo.h' is an "associated header" for
+ // foo.cc. Make sure we ignore self-includes, though!
+ // iwyu_output.cc gets upset if a file is its own associated header.
+ if (includer == main_file_ && includee != includer &&
+ BelongsToMainCompilationUnit(includer, includee)) {
+ GetFromFileInfoMap(includer)
+ ->AddAssociatedHeader(GetFromFileInfoMap(includee));
+ VERRS(4) << "Marked " << GetFilePath(includee)
+ << " as associated header of " << GetFilePath(includer) << ".\n";
+ }
+
+ // Besides marking headers as "associated header" with heuristics, the user
+ // can directly mark headers with the associated pragma.
+ const FileEntry* associated_includer =
+ GetFileEntry(associated_pragma_location_);
+ if (associated_pragma_location_.isValid() &&
+ associated_includer == includer) {
+ GetFromFileInfoMap(includer)->AddAssociatedHeader(
+ GetFromFileInfoMap(includee));
+ VERRS(4) << "Marked " << GetFilePath(includee)
+ << " as associated header of " << GetFilePath(includer)
+ << " due to associated pragma.\n";
+
+ AddGlobToReportIWYUViolationsFor(GetFilePath(includee));
+ associated_pragma_location_ = SourceLocation();
+ }
+
+ // Also keep track of what FileEntry we ended up using for this name.
+ // Because we use #include-next, the same include-name can map to
+ // several files; we use the first such mapping we see, which is the
+ // top of the #include-next chain.
+ if (!include_name_as_written.empty()) {
+ if (!ContainsKey(include_to_fileentry_map_, include_name_as_written)) {
+ include_to_fileentry_map_[include_name_as_written] = includee;
+ }
+ }
+
+ // Tell the include-picker about this new include.
+ MutableGlobalIncludePicker()->AddDirectInclude(
+ GetFilePath(includer), GetFilePath(includee), include_name_as_written);
+
+ MaybeProtectInclude(includer_loc, includee, include_name_as_written);
+
+ ERRSYM(includer) << "Added an #include: " << GetFilePath(includer)
+ << " -> " << include_name_as_written << "\n";
+}
+
+//------------------------------------------------------------
+// Preprocessor event handlers.
+
+// Called whenever a macro is expanded. Example: when FOO(a, b) is
+// seen in the source code, where FOO() is a macro #defined earlier,
+// MacroExpands() will be called once with 'macro_use_token' being
+// FOO, and 'directive' containing more information about FOO's
+// definition.
+void IwyuPreprocessorInfo::MacroExpands(const Token& macro_use_token,
+ const MacroDefinition& definition,
+ SourceRange range,
+ const clang::MacroArgs* /*args*/) {
+ const FileEntry* macro_file = GetFileEntry(macro_use_token);
+ const MacroInfo* macro_def = definition.getMacroInfo();
+ if (ShouldPrintSymbolFromFile(macro_file)) {
+ errs() << "[ Use macro ] "
+ << PrintableLoc(macro_use_token.getLocation())
+ << ": " << GetName(macro_use_token) << " "
+ << "(from " << PrintableLoc(macro_def->getDefinitionLoc()) << ")\n";
+ }
+
+ ReportMacroUse(GetName(macro_use_token),
+ macro_use_token.getLocation(),
+ macro_def->getDefinitionLoc());
+}
+
+void IwyuPreprocessorInfo::MacroDefined(const Token& id,
+ const MacroDirective* directive) {
+ const MacroInfo* macro = directive->getMacroInfo();
+ const SourceLocation macro_loc = macro->getDefinitionLoc();
+ ERRSYM(GetFileEntry(macro_loc))
+ << "[ #define ] " << PrintableLoc(macro_loc)
+ << ": " << GetName(id) << "\n";
+ // We'd like to do an iwyu check on every token in the macro
+ // definition, but without knowing how and where the macro will be
+ // used, we don't have enough context to. But we *can* check those
+ // tokens that are macro calls: that is, one macro calling another.
+ // We can't do the checking as we go, since macros can refer to
+ // macros that come after them in the source file, so we just store
+ // every macro that's defined, and every macro it calls from its
+ // body, and then after reading the whole file we do an iwyu
+ // analysis on the results. (This can make mistakes if the code
+ // #undefs and re-defines a macro, but should work fine in practice.)
+ if (macro_loc.isValid())
+ macros_definition_loc_[GetName(id)] = macro_loc;
+ for (MacroInfo::tokens_iterator it = macro->tokens_begin();
+ it != macro->tokens_end(); ++it) {
+ const Token& token_in_macro = *it;
+ if (token_in_macro.getKind() == clang::tok::identifier &&
+ token_in_macro.getIdentifierInfo()->hasMacroDefinition()) {
+ macros_called_from_macros_.push_back(token_in_macro);
+ }
+ }
+}
+
+void IwyuPreprocessorInfo::If(SourceLocation loc, SourceRange condition_range,
+ ConditionValueKind condition_value) {
+ ERRSYM(GetFileEntry(condition_range.getBegin()))
+ << " [ #if ] "
+ << PrintableSourceRange(condition_range) << "\n";
+ CheckIfOrElif(condition_range);
+}
+
+void IwyuPreprocessorInfo::Elif(SourceLocation loc,
+ SourceRange condition_range,
+ ConditionValueKind condition_value,
+ SourceLocation if_loc) {
+ ERRSYM(GetFileEntry(condition_range.getBegin()))
+ << " [ #elif ] "
+ << PrintableSourceRange(condition_range) << "\n";
+ CheckIfOrElif(condition_range);
+}
+
+void IwyuPreprocessorInfo::Ifdef(SourceLocation loc,
+ const Token& id,
+ const MacroDefinition& /*definition*/) {
+ ERRSYM(GetFileEntry(id.getLocation()))
+ << "[ #ifdef ] " << PrintableLoc(id.getLocation())
+ << ": " << GetName(id) << "\n";
+ FindAndReportMacroUse(GetName(id), id.getLocation());
+}
+
+void IwyuPreprocessorInfo::Ifndef(SourceLocation loc,
+ const Token& id,
+ const MacroDefinition& /*definition*/) {
+ ERRSYM(GetFileEntry(id.getLocation()))
+ << "[ #ifndef ] " << PrintableLoc(id.getLocation())
+ << ": " << GetName(id) << "\n";
+ FindAndReportMacroUse(GetName(id), id.getLocation());
+}
+
+void IwyuPreprocessorInfo::InclusionDirective(
+ SourceLocation hash_loc,
+ const Token& include_token,
+ StringRef filename,
+ bool is_angled,
+ clang::CharSourceRange filename_range,
+ const FileEntry* file,
+ StringRef search_path,
+ StringRef relative_path,
+ const clang::Module* imported) {
+ include_filename_loc_ = filename_range.getBegin();
+}
+
+void IwyuPreprocessorInfo::FileChanged(SourceLocation loc,
+ FileChangeReason reason,
+ SrcMgr::CharacteristicKind file_type,
+ FileID exiting_from_id) {
+ switch (reason) {
+ case EnterFile:
+ FileChanged_EnterFile(loc);
+ return;
+ case ExitFile:
+ FileChanged_ExitToFile(
+ loc, GlobalSourceManager()->getFileEntryForID(exiting_from_id));
+ return;
+ case RenameFile:
+ FileChanged_RenameFile(loc);
+ return;
+ case SystemHeaderPragma:
+ // We see "#pragma GCC system_header".
+ FileChanged_SystemHeaderPragma(loc);
+ return;
+ }
+ CHECK_UNREACHABLE_("Unknown file change reason");
+}
+
+// Called when we see an #include, but decide we don't need to
+// actually read it because it's already been #included (and is
+// protected by a header guard).
+void IwyuPreprocessorInfo::FileSkipped(const FileEntry& file,
+ const Token &filename,
+ SrcMgr::CharacteristicKind file_type) {
+ CHECK_(include_filename_loc_.isValid() &&
+ "Must skip file only for actual inclusion directive");
+ const string include_name_as_written =
+ GetIncludeNameAsWritten(include_filename_loc_);
+ const SourceLocation include_loc =
+ GetInstantiationLoc(filename.getLocation());
+ ERRSYM(GetFileEntry(include_loc))
+ << "[ (#include) ] " << include_name_as_written
+ << " (" << GetFilePath(&file) << ")\n";
+
+ AddDirectInclude(include_loc, &file, include_name_as_written);
+ if (ShouldReportIWYUViolationsFor(&file)) {
+ files_to_report_iwyu_violations_for_.insert(&file);
+ }
+}
+
+// Called when a file is #included.
+void IwyuPreprocessorInfo::FileChanged_EnterFile(
+ SourceLocation file_beginning) {
+ // Get the location of the #include directive that resulted in the
+ // include of the file that file_beginning is in.
+ const SourceLocation include_loc = GlobalSourceManager()->getIncludeLoc(
+ GlobalSourceManager()->getFileID(file_beginning));
+ string include_name_as_written;
+ if (!IsBuiltinOrCommandLineFile(GetFileEntry(include_loc))) {
+ CHECK_(include_filename_loc_.isValid() &&
+ "Include from not built-in file must have inclusion directive");
+ include_name_as_written = GetIncludeNameAsWritten(include_filename_loc_);
+ }
+ ERRSYM(GetFileEntry(include_loc))
+ << "[ #include ] " << include_name_as_written
+ << " (" << GetFilePath(file_beginning) << ")\n";
+
+ const FileEntry* const new_file = GetFileEntry(file_beginning);
+ if (new_file)
+ AddDirectInclude(include_loc, new_file, include_name_as_written);
+
+ if (IsBuiltinOrCommandLineFile(new_file))
+ return;
+
+ ProcessHeadernameDirectivesInFile(file_beginning);
+
+ // The first non-special file entered is the main file.
+ if (main_file_ == nullptr)
+ main_file_ = new_file;
+
+ if (main_file_ != nullptr &&
+ BelongsToMainCompilationUnit(GetFileEntry(include_loc), new_file)) {
+ VERRS(5) << "Added to main compilation unit: "
+ << GetFilePath(new_file) << "\n";
+ AddGlobToReportIWYUViolationsFor(GetFilePath(new_file));
+ }
+ if (ShouldReportIWYUViolationsFor(new_file)) {
+ files_to_report_iwyu_violations_for_.insert(new_file);
+ }
+
+ // Mark is_prefix_header.
+ CHECK_(new_file && "is_prefix_header is applicable to usual files only");
+ IwyuFileInfo *includee_file_info = GetFromFileInfoMap(new_file);
+ const FileEntry* includer_file = GetFileEntry(include_loc);
+ bool is_prefix_header = false;
+ if (includer_file) {
+ // File included from another prefix header file is prefix header too.
+ IwyuFileInfo *includer_file_info = GetFromFileInfoMap(includer_file);
+ is_prefix_header = includer_file_info->is_prefix_header();
+ } else {
+ // Files included from command line are prefix headers, unless it's the
+ // main file.
+ is_prefix_header = (new_file != main_file_);
+ }
+ if (is_prefix_header)
+ includee_file_info->set_prefix_header();
+}
+
+// Called when done with an #included file and returning to the parent file.
+void IwyuPreprocessorInfo::FileChanged_ExitToFile(
+ SourceLocation include_loc, const FileEntry* exiting_from) {
+ ERRSYM(GetFileEntry(include_loc)) << "[ Exiting to ] "
+ << PrintableLoc(include_loc) << "\n";
+ if (HasOpenBeginExports(exiting_from)) {
+ Warn(begin_exports_location_stack_.top(),
+ "begin_exports without an end_exports");
+ begin_exports_location_stack_.pop();
+ }
+}
+
+void IwyuPreprocessorInfo::FileChanged_RenameFile(SourceLocation new_file) {
+ ERRSYM(GetFileEntry(new_file)) << "[ Renaming to ] "
+ << PrintableLoc(new_file) << "\n";
+}
+
+void IwyuPreprocessorInfo::FileChanged_SystemHeaderPragma(SourceLocation loc) {
+ ERRSYM(GetFileEntry(loc)) << "[ #pragma s_h ] "
+ << PrintableLoc(loc) << "\n";
+}
+
+//------------------------------------------------------------
+// Iwyu checkers.
+
+// Checks whether it's OK to use the given macro defined in file defined_in.
+void IwyuPreprocessorInfo::ReportMacroUse(const string& name,
+ SourceLocation usage_location,
+ SourceLocation dfn_location) {
+ // Don't report macro uses that aren't actually in a file somewhere.
+ if (!dfn_location.isValid() || GetFilePath(dfn_location) == "<built-in>")
+ return;
+ const FileEntry* used_in = GetFileEntry(usage_location);
+ if (ShouldReportIWYUViolationsFor(used_in)) {
+ // ignore symbols used outside foo.{h,cc}
+
+ // TODO(csilvers): this isn't really a symbol use -- it may be ok
+ // that the symbol isn't defined. For instance:
+ // foo.h: #define FOO
+ // bar.h: #ifdef FOO ... #else ... #endif
+ // baz.cc: #include "foo.h"
+ // #include "bar.h"
+ // bang.cc: #include "bar.h"
+ // We don't want to say that bar.h 'uses' FOO, and thus needs to
+ // #include foo.h -- adding that #include could break bang.cc.
+ // I think the solution is to have a 'soft' use -- don't remove it
+ // if it's there, but don't add it if it's not. Or something.
+ GetFromFileInfoMap(used_in)->ReportMacroUse(usage_location, dfn_location,
+ name);
+ }
+ const FileEntry* defined_in = GetFileEntry(dfn_location);
+ GetFromFileInfoMap(defined_in)->ReportDefinedMacroUse(used_in);
+}
+
+// As above, but get the definition location from macros_definition_loc_.
+void IwyuPreprocessorInfo::FindAndReportMacroUse(const string& name,
+ SourceLocation loc) {
+ if (const SourceLocation* dfn_loc
+ = FindInMap(&macros_definition_loc_, name)) {
+ ReportMacroUse(name, loc, *dfn_loc);
+ }
+}
+
+// Clang will give an OnExpandMacro() callback for all macro-tokens
+// used inside an #if or #elif, *except* macro-tokens used within a
+// 'define': for '#if FOO || defined(BAR)', clang calls
+// OnExpandMacro() for FOO, but not for BAR (since macros within
+// defined() aren't expanded). We catch BAR-type uses here.
+void IwyuPreprocessorInfo::CheckIfOrElif(SourceRange range) {
+ const vector<Token> defined_args =
+ FindArgumentsToDefined(range, DefaultDataGetter()); // in iwyu_lexer.h
+ for (const Token& token : defined_args) {
+ FindAndReportMacroUse(GetTokenText(token, DefaultDataGetter()),
+ token.getLocation());
+ }
+}
+
+//------------------------------------------------------------
+// Post-processing functions (done after all source is read).
+
+// Adds of includer's includes, direct or indirect, into retval.
+void IwyuPreprocessorInfo::AddAllIncludesAsFileEntries(
+ const FileEntry* includer, set<const FileEntry*>* retval) const {
+ set<const FileEntry*> direct_incs
+ = FileInfoOrEmptyFor(includer).direct_includes_as_fileentries();
+ for (const FileEntry* include : direct_incs) {
+ if (ContainsKey(*retval, include)) // avoid infinite recursion
+ continue;
+ retval->insert(include);
+ AddAllIncludesAsFileEntries(include, retval);
+ }
+}
+
+void IwyuPreprocessorInfo::PopulateIntendsToProvideMap() {
+ CHECK_(intends_to_provide_map_.empty() && "Should only call this fn once");
+ // Figure out which of the header files we have are public. We'll
+ // map each one to a set of all private header files that map to it.
+ map<const FileEntry*, set<const FileEntry*>> private_headers_behind;
+ for (const auto& fileinfo : iwyu_file_info_map_) {
+ const FileEntry* header = fileinfo.first;
+ const vector<string> public_headers_for_header =
+ GlobalIncludePicker().GetCandidateHeadersForFilepath(
+ GetFilePath(header));
+ for (const string& pub : public_headers_for_header) {
+ if (const FileEntry* public_file
+ = GetOrDefault(include_to_fileentry_map_, pub, nullptr)) {
+ CHECK_(ContainsKey(iwyu_file_info_map_, public_file));
+ if (public_file != header) // no credit for mapping to yourself :-)
+ private_headers_behind[public_file].insert(header);
+ }
+ }
+ }
+ // Everyone gets to provide from their direct includes. Public
+ // headers gets to provide from *all* their includes. Likewise,
+ // when you bring in a public header (because it's one of your
+ // direct includes), you bring in all its includes as well.
+ // Basically, a public header is really an equivalence class of
+ // itself and all its direct includes.
+ // TODO(csilvers): use AddAssociatedHeaders() to get includes here.
+ const IncludePicker& picker = GlobalIncludePicker();
+ for (const auto& fileinfo : iwyu_file_info_map_) {
+ const FileEntry* file = fileinfo.first;
+ if (file == nullptr)
+ continue;
+ intends_to_provide_map_[file].insert(file); // Everyone provides itself!
+ if (picker.IsPublic(file)) {
+ AddAllIncludesAsFileEntries(file, &intends_to_provide_map_[file]);
+ } else {
+ const set<const FileEntry*>& direct_includes
+ = fileinfo.second.direct_includes_as_fileentries();
+ for (const FileEntry* inc : direct_includes) {
+ intends_to_provide_map_[file].insert(inc);
+ if (picker.IsPublic(inc))
+ AddAllIncludesAsFileEntries(inc, &intends_to_provide_map_[file]);
+ }
+ }
+ }
+ // Ugh, we can have two files with the same name, using
+ // #include-next (e.g. /usr/include/c++/vector and
+ // third_party/gcc3/vector). Merge them.
+ for (const auto& fileinfo : iwyu_file_info_map_) {
+ const FileEntry* file = fileinfo.first;
+ // See if a round-trip to string and back ends up at a different file.
+ const string quoted_include = ConvertToQuotedInclude(GetFilePath(file));
+ const FileEntry* other_file
+ = GetOrDefault(include_to_fileentry_map_, quoted_include, file);
+ if (other_file != file) {
+ InsertAllInto(intends_to_provide_map_[file],
+ &intends_to_provide_map_[other_file]);
+ // TODO(csilvers): this isn't enough if there are *more* than 2
+ // files with the same name.
+ intends_to_provide_map_[file] = intends_to_provide_map_[other_file];
+ }
+ }
+ // Finally, for convenience, we'll say every private header file
+ // intends to provide exactly what its public header files do.
+ // That way we don't always have to be mapping private headers to
+ // public ones before calling this function. Since we don't know
+ // exactly what public header a private header might map to (if it
+ // can map to more than one), we just union them all.
+ // TODO(csilvers): this can be bad: if i1.h maps to both p1.h and
+ // p2.h, and we end up picking p1.h, and we say that i1.h intends
+ // to provide symbols from p2.h, we're promising a lie. I think
+ // this is ok as long as IntendsToProvide means 'If when expanding
+ // a templated function or class in i1.h, you see the need for
+ // symbol Foo which isn't a template argument, don't worry about
+ // it.' Double check whether that's true.
+ for (const auto& header_map : private_headers_behind) {
+ const FileEntry* public_header = header_map.first;
+ for (const FileEntry* private_header : header_map.second) {
+ CHECK_(ContainsKey(intends_to_provide_map_, private_header));
+ InsertAllInto(intends_to_provide_map_[public_header],
+ &intends_to_provide_map_[private_header]);
+ }
+ }
+ // Show our work, at a high enough verbosity level.
+ for (const auto& header_map : intends_to_provide_map_) {
+ VERRS(4) << "Intends-to-provide for " << GetFilePath(header_map.first)
+ << ":\n";
+ for (const FileEntry* private_header : header_map.second) {
+ VERRS(4) << " " << GetFilePath(private_header) << "\n";
+ }
+ }
+}
+
+void IwyuPreprocessorInfo::PopulateTransitiveIncludeMap() {
+ CHECK_(transitive_include_map_.empty() && "Should only call this fn once");
+ for (const auto& fileinfo : iwyu_file_info_map_) {
+ const FileEntry* file = fileinfo.first;
+ transitive_include_map_[file].insert(file); // everyone includes itself!
+ AddAllIncludesAsFileEntries(file, &transitive_include_map_[file]);
+ }
+}
+
+//------------------------------------------------------------
+// The public API.
+
+void IwyuPreprocessorInfo::HandlePreprocessingDone() {
+ CHECK_(main_file_ && "Main file should be present");
+ FileChanged_ExitToFile(SourceLocation(), main_file_);
+
+ // In some cases, macros can refer to macros in files that are
+ // defined later in other files. In those cases, we can't
+ // do an iwyu check until all header files have been read.
+ // (For instance, if we see '#define FOO(x) BAR(!x)', BAR doesn't
+ // actually have to be defined until FOO is actually used, which
+ // could be later in the preprocessing.)
+ for (const Token& token : macros_called_from_macros_) {
+ FindAndReportMacroUse(GetName(token), token.getLocation());
+ }
+
+ // Other post-processing steps.
+ for (auto& file_info_map_entry : iwyu_file_info_map_) {
+ file_info_map_entry.second.HandlePreprocessingDone();
+ }
+ MutableGlobalIncludePicker()->FinalizeAddedIncludes();
+ ProtectReexportIncludes(&iwyu_file_info_map_);
+ PopulateIntendsToProvideMap();
+ PopulateTransitiveIncludeMap();
+}
+
+bool IwyuPreprocessorInfo::BelongsToMainCompilationUnit(
+ const FileEntry* includer, const FileEntry* includee) const {
+ // TODO: Should probably have a CHECK_(main_file_), but this method is
+ // currently sometimes called with a nullptr main_file_.
+ if (!includee)
+ return false;
+ if (GetCanonicalName(GetFilePath(includee)) ==
+ GetCanonicalName(GetFilePath(main_file_)))
+ return true;
+ // Heuristic: if the main compilation unit's *first* include is
+ // a file with the same basename, assume that it's the 'associated'
+ // .h file, even if the canonical names differ. This catches
+ // cases like 'foo/x.cc' #includes 'foo/public/x.h', or
+ // 'foo/mailserver/x.cc' #includes 'foo/public/x.h'.
+ // In the case of pch-in-code make this the *second* include,
+ // as the PCH must always be first.
+ int first_include_index = GlobalFlags().pch_in_code ? 2 : 1;
+ if (includer == main_file_ &&
+ ContainsKeyValue(num_includes_seen_, includer, first_include_index)) {
+ if (GetCanonicalName(Basename(GetFilePath(includee))) ==
+ GetCanonicalName(Basename(GetFilePath(main_file_))))
+ return true;
+ }
+ return false;
+}
+
+const FileEntry* IwyuPreprocessorInfo::IncludeToFileEntry(
+ const string quoted_include) const {
+ return GetOrDefault(include_to_fileentry_map_, quoted_include, nullptr);
+}
+
+IwyuFileInfo* IwyuPreprocessorInfo::FileInfoFor(const FileEntry* file) const {
+ return const_cast<IwyuFileInfo*>(FindInMap(&iwyu_file_info_map_, file));
+}
+
+const IwyuFileInfo& IwyuPreprocessorInfo::FileInfoOrEmptyFor(
+ const FileEntry* file) const {
+ const IwyuFileInfo* retval = FindInMap(&iwyu_file_info_map_, file);
+ if (retval)
+ return *retval;
+
+ return empty_file_info_;
+}
+
+bool IwyuPreprocessorInfo::PublicHeaderIntendsToProvide(
+ const FileEntry* public_header, const FileEntry* other_file) const {
+ if (const set<const FileEntry*>* provides
+ = FindInMap(&intends_to_provide_map_, public_header)) {
+ return ContainsKey(*provides, other_file);
+ }
+ return false;
+}
+
+bool IwyuPreprocessorInfo::FileTransitivelyIncludes(
+ const FileEntry* includer, const FileEntry* includee) const {
+ if (const set<const FileEntry*>* all_includes
+ = FindInMap(&transitive_include_map_, includer)) {
+ return ContainsKey(*all_includes, includee);
+ }
+ return false;
+}
+
+bool IwyuPreprocessorInfo::FileTransitivelyIncludes(
+ const FileEntry* includer, const string& quoted_includee) const {
+ if (const set<const FileEntry*>* all_includes
+ = FindInMap(&transitive_include_map_, includer)) {
+ for (const FileEntry* include : *all_includes) {
+ if (ConvertToQuotedInclude(GetFilePath(include)) == quoted_includee)
+ return true;
+ }
+ }
+ return false;
+}
+
+bool IwyuPreprocessorInfo::FileTransitivelyIncludes(
+ const string& quoted_includer, const FileEntry* includee) const {
+ for (const auto& entry : transitive_include_map_) {
+ if (ConvertToQuotedInclude(GetFilePath(entry.first)) == quoted_includer)
+ return ContainsKey(entry.second, includee);
+ }
+ return false;
+}
+
+bool IwyuPreprocessorInfo::IncludeIsInhibited(
+ const clang::FileEntry* file, const string& other_filename) const {
+ const set<string>* inhibited_includes = FindInMap(&no_include_map_, file);
+ return (inhibited_includes != nullptr) &&
+ ContainsKey(*inhibited_includes, other_filename);
+}
+
+bool IwyuPreprocessorInfo::ForwardDeclareIsInhibited(
+ const clang::FileEntry* file, const string& qualified_symbol_name) const {
+ const string normalized_symbol_name =
+ NormalizeNamespaces(qualified_symbol_name);
+ const set<string>* inhibited_forward_declares =
+ FindInMap(&no_forward_declare_map_, file);
+ return (inhibited_forward_declares != nullptr) &&
+ ContainsKey(*inhibited_forward_declares, normalized_symbol_name);
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_preprocessor.h b/iwyu_preprocessor.h
new file mode 100644
index 0000000..47fa79f
--- /dev/null
+++ b/iwyu_preprocessor.h
@@ -0,0 +1,364 @@
+//===--- iwyu_preprocessor.h - handle #includes/#defines for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The class that gets preprocessor callbacks: #includes, #defines,
+// #pragmas, and the like.
+//
+// It has three main tasks in iwyu:
+//
+// 1) Record the #include hierarchy. For each file it sees, it creates
+// an IwyuOutput class for that file, which is set up to hold the direct
+// includes that the file has.
+//
+// 2) Record iwyu violations for macro uses. In particular, if a macro
+// is #defined in one file and the token is accessed in another, do an
+// iwyu check on that use.
+//
+
+// 3) Process iwyu pragma-like constructs. Comments beginning "//"
+// are allowed to follow any pragma, otherwise extraneous text on the
+// line will result in an error message being logged. Here are the
+// constructs we look for:
+// Full-line constructs:
+// a) // IWYU pragma: private, include "foo/bar/baz.h"
+// b) // IWYU pragma: private
+// c) // IWYU pragma: begin_exports
+// d) // IWYU pragma: end_exports
+// e) // IWYU pragma: no_include "foo/bar/baz.h"
+// f) // IWYU pragma: no_forward_declare foo::Bar
+// g) // IWYU pragma: friend <regexp>
+// // IWYU pragma: friend "<regexp>" -- needed if spaces in regexp.
+// 'Annotation' constructs:
+// h) #include "foo/bar/baz.h" // IWYU pragma: export
+// i) #include "foo/bar/baz.h" // IWYU pragma: keep
+//
+// 4) Process doxygen @headername directives. In later versions of GCC,
+// these directives are like IWYU pragma private directives:
+// @headername{foo} means to include <foo> instead.
+// The arguments are allowed to be a comma-separated list.
+// See
+// http://gcc.gnu.org/onlinedocs/libstdc++/manual/documentation_hacking.html
+//
+// This class finishes its processing before the 'main' iwyu
+// processing is done, so other iwyu consumers can access the main
+// outputs of this class:
+// * The map from include-name to FileEntry*.
+// * The map from FileEntry* to its IwyuFileInfo object.
+// * TODO(csilvers): Information about direct includes of a FileEntry*
+// * The 'intends to provide' map, which encapsulates some
+// of the information about public vs private headers.
+// * Testing and reporting membership in the main compilation unit.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_PREPROCESSOR_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_PREPROCESSOR_H_
+
+#include <map> // for map
+#include <set> // for set
+#include <stack> // for stack
+#include <string> // for string
+#include <utility> // for pair
+#include <vector> // for vector
+
+#include "iwyu_output.h"
+#include "port.h"
+
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/Preprocessor.h"
+#include "clang/Lex/PPCallbacks.h"
+#include "clang/Lex/Token.h"
+
+namespace clang {
+class FileEntry;
+class MacroInfo;
+} // namespace clang
+
+namespace include_what_you_use {
+
+using std::map;
+using std::pair;
+using std::set;
+using std::stack;
+using std::string;
+using std::vector;
+
+class IwyuPreprocessorInfo : public clang::PPCallbacks,
+ public clang::CommentHandler {
+ public:
+ IwyuPreprocessorInfo() : main_file_(nullptr),
+ empty_file_info_(nullptr, this, "") {}
+
+ // The client *must* call this from the beginning of HandleTranslationUnit()
+ void HandlePreprocessingDone();
+
+ // More direct ways of getting at this information
+ const clang::FileEntry* main_file() const {
+ return main_file_;
+ }
+
+ const set<const clang::FileEntry*>* files_to_report_iwyu_violations_for()
+ const {
+ return &files_to_report_iwyu_violations_for_;
+ }
+
+ // Given a quoted include like '<vector>', or '"ads/base.h"',
+ // returns the FileEntry for that file, or nullptr if none is
+ // found. If multiple files are included under the same
+ // quoted-include name (which can happen via #include-next),
+ // one is returned arbitrarily. (But always the same one.)
+ const clang::FileEntry* IncludeToFileEntry(const string quoted_include) const;
+
+ // Returns an IwyuFileInfo struct (from iwyu_output.h) corresponding
+ // to the given file, or nullptr if no such struct can be found.
+ // Note this is a const method that returns a non-const pointer.
+ // Be careful if using this method in threaded contexts.
+ IwyuFileInfo* FileInfoFor(const clang::FileEntry* file) const;
+
+ // Instead of returning nullptr if no file info can be found, returns
+ // an empty IwyuFileInfo struct.
+ const IwyuFileInfo& FileInfoOrEmptyFor(const clang::FileEntry* file) const;
+
+ // For every file we've seen (that is, that we've #included),
+ // returns what files it 'intends' to provide full type information
+ // for. The motivation is that a file like <vector> #includes
+ // <memory> and doesn't expect you to have to, even though
+ // technically it's required whenever you create a vector<Foo>,
+ // which is really vector<Foo, alloc<Foo>>. We say you don't have
+ // to #include <memory> because vector intends to provide the full
+ // types from <memory> for you.
+ // The rule we use is every file intends to provide full type
+ // information for the files it directly includes. For public
+ // header files -- ones that the include-picker can map another file
+ // to -- we relax the rule to say the public header intends to
+ // provide *every* header file behind it, direct or no. This scheme
+ // isn't perfect -- it says <map> intends to provide the full type
+ // of pair<>, when really it just uses it internally -- but it's a
+ // reasonable heuristic.
+ // Returns true iff our analysis shows that public_header intends
+ // to provide all the symbols in other_file.
+ bool PublicHeaderIntendsToProvide(const clang::FileEntry* public_header,
+ const clang::FileEntry* other_file) const;
+
+ // Returns true if the first file directly or indirectly includes
+ // the second.
+ bool FileTransitivelyIncludes(const clang::FileEntry* includer,
+ const clang::FileEntry* includee) const;
+ bool FileTransitivelyIncludes(const clang::FileEntry* includer,
+ const string& quoted_includee) const;
+ // This seems like a weird way to call this function, but we
+ // happen to need this in iwyu_output.cc:
+ bool FileTransitivelyIncludes(const string& quoted_includer,
+ const clang::FileEntry* includee) const;
+
+ // Return true if the given file has
+ // "// IWYU pragma: no_include <other_filename>".
+ bool IncludeIsInhibited(const clang::FileEntry* file,
+ const string& other_filename) const;
+
+ // Return true if the given file has
+ // "// IWYU pragma: no_forward_declare <qualified_symbol_name>".
+ bool ForwardDeclareIsInhibited(
+ const clang::FileEntry* file, const string& qualified_symbol_name) const;
+
+ protected:
+ // Preprocessor event handlers called by Clang.
+ void MacroExpands(const clang::Token& macro_use_token,
+ const clang::MacroDefinition& definition,
+ clang::SourceRange range,
+ const clang::MacroArgs* args) override;
+ void MacroDefined(const clang::Token& id,
+ const clang::MacroDirective* directive) override;
+ // Not needed for iwyu:
+ // virtual void MacroUndefined(const clang::Token&, const clang::MacroInfo*);
+
+ void If(clang::SourceLocation loc,
+ clang::SourceRange condition_range,
+ ConditionValueKind condition_value) override;
+ void Elif(clang::SourceLocation loc,
+ clang::SourceRange condition_range,
+ ConditionValueKind condition_value,
+ clang::SourceLocation if_loc) override;
+ void Ifdef(clang::SourceLocation loc, const clang::Token& id,
+ const clang::MacroDefinition& definition) override;
+ void Ifndef(clang::SourceLocation loc, const clang::Token& id,
+ const clang::MacroDefinition& definition) override;
+ // Not needed for iwyu:
+ // virtual void Else();
+ // virtual void Endif();
+
+ void InclusionDirective(clang::SourceLocation hash_loc,
+ const clang::Token& include_token,
+ llvm::StringRef filename, bool is_angled,
+ clang::CharSourceRange filename_range,
+ const clang::FileEntry* file,
+ llvm::StringRef search_path,
+ llvm::StringRef relative_path,
+ const clang::Module* imported) override;
+
+ void FileChanged(clang::SourceLocation loc, FileChangeReason reason,
+ clang::SrcMgr::CharacteristicKind file_type,
+ clang::FileID exiting_from_id) override;
+ void FileSkipped(const clang::FileEntry& file, const clang::Token &filename,
+ clang::SrcMgr::CharacteristicKind file_type) override;
+ // FileChanged is actually a multi-plexer for 4 different callbacks.
+ void FileChanged_EnterFile(clang::SourceLocation file_beginning);
+ void FileChanged_ExitToFile(clang::SourceLocation include_loc,
+ const clang::FileEntry* exiting_from);
+ void FileChanged_RenameFile(clang::SourceLocation new_file);
+ void FileChanged_SystemHeaderPragma(clang::SourceLocation loc);
+
+ // CommentHandler callback.
+ // Clang doc: The handler shall return true if it has pushed any
+ // tokens to be read using e.g. EnterToken or EnterTokenStream.
+ bool HandleComment(clang::Preprocessor& pp,
+ clang::SourceRange comment_range) override;
+
+ private:
+ // Returns true if includee is considered part of the main
+ // compilation unit. We always generate warnings for violations in
+ // files are part of the main compilation unit.
+ bool BelongsToMainCompilationUnit(const clang::FileEntry* includer,
+ const clang::FileEntry* includee) const;
+
+ // Creates a new iwyu_file_info_map_[file_entry] if it doesn't exist,
+ // or a noop otherwise. quoted_include_name is used to create the
+ // new entry if necessary.
+ void InsertIntoFileInfoMap(const clang::FileEntry* file,
+ const string& quoted_include_name);
+
+ // Helper function that returns iwyu_file_info_map_[file_entry] if
+ // it already exists, or creates a new one and returns it otherwise.
+ // If it creates a new one, it generates the quoted_include_name
+ // from the file-path for 'file'.
+ // TODO(csilvers): see if, in practice, all uses in here are just 'get's.
+ IwyuFileInfo* GetFromFileInfoMap(const clang::FileEntry* file);
+
+ // Helper for AddDirectInclude. Checks if we should protect the
+ // #include from iwyu removal.
+ void MaybeProtectInclude(clang::SourceLocation includer_loc,
+ const clang::FileEntry* includee,
+ const string& include_name_as_written);
+
+ // Called whenever an #include is seen in the preprocessor output.
+ void AddDirectInclude(clang::SourceLocation includer_loc,
+ const clang::FileEntry* includee,
+ const string& include_name_as_written);
+
+ // Report a "begin_exports"/"end_exports" pragma pair.
+ // begin_line is first line, end_line is just after the last line.
+ void AddExportedRange(const clang::FileEntry* file,
+ int begin_line, int end_line);
+
+ // Determine if the comment is a pragma, and if so, process it.
+ void HandlePragmaComment(clang::SourceRange comment_range);
+
+ // Process @headername directives in a file.
+ void ProcessHeadernameDirectivesInFile(clang::SourceLocation file_beginning);
+
+ // Checks whether it's OK to use the given macro defined in file defined_in.
+ void ReportMacroUse(const string& name,
+ clang::SourceLocation usage_location,
+ clang::SourceLocation dfn_location);
+
+ // As above, but get the definition location from macros_definition_loc_.
+ void FindAndReportMacroUse(const string& name, clang::SourceLocation loc);
+
+ void CheckIfOrElif(clang::SourceRange range);
+
+ // Final-processing routines done after all header files have been read.
+ void DoFinalMacroChecks();
+ // Helper for PopulateIntendsToProvideMap().
+ void AddAllIncludesAsFileEntries(const clang::FileEntry* includer,
+ set<const clang::FileEntry*>* retval) const;
+ void PopulateIntendsToProvideMap();
+ void PopulateTransitiveIncludeMap();
+
+ // Return true if at the current point in the parse of the given file,
+ // there is a pending "begin_exports" pragma.
+ bool HasOpenBeginExports(const clang::FileEntry* file) const;
+
+ // The C++ source file passed in as an argument to the compiler (as
+ // opposed to other files seen via #includes).
+ const clang::FileEntry* main_file_;
+
+ // All files that we should report iwyu violations in. It defaults
+ // to the "main compilation unit" (e.g. foo.cc, foo.h, foo-inl.h):
+ // main_file_ and its associated .h and -inl.h files, if they exist.
+ // But users can add to it via the --check_also flag.
+ set<const clang::FileEntry*> files_to_report_iwyu_violations_for_;
+
+ // These store macros seen, as we see them, and also macros that are
+ // called from other macros. We use this to do limited iwyu-testing
+ // on macro tokens (we'd love to test macro bodies more completely
+ // -- like we do template bodies -- but macros don't give us enough
+ // context to know how to interpret the tokens we see, in general).
+ map<string, clang::SourceLocation> macros_definition_loc_; // key: macro name
+
+ // This should logically be a set, but set<> needs Token::operator<
+ // which we don't have. Luckily, a vector works just as well.
+ vector<clang::Token> macros_called_from_macros_;
+
+ // This maps from the include-name as written in the program
+ // (including <>'s or ""'s) to the FileEntry we loaded for that
+ // #include.
+ map<string, const clang::FileEntry*> include_to_fileentry_map_;
+
+ map<const clang::FileEntry*, IwyuFileInfo> iwyu_file_info_map_;
+
+ // How many #include lines we've encountered from the given file.
+ map<const clang::FileEntry*, int> num_includes_seen_;
+
+ // Maps from a FileEntry* to all files that this file "intends" to
+ // provide the symbols from. For now, we say a file intentionally
+ // provides a symbol if it defines it, or if any file it directly
+ // #includes defines it. However, if the header is a private header
+ // -- as determined by the fact it's in the private->public header
+ // map -- we relax the second requirement to allow any file directly
+ // or indirectly included by the public file. This isn't perfect,
+ // but is as close as we can be to matching the intent of the author
+ // of the public/private system.
+ map<const clang::FileEntry*,
+ set<const clang::FileEntry*>> intends_to_provide_map_;
+
+ // Maps from a FileEntry* to all the files that this file includes,
+ // either directly or indirectly.
+ map<const clang::FileEntry*,
+ set<const clang::FileEntry*>> transitive_include_map_;
+
+ // Maps from a FileEntry* to the quoted names of files that its file
+ // is directed *not* to include via the "no_include" pragma.
+ map<const clang::FileEntry*, set<string>> no_include_map_;
+
+ // Maps from a FileEntry* to the qualified names of symbols that its
+ // file is directed *not* to forward-declare via the
+ // "no_forward_declare" pragma.
+ map<const clang::FileEntry*, set<string>> no_forward_declare_map_;
+
+ const IwyuFileInfo empty_file_info_;
+
+ // For processing pragmas. It is the current stack of open
+ // "begin_exports". There should be at most one item in this stack
+ // per file in the current inclusion chain..
+ stack<clang::SourceLocation> begin_exports_location_stack_;
+
+ // For processing associated pragma. It is the current open
+ // "associated" pragma.
+ clang::SourceLocation associated_pragma_location_;
+
+ // Filename spelling location in the last encountered inclusion directive.
+ // Should be used only in FileChanged_EnterFile, FileSkipped when
+ // corresponding callback is caused by inclusion directive. Don't use in
+ // other places because it is unclear which inclusion directive filename
+ // location corresponds to.
+ clang::SourceLocation include_filename_loc_;
+};
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_PREPROCESSOR_H_
diff --git a/iwyu_stl_util.h b/iwyu_stl_util.h
new file mode 100644
index 0000000..de1b808
--- /dev/null
+++ b/iwyu_stl_util.h
@@ -0,0 +1,150 @@
+//===--- iwyu_stl_util.h - STL-like utilities for include-what-you-use ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Utilities that make it easier to work with STL.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_STL_UTIL_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_STL_UTIL_H_
+
+#include <algorithm> // for find
+#include <map> // for map, multimap
+#include <set> // for set
+#include <vector> // for vector
+
+namespace include_what_you_use {
+
+using std::map;
+using std::multimap;
+using std::set;
+using std::vector;
+
+// Returns true if the associative container (e.g. set or map)
+// contains the given key.
+template <class AssociativeContainer>
+bool ContainsKey(const AssociativeContainer& container,
+ const typename AssociativeContainer::key_type& key) {
+ return container.find(key) != container.end();
+}
+
+// Returns true if the container contains the given value.
+template <class Container>
+bool ContainsValue(const Container& container,
+ const typename Container::value_type& value) {
+ return (std::find(container.begin(), container.end(), value)
+ != container.end());
+}
+
+// For maps, we also let you check if the key exists with the given value.
+template <class Container, typename K, typename V>
+bool ContainsKeyValue(const Container& container,
+ const K& key, const V& value) {
+ for (typename Container::const_iterator it = container.lower_bound(key),
+ end = container.upper_bound(key); it != end; ++it) {
+ if (it->second == value)
+ return true;
+ }
+ return false;
+}
+
+// Returns true if the associative container contains any key in the
+// given set.
+template <class AssociativeContainer>
+bool ContainsAnyKey(
+ const AssociativeContainer& container,
+ const set<typename AssociativeContainer::key_type>& keys) {
+ for (const auto& key : keys) {
+ if (ContainsKey(container, key))
+ return true;
+ }
+ return false;
+}
+
+// Returns a_map[key] if key is in a_map; otherwise returns default_value.
+template <class Map>
+const typename Map::mapped_type& GetOrDefault(
+ const Map& a_map, const typename Map::key_type& key,
+ const typename Map::mapped_type& default_value) {
+ if (ContainsKey(a_map, key))
+ return a_map.find(key)->second;
+ return default_value;
+}
+
+// Returns a pointer to (*a_map)[key] if key is in *a_map; otherwise
+// returns nullptr.
+template <typename K, typename V>
+const V* FindInMap(const map<K, V>* a_map, const K& key) {
+ const typename map<K, V>::const_iterator it = a_map->find(key);
+ return it == a_map->end() ? nullptr : &it->second;
+}
+template <typename K, typename V>
+V* FindInMap(map<K, V>* a_map, const K& key) {
+ const typename map<K, V>::iterator it = a_map->find(key);
+ return it == a_map->end() ? nullptr : &it->second;
+}
+
+// Returns all values associated with the given key in the multimap.
+template <typename K, typename V>
+vector<V> FindInMultiMap(const multimap<K, V>& a_multimap, const K& key) {
+ vector<V> retval;
+ for (typename multimap<K, V>::const_iterator it = a_multimap.lower_bound(key),
+ end = a_multimap.upper_bound(key); it != end; ++it) {
+ retval.push_back(it->second);
+ }
+ return retval;
+}
+
+// Removes all elements in source from target.
+template <class SourceContainer, class TargetContainer>
+void RemoveAllFrom(const SourceContainer& source, TargetContainer* target) {
+ for (typename SourceContainer::const_iterator it = source.begin();
+ it != source.end(); ++it) {
+ target->erase(*it);
+ }
+}
+
+// Inserts all elements from source into target.
+template <class SourceContainer, class TargetContainer>
+void InsertAllInto(const SourceContainer& source, TargetContainer* target) {
+ target->insert(source.begin(), source.end());
+}
+
+// Appends all elements from source to the end of target. The target
+// type must support inserting a range at the end, which probably
+// means it's a vector.
+template <class TargetContainer, class SourceContainer>
+void Extend(TargetContainer* target, const SourceContainer& source) {
+ target->insert(target->end(), source.begin(), source.end());
+}
+
+// Returns the union of the two given sets.
+template <typename T>
+set<T> Union(const set<T>& lhs, const set<T>& rhs) {
+ set<T> retval(lhs);
+ InsertAllInto(rhs, &retval);
+ return retval;
+}
+
+// Returns a vector v with all duplicates removed, but order otherwise
+// maintained.
+template <typename T>
+vector<T> GetUniqueEntries(const vector<T>& v) {
+ set<T> seen;
+ vector<T> retval;
+ for (typename vector<T>::const_iterator it = v.begin(); it != v.end(); ++it) {
+ if (!ContainsKey(seen, *it)) {
+ retval.push_back(*it);
+ seen.insert(*it);
+ }
+ }
+ return retval;
+}
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_STL_UTIL_H_
diff --git a/iwyu_string_util.h b/iwyu_string_util.h
new file mode 100644
index 0000000..f1b1e5e
--- /dev/null
+++ b/iwyu_string_util.h
@@ -0,0 +1,204 @@
+//===--- iwyu_string_util.h - string utilities for include-what-you-use ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// String utilities for the IWYU checker.
+//
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_STRING_UTIL_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_STRING_UTIL_H_
+
+#include <cctype>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+#include "port.h"
+
+namespace include_what_you_use {
+
+using std::string;
+using std::vector;
+
+// Returns true if str starts with prefix.
+inline bool StartsWith(const string& str, const string& prefix) {
+ return str.substr(0, prefix.length()) == prefix;
+}
+
+// Returns true if str ends with suffix.
+inline bool EndsWith(const string& str, const string& suffix) {
+ if (suffix.length() > str.length())
+ return false;
+ return str.substr(str.length() - suffix.length()) == suffix;
+}
+
+// If *str starts with prefix, removes the prefix and returns true.
+inline bool StripLeft(string* str, const string& prefix) {
+ if (StartsWith(*str, prefix)) {
+ *str = str->substr(prefix.length());
+ return true;
+ }
+
+ return false;
+}
+
+// If *str ends with suffix, removes the suffix and returns true.
+inline bool StripRight(string* str, const string& suffix) {
+ if (str->length() >= suffix.length() &&
+ str->substr(str->length() - suffix.length()) == suffix) {
+ *str = str->substr(0, str->length() - suffix.length());
+ return true;
+ }
+
+ return false;
+}
+
+// Truncate str to width with ellipses to indicate truncation.
+// Return str unchanged if it fits within width.
+// Return empty string if width is too short to fit anything meaningful.
+// Otherwise return str truncated to width chars.
+inline string Ellipsize(const string& str, size_t width) {
+ if (str.length() <= width)
+ return str;
+
+ // If we truncate strings too short, we'll end up with nonsense abbreviations
+ // like '...', 'T...' or 'Ty...' so make sure we have at least three chars
+ // from str and three chars for ellipsis.
+ if (width < 6)
+ return string();
+
+ return str.substr(0, width - 3) + "...";
+}
+
+// Finds the first occurrence of substr in *str and removes from *str
+// everything before the occurrence and the occurrence itself. For
+// example, string s = "What a hat!"; StripPast(&s, "hat"); will make s
+// " a hat!".
+inline bool StripPast(string* str, const string& substr) {
+ const size_t pos = str->find(substr);
+ if (pos == string::npos)
+ return false;
+
+ *str = str->substr(pos + substr.length());
+ return true;
+}
+
+// Removes leading whitespace.
+inline void StripWhiteSpaceLeft(string* str) {
+ for (string::size_type i = 0; i < str->size(); ++i) {
+ if (!isspace((*str)[i])) {
+ *str = str->substr(i);
+ return;
+ }
+ }
+ // Everything is whitespace. Return with an empty string.
+ str->clear();
+}
+
+// Removes trailing whitespace.
+inline void StripWhiteSpaceRight(string* str) {
+ for (string::size_type end_of_string = str->size();
+ end_of_string > 0; --end_of_string) {
+ if (!isspace((*str)[end_of_string - 1])) {
+ *str = str->substr(0, end_of_string);
+ return;
+ }
+ }
+ // Everything is whitespace. Return with an empty string.
+ str->clear();
+}
+
+// Removes both leading and trailing whitespace.
+inline void StripWhiteSpace(string* str) {
+ StripWhiteSpaceLeft(str);
+ StripWhiteSpaceRight(str);
+}
+
+// This is the same as split() in Python. If max_segs is 0, there's
+// no limit on the number of the generated segments.
+inline vector<string> Split(
+ string str, const string& divider, size_t max_segs) {
+ CHECK_(!divider.empty());
+ vector<string> retval;
+ size_t pos;
+ // If max_segs is 0, the first part of the condition will always be true.
+ while (retval.size() + 1 != max_segs &&
+ (pos = str.find(divider)) != string::npos) {
+ retval.push_back(str.substr(0, pos));
+ str = str.substr(pos + divider.length());
+ }
+ retval.push_back(str);
+ return retval;
+}
+
+// Like Split, but using a divider of arbitrary whitespace.
+// Whitespace at the beginning and end is ignored.
+inline vector<string> SplitOnWhiteSpace(const string& str, size_t max_segs) {
+ vector<string> retval;
+ size_t tokstart = string::npos;
+ for (size_t pos = 0; pos < str.size(); ++pos) {
+ if (isspace(str[pos])) {
+ if (tokstart != string::npos) {
+ retval.push_back(str.substr(tokstart, pos - tokstart));
+ if (retval.size() == max_segs) {
+ return retval;
+ }
+ tokstart = string::npos;
+ }
+ } else {
+ if (tokstart == string::npos) {
+ tokstart = pos;
+ }
+ }
+ }
+ if (tokstart != string::npos) {
+ retval.push_back(str.substr(tokstart));
+ }
+ return retval;
+}
+
+// Like SplitOnWhiteSpace, but double-quoted and bracketed strings are
+// preserved. No error checking with respect to closing quotes is done.
+inline vector<string> SplitOnWhiteSpacePreservingQuotes(
+ const string& str, size_t max_segs) {
+ vector<string> retval;
+ size_t tokstart = string::npos;
+ char closing_quote = '\0';
+ for (size_t pos = 0; pos < str.size(); ++pos) {
+ if (isspace(str[pos])) {
+ if (tokstart != string::npos && closing_quote == '\0') {
+ retval.push_back(str.substr(tokstart, pos - tokstart));
+ if (retval.size() == max_segs) {
+ return retval;
+ }
+ tokstart = string::npos;
+ }
+ } else {
+ if (tokstart == string::npos) {
+ tokstart = pos;
+ if (str[pos] == '"') {
+ closing_quote = '"';
+ } else if (str[pos] == '<') {
+ closing_quote = '>';
+ } else {
+ closing_quote = '\0';
+ }
+ } else if (str[pos] == closing_quote) {
+ closing_quote = '\0';
+ }
+ }
+ }
+ if (tokstart != string::npos) {
+ retval.push_back(str.substr(tokstart));
+ }
+ return retval;
+}
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_STRING_UTIL_H_
diff --git a/iwyu_test_util.py b/iwyu_test_util.py
new file mode 100755
index 0000000..dfe37b6
--- /dev/null
+++ b/iwyu_test_util.py
@@ -0,0 +1,455 @@
+#!/usr/bin/env python
+
+##===--- iwyu_test_util.py - include-what-you-use test framework -----------===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===-----------------------------------------------------------------------===##
+
+"""Utilities for writing tests for IWYU.
+
+This script has been tested with python 2.7, 3.1.3 and 3.2.
+In order to support all of these platforms there are a few unusual constructs:
+ * print statements require parentheses
+ * standard output must be decoded as utf-8
+ * range() must be used in place of xrange()
+ * _PortableNext() is used to obtain next iterator value
+
+There is more detail on some of these issues at:
+http://diveintopython3.org/porting-code-to-python-3-with-2to3.html
+"""
+
+__author__ = 'wan@google.com (Zhanyong Wan)'
+
+import difflib
+import operator
+import os
+import re
+import subprocess
+import sys
+
+# These are the warning/error lines that iwyu.cc produces when --verbose >= 3
+_EXPECTED_DIAGNOSTICS_RE = re.compile(r'^\s*//\s*IWYU:\s*(.*)$')
+_ACTUAL_DIAGNOSTICS_RE = re.compile(r'^(.*?):(\d+):\d+:\s*'
+ r'(?:warning|error|fatal error):\s*(.*)$')
+
+# This is the final summary output that iwyu.cc produces when --verbose >= 1
+# The summary for a given source file should appear in that source file,
+# surrounded by '/**** IWYU_SUMMARY' and '***** IWYU_SUMMARY */'.
+_EXPECTED_SUMMARY_START_RE = re.compile(r'/\*+\s*IWYU_SUMMARY')
+_EXPECTED_SUMMARY_END_RE = re.compile(r'\**\s*IWYU_SUMMARY\s*\*+/')
+_ACTUAL_SUMMARY_START_RE = re.compile(r'^(.*?) should add these lines:$')
+_ACTUAL_SUMMARY_END_RE = re.compile(r'^---$')
+_ACTUAL_REMOVAL_LIST_START_RE = re.compile(r'.* should remove these lines:$')
+_NODIFFS_RE = re.compile(r'^\((.*?) has correct #includes/fwd-decls\)$')
+
+
+def _PortableNext(iterator):
+ if hasattr(iterator, 'next'):
+ iterator.next() # Python 2.4-2.6
+ else:
+ next(iterator) # Python 3
+
+
+def _Which(program, paths):
+ """Searches specified paths for program."""
+ if sys.platform == 'win32' and not program.lower().endswith('.exe'):
+ program += '.exe'
+
+ for path in paths:
+ candidate = os.path.join(os.path.normpath(path), program)
+ if os.path.isfile(candidate):
+ return candidate
+
+ return None
+
+
+_IWYU_PATH = None
+_SYSTEM_PATHS = [p.strip('"') for p in os.environ["PATH"].split(os.pathsep)]
+_IWYU_PATHS = [
+ '../../../../Debug+Asserts/bin',
+ '../../../../Release+Asserts/bin',
+ '../../../../Release/bin',
+ '../../../../build/Debug+Asserts/bin',
+ '../../../../build/Release+Asserts/bin',
+ '../../../../build/Release/bin',
+ # Linux/Mac OS X default out-of-tree paths.
+ '../../../../../build/Debug+Asserts/bin',
+ '../../../../../build/Release+Asserts/bin',
+ '../../../../../build/Release/bin',
+ # Windows default out-of-tree paths.
+ '../../../../../build/bin/Debug',
+ '../../../../../build/bin/Release',
+ '../../../../../build/bin/MinSizeRel',
+ '../../../../../build/bin/RelWithDebInfo',
+ ]
+
+
+def SetIwyuPath(iwyu_path):
+ """Set the path to the IWYU executable under test.
+ """
+ global _IWYU_PATH
+ _IWYU_PATH = iwyu_path
+
+
+def _GetIwyuPath():
+ """Returns the path to IWYU or raises IOError if it cannot be found."""
+ global _IWYU_PATH
+
+ if not _IWYU_PATH:
+ iwyu_paths = _IWYU_PATHS + _SYSTEM_PATHS
+ _IWYU_PATH = _Which('include-what-you-use', iwyu_paths)
+ if not _IWYU_PATH:
+ raise IOError('Failed to locate IWYU.\nSearched\n %s' %
+ '\n '.join(iwyu_paths))
+
+ return _IWYU_PATH
+
+
+def _ShellQuote(arg):
+ if ' ' in arg:
+ arg = '"' + arg + '"'
+ return arg
+
+
+def _GetCommandOutput(command):
+ p = subprocess.Popen(command,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ stdout, _ = p.communicate()
+ lines = stdout.decode("utf-8").splitlines(True)
+ lines = [line.replace(os.linesep, '\n') for line in lines]
+ return lines
+
+
+def _GetMatchingLines(regex, file_names):
+ """Returns a map: file location => string matching `regex`.
+
+ File location is a tuple (file_name, line number starting from 1)."""
+
+ loc_to_line = {}
+ for file_name in file_names:
+ with open(file_name) as fileobj:
+ for line_num, line in enumerate(fileobj):
+ m = regex.match(line)
+ if m:
+ loc_to_line[file_name, line_num + 1] = m.group()
+ return loc_to_line
+
+
+def _GetExpectedDiagnosticRegexes(spec_loc_to_line):
+ """Returns a map: source file location => list of regexes for that line."""
+
+ # Maps a source file line location to a list of regexes for diagnostics
+ # that should be generated for that line.
+ expected_diagnostic_regexes = {}
+ regexes = []
+ for loc in sorted(spec_loc_to_line.keys()):
+ line = spec_loc_to_line[loc]
+ m = _EXPECTED_DIAGNOSTICS_RE.match(line.strip())
+ assert m is not None, "Input should contain only matching lines."
+ regex = m.group(1)
+ if not regex:
+ # Allow the regex to be omitted if we are uninterested in the
+ # diagnostic message.
+ regex = r'.*'
+ regexes.append(re.compile(regex))
+ # Do we have a spec on the next line?
+ path, line_num = loc
+ next_line_loc = path, line_num + 1
+ if next_line_loc not in spec_loc_to_line:
+ expected_diagnostic_regexes[next_line_loc] = regexes
+ regexes = []
+
+ return expected_diagnostic_regexes
+
+
+def _GetActualDiagnostics(actual_output):
+ """Returns a map: source file location => list of diagnostics on that line.
+
+ The elements of the list are unique and sorted."""
+
+ actual_diagnostics = {}
+ for line in actual_output:
+ m = _ACTUAL_DIAGNOSTICS_RE.match(line.strip())
+ if m:
+ path, line_num, message = m.groups()
+ loc = path, int(line_num)
+ actual_diagnostics[loc] = actual_diagnostics.get(loc, []) + [message]
+
+ locs = actual_diagnostics.keys()
+ for loc in locs:
+ actual_diagnostics[loc] = sorted(set(actual_diagnostics[loc]))
+
+ return actual_diagnostics
+
+
+def _StripCommentFromLine(line):
+ """Removes the "// ..." comment at the end of the given line."""
+
+ m = re.match(r'(.*)//', line)
+ if m:
+ return m.group(1).strip() + '\n'
+ else:
+ return line
+
+
+def _NormalizeSummaryLineNumbers(line):
+ """Replaces the comment '// lines <number>-<number>' with '// lines XX-YY'.
+
+ Because line numbers in the source code often change, it's a pain to
+ keep the '// lines <number>-<number>' comments accurate in our
+ 'golden' output. Instead, we normalize these iwyu comments to just
+ say how many line numbers are listed by mapping the output to
+ '// lines XX-XX' (for one-line spans) or '// lines XX-XX+<number>'.
+ For instance, '// lines 12-12' would map to '// lines XX-XX', while
+ '// lines 12-14' would map to '//lines XX-XX+2'.
+
+ Arguments:
+ line: the line to be normalized.
+
+ Returns:
+ A new line with the '// lines' comment, if any, normalized as
+ described above. If no '// lines' comment is present, returns
+ the original line.
+ """
+ m = re.search('// lines ([0-9]+)-([0-9]+)', line)
+ if not m:
+ return line
+ if m.group(1) == m.group(2):
+ return line[:m.start()] + '// lines XX-XX\n'
+ else:
+ num_lines = int(m.group(2)) - int(m.group(1))
+ return line[:m.start()] + '// lines XX-XX+%d\n' % num_lines
+
+
+def _NormalizeSummaryLine(line):
+ """Alphabetically sorts the symbols in the '// for XXX, YYY, ZZZ' comments.
+
+ Most iwyu summary lines have the form
+ #include <foo.h> // for XXX, YYY, ZZZ
+ XXX, YYY, ZZZ are symbols that this file uses from foo.h. They are
+ sorted in frequency order, but that changes so often as the test is
+ augmented, that it's impractical to test. We just sort the symbols
+ alphabetically and compare that way. This means we never test the
+ frequency ordering here, but that's a small price to pay for easier
+ testing development.
+
+ We also always move the '// for' comment to be exactly two spaces
+ after the '#include' text. Again, this means we don't test the
+ indenting correctly (though iwyu_output_test.cc does), but allows us
+ to rename filenames without having to reformat each test. This is
+ particularly important when opensourcing, since the filenames will
+ be different in opensource-land than they are inside google.
+
+ Arguments:
+ line: one line of the summary output
+
+ Returns:
+ A normalized form of 'line', with the 'why' symbols sorted and
+ whitespace before the 'why' comment collapsed.
+ """
+ m = re.match(r'(.*?)\s* // for (.*)', line)
+ if not m:
+ return line
+ symbols = m.group(2).strip().split(', ')
+ symbols.sort()
+ return '%s // for %s\n' % (m.group(1), ', '.join(symbols))
+
+
+def _GetExpectedSummaries(files):
+ """Returns a map: source file => list of iwyu summary lines."""
+
+ expected_summaries = {}
+ for f in files:
+ in_summary = False
+ fh = open(f)
+ for line in fh:
+ if _EXPECTED_SUMMARY_START_RE.match(line):
+ in_summary = True
+ expected_summaries[f] = []
+ elif _EXPECTED_SUMMARY_END_RE.match(line):
+ in_summary = False
+ elif re.match(r'^\s*//', line):
+ pass # ignore comment lines
+ elif in_summary:
+ expected_summaries[f].append(line)
+ fh.close()
+
+ # Get rid of blank lines at the beginning and end of the each summary.
+ for loc in expected_summaries:
+ while expected_summaries[loc] and expected_summaries[loc][-1] == '\n':
+ expected_summaries[loc].pop()
+ while expected_summaries[loc] and expected_summaries[loc][0] == '\n':
+ expected_summaries[loc].pop(0)
+
+ return expected_summaries
+
+
+def _GetActualSummaries(output):
+ """Returns a map: source file => list of iwyu summary lines."""
+
+ actual_summaries = {}
+ file_being_summarized = None
+ in_addition_section = False # Are we in the "should add these lines" section?
+ for line in output:
+ # For files with no diffs, we print a different (one-line) summary.
+ m = _NODIFFS_RE.match(line)
+ if m:
+ actual_summaries[m.group(1)] = [line]
+ continue
+
+ m = _ACTUAL_SUMMARY_START_RE.match(line)
+ if m:
+ file_being_summarized = m.group(1)
+ in_addition_section = True
+ actual_summaries[file_being_summarized] = [line]
+ elif _ACTUAL_SUMMARY_END_RE.match(line):
+ file_being_summarized = None
+ elif file_being_summarized:
+ if _ACTUAL_REMOVAL_LIST_START_RE.match(line):
+ in_addition_section = False
+ # Replace any line numbers in comments with something more stable.
+ line = _NormalizeSummaryLineNumbers(line)
+ if in_addition_section:
+ # Each #include in the "should add" list will appear later in
+ # the full include list. There's no need to verify its symbol
+ # list twice. Therefore we remove the symbol list here for
+ # easy test maintenance.
+ line = _StripCommentFromLine(line)
+ else:
+ line = _NormalizeSummaryLine(line)
+ actual_summaries[file_being_summarized].append(line)
+
+ return actual_summaries
+
+
+def _VerifyDiagnosticsAtLoc(loc_str, regexes, diagnostics):
+ """Verify the diagnostics at the given location; return a list of failures."""
+
+ # Find out which regexes match a diagnostic and vice versa.
+ matching_regexes = [[] for unused_i in range(len(diagnostics))]
+ matched_diagnostics = [[] for unused_i in range(len(regexes))]
+ for (r_index, regex) in enumerate(regexes):
+ for (d_index, diagnostic) in enumerate(diagnostics):
+ if regex.search(diagnostic):
+ matching_regexes[d_index].append(r_index)
+ matched_diagnostics[r_index].append(d_index)
+
+ failure_messages = []
+
+ # Collect unmatched diagnostics and multiply matched diagnostics.
+ for (d_index, r_indexes) in enumerate(matching_regexes):
+ if not r_indexes:
+ failure_messages.append('Unexpected diagnostic:\n%s\n'
+ % diagnostics[d_index])
+ elif len(r_indexes) > 1:
+ failure_messages.append(
+ 'The diagnostic message:\n%s\n'
+ 'matches multiple regexes:\n%s'
+ % (diagnostics[d_index],
+ '\n'.join([regexes[r_index].pattern for r_index in r_indexes])))
+
+ # Collect unmatched regexes and regexes with multiple matches.
+ for (r_index, d_indexes) in enumerate(matched_diagnostics):
+ if not d_indexes:
+ failure_messages.append('Unmatched regex:\n%s\n'
+ % regexes[r_index].pattern)
+ elif len(d_indexes) > 1:
+ failure_messages.append(
+ 'The regex:\n%s\n'
+ 'matches multiple diagnostics:\n%s'
+ % (regexes[r_index].pattern,
+ '\n'.join([diagnostics[d_index] for d_index in d_indexes])))
+
+ return ['%s %s' % (loc_str, message) for message in failure_messages]
+
+
+def _CompareExpectedAndActualDiagnostics(expected_diagnostic_regexes,
+ actual_diagnostics):
+ """Verify that the diagnostics are as expected; return a list of failures."""
+
+ failures = []
+ for loc in sorted(set(actual_diagnostics.keys()) |
+ set(expected_diagnostic_regexes.keys())):
+ # Find all regexes and actual diagnostics for the given location.
+ regexes = expected_diagnostic_regexes.get(loc, [])
+ diagnostics = actual_diagnostics.get(loc, [])
+ failures += _VerifyDiagnosticsAtLoc('\n%s:%s:' % loc, regexes, diagnostics)
+
+ return failures
+
+
+def _CompareExpectedAndActualSummaries(expected_summaries, actual_summaries):
+ """Verify that the summaries are as expected; return a list of failures."""
+
+ failures = []
+ for loc in sorted(set(actual_summaries.keys()) |
+ set(expected_summaries.keys())):
+ this_failure = difflib.unified_diff(expected_summaries.get(loc, []),
+ actual_summaries.get(loc, []))
+ try:
+ _PortableNext(this_failure) # read past the 'what files are this' header
+ failures.append('\n')
+ failures.append('Unexpected summary diffs for %s:\n' % loc)
+ failures.extend(this_failure)
+ failures.append('---\n')
+ except StopIteration:
+ pass # empty diff
+ return failures
+
+
+def TestIwyuOnRelativeFile(test_case, cc_file, cpp_files_to_check,
+ iwyu_flags=None, clang_flags=None, verbose=False):
+ """Checks running IWYU on the given .cc file.
+
+ Args:
+ test_case: A googletest.TestCase instance.
+ cc_file: The name of the file to test, relative to the current dir.
+ cpp_files_to_check: A list of filenames for the files
+ to check the diagnostics on, relative to the current dir.
+ iwyu_flags: Extra command-line flags to pass to iwyu.
+ clang_flags: Extra command-line flags to pass to clang, for example
+ "-std=c++11".
+ verbose: Whether to display verbose output.
+ """
+ iwyu_flags = iwyu_flags or [] # Make sure iwyu_flags is a list.
+ clang_flags = clang_flags or [] # Make sure this is a list
+
+ # Require verbose level 3 so that we can verify the individual diagnostics.
+ # We allow the level to be overriden by the IWYU_VERBOSE environment
+ # variable, or by iwyu_flags, for easy debugging. (We put the
+ # envvar-based flag first, so user flags can override it later.)
+ iwyu_flags = ['--verbose=%s' % os.getenv('IWYU_VERBOSE', '3')] + iwyu_flags
+
+ # clang reads iwyu flags after the -Xiwyu clang flag: '-Xiwyu --verbose=6'
+ iwyu_flags = ['-Xiwyu ' + flag for flag in iwyu_flags]
+
+ # TODO(csilvers): verify that has exit-status 0.
+ cmd = '%s %s %s %s' % (
+ _ShellQuote(_GetIwyuPath()),
+ ' '.join(iwyu_flags),
+ ' '.join(clang_flags),
+ cc_file)
+ if verbose:
+ print('>>> Running %s' % cmd)
+ output = _GetCommandOutput(cmd)
+ print(''.join(output))
+ sys.stdout.flush() # don't commingle this output with the failure output
+
+ expected_diagnostics = _GetMatchingLines(
+ _EXPECTED_DIAGNOSTICS_RE, cpp_files_to_check)
+ failures = _CompareExpectedAndActualDiagnostics(
+ _GetExpectedDiagnosticRegexes(expected_diagnostics),
+ _GetActualDiagnostics(output))
+
+ # Also figure out if the end-of-parsing suggestions match up.
+ failures += _CompareExpectedAndActualSummaries(
+ _GetExpectedSummaries(cpp_files_to_check),
+ _GetActualSummaries(output))
+
+ test_case.assertTrue(not failures, ''.join(failures))
diff --git a/iwyu_tool.py b/iwyu_tool.py
new file mode 100755
index 0000000..efda8c1
--- /dev/null
+++ b/iwyu_tool.py
@@ -0,0 +1,247 @@
+#!/usr/bin/env python
+
+""" Driver to consume a Clang compilation database and invoke IWYU.
+
+Example usage with CMake:
+
+ # Unix systems
+ $ mkdir build && cd build
+ $ CC="clang" CXX="clang++" cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ...
+ $ iwyu_tool.py -p .
+
+ # Windows systems
+ $ mkdir build && cd build
+ $ cmake -DCMAKE_CXX_COMPILER="%VCINSTALLDIR%/bin/cl.exe" \
+ -DCMAKE_C_COMPILER="%VCINSTALLDIR%/VC/bin/cl.exe" \
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
+ -G Ninja ...
+ $ python iwyu_tool.py -p .
+
+See iwyu_tool.py -h for more details on command-line arguments.
+"""
+
+import os
+import sys
+import json
+import argparse
+import subprocess
+import re
+import multiprocessing
+
+
+def iwyu_formatter(output):
+ """ Process iwyu's output, basically a no-op. """
+ print('\n'.join(output))
+
+
+CORRECT_RE = re.compile(r'^\((.*?) has correct #includes/fwd-decls\)$')
+SHOULD_ADD_RE = re.compile(r'^(.*?) should add these lines:$')
+SHOULD_REMOVE_RE = re.compile(r'^(.*?) should remove these lines:$')
+FULL_LIST_RE = re.compile(r'The full include-list for (.*?):$')
+END_RE = re.compile(r'^---$')
+LINES_RE = re.compile(r'^- (.*?) // lines ([0-9]+)-[0-9]+$')
+
+
+GENERAL, ADD, REMOVE, LIST = range(4)
+
+
+def clang_formatter(output):
+ """ Process iwyu's output into something clang-like. """
+ state = (GENERAL, None)
+ for line in output:
+ match = CORRECT_RE.match(line)
+ if match:
+ print('%s:1:1: note: #includes/fwd-decls are correct' % match.groups(1))
+ continue
+ match = SHOULD_ADD_RE.match(line)
+ if match:
+ state = (ADD, match.group(1))
+ continue
+ match = SHOULD_REMOVE_RE.match(line)
+ if match:
+ state = (REMOVE, match.group(1))
+ continue
+ match = FULL_LIST_RE.match(line)
+ if match:
+ state = (LIST, match.group(1))
+ elif END_RE.match(line):
+ state = (GENERAL, None)
+ elif not line.strip():
+ continue
+ elif state[0] == GENERAL:
+ print(line)
+ elif state[0] == ADD:
+ print('%s:1:1: error: add the following line' % state[1])
+ print(line)
+ elif state[0] == REMOVE:
+ match = LINES_RE.match(line)
+ line_no = match.group(2) if match else '1'
+ print('%s:%s:1: error: remove the following line' % (state[1], line_no))
+ print(match.group(1))
+
+
+DEFAULT_FORMAT = 'iwyu'
+FORMATTERS = {
+ 'iwyu': iwyu_formatter,
+ 'clang': clang_formatter
+}
+
+def get_output(cwd, command):
+ """ Run the given command and return its output as a string. """
+ process = subprocess.Popen(command,
+ cwd=cwd,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ return process.communicate()[0].decode("utf-8").splitlines()
+
+
+def run_iwyu(dbentry, iwyu_args, verbose):
+ """ Rewrite compile_command to an IWYU command, and run it. """
+ cwd = dbentry['directory']
+
+ if 'arguments' in dbentry:
+ # arguments is a command-line in list form
+ arguments = dbentry['arguments']
+ compile_command, compile_args = arguments[0], arguments[1:]
+ compile_args = ' '.join(compile_args)
+ elif 'command' in dbentry:
+ # command is a command-line in string form
+ compile_command, _, compile_args = dbentry['command'].partition(' ')
+ else:
+ raise ValueError('Invalid compilation database entry: %s' % dbentry)
+
+ if compile_command.endswith('cl.exe'):
+ # If the compiler name is cl.exe, let IWYU be cl-compatible
+ clang_args = ['--driver-mode=cl']
+ else:
+ clang_args = []
+
+ iwyu_args = ['-Xiwyu ' + a for a in iwyu_args]
+ command = ['include-what-you-use'] + clang_args + iwyu_args
+ command = '%s %s' % (' '.join(command), compile_args.strip())
+
+ if verbose:
+ print('%s:' % command)
+
+ return get_output(cwd, command)
+
+
+def main(compilation_db_path, source_files, verbose, formatter, jobs, iwyu_args):
+ """ Entry point. """
+ # Canonicalize compilation database path
+ if os.path.isdir(compilation_db_path):
+ compilation_db_path = os.path.join(compilation_db_path,
+ 'compile_commands.json')
+
+ compilation_db_path = os.path.realpath(compilation_db_path)
+ if not os.path.isfile(compilation_db_path):
+ print('ERROR: No such file or directory: \'%s\'' % compilation_db_path)
+ return 1
+
+ # Read compilation db from disk
+ with open(compilation_db_path, 'r') as fileobj:
+ compilation_db = json.load(fileobj)
+
+ # expand symlinks
+ for entry in compilation_db:
+ entry['file'] = os.path.realpath(entry['file'])
+
+ # Cross-reference source files with compilation database
+ source_files = [os.path.realpath(s) for s in source_files]
+ if not source_files:
+ # No source files specified, analyze entire compilation database
+ entries = compilation_db
+ else:
+ # Source files specified, analyze the ones appearing in compilation db,
+ # warn for the rest.
+ entries = []
+ for source in source_files:
+ matches = [e for e in compilation_db if e['file'] == source]
+ if matches:
+ entries.extend(matches)
+ else:
+ print('WARNING: \'%s\' not found in compilation database.' %
+ source)
+
+ # Run analysis
+ try:
+
+ pool = multiprocessing.Pool(jobs)
+ # No actual results in `results`, it's only used for exception handling.
+ # Details here: https://stackoverflow.com/a/28660669.
+ results = []
+ for entry in entries:
+ results.append(pool.apply_async(run_iwyu,
+ (entry, iwyu_args, verbose),
+ callback=formatter))
+ pool.close()
+ pool.join()
+ for r in results:
+ r.get()
+ except OSError as why:
+ print('ERROR: Failed to launch include-what-you-use: %s' % why)
+ return 1
+
+ return 0
+
+
+def _bootstrap():
+ """ Parse arguments and dispatch to main(). """
+ # This hackery is necessary to add the forwarded IWYU args to the
+ # usage and help strings.
+ def customize_usage(parser):
+ """ Rewrite the parser's format_usage. """
+ original_format_usage = parser.format_usage
+ parser.format_usage = lambda: original_format_usage().rstrip() + \
+ ' -- [<IWYU args>]' + os.linesep
+
+ def customize_help(parser):
+ """ Rewrite the parser's format_help. """
+ original_format_help = parser.format_help
+
+ def custom_help():
+ """ Customized help string, calls the adjusted format_usage. """
+ helpmsg = original_format_help()
+ helplines = helpmsg.splitlines()
+ helplines[0] = parser.format_usage().rstrip()
+ return os.linesep.join(helplines) + os.linesep
+
+ parser.format_help = custom_help
+
+ # Parse arguments
+ parser = argparse.ArgumentParser(
+ description='Include-what-you-use compilation database driver.',
+ epilog='Assumes include-what-you-use is available on the PATH.')
+ customize_usage(parser)
+ customize_help(parser)
+
+ parser.add_argument('-v', '--verbose', action='store_true',
+ help='Print IWYU commands')
+ parser.add_argument('-o', '--output-format', type=str,
+ choices=FORMATTERS.keys(), default=DEFAULT_FORMAT,
+ help='Output format (default: %s)' % DEFAULT_FORMAT)
+ parser.add_argument('-j', '--jobs', type=int, default=1,
+ help='Number of concurrent subprocesses')
+ parser.add_argument('-p', metavar='<build-path>', required=True,
+ help='Compilation database path', dest='dbpath')
+ parser.add_argument('source', nargs='*',
+ help='Zero or more source files to run IWYU on. '
+ 'Defaults to all in compilation database.')
+
+ def partition_args(argv):
+ """ Split around '--' into driver args and IWYU args. """
+ try:
+ double_dash = argv.index('--')
+ return argv[:double_dash], argv[double_dash+1:]
+ except ValueError:
+ return argv, []
+ argv, iwyu_args = partition_args(sys.argv[1:])
+ args = parser.parse_args(argv)
+
+ sys.exit(main(args.dbpath, args.source, args.verbose,
+ FORMATTERS[args.output_format], args.jobs, iwyu_args))
+
+
+if __name__ == '__main__':
+ _bootstrap()
diff --git a/iwyu_verrs.cc b/iwyu_verrs.cc
new file mode 100644
index 0000000..220ed00
--- /dev/null
+++ b/iwyu_verrs.cc
@@ -0,0 +1,44 @@
+//===--- iwyu_verrs.cc - debug output for include-what-you-use ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "iwyu_verrs.h"
+
+#include "iwyu_globals.h"
+#include "iwyu_location_util.h"
+#include "iwyu_path_util.h"
+
+namespace include_what_you_use {
+
+using clang::FileEntry;
+
+namespace {
+int verbose_level = 1;
+} // namespace
+
+void SetVerboseLevel(int level) {
+ verbose_level = level;
+}
+
+int GetVerboseLevel() {
+ return verbose_level;
+}
+
+bool ShouldPrintSymbolFromFile(const FileEntry* file) {
+ if (GetVerboseLevel() < 5) {
+ return false;
+ } else if (GetVerboseLevel() < 10) {
+ return ShouldReportIWYUViolationsFor(file);
+ } else if (GetVerboseLevel() < 11) {
+ return !IsSystemIncludeFile(GetFilePath(file));
+ } else {
+ return true;
+ }
+}
+
+} // namespace include_what_you_use
diff --git a/iwyu_verrs.h b/iwyu_verrs.h
new file mode 100644
index 0000000..27e575a
--- /dev/null
+++ b/iwyu_verrs.h
@@ -0,0 +1,52 @@
+//===--- iwyu_verrs.h - debug output for include-what-you-use -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This module controls logging and verbosity levels for include-what-you-use.
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_VERRS_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_VERRS_H_
+
+#include "llvm/Support/raw_ostream.h"
+
+namespace clang {
+class FileEntry;
+}
+
+namespace include_what_you_use {
+
+void SetVerboseLevel(int level);
+int GetVerboseLevel();
+
+// Returns true if we should print a message at the given verbosity level.
+inline bool ShouldPrint(int verbose_level) {
+ return verbose_level <= GetVerboseLevel();
+}
+
+// Returns true if we should print information about a symbol in the
+// given file, at the current verbosity level. For instance, at most
+// normal verbosities, we don't print information about symbols in
+// system header files.
+bool ShouldPrintSymbolFromFile(const clang::FileEntry* file);
+
+// VERRS(n) << blah;
+// prints blah to errs() if the verbose level is >= n.
+#define VERRS(verbose_level) \
+ if (!::include_what_you_use::ShouldPrint( \
+ verbose_level)) ; else ::llvm::errs()
+
+// Prints to errs() if the verbose level is at a high enough level to
+// print symbols that occur in the given file. This is only valid
+// when used inside a class, such as IwyuAstConsumer, that defines a
+// method named ShouldPrintSymbolFromFile().
+#define ERRSYM(file_entry) \
+ if (!ShouldPrintSymbolFromFile(file_entry)) ; else ::llvm::errs()
+
+} // namespace include_what_you_use
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_VERRS_H_
diff --git a/iwyu_version.h b/iwyu_version.h
new file mode 100644
index 0000000..34fdc1a
--- /dev/null
+++ b/iwyu_version.h
@@ -0,0 +1,15 @@
+//===--- iwyu_version.h - include-what-you-use versioning -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_IWYU_VERSION_H_
+#define INCLUDE_WHAT_YOU_USE_IWYU_VERSION_H_
+
+#define IWYU_VERSION_STRING "0.9"
+
+#endif // INCLUDE_WHAT_YOU_USE_IWYU_VERSION_H_
diff --git a/libcxx.imp b/libcxx.imp
new file mode 100644
index 0000000..7b1b61c
--- /dev/null
+++ b/libcxx.imp
@@ -0,0 +1,10 @@
+# libc++ headers
+[
+ { include: ["<__functional_base>", private, "<functional>", public ] },
+ { include: ["<__mutex_base>", private, "<mutex>", public ] },
+ { symbol: [ "std::declval", private, "<utility>", public ] },
+ { symbol: [ "std::forward", private, "<utility>", public ] },
+ { symbol: [ "std::move", private, "<algorithm>", public ] },
+ { symbol: [ "std::nullptr_t", private, "<cstddef>", public ] },
+ { symbol: [ "std::string", private, "<string>", public ] },
+]
diff --git a/more_tests/iwyu_include_picker_test.cc b/more_tests/iwyu_include_picker_test.cc
new file mode 100644
index 0000000..58a1c77
--- /dev/null
+++ b/more_tests/iwyu_include_picker_test.cc
@@ -0,0 +1,604 @@
+//===--- iwyu_include_picker_test.cc - test the iwyu include-picker file --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the internals of iwyu_include_picker.{h,cc}, and a few related
+// functions from iwyu_path_util.h
+
+#include "iwyu_include_picker.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "iwyu_globals.h"
+#include "iwyu_path_util.h"
+#include "testing/base/public/gunit.h"
+
+namespace clang {
+class ASTConsumer;
+class ASTFrontendAction;
+class CompilerInstance;
+} // namespace clang
+
+using clang::ASTConsumer;
+using clang::ASTFrontendAction;
+using clang::CompilerInstance;
+
+namespace include_what_you_use {
+
+namespace {
+
+string IntToString(int i) {
+ char buf[64]; // big enough for any number
+ snprintf(buf, sizeof(buf), "%d", i);
+ return buf;
+}
+
+// Returns a string representing the first element where actual (a vector),
+// and expected (an array) differ, or "" if they're identical.
+template <size_t kCount> string VectorDiff(const string (&expected)[kCount],
+ const vector<string>& actual) {
+ for (int i = 0; i < std::min(kCount, actual.size()); ++i) {
+ if (expected[i] != actual[i]) {
+ return ("Differ at #" + IntToString(i) + ": expected=" + expected[i] +
+ ", actual=" + actual[i]);
+ }
+ }
+ if (kCount < actual.size()) {
+ return ("Differ at #" + IntToString(kCount) +
+ ": expected at EOF, actual=" + actual[kCount]);
+ } else if (actual.size() < kCount) {
+ return ("Differ at #" + IntToString(kCount) + ": expected=" +
+ expected[actual.size()] + ", actual at EOF");
+ } else {
+ return "";
+ }
+}
+
+// Different format than usual due to VA_ARGS. First comes the actual
+// value (as a string vector), then the expected values (as strings).
+#define EXPECT_VECTOR_STREQ(actual, ...) do { \
+ const string expected[] = { __VA_ARGS__ }; \
+ EXPECT_EQ("", VectorDiff(expected, actual)); \
+} while (0)
+
+
+TEST(GetCanonicalName, StripsKnownSuffixes) {
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo.cxx"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo.cpp"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo.cc"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo.h"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo-inl.h"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo_unittest.cc"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo_regtest.cc"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo_test.cc"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo.c"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("my/path/foo-inl_unittest.cc"));
+ EXPECT_EQ("my/path/foo_mytest", GetCanonicalName("my/path/foo_mytest.cc"));
+}
+
+TEST(GetCanonicalName, StripsQuotes) {
+ EXPECT_EQ("set", GetCanonicalName("<set>"));
+ EXPECT_EQ("bits/stl_set", GetCanonicalName("<bits/stl_set.h>"));
+ EXPECT_EQ("my/path/foo", GetCanonicalName("\"my/path/foo-inl.h\""));
+}
+
+TEST(GetCanonicalName, MapsInternalToPublic) {
+ EXPECT_EQ("my/public/foo", GetCanonicalName("my/internal/foo.cc"));
+ EXPECT_EQ("my/public/foo", GetCanonicalName("my/public/foo.cc"));
+ EXPECT_EQ("my/public/foo", GetCanonicalName("my/internal/foo.h"));
+ EXPECT_EQ("my/public/foo", GetCanonicalName("my/public/foo.h"));
+ EXPECT_EQ("internal/foo", GetCanonicalName("internal/foo"));
+ EXPECT_EQ("path/internal_impl", GetCanonicalName("path/internal_impl.cc"));
+}
+
+TEST(IsSystemIncludeFile, Basic) {
+ EXPECT_FALSE(IsSystemIncludeFile("foo.h"));
+ EXPECT_FALSE(IsSystemIncludeFile("third_party/ICU/icu.h"));
+ EXPECT_TRUE(IsSystemIncludeFile("/usr/include/string.h"));
+ EXPECT_TRUE(IsSystemIncludeFile("/usr/include/c++/4.3/bits/stl_vector.h"));
+}
+
+TEST(ConvertToQuotedInclude, Basic) {
+ EXPECT_EQ("\"foo.h\"", ConvertToQuotedInclude("foo.h"));
+ EXPECT_EQ("\"third_party/ICU/icu.h\"",
+ ConvertToQuotedInclude("third_party/ICU/icu.h"));
+ EXPECT_EQ("<string.h>", ConvertToQuotedInclude("/usr/include/string.h"));
+ EXPECT_EQ("<bits/stl_vector.h>",
+ ConvertToQuotedInclude("/usr/include/c++/4.3/bits/stl_vector.h"));
+}
+
+
+TEST(DynamicMapping, DoesMapping) {
+ IncludePicker p;
+ p.AddDirectInclude("project/public/foo.h", "project/internal/private.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("project/internal/private.h"),
+ "\"project/public/foo.h\"");
+}
+
+TEST(DynamicMapping, MultiplePublicFiles) {
+ IncludePicker p;
+ p.AddDirectInclude("project/public/foo.h", "project/internal/private.h", "");
+ p.AddDirectInclude("project/public/bar.h", "project/internal/private.h", "");
+ p.AddDirectInclude("project/public/bar.h", "project/internal/other.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("project/internal/private.h"),
+ "\"project/public/foo.h\"", "\"project/public/bar.h\"");
+}
+
+TEST(DynamicMapping, TransitiveMapping) {
+ IncludePicker p;
+ p.AddDirectInclude("project/public/foo.h", "project/internal/private.h", "");
+ p.AddDirectInclude("project/internal/private.h", "project/internal/other.h",
+ "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("project/internal/other.h"),
+ "\"project/public/foo.h\"");
+}
+
+TEST(DynamicMapping, MultipleTransitiveMapping) {
+ IncludePicker p;
+ p.AddDirectInclude("project/public/foo.h", "project/internal/private.h", "");
+ p.AddDirectInclude("project/public/bar.h", "project/internal/private.h", "");
+ p.AddDirectInclude("project/public/baz.h", "project/internal/private2.h", "");
+ p.AddDirectInclude("project/internal/private.h", "project/internal/other.h",
+ "");
+ p.AddDirectInclude("project/internal/private2.h", "project/internal/other.h",
+ "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("project/internal/other.h"),
+ "\"project/public/foo.h\"", "\"project/public/bar.h\"",
+ "\"project/public/baz.h\"");
+}
+
+TEST(DynamicMapping, NormalizesAsm) {
+ IncludePicker p;
+ p.AddDirectInclude("/usr/include/types.h",
+ "/usr/include/asm-cris/posix_types.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/src/linux-headers-2.6.24-gg23/"
+ "include/asm-cris/posix_types.h"),
+ "<asm/posix_types.h>");
+}
+
+TEST(DynamicMapping, PrivateToPublicMapping) {
+ IncludePicker p;
+ // These names are not the public/internal names that AddInclude looks at.
+ p.AddMapping("\"project/private/foo.h\"", "\"project/not_private/bar.h\"");
+ p.MarkIncludeAsPrivate("\"project/private/foo.h\"");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("project/private/foo.h"),
+ "\"project/not_private/bar.h\"");
+}
+
+TEST(GetCandidateHeadersForSymbol, Basic) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(p.GetCandidateHeadersForSymbol("dev_t"),
+ "<sys/types.h>", "<sys/stat.h>");
+ EXPECT_VECTOR_STREQ(p.GetCandidateHeadersForSymbol("NULL"),
+ "<stddef.h>", "<cstddef>", "<clocale>", "<cstdio>",
+ "<cstdlib>", "<cstring>", "<ctime>", "<cwchar>",
+ "<locale.h>", "<stdio.h>", "<stdlib.h>", "<string.h>",
+ "<time.h>", "<wchar.h>"
+ );
+ EXPECT_VECTOR_STREQ(p.GetCandidateHeadersForSymbol("std::allocator"),
+ "<memory>", "<string>", "<vector>", "<map>", "<set>");
+ EXPECT_EQ(0, p.GetCandidateHeadersForSymbol("foo").size());
+}
+
+TEST(GetCandidateHeadersForFilepath, C) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/include/bits/dlfcn.h"),
+ "<dlfcn.h>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/grte/v2/release/include/"
+ "bits/mathcalls.h"),
+ "<math.h>", "<cmath>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/grte/v1/include/assert.h"),
+ "<assert.h>", "<cassert>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/grte/v1/include/stdarg.h"),
+ "<stdarg.h>", "<cstdarg>");
+}
+
+TEST(GetCandidateHeadersForFilepath, CXX) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/include/c++/4.2/bits/allocator.h"),
+ "<memory>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/llvm/crosstool/gcc-4.4.0-glibc-2.3.6-grte/x86/"
+ "include/c++/4.4.0/backward/hash_fun.h"),
+ "<hash_map>", "<hash_set>");
+}
+
+TEST(IsThirdPartyFile, ReturnsFalseForGoogleFile) {
+ EXPECT_FALSE(IsThirdPartyFile("\"foo/bar.h\""));
+ EXPECT_FALSE(IsThirdPartyFile("\"foo/third_party/bar.cc\""));
+}
+
+TEST(IsThirdPartyFile, ReturnsFalseForGoogleFileInThirdParty) {
+ EXPECT_FALSE(IsThirdPartyFile("\"third_party/car/car.h\""));
+ EXPECT_FALSE(IsThirdPartyFile("\"third_party/gtest/a.h\""));
+ EXPECT_FALSE(IsThirdPartyFile("\"third_party/gmock/b.h\""));
+}
+
+TEST(IsThirdPartyFile, ReturnsTrueForNonGoogleFileInThirdParty) {
+ EXPECT_TRUE(IsThirdPartyFile("\"third_party/tr1/tuple\""));
+ EXPECT_TRUE(IsThirdPartyFile("\"third_party/foo/bar.h\""));
+}
+
+TEST(GetCandidateHeadersForFilepath, ThirdParty) {
+ IncludePicker p;
+ p.AddDirectInclude("a.h", "third_party/dynamic_annotations/d.h", "");
+ p.AddDirectInclude("b.h", "third_party/dynamic_annotations/a/b/c.h", "");
+ p.AddDirectInclude("c.h", "third_party/python_runtime/includes/py.h", "");
+ p.AddDirectInclude("d.h", "third_party/isu/include/unicode/udraft.h", "");
+ p.AddDirectInclude("e.h", "third_party/isu/include/unicode/ukeep.h", "");
+ p.FinalizeAddedIncludes();
+
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/dynamic_annotations/d.h"),
+ "\"base/dynamic_annotations.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/dynamic_annotations/a/b/c.h"),
+ "\"base/dynamic_annotations.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/python_runtime/includes/py.h"),
+ "<Python.h>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/icu/include/unicode/udraft.h"),
+ "\"third_party/icu/include/unicode/utypes.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/icu/include/unicode/ukeep.h"),
+ "\"third_party/icu/include/unicode/ukeep.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, ThirdPartyCycle) {
+ IncludePicker p;
+ // We should ignore the cycle here.
+ p.AddDirectInclude("myapp.h", "third_party/a.h", "");
+ p.AddDirectInclude("third_party/a.h", "third_party/b.h", "");
+ p.AddDirectInclude("third_party/b.h", "third_party/c.h", "");
+ p.AddDirectInclude("third_party/c.h", "third_party/a.h", ""); // cycle!
+ p.FinalizeAddedIncludes();
+
+ // We ignore the cycle, so the includes look like a -> b -> c. In
+ // each case, a.h is the only public header file in the bunch; the
+ // rest are private because they're only #included from other
+ // third_party files.
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/a.h"),
+ "\"third_party/a.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/b.h"),
+ "\"third_party/a.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/c.h"),
+ "\"third_party/a.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, RegexOverlap) {
+ IncludePicker p;
+ // It's ok if a header is specified in both a regex and non-regex rule.
+ // For regexes to work, we need to have actually seen the includes.
+ p.AddDirectInclude("a.h", "third_party/dynamic_annotations/d.h", "");
+ p.AddMapping("\"third_party/dynamic_annotations/d.h\"",
+ "\"third_party/dynamic_annotations/public.h\"");
+ p.MarkIncludeAsPrivate("\"third_party/dynamic_annotations/d.h\"");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/dynamic_annotations/d.h"),
+ "\"third_party/dynamic_annotations/public.h\"",
+ "\"base/dynamic_annotations.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, NoIdentityRegex) {
+ IncludePicker p;
+ // Make sure we don't complain when the key of a mapping is a regex
+ // that includes the value (which would, naively, lead to an identity
+ // mapping).
+ p.AddMapping("@\"mydir/.*\\.h\"", "\"mydir/include.h\"");
+ p.MarkIncludeAsPrivate("@\"mydir/.*\\.h\""); // will *not* apply to include.h!
+ // Add a direct include that should be mapped, and that already is.
+ p.AddDirectInclude("a.h", "mydir/internal.h", "");
+ p.AddDirectInclude("b.h", "mydir/include.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("mydir/internal.h"),
+ "\"mydir/include.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("mydir/include.h"),
+ "\"mydir/include.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, ImplicitThirdPartyMapping) {
+ IncludePicker p;
+ p.AddDirectInclude("third_party/public.h", "third_party/private1.h", "");
+ p.AddDirectInclude("third_party/public.h", "third_party/private2.h", "");
+ p.AddDirectInclude("third_party/private1.h", "third_party/private11.h", "");
+ p.AddDirectInclude("third_party/public.h", "third_party/other_public.h", "");
+ p.AddDirectInclude("third_party/other_public.h", "third_party/oprivate.h",
+ "");
+ p.AddDirectInclude("my_app.h", "third_party/public.h", "");
+ p.AddDirectInclude("my_app.h", "third_party/other_public.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/public.h"),
+ "\"third_party/public.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/private1.h"),
+ "\"third_party/public.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/private2.h"),
+ "\"third_party/public.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/private11.h"),
+ "\"third_party/public.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/other_public.h"),
+ "\"third_party/other_public.h\"");
+ // Shouldn't have third_party/public.h here, even though it indirectly
+ // includes oprivate.h, because other_public is in between and is itself
+ // considered a public include (since it is #included from my_app.h).
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/oprivate.h"),
+ "\"third_party/other_public.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, TreatsGTestAsNonThirdParty) {
+ IncludePicker p;
+ p.AddDirectInclude("foo/foo.cc", "testing/base/public/gunit.h", "");
+ p.AddDirectInclude("testing/base/public/gunit.h",
+ "third_party/gtest/include/gtest/gtest.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/gtest/include/gtest/gtest.h"),
+ "\"third_party/gtest/include/gtest/gtest.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("testing/base/public/gunit.h"),
+ "\"testing/base/public/gunit.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, ExplicitThirdPartyMapping) {
+ IncludePicker p;
+ // These are controlled by third_party_include_map, not by
+ // AddImplicitThirdPartyMappings().
+ p.AddDirectInclude("my_app.h", "third_party/dynamic_annotations/public.h",
+ "");
+ p.AddDirectInclude("third_party/dynamic_annotations/public.h",
+ "third_party/dynamic_annotations/private.h", "");
+ p.AddDirectInclude("my_app.h", "third_party/icu/include/unicode/umachine.h",
+ "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/dynamic_annotations/public.h"),
+ "\"base/dynamic_annotations.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/icu/include/unicode/umachine.h"),
+ "\"third_party/icu/include/unicode/utypes.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, ExplicitVsImplicitThirdPartyMapping) {
+ IncludePicker p;
+ // Here, the includees are all explicitly marked as public.
+ p.AddDirectInclude("my_app.h", "third_party/icu/include/unicode/foo.h", "");
+ p.AddDirectInclude("third_party/icu/include/unicode/foo.h",
+ "third_party/icu/include/unicode/utypes.h", "");
+ p.AddDirectInclude("third_party/icu/include/unicode/foo.h",
+ "/usr/include/stdio.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/include/stdio.h"),
+ "<stdio.h>", "<cstdio>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath(
+ "third_party/icu/include/unicode/utypes.h"),
+ "\"third_party/icu/include/unicode/utypes.h\"",
+ "\"third_party/icu/include/unicode/foo.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, NotInAnyMap) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/grte/v1/include/poll.h"),
+ "<poll.h>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("third_party/llvm/crosstool/"
+ "gcc-4.4.0-glibc-2.3.6-grte/x86/"
+ "include/c++/4.4.0/vector"),
+ "<vector>");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("././././my/dot.h"),
+ "\"my/dot.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepath, IncludeRecursion) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/include/c++/4.2/bits/istream.tcc"),
+ "<istream>", "<fstream>", "<iostream>", "<sstream>");
+}
+
+TEST(GetCandidateHeadersForFilepath, PrivateValueInRecursion) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("/usr/include/linux/errno.h"),
+ "<errno.h>", "<cerrno>");
+}
+
+TEST(GetCandidateHeadersForFilepath, NoBuiltin) {
+ // Make sure we never specify "<built-in>" as an #include mapping.
+ IncludePicker p;
+ p.AddDirectInclude("<built-in>", "foo/bar/internal/code.cc", "");
+ p.AddDirectInclude("foo/bar/internal/code.cc", "foo/qux/internal/lib.h", "");
+
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepath("foo/qux/internal/lib.h"),
+ "\"foo/qux/internal/lib.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, NoInternal) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("/usr/include/bits/dlfcn.h",
+ "mydir/myapp.h"),
+ "<dlfcn.h>");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, Internal) {
+ IncludePicker p;
+ // clang always has <built-in> #including the file specified on the cmdline.
+ p.AddDirectInclude("<built-in>", "foo/bar/internal/code.cc", "");
+ p.AddDirectInclude("foo/bar/internal/code.cc", "foo/bar/public/code.h", "");
+ p.AddDirectInclude("foo/bar/public/code.h", "foo/bar/internal/hdr.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("foo/bar/internal/hdr.h",
+ "foo/bar/internal/code.cc"),
+ "\"foo/bar/internal/hdr.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, OtherInternal) {
+ IncludePicker p;
+ p.AddDirectInclude("foo/bar/public/code.h", "foo/bar/internal/hdr.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("foo/bar/internal/hdr.h",
+ "baz/internal/code.cc"),
+ "\"foo/bar/public/code.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, PublicToInternal) {
+ IncludePicker p;
+ p.AddDirectInclude("foo/bar/public/code.cc", "foo/bar/public/code.h", "");
+ p.AddDirectInclude("foo/bar/public/code.cc", "foo/bar/public/code2.h", "");
+ p.AddDirectInclude("foo/bar/public/code.h", "foo/bar/internal/hdr.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("foo/bar/internal/hdr.h",
+ "foo/bar/public/code.h"),
+ "\"foo/bar/internal/hdr.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("foo/bar/internal/hdr.h",
+ "foo/bar/public/code2.h"),
+ "\"foo/bar/internal/hdr.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, FriendRegex) {
+ IncludePicker p;
+ p.AddDirectInclude("baz.cc", "baz.h", "");
+ p.AddDirectInclude("baz.cc", "abcde.h", "");
+ p.AddDirectInclude("baz.cc", "random.h", "");
+ p.AddDirectInclude("baz.h", "project/private/bar.h", "");
+ p.AddDirectInclude("abcde.h", "project/private/bar.h", "");
+ p.AddDirectInclude("random.h", "project/private/bar.h", "");
+ p.AddMapping("\"project/private/bar.h\"", "\"foo.h\"");
+ p.MarkIncludeAsPrivate("\"project/private/bar.h\"");
+ p.AddFriendRegex("project/private/bar.h", "\"baz.*\"");
+ p.AddFriendRegex("project/private/bar.h", "\"a.c.+\\.h\"");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("project/private/bar.h",
+ "random.h"),
+ "\"foo.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("project/private/bar.h",
+ "baz.h"),
+ "\"project/private/bar.h\"");
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("project/private/bar.h",
+ "abcde.h"),
+ "\"project/private/bar.h\"");
+}
+
+TEST(GetCandidateHeadersForFilepathIncludedFrom, PreservesWrittenForm) {
+ IncludePicker p;
+ p.AddDirectInclude("baz.cc", "baz.h", "\"./././baz.h\"");
+ p.FinalizeAddedIncludes();
+ EXPECT_VECTOR_STREQ(
+ p.GetCandidateHeadersForFilepathIncludedFrom("baz.h", "baz.cc"),
+ "\"./././baz.h\"");
+}
+
+TEST(HasMapping, IncludeMatch) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_TRUE(p.HasMapping("/usr/include/stdio.h",
+ "/usr/include/c++/4.2/cstdio"));
+ EXPECT_TRUE(p.HasMapping("/usr/include/c++/4.2/bits/stl_deque.h",
+ "/usr/include/c++/4.2/deque"));
+ EXPECT_TRUE(p.HasMapping("/usr/include/bits/stat.h",
+ "/usr/include/sys/stat.h"));
+ EXPECT_FALSE(p.HasMapping("/usr/include/bits/syscall.h",
+ "/usr/include/sys/stat.h"));
+}
+
+TEST(HasMapping, IncludeMatchIndirectly) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ EXPECT_TRUE(p.HasMapping("/usr/include/c++/4.2/ios",
+ "/usr/include/c++/4.2/iostream"));
+ EXPECT_TRUE(p.HasMapping("/usr/include/linux/errno.h",
+ "/usr/include/errno.h"));
+}
+
+TEST(HasMapping, IncludeMatchDifferentMaps) {
+ IncludePicker p;
+ p.FinalizeAddedIncludes();
+ // Testing when a google path re-exports a c++ system #include.
+ EXPECT_TRUE(p.HasMapping("/usr/include/c++/4.2/ostream", "base/logging.h"));
+ // Do some indirect checking too.
+ EXPECT_TRUE(p.HasMapping("/usr/include/c++/4.2/ios", "base/logging.h"));
+}
+
+TEST(HasMapping, IncludeForThirdParty) {
+ IncludePicker p;
+ // For regexes to work, we need to have actually seen the includes.
+ p.AddDirectInclude("base/dynamic_annotations.h",
+ "third_party/dynamic_annotations/foo/bar.h", "");
+ p.FinalizeAddedIncludes();
+ EXPECT_TRUE(p.HasMapping("third_party/dynamic_annotations/foo/bar.h",
+ "base/dynamic_annotations.h"));
+}
+
+} // namespace
+} // namespace include_what_you_use
+
+
+int main(int argc, char **argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ include_what_you_use::InitGlobalsAndFlagsForTesting();
+ return RUN_ALL_TESTS();
+}
diff --git a/more_tests/iwyu_lexer_utils_test.cc b/more_tests/iwyu_lexer_utils_test.cc
new file mode 100644
index 0000000..2669af0
--- /dev/null
+++ b/more_tests/iwyu_lexer_utils_test.cc
@@ -0,0 +1,277 @@
+//===--- iwyu_lexer_utils_test.cc - test iwyu_lexer_utils.{cc,h} ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+// Tests for the iwyu_lexer_utils module. In addition, provides sample
+// code for using Clang's Lexer.
+
+#include "iwyu_lexer_utils.h"
+
+#include <cstdio>
+#include <cstring>
+#include <string>
+#include <vector>
+
+#include "base/logging.h"
+#include "iwyu_globals.h"
+#include "testing/base/public/gunit.h"
+#include "clang/Basic/LangOptions.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Lex/Token.h"
+
+using clang::LangOptions;
+using clang::Lexer;
+using clang::SourceLocation;
+using clang::SourceRange;
+using clang::Token;
+
+namespace iwyu = include_what_you_use;
+using iwyu::CharacterDataGetterInterface;
+using iwyu::FindArgumentsToDefined;
+
+namespace {
+
+// Hack. Work around the fact that only SourceManagers can create
+// non-trivial SourceLocations.
+SourceLocation CreateSourceLocationFromOffset(SourceLocation begin_loc,
+ unsigned offset) {
+ return SourceLocation::getFromRawEncoding(begin_loc.getRawEncoding()
+ + offset);
+}
+
+class StringCharacterDataGetter : public CharacterDataGetterInterface {
+ public:
+ StringCharacterDataGetter(const string& str)
+ : str_("unused" + str) {
+ }
+
+ virtual const char* GetCharacterData(SourceLocation loc) const {
+ unsigned offset = loc.getRawEncoding();
+ CHECK_LE(offset, str_.size());
+ return str_.c_str() + offset;
+ }
+
+ SourceLocation BeginningOfString() {
+ // Returns an index into str that skips over the "unused" set in the ctor.
+ return CreateSourceLocationFromOffset(SourceLocation(), strlen("unused"));
+ }
+
+ private:
+ string str_;
+};
+
+TEST(LexerTest, ClangLexer) {
+ // Not so much a test as an example of how to use the Lexer.
+ const char text[] = "#if defined(FOO)";
+ Lexer lexer(SourceLocation(), LangOptions(), text, text, text + strlen(text));
+
+ Token token;
+ while (!lexer.LexFromRawLexer(token)) {
+ printf("Token: %s at %u length %u: \"%s\"\n",
+ token.getName(), token.getLocation().getRawEncoding(),
+ token.getLength(),
+ string(text + token.getLocation().getRawEncoding(),
+ token.getLength()).c_str());
+ }
+}
+
+// Common test code for testing FindArgumentsToDefined. The symbols
+// should be the arguments to defined() in order.
+void TestFindArgumentsToDefinedWithText(const string& text,
+ const vector<string>& symbols) {
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation end_loc =
+ CreateSourceLocationFromOffset(begin_loc, text.size());
+
+ vector<Token> defined_tokens = FindArgumentsToDefined(
+ SourceRange(begin_loc, end_loc), data_getter);
+ EXPECT_EQ(symbols.size(), defined_tokens.size());
+ for (int i = 0; i < symbols.size(); ++i) {
+ const string& symbol = symbols[i];
+ const Token& token = defined_tokens[i];
+ EXPECT_EQ(clang::tok::raw_identifier, token.getKind());
+ SourceLocation expected_loc =
+ CreateSourceLocationFromOffset(begin_loc, text.find(symbol));
+ EXPECT_EQ(expected_loc, token.getLocation());
+ EXPECT_EQ(symbol.size(), token.getLength());
+ EXPECT_EQ(symbol, GetTokenText(token, data_getter));
+ }
+}
+
+TEST(FindArgumentsToDefined, InParentheses) {
+ vector<string> symbols;
+ symbols.push_back("FOO");
+ TestFindArgumentsToDefinedWithText("#if defined(FOO)\n", symbols);
+}
+
+TEST(FindArgumentsToDefined, NoParentheses) {
+ vector<string> symbols;
+ symbols.push_back("FOO");
+ TestFindArgumentsToDefinedWithText("#if defined FOO\n", symbols);
+}
+
+TEST(FindArgumentsToDefined, MultipleArgs) {
+ vector<string> symbols;
+ symbols.push_back("FOO");
+ symbols.push_back("BAR");
+ symbols.push_back("BAZ");
+ TestFindArgumentsToDefinedWithText(
+ "#if defined FOO || defined(BAR) || !defined(BAZ)\n", symbols);
+}
+
+TEST(GetSourceTextUntilEndOfLine, FullLine) {
+ const char text[] = "This is the full line.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ EXPECT_EQ("This is the full line.",
+ GetSourceTextUntilEndOfLine(begin_loc, data_getter));
+}
+
+TEST(GetSourceTextUntilEndOfLine, MultipleLines) {
+ const char text[] = "This is the full line.\nThis line should be ignored.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ EXPECT_EQ("This is the full line.",
+ GetSourceTextUntilEndOfLine(begin_loc, data_getter));
+}
+
+TEST(GetSourceTextUntilEndOfLine, PartialLine) {
+ const char text[] = "This is the full line.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation middle_loc = CreateSourceLocationFromOffset(begin_loc, 5);
+ EXPECT_EQ("is the full line.",
+ GetSourceTextUntilEndOfLine(middle_loc, data_getter));
+}
+
+TEST(GetSourceTextUntilEndOfLine, MiddleLine) {
+ const char text[] = "This is the full line.\nThis is the winning line.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation middle_loc = CreateSourceLocationFromOffset(begin_loc, 35);
+ EXPECT_EQ("winning line.",
+ GetSourceTextUntilEndOfLine(middle_loc, data_getter));
+}
+
+TEST(GetSourceTextUntilEndOfLine, NoNewline) {
+ const char text[] = "This is the full line.";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ EXPECT_EQ("This is the full line.",
+ GetSourceTextUntilEndOfLine(begin_loc, data_getter));
+}
+
+TEST(GetLocationAfter, FullLine) {
+ const char text[] = "This is the full line.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "is the", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ // We can't explore after_loc directly (it's opaque), so we use
+ // GetSourceTextUntilEndOfLine as a proxy.
+ EXPECT_EQ(" full line.", GetSourceTextUntilEndOfLine(after_loc, data_getter));
+}
+
+TEST(GetLocationAfter, FirstOfManyOccurrences) {
+ const char text[] = "This is the full line.\nThis is the full line too.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "is the", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ EXPECT_EQ(" full line.", GetSourceTextUntilEndOfLine(after_loc, data_getter));
+}
+
+TEST(GetLocationAfter, SecondOfManyOccurrences) {
+ const char text[] = "This is the full line.\nThis is the full line too.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "is the", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ after_loc = GetLocationAfter(after_loc, "is the", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ EXPECT_EQ(" full line too.",
+ GetSourceTextUntilEndOfLine(after_loc, data_getter));
+}
+
+TEST(GetLocationAfter, NeedleNotFound) {
+ const char text[] = "This is the full line.\nThis is the full line too.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "isthe", data_getter);
+ EXPECT_FALSE(after_loc.isValid());
+}
+
+TEST(GetLocationAfter, NeedleNotFoundTwice) {
+ const char text[] = "This is the full line.\nThis is the full line too.\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "line.", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ after_loc = GetLocationAfter(after_loc, "line.", data_getter);
+ EXPECT_FALSE(after_loc.isValid());
+}
+
+TEST(GetLocationAfter, EmptyNeedle) {
+ const char text[] = "This is the full line.";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ EXPECT_EQ("This is the full line.",
+ GetSourceTextUntilEndOfLine(after_loc, data_getter));
+}
+
+TEST(GetLocationAfter, BeginAfterStartOfText) {
+ const char text[] = "This is the full line. This is the second 'this'.";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ begin_loc = CreateSourceLocationFromOffset(begin_loc, 1);
+ SourceLocation after_loc = GetLocationAfter(begin_loc, "This", data_getter);
+ EXPECT_TRUE(after_loc.isValid());
+ EXPECT_EQ(" is the second 'this'.",
+ GetSourceTextUntilEndOfLine(after_loc, data_getter));
+}
+
+TEST(GetIncludeNameAsWritten, SystemInclude) {
+ const char text[] = "#include <stdio.h>\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation inc_loc = CreateSourceLocationFromOffset(begin_loc, 9);
+ EXPECT_EQ("<stdio.h>",
+ GetIncludeNameAsWritten(inc_loc, data_getter));
+}
+
+TEST(GetIncludeNameAsWritten, NonsysytemInclude) {
+ const char text[] = "#include \"ads/util.h\"\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation inc_loc = CreateSourceLocationFromOffset(begin_loc, 9);
+ EXPECT_EQ("\"ads/util.h\"",
+ GetIncludeNameAsWritten(inc_loc, data_getter));
+}
+
+TEST(GetIncludeNameAsWritten, WithComments) {
+ const char text[] = "#include <stdio.h> // for printf\n";
+ StringCharacterDataGetter data_getter(text);
+ SourceLocation begin_loc = data_getter.BeginningOfString();
+ SourceLocation inc_loc = CreateSourceLocationFromOffset(begin_loc, 9);
+ EXPECT_EQ("<stdio.h>",
+ GetIncludeNameAsWritten(inc_loc, data_getter));
+}
+
+} // namespace
+
+
+int main(int argc, char **argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ include_what_you_use::InitGlobalsAndFlagsForTesting();
+ return RUN_ALL_TESTS();
+}
diff --git a/more_tests/iwyu_output_test.cc b/more_tests/iwyu_output_test.cc
new file mode 100644
index 0000000..4cdd839
--- /dev/null
+++ b/more_tests/iwyu_output_test.cc
@@ -0,0 +1,584 @@
+//===--- iwyu_output_test.cc - test iwyu_output.{h,cc} --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests iwyu_output.{h,cc}
+
+#include "iwyu_output.h"
+
+#include <stddef.h>
+#include <set>
+
+#include "iwyu_ast_util.h"
+#include "iwyu_globals.h"
+#include "iwyu_verrs.h"
+#include "testing/base/public/gunit.h"
+
+#undef ATTRIBUTE_UNUSED
+#include "clang/Basic/SourceLocation.h"
+
+using clang::NamedDecl;
+using clang::SourceLocation;
+
+namespace include_what_you_use {
+
+namespace internal {
+// Internal routines from iwyu_output.cc exposed for testing purposes.
+
+string MungedForwardDeclareLine(const NamedDecl* decl);
+
+set<string> CalculateMinimalIncludes(
+ const set<string>& direct_includes,
+ const set<string>& associated_direct_includes,
+ vector<OneUse>* uses);
+
+void ProcessForwardDeclare(OneUse* use);
+
+void ProcessFullUse(OneUse* use);
+
+void ProcessSymbolUse(OneUse* use);
+
+void CalculateIwyuForForwardDeclareUse(OneUse* use,
+ const set<string>& actual_includes,
+ const set<string>& desired_includes);
+
+void CalculateIwyuForFullUse(OneUse* use,
+ const set<string>& actual_includes,
+ const set<string>& desired_includes);
+
+void CalculateDesiredIncludesAndForwardDeclares(
+ const vector<OneUse>& uses,
+ const set<string> associated_desired_includes,
+ vector<OneIncludeOrForwardDeclareLine>* lines);
+
+string PrintableIncludeOrForwardDeclareLine(
+ const OneIncludeOrForwardDeclareLine& line,
+ const set<string>& associated_quoted_includes);
+
+string PrintableDiffs(const string& filename,
+ const set<string>& associated_quoted_includes,
+ const vector<OneIncludeOrForwardDeclareLine>& lines);
+
+struct FakeSourceLocation : public SourceLocation {
+ FakeSourceLocation(const string& fp, int ln)
+ : SourceLocation(), filepath(fp), linenum(ln) { }
+ string filepath;
+ int linenum;
+};
+
+} // namespace internal
+
+using internal::FakeNamedDecl; // from iwyu_output.h
+using internal::FakeSourceLocation;
+
+
+// Some helper routines on fakes.
+// TODO(csilvers): these don't get called where we want them to. :-(
+string GetFilePath(const FakeSourceLocation& fake_loc) {
+ return fake_loc.filepath;
+}
+
+string GetFilePath(const FakeNamedDecl* fake_decl) {
+ return fake_decl->decl_filepath();
+}
+
+// Note these return a string, not a FileEntry*.
+string GetFileEntry(const FakeSourceLocation& fake_loc) {
+ return fake_loc.filepath;
+}
+
+string GetFileEntry(const FakeNamedDecl* fake_decl) {
+ return fake_decl->decl_filepath();
+}
+
+// DynCasting a fake always fails.
+inline internal::DynCastPtr<FakeNamedDecl> DynCastFrom(FakeNamedDecl* ptr) {
+ return internal::DynCastPtr<FakeNamedDecl>(NULL);
+}
+
+namespace {
+
+// A helper for creating an IncludeLineData object.
+template <int N>
+OneIncludeOrForwardDeclareLine MakeDesiredIncludeLine(
+ const string& quoted_includee, const char* (&used_symbols)[N]) {
+ OneIncludeOrForwardDeclareLine retval(quoted_includee, 1);
+ retval.set_desired();
+ for (int i = 0; i < N; i++)
+ retval.AddSymbolUse(used_symbols[i]);
+ return retval;
+}
+
+// Common case where we only need one symbol.
+OneIncludeOrForwardDeclareLine MakeDesiredIncludeLine(
+ const string& quoted_includee, const char* used_symbol) {
+ const char* used_symbols[1] = { used_symbol };
+ return MakeDesiredIncludeLine(quoted_includee, used_symbols);
+}
+
+TEST(MungedForwardDeclareLineTest, Works) {
+ // TODO(csilvers): figure out how to test on a real RecordDecl/etc.
+}
+
+TEST(CalculateMinimalIncludes, Works) {
+ // TODO(csilvers): add tests here
+}
+
+TEST(ProcessForwardDeclareTest, A1) {
+ // TODO(csilvers): figure out how to test with a real record_decl/tpl_decl
+}
+
+TEST(ProcessForwardDeclareTest, A2) {
+ // TODO(csilvers): figure out how to test with a real class_tpl_decl
+}
+
+TEST(ProcessForwardDeclareTest, A3) {
+ // TODO(csilvers): figure out how to test with a real record_decl
+}
+
+TEST(ProcessForwardDeclareTest, A4) {
+ // TODO(csilvers): figure out how to test with a real record_decl
+}
+
+TEST(ProcessFullUseTest, B1) {
+ return; // TODO(csilvers): re-enable when we can fake the SourceLoc and decl
+ FakeNamedDecl decl("class", "MyClass", "src/includes/myclass.h", 10);
+ // Test the use being *before* the definition in the file (shouldn't matter)
+ OneUse samefile_use(&decl, FakeSourceLocation("src/includes/myclass.h", 5),
+ OneUse::kFullUse, false, NULL);
+ OneUse difffile_use(&decl, FakeSourceLocation("src/myclass.cc", 10),
+ OneUse::kFullUse, false, NULL);
+ internal::ProcessFullUse(&samefile_use);
+ internal::ProcessFullUse(&difffile_use);
+ EXPECT_TRUE(samefile_use.ignore_use());
+ EXPECT_FALSE(difffile_use.ignore_use());
+}
+
+TEST(ProcessFullUseTest, B2) {
+ // TODO(csilvers): figure out how to test with a real fn_decl
+}
+
+TEST(ProcessFullUseTest, B3) {
+ return; // TODO(csilvers): re-enable when we can fake the SourceLoc and decl
+ FakeNamedDecl cc_decl("class", "MyClass", "src/myclass.cc", 10);
+ // Test the use being *before* the definition in the file (shouldn't matter)
+ OneUse h_use(&cc_decl, FakeSourceLocation("src/includes/myclass.h", 5),
+ OneUse::kFullUse, false, NULL);
+ OneUse cc_use(&cc_decl, FakeSourceLocation("src/main.cc", 10),
+ OneUse::kFullUse, false, NULL);
+ internal::ProcessFullUse(&h_use);
+ internal::ProcessFullUse(&cc_use);
+ EXPECT_TRUE(h_use.ignore_use());
+ EXPECT_FALSE(cc_use.ignore_use());
+}
+
+TEST(ProcessFullUseTest, B4) {
+ // TODO(csilvers): figure out how to test with a real cxx_method_decl
+}
+
+TEST(ProcessSymbolUseTest, B5) {
+ return; // TODO(csilvers): re-enable when we can fake the SourceLoc and decl
+ // Test the use being *before* the definition in the file (shouldn't matter)
+ OneUse samefile_use("mysym", "src/includes/myclass.h",
+ FakeSourceLocation("src/includes/myclass.h", 5));
+ OneUse difffile_use("sym2", "src/includes/myclass.h",
+ FakeSourceLocation("src/myclass.cc", 5));
+ internal::ProcessSymbolUse(&samefile_use);
+ internal::ProcessSymbolUse(&difffile_use);
+ EXPECT_TRUE(samefile_use.ignore_use());
+ EXPECT_FALSE(difffile_use.ignore_use());
+}
+
+TEST(CalculateIwyuForForwardDeclareUseTest, D1) {
+ // TODO(csilvers): figure out how to test with a real record_decl
+}
+
+TEST(CalculateIwyuForForwardDeclareUseTest, D2) {
+ // TODO(csilvers): figure out how to test with a real record_decl
+}
+
+TEST(CalculateIwyuForFullUse, E1) {
+ OneUse iwyu_violation("mysym", "src/includes/myclass.h",
+ FakeSourceLocation("src/myclass.cc", 5));
+ OneUse iwyu_ok("mysym", "src/includes/myclass.h",
+ FakeSourceLocation("src/myclass.cc", 5));
+ iwyu_violation.set_suggested_header("<myclass.h>");
+ iwyu_ok.set_suggested_header("\"includes/myclass.h\"");
+
+ set<string> actual_includes;
+ actual_includes.insert("\"includes/myclass.h\"");
+ actual_includes.insert("<stdio.h>");
+ const set<string> empty; // desired includes: doesn't matter for this test
+
+ internal::CalculateIwyuForFullUse(&iwyu_violation, actual_includes, empty);
+ internal::CalculateIwyuForFullUse(&iwyu_ok, actual_includes, empty);
+ EXPECT_TRUE(iwyu_violation.is_iwyu_violation());
+ EXPECT_FALSE(iwyu_ok.is_iwyu_violation());
+}
+
+TEST(SanitizeSymbolTest, Works) {
+ // TODO(csilvers): Do this when we can create non-trivial test decls.
+}
+
+TEST(CalculateDesiredIncludesAndForwardDeclaresTest, Works) {
+ // TODO(csilvers): Implement.
+}
+
+// This test fixture automatically saves/restores the verbose level
+// between tests to prevent leaking side effects.
+class VerboseTest : public ::testing::Test {
+ protected:
+ VerboseTest() : old_verbose_level_(GetVerboseLevel()) {
+ // 2 is the default verbose level for tests that don't care much
+ // about the level.
+ SetVerboseLevel(2);
+ }
+
+ ~VerboseTest() {
+ SetVerboseLevel(old_verbose_level_);
+ }
+
+ private:
+ const int old_verbose_level_;
+};
+
+class PrintableIncludeOrForwardDeclareLineTest : public VerboseTest { };
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest, CutsOffAt80Columns) {
+ const set<string> empty;
+ OneIncludeOrForwardDeclareLine foo_line("<foo.h>", 1);
+ foo_line.AddSymbolUse("FOO");
+ foo_line.AddSymbolUse("FooClass");
+ foo_line.AddSymbolUse("FooClass::a");
+ foo_line.AddSymbolUse("FooClass::~FooClass");
+ foo_line.AddSymbolUse("FunctionOnFoo");
+ foo_line.AddSymbolUse("Foo_Enum");
+ foo_line.AddSymbolUse("Foo_Typedef");
+ foo_line.set_desired();
+ EXPECT_EQ("#include <foo.h>"
+ " // for FOO, FooClass, FooClass::a, etc\n",
+ internal::PrintableIncludeOrForwardDeclareLine(foo_line, empty));
+
+ OneIncludeOrForwardDeclareLine bar_line("<bar.h>", 2);
+ bar_line.AddSymbolUse("this_symbol_is_so_big_there_is_no_room_for_it_at_all");
+ bar_line.set_desired();
+ EXPECT_EQ("#include <bar.h>\n",
+ internal::PrintableIncludeOrForwardDeclareLine(bar_line, empty));
+
+ OneIncludeOrForwardDeclareLine long_line(
+ "\"deep/enough/to/go/past/the/indent.h\"", 3);
+ long_line.AddSymbolUse("DeepFn");
+ long_line.AddSymbolUse("Deep_Typedef");
+ long_line.AddSymbolUse("DEEP");
+ long_line.AddSymbolUse("TheInkyDeeps");
+ long_line.set_desired();
+
+ EXPECT_EQ("#include \"deep/enough/to/go/past/the/indent.h\""
+ " // for DEEP, DeepFn, etc\n",
+ internal::PrintableIncludeOrForwardDeclareLine(long_line, empty));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest, SortsSymbolsByFreqThenAlpha) {
+ SetVerboseLevel(3); // so we see a printout of *all* the symbols
+ const set<string> empty;
+ OneIncludeOrForwardDeclareLine line("<foo.h>", 2);
+ line.AddSymbolUse("FOO");
+ line.AddSymbolUse("FooClass");
+ line.AddSymbolUse("FooClass::a");
+ line.AddSymbolUse("Foo_Enum");
+ line.AddSymbolUse("FooClass::~FooClass");
+ line.AddSymbolUse("FunctionOnFoo");
+ line.AddSymbolUse("FooClass");
+ line.AddSymbolUse("Foo_Typedef");
+ line.AddSymbolUse("FooClass");
+ line.AddSymbolUse("Foo_Typedef");
+ line.AddSymbolUse("FunctionOnFoo");
+ line.set_desired();
+ EXPECT_EQ("#include <foo.h>"
+ " // for FooClass, Foo_Typedef,"
+ " FunctionOnFoo, FOO, FooClass::a, FooClass::~FooClass, Foo_Enum\n",
+ internal::PrintableIncludeOrForwardDeclareLine(line, empty));
+}
+
+TEST(PrintableDiffsTest, PrintsEmptyIncludes) {
+ vector<OneIncludeOrForwardDeclareLine> no_lines;
+ EXPECT_EQ("\n"
+ "(baz.cc has correct #includes/fwd-decls)\n",
+ internal::PrintableDiffs("baz.cc", set<string>(), no_lines));
+}
+
+TEST(PrintableDiffsTest, ProperlyOrdersIncludeLines) {
+ set<string> associated_includes;
+ associated_includes.insert("\"baz.h\"");
+ associated_includes.insert("\"baz-inl.h\"");
+ vector<OneIncludeOrForwardDeclareLine> lines;
+ lines.push_back(MakeDesiredIncludeLine("\"foo.h\"", "FOO"));
+ lines.push_back(MakeDesiredIncludeLine("\"bar.h\"", "BAR"));
+ lines.push_back(MakeDesiredIncludeLine("\"baz.h\"", "BAZ"));
+ lines.push_back(MakeDesiredIncludeLine("\"foo-inl.h\"", "FooFn"));
+ lines.push_back(MakeDesiredIncludeLine("\"bar-inl.h\"", "BarFn"));
+ lines.push_back(MakeDesiredIncludeLine("\"baz-inl.h\"", "BazFn"));
+ lines.push_back(MakeDesiredIncludeLine("<stdio.h>", "printf"));
+ lines.push_back(MakeDesiredIncludeLine("<string>", "string::iterator"));
+ lines.push_back(MakeDesiredIncludeLine("<sstring>", "sstring"));
+ lines.push_back(MakeDesiredIncludeLine("<ctype.h>", "isascii"));
+ EXPECT_EQ("\n"
+ "baz.cc should add these lines:\n"
+ "#include \"baz.h\"\n"
+ "#include \"baz-inl.h\"\n"
+ "#include <ctype.h> // for isascii\n"
+ "#include <stdio.h> // for printf\n"
+ "#include <sstring> // for sstring\n"
+ "#include <string> // for string::iterator\n"
+ "#include \"bar-inl.h\" // for BarFn\n"
+ "#include \"bar.h\" // for BAR\n"
+ "#include \"foo-inl.h\" // for FooFn\n"
+ "#include \"foo.h\" // for FOO\n"
+ "\n"
+ "baz.cc should remove these lines:\n"
+ "\n"
+ "The full include-list for baz.cc:\n"
+ "#include \"baz.h\"\n"
+ "#include \"baz-inl.h\"\n"
+ "#include <ctype.h> // for isascii\n"
+ "#include <stdio.h> // for printf\n"
+ "#include <sstring> // for sstring\n"
+ "#include <string> // for string::iterator\n"
+ "#include \"bar-inl.h\" // for BarFn\n"
+ "#include \"bar.h\" // for BAR\n"
+ "#include \"foo-inl.h\" // for FooFn\n"
+ "#include \"foo.h\" // for FOO\n"
+ "---\n",
+ internal::PrintableDiffs("baz.cc", associated_includes, lines));
+}
+
+TEST(PrintableDiffsTest, ShowLineNumbersForDeletedIncludesEvenWithUses) {
+ const set<string> empty;
+ vector<OneIncludeOrForwardDeclareLine> lines;
+ OneIncludeOrForwardDeclareLine line("\"foo.h\"", 1);
+ line.set_present(); // *not* desired
+ line.AddSymbolUse("Foo (ptr only)");
+ lines.push_back(line);
+ EXPECT_EQ("\n"
+ "baz.cc should add these lines:\n"
+ "\n"
+ "baz.cc should remove these lines:\n"
+ "- #include \"foo.h\" // lines 1-1\n"
+ "\n"
+ "The full include-list for baz.cc:\n"
+ "---\n",
+ internal::PrintableDiffs("baz.cc", empty, lines));
+}
+
+#if 0
+
+TEST_F(IwyuFileInfo_PrintableIncludeInformation, PrintsForwardDeclares) {
+ IwyuFileInfo f("baz.cc");
+ f.AddDesiredIncludeNeededBySymbol("\"foo.h\"", "FOO");
+ f.AddDesiredIncludeNeededBySymbol("\"bar.h\"", "BAR");
+ f.AddDesiredIncludeNeededBySymbol("\"baz.h\"", "BAZ");
+ f.AddDesiredIncludeNeededBySymbol("<string>", "string::iterator");
+ f.AddDesiredIncludeNeededBySymbol("<stdio.h>", "printf");
+ FakeNamedDecl record1("struct", "Foo");
+ f.AddDesiredForwardDeclare("\"record1.h\"", &record1);
+ f.NormalizeDesiredSetsForCc(set<string>());
+ EXPECT_EQ("\n"
+ "baz.cc should add these lines:\n"
+ "#include \"baz.h\"\n"
+ "#include <stdio.h> // for printf\n"
+ "#include <string> // for string::iterator\n"
+ "#include \"bar.h\" // for BAR\n"
+ "#include \"foo.h\" // for FOO\n"
+ "struct Foo;\n"
+ "\n"
+ "baz.cc should remove these lines:\n"
+ "\n"
+ "The full include-list for baz.cc:\n"
+ "#include \"baz.h\"\n"
+ "#include <stdio.h> // for printf\n"
+ "#include <string> // for string::iterator\n"
+ "#include \"bar.h\" // for BAR\n"
+ "#include \"foo.h\" // for FOO\n"
+ "struct Foo;\n"
+ "---\n",
+ f.PrintableIncludeInformation());
+}
+
+using internal::PrintableIncludeOrForwardDeclareLine;
+
+// This test fixture automatically saves/restores the verbose level
+// between tests to prevent leaking side effects.
+class PrintableIncludeOrForwardDeclareLineTest : public VerboseTest { };
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ ShowsReasonForNonMainCUHeaders) {
+ // The reason should be printed even at a low verbose level.
+ SetVerboseLevel(1);
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"foo.h\" "
+ "// for Foo\n", // single symbol
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("\"foo.h\"", symbols)));
+ const char* symbols2[] = { "Foo", "Bar" };
+ EXPECT_EQ("#include \"foo.h\" "
+ "// for Foo, Bar\n", // multiple symbols
+ PrintableIncludeOrForwardDeclareLine(
+ "x.h", MakeIncludeLine("\"foo.h\"", symbols2)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest, HidesReasonForMainCUHeaders) {
+ // The reason should be hidden even at a high verbose level.
+ SetVerboseLevel(5);
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"foo.h\"\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "foo.cc", MakeIncludeLine("\"foo.h\"", symbols)));
+ EXPECT_EQ("#include \"foo.h\"\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "foo_test.cc", MakeIncludeLine("\"foo.h\"", symbols)));
+ EXPECT_EQ("#include \"foo-inl.h\"\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "foo.cc", MakeIncludeLine("\"foo-inl.h\"", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ TruncatesLongSymbolListAtLowVerbosityLevels) {
+ SetVerboseLevel(2);
+ const char* symbols[] = { "Foo", "Bar", "SomeA", "SomeB", "SomeC", "BigX",
+ "BigY", "BigZ", "What", "Which", "Where" };
+ EXPECT_EQ("#include <foo.h> "
+ " // for Foo, Bar, SomeA, SomeB, etc\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("<foo.h>", symbols)));
+
+ EXPECT_EQ(
+ "#include <some/really/really/really/really/long/path/abc.h> "
+ "// for Foo, etc\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "a.cc",
+ MakeIncludeLine("<some/really/really/really/really/long/path/abc.h>",
+ symbols)));
+
+ EXPECT_EQ(
+ // This line is exactly 80-character long, including the \n.
+ "#include <some/really/really/really/really/long/path/abcdef.h> "
+ "// for Foo, etc\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "foo.cc",
+ MakeIncludeLine(
+ "<some/really/really/really/really/long/path/abcdef.h>",
+ symbols)));
+
+ EXPECT_EQ(
+ // There's no space on this line for " // for Foo, etc". We
+ // should cut off the comment entirely instead of printing
+ // " // for etc" or " // for ".
+ "#include <some/really/really/really/really/long/path/abcdefg.h>\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "foo.cc",
+ MakeIncludeLine(
+ "<some/really/really/really/really/long/path/abcdefg.h>",
+ symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ PreservesLongSymbolListAtHighVerbosityLevels) {
+ SetVerboseLevel(3);
+ const char* symbols[] = { "Foo", "Bar", "SomeA", "SomeB", "SomeC", "BigX",
+ "BigY", "BigZ", "What", "Which", "Where" };
+ EXPECT_EQ("#include <foo.h> "
+ "// for Foo, Bar, SomeA, SomeB, SomeC, BigX, BigY, BigZ, What, "
+ "Which, Where\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("<foo.h>", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ OmitsReasonForSuperLongPathsAtLowVerbosityLevels) {
+ SetVerboseLevel(2);
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"some/really/really/really/really/really/deeply/buried/"
+ "package/foo.h\"\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc",
+ MakeIncludeLine("\"some/really/really/really/really/really/"
+ "deeply/buried/package/foo.h\"", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ PreservesReasonForSuperLongPathsAtHighVerbosityLevels) {
+ SetVerboseLevel(3);
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"some/really/really/really/really/really/deeply/buried/"
+ "package/foo.h\" // for Foo\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc",
+ MakeIncludeLine("\"some/really/really/really/really/really/"
+ "deeply/buried/package/foo.h\"", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest, PadsSpacesForShortPaths) {
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"foo.h\" // for Foo\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("\"foo.h\"", symbols)));
+ EXPECT_EQ("#include \"foo/bar/b.h\" // for Foo\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("\"foo/bar/b.h\"", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest, DoesNotPadSpacesForLongPaths) {
+ const char* symbols[] = { "Foo" };
+ EXPECT_EQ("#include \"foo/bar/bluh.h\" // for Foo\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("\"foo/bar/bluh.h\"", symbols)));
+ EXPECT_EQ("#include \"foo/bar/bluh-bluh.h\" // for Foo\n",
+ PrintableIncludeOrForwardDeclareLine(
+ "bar.cc", MakeIncludeLine("\"foo/bar/bluh-bluh.h\"", symbols)));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ PrintsLineNumbersWhenThereIsNoUsedSymbol) {
+ IncludeOrForwardDeclareLineData data;
+ data.line = "#include <foo.h>";
+ data.line_num_range = make_pair(12, 12);
+ // data.used_symbols is intentionally left empty.
+ // We don't really care about .is_present and .is_desired.
+ EXPECT_EQ("#include <foo.h> // lines 12-12\n",
+ PrintableIncludeOrForwardDeclareLine("bar.cc", data));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ PrintsForwardDeclaresProperlyWithLineNumbers) {
+ IncludeOrForwardDeclareLineData data;
+ data.line = "class Foo;";
+ data.line_num_range = make_pair(7, 8);
+ EXPECT_EQ("class Foo; // lines 7-8\n",
+ PrintableIncludeOrForwardDeclareLine("bar.cc", data));
+}
+
+TEST_F(PrintableIncludeOrForwardDeclareLineTest,
+ PrintsForwardDeclaresProperlyWithNoLineNumbers) {
+ IncludeOrForwardDeclareLineData data;
+ data.line = "class Foo;";
+ data.line_num_range = make_pair(-1, -1);
+ EXPECT_EQ("class Foo;\n",
+ PrintableIncludeOrForwardDeclareLine("bar.cc", data));
+}
+
+#endif
+
+} // unnamed namespace
+} // namespace include_what_you_use
+
+
+int main(int argc, char **argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ include_what_you_use::InitGlobalsAndFlagsForTesting();
+ return RUN_ALL_TESTS();
+}
diff --git a/more_tests/iwyu_string_util_test.cc b/more_tests/iwyu_string_util_test.cc
new file mode 100644
index 0000000..65e199c
--- /dev/null
+++ b/more_tests/iwyu_string_util_test.cc
@@ -0,0 +1,122 @@
+//===--- iwyu_string_util_test.cc - test iwyu_string_util.h ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+// Tests for the iwyu_string_util module.
+
+#include "iwyu_string_util.h"
+
+#include <string>
+
+
+// TODO(dsturtevant): using string for MOE.
+
+namespace iwyu = include_what_you_use;
+using iwyu::SplitOnWhiteSpace;
+using iwyu::SplitOnWhiteSpacePreservingQuotes;
+using iwyu::StripWhiteSpaceLeft;
+using iwyu::StripWhiteSpaceRight;
+using iwyu::StripWhiteSpace;
+
+#define TEST_OPERATION(op, in, expected_out) { \
+ string str = in; \
+ op(&str); \
+ EXPECT_EQ(string(expected_out), str); \
+}
+
+TEST(IwyuStringUtilTest, StripWhiteSpaceLeft) {
+ TEST_OPERATION(StripWhiteSpaceLeft, "", "");
+ TEST_OPERATION(StripWhiteSpaceLeft, " ", "");
+ TEST_OPERATION(StripWhiteSpaceLeft, "abc", "abc");
+ TEST_OPERATION(StripWhiteSpaceLeft, " abc", "abc");
+ TEST_OPERATION(StripWhiteSpaceLeft, " abc ", "abc ");
+}
+
+TEST(IwyuStringUtilTest, StripWhiteSpaceRight) {
+ TEST_OPERATION(StripWhiteSpaceRight, "", "");
+ TEST_OPERATION(StripWhiteSpaceRight, " ", "");
+ TEST_OPERATION(StripWhiteSpaceRight, "abc", "abc");
+ TEST_OPERATION(StripWhiteSpaceRight, "abc ", "abc");
+ TEST_OPERATION(StripWhiteSpaceRight, " abc ", " abc");
+}
+
+TEST(IwyuStringUtilTest, StripWhiteSpace) {
+ TEST_OPERATION(StripWhiteSpace, "", "");
+ TEST_OPERATION(StripWhiteSpace, " ", "");
+ TEST_OPERATION(StripWhiteSpace, "abc", "abc");
+ TEST_OPERATION(StripWhiteSpace, " abc", "abc");
+ TEST_OPERATION(StripWhiteSpace, "abc ", "abc");
+ TEST_OPERATION(StripWhiteSpace, " abc ", "abc");
+}
+
+TEST(IwyuStringUtilTest, SplitOnWhiteSpace) {
+ string in = "this is a test";
+ vector<string> out = SplitOnWhiteSpace(in, 0);
+ ASSERT_EQ(4, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+ EXPECT_EQ(string("a"), out[2]);
+ EXPECT_EQ(string("test"), out[3]);
+
+ in = "this is a test";
+ out = SplitOnWhiteSpace(in, 2);
+ ASSERT_EQ(2, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+
+ in = "this is\ta test";
+ out = SplitOnWhiteSpace(in, 0);
+ ASSERT_EQ(4, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+ EXPECT_EQ(string("a"), out[2]);
+ EXPECT_EQ(string("test"), out[3]);
+
+ in = " this is a test ";
+ out = SplitOnWhiteSpace(in, 0);
+ ASSERT_EQ(4, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+ EXPECT_EQ(string("a"), out[2]);
+ EXPECT_EQ(string("test"), out[3]);
+}
+
+TEST(IwyuStringUtilTest, SplitOnWhiteSpacePreservingQuotes) {
+ string in = "this is <a test>";
+ vector<string> out = SplitOnWhiteSpacePreservingQuotes(in, 0);
+ ASSERT_EQ(3, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+ EXPECT_EQ(string("<a test>"), out[2]);
+
+ in = "this <is a> test";
+ out = SplitOnWhiteSpacePreservingQuotes(in, 2);
+ ASSERT_EQ(2, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("<is a>"), out[1]);
+
+ in = "\"this is\"\ta test";
+ out = SplitOnWhiteSpacePreservingQuotes(in, 0);
+ ASSERT_EQ(3, out.size());
+ EXPECT_EQ(string("\"this is\""), out[0]);
+ EXPECT_EQ(string("a"), out[1]);
+ EXPECT_EQ(string("test"), out[2]);
+
+ in = " this is \"a test\" ";
+ out = SplitOnWhiteSpacePreservingQuotes(in, 0);
+ ASSERT_EQ(3, out.size());
+ EXPECT_EQ(string("this"), out[0]);
+ EXPECT_EQ(string("is"), out[1]);
+ EXPECT_EQ(string("\"a test\""), out[2]);
+}
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/port.h b/port.h
new file mode 100644
index 0000000..5bf8f38
--- /dev/null
+++ b/port.h
@@ -0,0 +1,90 @@
+//===--- port.h - OS/cpu specific stuff for include-what-you-use ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// Source file for architecture-specific logic.
+
+#ifndef INCLUDE_WHAT_YOU_USE_PORT_H_
+#define INCLUDE_WHAT_YOU_USE_PORT_H_
+
+#include <cstdlib> // for abort
+#include <iostream>
+#include "llvm/Support/Compiler.h"
+
+// Count of statically allocated array.
+#define IWYU_ARRAYSIZE(arr) sizeof(arr) / sizeof(*arr)
+
+namespace include_what_you_use {
+
+// Helper class that allows programmers to log extra information in CHECK_s.
+class FatalMessageEmitter {
+ public:
+ FatalMessageEmitter(const char* file, int line, const char* message) {
+ stream() << file << ":" << line << ": Assertion failed: " << message;
+ }
+ LLVM_ATTRIBUTE_NORETURN ~FatalMessageEmitter() {
+ stream() << std::endl;
+ ::abort();
+#ifdef LLVM_BUILTIN_UNREACHABLE
+ // Windows systems and possibly others don't declare abort() to be noreturn,
+ // so use the unreachable builtin to avoid a Clang self-host warning.
+ LLVM_BUILTIN_UNREACHABLE;
+#endif
+ }
+ std::ostream& stream() { return std::cerr; }
+};
+
+// Helper class that allows an ostream to 'appear' as a void expression.
+class OstreamVoidifier {
+ public:
+ // This has to be an operator with a precedence lower than << but
+ // higher than ?:
+ void operator&(std::ostream&) {}
+};
+
+} // namespace include_what_you_use
+
+// Usage: CHECK_(condition) << extra << information;
+// The file, line, condition and extra information will be printed to cerr,
+// then the program will abort.
+#define CHECK_(x) (x) ? (void)0 : \
+ ::include_what_you_use::OstreamVoidifier() & \
+ ::include_what_you_use::FatalMessageEmitter( \
+ __FILE__, __LINE__, #x).stream()
+// Instead of CHECK_(false && "message") use CHECK_UNREACHABLE_("message").
+#define CHECK_UNREACHABLE_(message) \
+ ::include_what_you_use::OstreamVoidifier() & \
+ ::include_what_you_use::FatalMessageEmitter( \
+ __FILE__, __LINE__, message).stream()
+
+#if defined(_WIN32)
+
+#define snprintf _snprintf
+
+#define NOMINMAX // Prevent Windows headers from redefining min/max.
+#include "Shlwapi.h" // for PathMatchSpecA
+
+// This undef is necessary to prevent conflicts between llvm
+// and Windows headers.
+// objbase.h has #define interface struct.
+#undef interface
+
+inline bool GlobMatchesPath(const char *glob, const char *path) {
+ return PathMatchSpecA(path, glob);
+}
+
+#else // #if defined(_WIN32)
+
+#include <fnmatch.h>
+
+inline bool GlobMatchesPath(const char *glob, const char *path) {
+ return fnmatch(glob, path, FNM_PATHNAME) == 0;
+}
+
+#endif // #if defined(_WIN32)
+
+#endif // INCLUDE_WHAT_YOU_USE_PORT_H_
diff --git a/qt4.imp b/qt4.imp
new file mode 100644
index 0000000..27939e9
--- /dev/null
+++ b/qt4.imp
@@ -0,0 +1,1996 @@
+[
+##/usr/include/qt4$ grep -r '^ *# *include' | grep -e "^Q[^:]*/Q" | perl -nle 'm/^Q.*\/([^:]+).*["<]([^>Q]+)[">]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | sort -u
+ { include: ["<abstractactioneditor.h>", private, "<QDesignerActionEditorInterface>", public ] },
+ { include: ["<abstractactioneditor.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractbrushmanager.h>", private, "<QDesignerBrushManagerInterface>", public ] },
+ { include: ["<abstractbrushmanager.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractdnditem.h>", private, "<QDesignerDnDItemInterface>", public ] },
+ { include: ["<abstractdnditem.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformbuilder.h>", private, "<QAbstractFormBuilder>", public ] },
+ { include: ["<abstractformbuilder.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformeditor.h>", private, "<QDesignerFormEditorInterface>", public ] },
+ { include: ["<abstractformeditor.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformeditorplugin.h>", private, "<QDesignerFormEditorPluginInterface>", public ] },
+ { include: ["<abstractformeditorplugin.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformwindowcursor.h>", private, "<QDesignerFormWindowCursorInterface>", public ] },
+ { include: ["<abstractformwindowcursor.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformwindow.h>", private, "<QDesignerFormWindowInterface>", public ] },
+ { include: ["<abstractformwindow.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformwindowmanager.h>", private, "<QDesignerFormWindowManagerInterface>", public ] },
+ { include: ["<abstractformwindowmanager.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractformwindowtool.h>", private, "<QDesignerFormWindowToolInterface>", public ] },
+ { include: ["<abstractformwindowtool.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstracticoncache.h>", private, "<QDesignerIconCacheInterface>", public ] },
+ { include: ["<abstracticoncache.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractintegration.h>", private, "<QDesignerIntegrationInterface>", public ] },
+ { include: ["<abstractintegration.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractlanguage.h>", private, "<QDesignerLanguageExtension>", public ] },
+ { include: ["<abstractlanguage.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractmetadatabase.h>", private, "<QDesignerMetaDataBaseInterface>", public ] },
+ { include: ["<abstractmetadatabase.h>", private, "<QDesignerMetaDataBaseItemInterface>", public ] },
+ { include: ["<abstractmetadatabase.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractobjectinspector.h>", private, "<QDesignerObjectInspectorInterface>", public ] },
+ { include: ["<abstractobjectinspector.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractpromotioninterface.h>", private, "<QDesignerPromotionInterface>", public ] },
+ { include: ["<abstractpromotioninterface.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractpropertyeditor.h>", private, "<QDesignerPropertyEditorInterface>", public ] },
+ { include: ["<abstractpropertyeditor.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractresourcebrowser.h>", private, "<QDesignerResourceBrowserInterface>", public ] },
+ { include: ["<abstractresourcebrowser.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractwidgetbox.h>", private, "<QDesignerWidgetBoxInterface>", public ] },
+ { include: ["<abstractwidgetbox.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractwidgetdatabase.h>", private, "<QDesignerWidgetDataBaseInterface>", public ] },
+ { include: ["<abstractwidgetdatabase.h>", private, "<QDesignerWidgetDataBaseItemInterface>", public ] },
+ { include: ["<abstractwidgetdatabase.h>", private, "<QtDesigner>", public ] },
+ { include: ["<abstractwidgetfactory.h>", private, "<QDesignerWidgetFactoryInterface>", public ] },
+ { include: ["<abstractwidgetfactory.h>", private, "<QtDesigner>", public ] },
+ { include: ["<container.h>", private, "<QDesignerContainerExtension>", public ] },
+ { include: ["<container.h>", private, "<QtDesigner>", public ] },
+ { include: ["<customwidget.h>", private, "<QDesignerCustomWidgetCollectionInterface>", public ] },
+ { include: ["<customwidget.h>", private, "<QDesignerCustomWidgetInterface>", public ] },
+ { include: ["<customwidget.h>", private, "<QtDesigner>", public ] },
+ { include: ["<default_extensionfactory.h>", private, "<QExtensionFactory>", public ] },
+ { include: ["<dynamicpropertysheet.h>", private, "<QDesignerDynamicPropertySheetExtension>", public ] },
+ { include: ["<dynamicpropertysheet.h>", private, "<QtDesigner>", public ] },
+ { include: ["<extension.h>", private, "<QAbstractExtensionFactory>", public ] },
+ { include: ["<extension.h>", private, "<QAbstractExtensionManager>", public ] },
+ { include: ["<extension.h>", private, "<QtDesigner>", public ] },
+ { include: ["<extrainfo.h>", private, "<QDesignerExtraInfoExtension>", public ] },
+ { include: ["<extrainfo.h>", private, "<QtDesigner>", public ] },
+ { include: ["<formbuilder.h>", private, "<QFormBuilder>", public ] },
+ { include: ["<formbuilder.h>", private, "<QtDesigner>", public ] },
+ { include: ["<layoutdecoration.h>", private, "<QDesignerLayoutDecorationExtension>", public ] },
+ { include: ["<layoutdecoration.h>", private, "<QtDesigner>", public ] },
+ { include: ["<membersheet.h>", private, "<QDesignerMemberSheetExtension>", public ] },
+ { include: ["<membersheet.h>", private, "<QtDesigner>", public ] },
+ { include: ["<propertysheet.h>", private, "<QDesignerPropertySheetExtension>", public ] },
+ { include: ["<propertysheet.h>", private, "<QtDesigner>", public ] },
+ { include: ["<q3accel.h>", private, "<Q3Accel>", public ] },
+ { include: ["<q3accel.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3action.h>", private, "<Q3ActionGroup>", public ] },
+ { include: ["<q3action.h>", private, "<Q3Action>", public ] },
+ { include: ["<q3action.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3asciicache.h>", private, "<Q3AsciiCacheIterator>", public ] },
+ { include: ["<q3asciicache.h>", private, "<Q3AsciiCache>", public ] },
+ { include: ["<q3asciicache.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3asciidict.h>", private, "<Q3AsciiDictIterator>", public ] },
+ { include: ["<q3asciidict.h>", private, "<Q3AsciiDict>", public ] },
+ { include: ["<q3asciidict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3boxlayout.h>", private, "<Q3BoxLayout>", public ] },
+ { include: ["<q3boxlayout.h>", private, "<Q3HBoxLayout>", public ] },
+ { include: ["<q3boxlayout.h>", private, "<Q3VBoxLayout>", public ] },
+ { include: ["<q3boxlayout.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3buttongroup.h>", private, "<Q3ButtonGroup>", public ] },
+ { include: ["<q3buttongroup.h>", private, "<Q3HButtonGroup>", public ] },
+ { include: ["<q3buttongroup.h>", private, "<Q3VButtonGroup>", public ] },
+ { include: ["<q3buttongroup.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3button.h>", private, "<Q3Button>", public ] },
+ { include: ["<q3button.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3cache.h>", private, "<Q3CacheIterator>", public ] },
+ { include: ["<q3cache.h>", private, "<Q3Cache>", public ] },
+ { include: ["<q3cache.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasEllipse>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasItemList>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasItem>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasLine>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasPixmapArray>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasPixmap>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasPolygonalItem>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasPolygon>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3Canvas>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasRectangle>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasSpline>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasSprite>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasText>", public ] },
+ { include: ["<q3canvas.h>", private, "<Q3CanvasView>", public ] },
+ { include: ["<q3canvas.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3cleanuphandler.h>", private, "<Q3CleanupHandler>", public ] },
+ { include: ["<q3cleanuphandler.h>", private, "<Q3SingleCleanupHandler>", public ] },
+ { include: ["<q3cleanuphandler.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3combobox.h>", private, "<Q3ComboBox>", public ] },
+ { include: ["<q3combobox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3cstring.h>", private, "<Q3CString>", public ] },
+ { include: ["<q3cstring.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3databrowser.h>", private, "<Q3DataBrowser>", public ] },
+ { include: ["<q3databrowser.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3datatable.h>", private, "<Q3DataTable>", public ] },
+ { include: ["<q3datatable.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dataview.h>", private, "<Q3DataView>", public ] },
+ { include: ["<q3dataview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3datetimeedit.h>", private, "<Q3DateEdit>", public ] },
+ { include: ["<q3datetimeedit.h>", private, "<Q3DateTimeEditBase>", public ] },
+ { include: ["<q3datetimeedit.h>", private, "<Q3DateTimeEdit>", public ] },
+ { include: ["<q3datetimeedit.h>", private, "<Q3TimeEdit>", public ] },
+ { include: ["<q3datetimeedit.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3deepcopy.h>", private, "<Q3DeepCopy>", public ] },
+ { include: ["<q3deepcopy.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dict.h>", private, "<Q3DictIterator>", public ] },
+ { include: ["<q3dict.h>", private, "<Q3Dict>", public ] },
+ { include: ["<q3dict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dns.h>", private, "<Q3Dns>", public ] },
+ { include: ["<q3dns.h>", private, "<Q3DnsSocket>", public ] },
+ { include: ["<q3dns.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dockarea.h>", private, "<Q3DockAreaLayout>", public ] },
+ { include: ["<q3dockarea.h>", private, "<Q3DockArea>", public ] },
+ { include: ["<q3dockarea.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dockwindow.h>", private, "<Q3DockWindow>", public ] },
+ { include: ["<q3dockwindow.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3ColorDrag>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3DragObject>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3ImageDrag>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3StoredDrag>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3TextDrag>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Q3UriDrag>", public ] },
+ { include: ["<q3dragobject.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3dropsite.h>", private, "<Q3DropSite>", public ] },
+ { include: ["<q3dropsite.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3editorfactory.h>", private, "<Q3EditorFactory>", public ] },
+ { include: ["<q3editorfactory.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3filedialog.h>", private, "<Q3FileDialog>", public ] },
+ { include: ["<q3filedialog.h>", private, "<Q3FileIconProvider>", public ] },
+ { include: ["<q3filedialog.h>", private, "<Q3FilePreview>", public ] },
+ { include: ["<q3filedialog.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3frame.h>", private, "<Q3Frame>", public ] },
+ { include: ["<q3frame.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ftp.h>", private, "<Q3Ftp>", public ] },
+ { include: ["<q3ftp.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3garray.h>", private, "<Q3GArray>", public ] },
+ { include: ["<q3garray.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3gcache.h>", private, "<Q3GCacheIterator>", public ] },
+ { include: ["<q3gcache.h>", private, "<Q3GCache>", public ] },
+ { include: ["<q3gcache.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3AsciiBucket>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3BaseBucket>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3GDictIterator>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3GDict>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3IntBucket>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3PtrBucket>", public ] },
+ { include: ["<q3gdict.h>", private, "<Q3StringBucket>", public ] },
+ { include: ["<q3gdict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3glist.h>", private, "<Q3GListIterator>", public ] },
+ { include: ["<q3glist.h>", private, "<Q3GList>", public ] },
+ { include: ["<q3glist.h>", private, "<Q3GListStdIterator>", public ] },
+ { include: ["<q3glist.h>", private, "<Q3LNode>", public ] },
+ { include: ["<q3glist.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3grid.h>", private, "<Q3Grid>", public ] },
+ { include: ["<q3grid.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3gridlayout.h>", private, "<Q3GridLayout>", public ] },
+ { include: ["<q3gridlayout.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3gridview.h>", private, "<Q3GridView>", public ] },
+ { include: ["<q3gridview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3groupbox.h>", private, "<Q3GroupBox>", public ] },
+ { include: ["<q3groupbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3gvector.h>", private, "<Q3GVector>", public ] },
+ { include: ["<q3gvector.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3hbox.h>", private, "<Q3HBox>", public ] },
+ { include: ["<q3hbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3header.h>", private, "<Q3Header>", public ] },
+ { include: ["<q3header.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3hgroupbox.h>", private, "<Q3HGroupBox>", public ] },
+ { include: ["<q3hgroupbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3http.h>", private, "<Q3HttpHeader>", public ] },
+ { include: ["<q3http.h>", private, "<Q3Http>", public ] },
+ { include: ["<q3http.h>", private, "<Q3HttpRequestHeader>", public ] },
+ { include: ["<q3http.h>", private, "<Q3HttpResponseHeader>", public ] },
+ { include: ["<q3http.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3iconview.h>", private, "<Q3IconDragItem>", public ] },
+ { include: ["<q3iconview.h>", private, "<Q3IconDrag>", public ] },
+ { include: ["<q3iconview.h>", private, "<Q3IconViewItem>", public ] },
+ { include: ["<q3iconview.h>", private, "<Q3IconView>", public ] },
+ { include: ["<q3iconview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3intcache.h>", private, "<Q3IntCacheIterator>", public ] },
+ { include: ["<q3intcache.h>", private, "<Q3IntCache>", public ] },
+ { include: ["<q3intcache.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3intdict.h>", private, "<Q3IntDictIterator>", public ] },
+ { include: ["<q3intdict.h>", private, "<Q3IntDict>", public ] },
+ { include: ["<q3intdict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3listbox.h>", private, "<Q3ListBoxItem>", public ] },
+ { include: ["<q3listbox.h>", private, "<Q3ListBoxPixmap>", public ] },
+ { include: ["<q3listbox.h>", private, "<Q3ListBox>", public ] },
+ { include: ["<q3listbox.h>", private, "<Q3ListBoxText>", public ] },
+ { include: ["<q3listbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3listview.h>", private, "<Q3CheckListItem>", public ] },
+ { include: ["<q3listview.h>", private, "<Q3ListViewItemIterator>", public ] },
+ { include: ["<q3listview.h>", private, "<Q3ListViewItem>", public ] },
+ { include: ["<q3listview.h>", private, "<Q3ListView>", public ] },
+ { include: ["<q3listview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3localfs.h>", private, "<Q3LocalFs>", public ] },
+ { include: ["<q3localfs.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3mainwindow.h>", private, "<Q3MainWindow>", public ] },
+ { include: ["<q3mainwindow.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3memarray.h>", private, "<Q3MemArray>", public ] },
+ { include: ["<q3memarray.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3mimefactory.h>", private, "<Q3MimeSourceFactory>", public ] },
+ { include: ["<q3mimefactory.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3multilineedit.h>", private, "<Q3MultiLineEdit>", public ] },
+ { include: ["<q3multilineedit.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3network.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Q3NetworkOperation>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Q3NetworkProtocolDict>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Q3NetworkProtocolFactoryBase>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Q3NetworkProtocolFactory>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Q3NetworkProtocol>", public ] },
+ { include: ["<q3networkprotocol.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3objectdict.h>", private, "<Q3ObjectDictionary>", public ] },
+ { include: ["<q3objectdict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3paintdevicemetrics.h>", private, "<Q3PaintDeviceMetrics>", public ] },
+ { include: ["<q3paintdevicemetrics.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3painter.h>", private, "<Q3Painter>", public ] },
+ { include: ["<q3painter.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3picture.h>", private, "<Q3Picture>", public ] },
+ { include: ["<q3picture.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3pointarray.h>", private, "<Q3PointArray>", public ] },
+ { include: ["<q3pointarray.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3polygonscanner.h>", private, "<Q3PolygonScanner>", public ] },
+ { include: ["<q3polygonscanner.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3popupmenu.h>", private, "<Q3PopupMenu>", public ] },
+ { include: ["<q3popupmenu.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3process.h>", private, "<Q3Process>", public ] },
+ { include: ["<q3process.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3progressbar.h>", private, "<Q3ProgressBar>", public ] },
+ { include: ["<q3progressbar.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3progressdialog.h>", private, "<Q3ProgressDialog>", public ] },
+ { include: ["<q3progressdialog.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrcollection.h>", private, "<Q3PtrCollection>", public ] },
+ { include: ["<q3ptrcollection.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrdict.h>", private, "<Q3PtrDictIterator>", public ] },
+ { include: ["<q3ptrdict.h>", private, "<Q3PtrDict>", public ] },
+ { include: ["<q3ptrdict.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrlist.h>", private, "<Q3PtrListIterator>", public ] },
+ { include: ["<q3ptrlist.h>", private, "<Q3PtrList>", public ] },
+ { include: ["<q3ptrlist.h>", private, "<Q3PtrListStdIterator>", public ] },
+ { include: ["<q3ptrlist.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrqueue.h>", private, "<Q3PtrQueue>", public ] },
+ { include: ["<q3ptrqueue.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrstack.h>", private, "<Q3PtrStack>", public ] },
+ { include: ["<q3ptrstack.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3ptrvector.h>", private, "<Q3PtrVector>", public ] },
+ { include: ["<q3ptrvector.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3rangecontrol.h>", private, "<Q3RangeControl>", public ] },
+ { include: ["<q3rangecontrol.h>", private, "<Q3SpinWidget>", public ] },
+ { include: ["<q3rangecontrol.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3scrollview.h>", private, "<Q3ScrollView>", public ] },
+ { include: ["<q3scrollview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3semaphore.h>", private, "<Q3Semaphore>", public ] },
+ { include: ["<q3semaphore.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3serversocket.h>", private, "<Q3ServerSocket>", public ] },
+ { include: ["<q3serversocket.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3shared.h>", private, "<Q3Shared>", public ] },
+ { include: ["<q3shared.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3signal.h>", private, "<Q3Signal>", public ] },
+ { include: ["<q3signal.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3simplerichtext.h>", private, "<Q3SimpleRichText>", public ] },
+ { include: ["<q3simplerichtext.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3socketdevice.h>", private, "<Q3SocketDevice>", public ] },
+ { include: ["<q3socketdevice.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3socket.h>", private, "<Q3Socket>", public ] },
+ { include: ["<q3socket.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sortedlist.h>", private, "<Q3SortedList>", public ] },
+ { include: ["<q3sortedlist.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlcursor.h>", private, "<Q3SqlCursor>", public ] },
+ { include: ["<q3sqlcursor.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqleditorfactory.h>", private, "<Q3SqlEditorFactory>", public ] },
+ { include: ["<q3sqleditorfactory.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlfieldinfo.h>", private, "<Q3SqlFieldInfo>", public ] },
+ { include: ["<q3sqlfieldinfo.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlform.h>", private, "<Q3SqlForm>", public ] },
+ { include: ["<q3sqlform.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlpropertymap.h>", private, "<Q3SqlPropertyMap>", public ] },
+ { include: ["<q3sqlpropertymap.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlrecordinfo.h>", private, "<Q3SqlFieldInfoList>", public ] },
+ { include: ["<q3sqlrecordinfo.h>", private, "<Q3SqlRecordInfo>", public ] },
+ { include: ["<q3sqlrecordinfo.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3sqlselectcursor.h>", private, "<Q3SqlSelectCursor>", public ] },
+ { include: ["<q3sqlselectcursor.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3strlist.h>", private, "<Q3StrIList>", public ] },
+ { include: ["<q3strlist.h>", private, "<Q3StrListIterator>", public ] },
+ { include: ["<q3strlist.h>", private, "<Q3StrList>", public ] },
+ { include: ["<q3strlist.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3strvec.h>", private, "<Q3StrIVec>", public ] },
+ { include: ["<q3strvec.h>", private, "<Q3StrVec>", public ] },
+ { include: ["<q3strvec.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3stylesheet.h>", private, "<Q3StyleSheetItem>", public ] },
+ { include: ["<q3stylesheet.h>", private, "<Q3StyleSheet>", public ] },
+ { include: ["<q3stylesheet.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3syntaxhighlighter.h>", private, "<Q3SyntaxHighlighter>", public ] },
+ { include: ["<q3syntaxhighlighter.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3tabdialog.h>", private, "<Q3TabDialog>", public ] },
+ { include: ["<q3tabdialog.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3table.h>", private, "<Q3CheckTableItem>", public ] },
+ { include: ["<q3table.h>", private, "<Q3ComboTableItem>", public ] },
+ { include: ["<q3table.h>", private, "<Q3TableItem>", public ] },
+ { include: ["<q3table.h>", private, "<Q3Table>", public ] },
+ { include: ["<q3table.h>", private, "<Q3TableSelection>", public ] },
+ { include: ["<q3table.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3textbrowser.h>", private, "<Q3TextBrowser>", public ] },
+ { include: ["<q3textbrowser.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3textedit.h>", private, "<Q3TextEditOptimPrivate>", public ] },
+ { include: ["<q3textedit.h>", private, "<Q3TextEdit>", public ] },
+ { include: ["<q3textedit.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3textstream.h>", private, "<Q3TextStream>", public ] },
+ { include: ["<q3textstream.h>", private, "<Q3TSFUNC>", public ] },
+ { include: ["<q3textstream.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3textview.h>", private, "<Q3TextView>", public ] },
+ { include: ["<q3textview.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3tl.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3toolbar.h>", private, "<Q3ToolBar>", public ] },
+ { include: ["<q3toolbar.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3url.h>", private, "<Q3Url>", public ] },
+ { include: ["<q3url.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3urloperator.h>", private, "<Q3UrlOperator>", public ] },
+ { include: ["<q3urloperator.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3valuelist.h>", private, "<Q3ValueListConstIterator>", public ] },
+ { include: ["<q3valuelist.h>", private, "<Q3ValueListIterator>", public ] },
+ { include: ["<q3valuelist.h>", private, "<Q3ValueList>", public ] },
+ { include: ["<q3valuelist.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3valuestack.h>", private, "<Q3ValueStack>", public ] },
+ { include: ["<q3valuestack.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3valuevector.h>", private, "<Q3ValueVector>", public ] },
+ { include: ["<q3valuevector.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3vbox.h>", private, "<Q3VBox>", public ] },
+ { include: ["<q3vbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3vgroupbox.h>", private, "<Q3VGroupBox>", public ] },
+ { include: ["<q3vgroupbox.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3whatsthis.h>", private, "<Q3WhatsThis>", public ] },
+ { include: ["<q3whatsthis.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3widgetstack.h>", private, "<Q3WidgetStack>", public ] },
+ { include: ["<q3widgetstack.h>", private, "<Qt3Support>", public ] },
+ { include: ["<q3wizard.h>", private, "<Q3Wizard>", public ] },
+ { include: ["<q3wizard.h>", private, "<Qt3Support>", public ] },
+ { include: ["<qabstractanimation.h>", private, "<QAbstractAnimation>", public ] },
+ { include: ["<qabstractanimation.h>", private, "<QAnimationDriver>", public ] },
+ { include: ["<qabstractanimation.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstractbutton.h>", private, "<QAbstractButton>", public ] },
+ { include: ["<qabstractbutton.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstracteventdispatcher.h>", private, "<QAbstractEventDispatcher>", public ] },
+ { include: ["<qabstracteventdispatcher.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstractfileengine.h>", private, "<QAbstractFileEngineHandler>", public ] },
+ { include: ["<qabstractfileengine.h>", private, "<QAbstractFileEngineIterator>", public ] },
+ { include: ["<qabstractfileengine.h>", private, "<QAbstractFileEngine>", public ] },
+ { include: ["<qabstractfileengine.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstractfontengine_qws.h>", private, "<QAbstractFontEngine>", public ] },
+ { include: ["<qabstractfontengine_qws.h>", private, "<QFontEngineFactoryInterface>", public ] },
+ { include: ["<qabstractfontengine_qws.h>", private, "<QFontEngineInfo>", public ] },
+ { include: ["<qabstractfontengine_qws.h>", private, "<QFontEnginePlugin>", public ] },
+ { include: ["<qabstractitemdelegate.h>", private, "<QAbstractItemDelegate>", public ] },
+ { include: ["<qabstractitemdelegate.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QAbstractItemModel>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QAbstractListModel>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QAbstractTableModel>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QModelIndexList>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QModelIndex>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QPersistentModelIndex>", public ] },
+ { include: ["<qabstractitemmodel.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstractitemview.h>", private, "<QAbstractItemView>", public ] },
+ { include: ["<qabstractitemview.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractmessagehandler.h>", private, "<QAbstractMessageHandler>", public ] },
+ { include: ["<qabstractmessagehandler.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qabstractnetworkcache.h>", private, "<QAbstractNetworkCache>", public ] },
+ { include: ["<qabstractnetworkcache.h>", private, "<QNetworkCacheMetaData>", public ] },
+ { include: ["<qabstractnetworkcache.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qabstractpagesetupdialog.h>", private, "<QAbstractPageSetupDialog>", public ] },
+ { include: ["<qabstractpagesetupdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractprintdialog.h>", private, "<QAbstractPrintDialog>", public ] },
+ { include: ["<qabstractprintdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractproxymodel.h>", private, "<QAbstractProxyModel>", public ] },
+ { include: ["<qabstractproxymodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractscrollarea.h>", private, "<QAbstractScrollArea>", public ] },
+ { include: ["<qabstractscrollarea.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractslider.h>", private, "<QAbstractSlider>", public ] },
+ { include: ["<qabstractslider.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractsocket.h>", private, "<QAbstractSocket>", public ] },
+ { include: ["<qabstractsocket.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qabstractspinbox.h>", private, "<QAbstractSpinBox>", public ] },
+ { include: ["<qabstractspinbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstractstate.h>", private, "<QAbstractState>", public ] },
+ { include: ["<qabstractstate.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstracttextdocumentlayout.h>", private, "<QAbstractTextDocumentLayout>", public ] },
+ { include: ["<qabstracttextdocumentlayout.h>", private, "<QTextObjectInterface>", public ] },
+ { include: ["<qabstracttextdocumentlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qabstracttransition.h>", private, "<QAbstractTransition>", public ] },
+ { include: ["<qabstracttransition.h>", private, "<QtCore>", public ] },
+ { include: ["<qabstracturiresolver.h>", private, "<QAbstractUriResolver>", public ] },
+ { include: ["<qabstracturiresolver.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qabstractxmlnodemodel.h>", private, "<QAbstractXmlNodeModel>", public ] },
+ { include: ["<qabstractxmlnodemodel.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qabstractxmlnodemodel.h>", private, "<QXmlItem>", public ] },
+ { include: ["<qabstractxmlnodemodel.h>", private, "<QXmlNodeModelIndex>", public ] },
+ { include: ["<qabstractxmlreceiver.h>", private, "<QAbstractXmlReceiver>", public ] },
+ { include: ["<qabstractxmlreceiver.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessible2Interface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleActionInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleEditableTextInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleImageInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleSimpleEditableTextInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleTable2CellInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleTable2Interface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleTableInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleTextInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QAccessibleValueInterface>", public ] },
+ { include: ["<qaccessible2.h>", private, "<QtGui>", public ] },
+ { include: ["<qaccessiblebridge.h>", private, "<QAccessibleBridgeFactoryInterface>", public ] },
+ { include: ["<qaccessiblebridge.h>", private, "<QAccessibleBridgePlugin>", public ] },
+ { include: ["<qaccessiblebridge.h>", private, "<QAccessibleBridge>", public ] },
+ { include: ["<qaccessiblebridge.h>", private, "<QtGui>", public ] },
+ { include: ["<qaccessible.h>", private, "<QAccessibleEvent>", public ] },
+ { include: ["<qaccessible.h>", private, "<QAccessibleInterfaceEx>", public ] },
+ { include: ["<qaccessible.h>", private, "<QAccessibleInterface>", public ] },
+ { include: ["<qaccessible.h>", private, "<QAccessible>", public ] },
+ { include: ["<qaccessible.h>", private, "<QtGui>", public ] },
+ { include: ["<qaccessibleobject.h>", private, "<QAccessibleApplication>", public ] },
+ { include: ["<qaccessibleobject.h>", private, "<QAccessibleObjectEx>", public ] },
+ { include: ["<qaccessibleobject.h>", private, "<QAccessibleObject>", public ] },
+ { include: ["<qaccessibleobject.h>", private, "<QtGui>", public ] },
+ { include: ["<qaccessibleplugin.h>", private, "<QAccessibleFactoryInterface>", public ] },
+ { include: ["<qaccessibleplugin.h>", private, "<QAccessiblePlugin>", public ] },
+ { include: ["<qaccessibleplugin.h>", private, "<QtGui>", public ] },
+ { include: ["<qaccessiblewidget.h>", private, "<QAccessibleWidgetEx>", public ] },
+ { include: ["<qaccessiblewidget.h>", private, "<QAccessibleWidget>", public ] },
+ { include: ["<qaccessiblewidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qactiongroup.h>", private, "<QActionGroup>", public ] },
+ { include: ["<qactiongroup.h>", private, "<QtGui>", public ] },
+ { include: ["<qaction.h>", private, "<QAction>", public ] },
+ { include: ["<qaction.h>", private, "<QtGui>", public ] },
+ { include: ["<qalgorithms.h>", private, "<QtAlgorithms>", public ] },
+ { include: ["<qalgorithms.h>", private, "<QtCore>", public ] },
+ { include: ["<qanimationgroup.h>", private, "<QAnimationGroup>", public ] },
+ { include: ["<qanimationgroup.h>", private, "<QtCore>", public ] },
+ { include: ["<qapplication.h>", private, "<QApplication>", public ] },
+ { include: ["<qapplication.h>", private, "<QtGui>", public ] },
+ { include: ["<qassistantclient.h>", private, "<QAssistantClient>", public ] },
+ { include: ["<qassistantclient.h>", private, "<QtAssistant>", public ] },
+ { include: ["<qatomic.h>", private, "<QAtomicInt>", public ] },
+ { include: ["<qatomic.h>", private, "<QAtomicPointer>", public ] },
+ { include: ["<qatomic.h>", private, "<QtCore>", public ] },
+ { include: ["<qauthenticator.h>", private, "<QAuthenticator>", public ] },
+ { include: ["<qauthenticator.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qbasicatomic.h>", private, "<QBasicAtomicInt>", public ] },
+ { include: ["<qbasicatomic.h>", private, "<QBasicAtomicPointer>", public ] },
+ { include: ["<qbasicatomic.h>", private, "<QtCore>", public ] },
+ { include: ["<qbasictimer.h>", private, "<QBasicTimer>", public ] },
+ { include: ["<qbasictimer.h>", private, "<QtCore>", public ] },
+ { include: ["<qbenchmark.h>", private, "<QtTest>", public ] },
+ { include: ["<qbenchmarkmetric.h>", private, "<QtTest>", public ] },
+ { include: ["<qbitarray.h>", private, "<QBitArray>", public ] },
+ { include: ["<qbitarray.h>", private, "<QBitRef>", public ] },
+ { include: ["<qbitarray.h>", private, "<QtCore>", public ] },
+ { include: ["<qbitmap.h>", private, "<QBitmap>", public ] },
+ { include: ["<qbitmap.h>", private, "<QtGui>", public ] },
+ { include: ["<qboxlayout.h>", private, "<QBoxLayout>", public ] },
+ { include: ["<qboxlayout.h>", private, "<QHBoxLayout>", public ] },
+ { include: ["<qboxlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qboxlayout.h>", private, "<QVBoxLayout>", public ] },
+ { include: ["<qbrush.h>", private, "<QBrushData>", public ] },
+ { include: ["<qbrush.h>", private, "<QBrush>", public ] },
+ { include: ["<qbrush.h>", private, "<QConicalGradient>", public ] },
+ { include: ["<qbrush.h>", private, "<QGradient>", public ] },
+ { include: ["<qbrush.h>", private, "<QGradientStop>", public ] },
+ { include: ["<qbrush.h>", private, "<QGradientStops>", public ] },
+ { include: ["<qbrush.h>", private, "<QLinearGradient>", public ] },
+ { include: ["<qbrush.h>", private, "<QRadialGradient>", public ] },
+ { include: ["<qbrush.h>", private, "<QtGui>", public ] },
+ { include: ["<qbuffer.h>", private, "<QBuffer>", public ] },
+ { include: ["<qbuffer.h>", private, "<QtCore>", public ] },
+ { include: ["<qbuttongroup.h>", private, "<QButtonGroup>", public ] },
+ { include: ["<qbuttongroup.h>", private, "<QtGui>", public ] },
+ { include: ["<qbytearray.h>", private, "<QByteArray>", public ] },
+ { include: ["<qbytearray.h>", private, "<QByteRef>", public ] },
+ { include: ["<qbytearray.h>", private, "<QtCore>", public ] },
+ { include: ["<qbytearraymatcher.h>", private, "<QByteArrayMatcher>", public ] },
+ { include: ["<qbytearraymatcher.h>", private, "<QtCore>", public ] },
+ { include: ["<qcache.h>", private, "<QCache>", public ] },
+ { include: ["<qcache.h>", private, "<QtCore>", public ] },
+ { include: ["<qcalendarwidget.h>", private, "<QCalendarWidget>", public ] },
+ { include: ["<qcalendarwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qcdestyle.h>", private, "<QCDEStyle>", public ] },
+ { include: ["<qcdestyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qchar.h>", private, "<QChar>", public ] },
+ { include: ["<qchar.h>", private, "<QLatin1Char>", public ] },
+ { include: ["<qchar.h>", private, "<QtCore>", public ] },
+ { include: ["<qcheckbox.h>", private, "<QCheckBox>", public ] },
+ { include: ["<qcheckbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qcleanlooksstyle.h>", private, "<QCleanlooksStyle>", public ] },
+ { include: ["<qcleanlooksstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qclipboard.h>", private, "<QClipboard>", public ] },
+ { include: ["<qclipboard.h>", private, "<QtGui>", public ] },
+ { include: ["<qcolordialog.h>", private, "<QColorDialog>", public ] },
+ { include: ["<qcolordialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qcolor.h>", private, "<QColor>", public ] },
+ { include: ["<qcolor.h>", private, "<QtGui>", public ] },
+ { include: ["<qcolormap.h>", private, "<QColormap>", public ] },
+ { include: ["<qcolormap.h>", private, "<QtGui>", public ] },
+ { include: ["<qcolumnview.h>", private, "<QColumnView>", public ] },
+ { include: ["<qcolumnview.h>", private, "<QtGui>", public ] },
+ { include: ["<qcombobox.h>", private, "<QComboBox>", public ] },
+ { include: ["<qcombobox.h>", private, "<QtGui>", public ] },
+ { include: ["<qcommandlinkbutton.h>", private, "<QCommandLinkButton>", public ] },
+ { include: ["<qcommandlinkbutton.h>", private, "<QtGui>", public ] },
+ { include: ["<qcommonstyle.h>", private, "<QCommonStyle>", public ] },
+ { include: ["<qcommonstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qcompleter.h>", private, "<QCompleter>", public ] },
+ { include: ["<qcompleter.h>", private, "<QtGui>", public ] },
+ { include: ["<qconfig.h>", private, "<QtConfig>", public ] },
+ { include: ["<qcontainerfwd.h>", private, "<QtContainerFwd>", public ] },
+ { include: ["<qcontainerfwd.h>", private, "<QtCore>", public ] },
+ { include: ["<qcontiguouscache.h>", private, "<QContiguousCacheData>", public ] },
+ { include: ["<qcontiguouscache.h>", private, "<QContiguousCache>", public ] },
+ { include: ["<qcontiguouscache.h>", private, "<QContiguousCacheTypedData>", public ] },
+ { include: ["<qcontiguouscache.h>", private, "<QtCore>", public ] },
+ { include: ["<qcopchannel_qws.h>", private, "<QCopChannel>", public ] },
+ { include: ["<qcoreapplication.h>", private, "<QCoreApplication>", public ] },
+ { include: ["<qcoreapplication.h>", private, "<QtCleanUpFunction>", public ] },
+ { include: ["<qcoreapplication.h>", private, "<QtCore>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QChildEvent>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QCustomEvent>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QDynamicPropertyChangeEvent>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QEvent>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QtCore>", public ] },
+ { include: ["<qcoreevent.h>", private, "<QTimerEvent>", public ] },
+ { include: ["<qcryptographichash.h>", private, "<QCryptographicHash>", public ] },
+ { include: ["<qcryptographichash.h>", private, "<QtCore>", public ] },
+ { include: ["<qcursor.h>", private, "<QCursor>", public ] },
+ { include: ["<qcursor.h>", private, "<QCursorShape>", public ] },
+ { include: ["<qcursor.h>", private, "<QtGui>", public ] },
+ { include: ["<qdatastream.h>", private, "<QDataStream>", public ] },
+ { include: ["<qdatastream.h>", private, "<QtCore>", public ] },
+ { include: ["<qdatawidgetmapper.h>", private, "<QDataWidgetMapper>", public ] },
+ { include: ["<qdatawidgetmapper.h>", private, "<QtGui>", public ] },
+ { include: ["<qdatetimeedit.h>", private, "<QDateEdit>", public ] },
+ { include: ["<qdatetimeedit.h>", private, "<QDateTimeEdit>", public ] },
+ { include: ["<qdatetimeedit.h>", private, "<QtGui>", public ] },
+ { include: ["<qdatetimeedit.h>", private, "<QTimeEdit>", public ] },
+ { include: ["<qdatetime.h>", private, "<QDate>", public ] },
+ { include: ["<qdatetime.h>", private, "<QDateTime>", public ] },
+ { include: ["<qdatetime.h>", private, "<QtCore>", public ] },
+ { include: ["<qdatetime.h>", private, "<QTime>", public ] },
+ { include: ["<qdbusabstractadaptor.h>", private, "<QDBusAbstractAdaptor>", public ] },
+ { include: ["<qdbusabstractadaptor.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusabstractinterface.h>", private, "<QDBusAbstractInterfaceBase>", public ] },
+ { include: ["<qdbusabstractinterface.h>", private, "<QDBusAbstractInterface>", public ] },
+ { include: ["<qdbusabstractinterface.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusargument.h>", private, "<QDBusArgument>", public ] },
+ { include: ["<qdbusargument.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusconnection.h>", private, "<QDBusConnection>", public ] },
+ { include: ["<qdbusconnection.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusconnectioninterface.h>", private, "<QDBusConnectionInterface>", public ] },
+ { include: ["<qdbusconnectioninterface.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbuscontext.h>", private, "<QDBusContext>", public ] },
+ { include: ["<qdbuscontext.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbuserror.h>", private, "<QDBusError>", public ] },
+ { include: ["<qdbuserror.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusextratypes.h>", private, "<QDBusObjectPath>", public ] },
+ { include: ["<qdbusextratypes.h>", private, "<QDBusSignature>", public ] },
+ { include: ["<qdbusextratypes.h>", private, "<QDBusVariant>", public ] },
+ { include: ["<qdbusextratypes.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusinterface.h>", private, "<QDBusInterface>", public ] },
+ { include: ["<qdbusinterface.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusmacros.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusmessage.h>", private, "<QDBusMessage>", public ] },
+ { include: ["<qdbusmessage.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusmetatype.h>", private, "<QDBusMetaType>", public ] },
+ { include: ["<qdbusmetatype.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbuspendingcall.h>", private, "<QDBusPendingCall>", public ] },
+ { include: ["<qdbuspendingcall.h>", private, "<QDBusPendingCallWatcher>", public ] },
+ { include: ["<qdbuspendingcall.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbuspendingreply.h>", private, "<QDBusPendingReplyData>", public ] },
+ { include: ["<qdbuspendingreply.h>", private, "<QDBusPendingReply>", public ] },
+ { include: ["<qdbuspendingreply.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusreply.h>", private, "<QDBusReply>", public ] },
+ { include: ["<qdbusreply.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusserver.h>", private, "<QDBusServer>", public ] },
+ { include: ["<qdbusserver.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusservicewatcher.h>", private, "<QDBusServiceWatcher>", public ] },
+ { include: ["<qdbusservicewatcher.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusunixfiledescriptor.h>", private, "<QDBusUnixFileDescriptor>", public ] },
+ { include: ["<qdbusunixfiledescriptor.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdbusvirtualobject.h>", private, "<QDBusVirtualObject>", public ] },
+ { include: ["<qdbusvirtualobject.h>", private, "<QtDBus>", public ] },
+ { include: ["<qdebug.h>", private, "<QDebug>", public ] },
+ { include: ["<qdebug.h>", private, "<QNoDebug>", public ] },
+ { include: ["<qdebug.h>", private, "<QtCore>", public ] },
+ { include: ["<qdebug.h>", private, "<QtDebug>", public ] },
+ { include: ["<qdeclarativecomponent.h>", private, "<QDeclarativeComponent>", public ] },
+ { include: ["<qdeclarativecomponent.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativecontext.h>", private, "<QDeclarativeContext>", public ] },
+ { include: ["<qdeclarativecontext.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativedebug.h>", private, "<QDeclarativeDebuggingEnabler>", public ] },
+ { include: ["<qdeclarativedebug.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeengine.h>", private, "<QDeclarativeEngine>", public ] },
+ { include: ["<qdeclarativeengine.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeerror.h>", private, "<QDeclarativeError>", public ] },
+ { include: ["<qdeclarativeerror.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeexpression.h>", private, "<QDeclarativeExpression>", public ] },
+ { include: ["<qdeclarativeexpression.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeextensioninterface.h>", private, "<QDeclarativeExtensionInterface>", public ] },
+ { include: ["<qdeclarativeextensioninterface.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeextensionplugin.h>", private, "<QDeclarativeExtensionPlugin>", public ] },
+ { include: ["<qdeclarativeextensionplugin.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarative.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeimageprovider.h>", private, "<QDeclarativeImageProvider>", public ] },
+ { include: ["<qdeclarativeimageprovider.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeinfo.h>", private, "<QDeclarativeInfo>", public ] },
+ { include: ["<qdeclarativeinfo.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeitem.h>", private, "<QDeclarativeItem>", public ] },
+ { include: ["<qdeclarativeitem.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativelist.h>", private, "<QDeclarativeListProperty>", public ] },
+ { include: ["<qdeclarativelist.h>", private, "<QDeclarativeListReference>", public ] },
+ { include: ["<qdeclarativelist.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativenetworkaccessmanagerfactory.h>", private, "<QDeclarativeNetworkAccessManagerFactory>", public ] },
+ { include: ["<qdeclarativenetworkaccessmanagerfactory.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeparserstatus.h>", private, "<QDeclarativeParserStatus>", public ] },
+ { include: ["<qdeclarativeparserstatus.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeprivate.h>", private, "<QDeclarativeAttachedPropertiesFunc>", public ] },
+ { include: ["<qdeclarativeprivate.h>", private, "<QDeclarativeTypeInfo>", public ] },
+ { include: ["<qdeclarativeprivate.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeproperty.h>", private, "<QDeclarativeProperties>", public ] },
+ { include: ["<qdeclarativeproperty.h>", private, "<QDeclarativeProperty>", public ] },
+ { include: ["<qdeclarativeproperty.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativepropertymap.h>", private, "<QDeclarativePropertyMap>", public ] },
+ { include: ["<qdeclarativepropertymap.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativepropertyvalueinterceptor.h>", private, "<QDeclarativePropertyValueInterceptor>", public ] },
+ { include: ["<qdeclarativepropertyvalueinterceptor.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativepropertyvaluesource.h>", private, "<QDeclarativePropertyValueSource>", public ] },
+ { include: ["<qdeclarativepropertyvaluesource.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativescriptstring.h>", private, "<QDeclarativeScriptString>", public ] },
+ { include: ["<qdeclarativescriptstring.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdeclarativeview.h>", private, "<QDeclarativeView>", public ] },
+ { include: ["<qdeclarativeview.h>", private, "<QtDeclarative>", public ] },
+ { include: ["<qdecorationdefault_qws.h>", private, "<QDecorationDefault>", public ] },
+ { include: ["<qdecorationfactory_qws.h>", private, "<QDecorationFactory>", public ] },
+ { include: ["<qdecorationplugin_qws.h>", private, "<QDecorationFactoryInterface>", public ] },
+ { include: ["<qdecorationplugin_qws.h>", private, "<QDecorationPlugin>", public ] },
+ { include: ["<qdecoration_qws.h>", private, "<QDecorationAction>", public ] },
+ { include: ["<qdecoration_qws.h>", private, "<QDecoration>", public ] },
+ { include: ["<qdecorationstyled_qws.h>", private, "<QDecorationStyled>", public ] },
+ { include: ["<qdecorationwindows_qws.h>", private, "<QDecorationWindows>", public ] },
+ { include: ["<qdesigner_components.h>", private, "<QDesignerComponents>", public ] },
+ { include: ["<qdesignerexportwidget.h>", private, "<QDesignerExportWidget>", public ] },
+ { include: ["<qdesignerexportwidget.h>", private, "<QtDesigner>", public ] },
+ { include: ["<qdesktopservices.h>", private, "<QDesktopServices>", public ] },
+ { include: ["<qdesktopservices.h>", private, "<QtGui>", public ] },
+ { include: ["<qdesktopwidget.h>", private, "<QDesktopWidget>", public ] },
+ { include: ["<qdesktopwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qdial.h>", private, "<QDial>", public ] },
+ { include: ["<qdial.h>", private, "<QtGui>", public ] },
+ { include: ["<qdialogbuttonbox.h>", private, "<QDialogButtonBox>", public ] },
+ { include: ["<qdialogbuttonbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qdialog.h>", private, "<QDialog>", public ] },
+ { include: ["<qdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qdirectpainter_qws.h>", private, "<QDirectPainter>", public ] },
+ { include: ["<qdir.h>", private, "<QDir>", public ] },
+ { include: ["<qdir.h>", private, "<QtCore>", public ] },
+ { include: ["<qdiriterator.h>", private, "<QDirIterator>", public ] },
+ { include: ["<qdiriterator.h>", private, "<QtCore>", public ] },
+ { include: ["<qdirmodel.h>", private, "<QDirModel>", public ] },
+ { include: ["<qdirmodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qdockwidget.h>", private, "<QDockWidget>", public ] },
+ { include: ["<qdockwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qdom.h>", private, "<QDomAttr>", public ] },
+ { include: ["<qdom.h>", private, "<QDomCDATASection>", public ] },
+ { include: ["<qdom.h>", private, "<QDomCharacterData>", public ] },
+ { include: ["<qdom.h>", private, "<QDomComment>", public ] },
+ { include: ["<qdom.h>", private, "<QDomDocumentFragment>", public ] },
+ { include: ["<qdom.h>", private, "<QDomDocument>", public ] },
+ { include: ["<qdom.h>", private, "<QDomDocumentType>", public ] },
+ { include: ["<qdom.h>", private, "<QDomElement>", public ] },
+ { include: ["<qdom.h>", private, "<QDomEntity>", public ] },
+ { include: ["<qdom.h>", private, "<QDomEntityReference>", public ] },
+ { include: ["<qdom.h>", private, "<QDomImplementation>", public ] },
+ { include: ["<qdom.h>", private, "<QDomNamedNodeMap>", public ] },
+ { include: ["<qdom.h>", private, "<QDomNodeList>", public ] },
+ { include: ["<qdom.h>", private, "<QDomNode>", public ] },
+ { include: ["<qdom.h>", private, "<QDomNotation>", public ] },
+ { include: ["<qdom.h>", private, "<QDomProcessingInstruction>", public ] },
+ { include: ["<qdom.h>", private, "<QDomText>", public ] },
+ { include: ["<qdom.h>", private, "<QtXml>", public ] },
+ { include: ["<qdrag.h>", private, "<QDrag>", public ] },
+ { include: ["<qdrag.h>", private, "<QtGui>", public ] },
+ { include: ["<qdrawutil.h>", private, "<QtGui>", public ] },
+ { include: ["<qdrawutil.h>", private, "<QTileRules>", public ] },
+ { include: ["<qeasingcurve.h>", private, "<QEasingCurve>", public ] },
+ { include: ["<qeasingcurve.h>", private, "<QtCore>", public ] },
+ { include: ["<qelapsedtimer.h>", private, "<QElapsedTimer>", public ] },
+ { include: ["<qelapsedtimer.h>", private, "<QtCore>", public ] },
+ { include: ["<qendian.h>", private, "<QtCore>", public ] },
+ { include: ["<qendian.h>", private, "<QtEndian>", public ] },
+ { include: ["<qerrormessage.h>", private, "<QErrorMessage>", public ] },
+ { include: ["<qerrormessage.h>", private, "<QtGui>", public ] },
+ { include: ["<qevent.h>", private, "<QActionEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QClipboardEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QCloseEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QContextMenuEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QDragEnterEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QDragLeaveEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QDragMoveEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QDragResponseEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QDropEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QFileOpenEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QFocusEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QGestureEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QHelpEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QHideEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QHoverEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QIconDragEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QInputEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QInputMethodEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QKeyEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QMenubarUpdatedEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QMouseEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QMoveEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QPaintEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QResizeEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QShortcutEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QShowEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QStatusTipEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QTabletEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QtEvents>", public ] },
+ { include: ["<qevent.h>", private, "<QtGui>", public ] },
+ { include: ["<qevent.h>", private, "<QToolBarChangeEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QTouchEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QUpdateLaterEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QWhatsThisClickedEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QWheelEvent>", public ] },
+ { include: ["<qevent.h>", private, "<QWindowStateChangeEvent>", public ] },
+ { include: ["<qeventloop.h>", private, "<QEventLoop>", public ] },
+ { include: ["<qeventloop.h>", private, "<QtCore>", public ] },
+ { include: ["<qeventtransition.h>", private, "<QEventTransition>", public ] },
+ { include: ["<qeventtransition.h>", private, "<QtCore>", public ] },
+ { include: ["<qextensionmanager.h>", private, "<QExtensionManager>", public ] },
+ { include: ["<qextensionmanager.h>", private, "<QtDesigner>", public ] },
+ { include: ["<qfactoryinterface.h>", private, "<QFactoryInterface>", public ] },
+ { include: ["<qfactoryinterface.h>", private, "<QtCore>", public ] },
+ { include: ["<qfeatures.h>", private, "<QtCore>", public ] },
+ { include: ["<qfiledialog.h>", private, "<QFileDialog>", public ] },
+ { include: ["<qfiledialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qfile.h>", private, "<QFile>", public ] },
+ { include: ["<qfile.h>", private, "<QtCore>", public ] },
+ { include: ["<qfileiconprovider.h>", private, "<QFileIconProvider>", public ] },
+ { include: ["<qfileiconprovider.h>", private, "<QtGui>", public ] },
+ { include: ["<qfileinfo.h>", private, "<QFileInfoListIterator>", public ] },
+ { include: ["<qfileinfo.h>", private, "<QFileInfoList>", public ] },
+ { include: ["<qfileinfo.h>", private, "<QFileInfo>", public ] },
+ { include: ["<qfileinfo.h>", private, "<QtCore>", public ] },
+ { include: ["<qfilesystemmodel.h>", private, "<QFileSystemModel>", public ] },
+ { include: ["<qfilesystemmodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qfilesystemwatcher.h>", private, "<QFileSystemWatcher>", public ] },
+ { include: ["<qfilesystemwatcher.h>", private, "<QtCore>", public ] },
+ { include: ["<qfinalstate.h>", private, "<QFinalState>", public ] },
+ { include: ["<qfinalstate.h>", private, "<QtCore>", public ] },
+ { include: ["<qfocusframe.h>", private, "<QFocusFrame>", public ] },
+ { include: ["<qfocusframe.h>", private, "<QtGui>", public ] },
+ { include: ["<qfontcombobox.h>", private, "<QFontComboBox>", public ] },
+ { include: ["<qfontcombobox.h>", private, "<QtGui>", public ] },
+ { include: ["<qfontdatabase.h>", private, "<QFontDatabase>", public ] },
+ { include: ["<qfontdatabase.h>", private, "<QtGui>", public ] },
+ { include: ["<qfontdialog.h>", private, "<QFontDialog>", public ] },
+ { include: ["<qfontdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qfont.h>", private, "<QFont>", public ] },
+ { include: ["<qfont.h>", private, "<QtGui>", public ] },
+ { include: ["<qfontinfo.h>", private, "<QFontInfo>", public ] },
+ { include: ["<qfontinfo.h>", private, "<QtGui>", public ] },
+ { include: ["<qfontmetrics.h>", private, "<QFontMetricsF>", public ] },
+ { include: ["<qfontmetrics.h>", private, "<QFontMetrics>", public ] },
+ { include: ["<qfontmetrics.h>", private, "<QtGui>", public ] },
+ { include: ["<qformlayout.h>", private, "<QFormLayout>", public ] },
+ { include: ["<qformlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qframe.h>", private, "<QFrame>", public ] },
+ { include: ["<qframe.h>", private, "<QtGui>", public ] },
+ { include: ["<qfsfileengine.h>", private, "<QFSFileEngine>", public ] },
+ { include: ["<qfsfileengine.h>", private, "<QtCore>", public ] },
+ { include: ["<qftp.h>", private, "<QFtp>", public ] },
+ { include: ["<qftp.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qfuture.h>", private, "<QFutureIterator>", public ] },
+ { include: ["<qfuture.h>", private, "<QFuture>", public ] },
+ { include: ["<qfuture.h>", private, "<QMutableFutureIterator>", public ] },
+ { include: ["<qfuture.h>", private, "<QtCore>", public ] },
+ { include: ["<qfutureinterface.h>", private, "<QFutureInterfaceBase>", public ] },
+ { include: ["<qfutureinterface.h>", private, "<QFutureInterface>", public ] },
+ { include: ["<qfutureinterface.h>", private, "<QtCore>", public ] },
+ { include: ["<qfuturesynchronizer.h>", private, "<QFutureSynchronizer>", public ] },
+ { include: ["<qfuturesynchronizer.h>", private, "<QtCore>", public ] },
+ { include: ["<qfuturewatcher.h>", private, "<QFutureWatcherBase>", public ] },
+ { include: ["<qfuturewatcher.h>", private, "<QFutureWatcher>", public ] },
+ { include: ["<qfuturewatcher.h>", private, "<QtCore>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QGenericMatrix>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix2x2>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix2x3>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix2x4>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix3x2>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix3x3>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix3x4>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix4x2>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QMatrix4x3>", public ] },
+ { include: ["<qgenericmatrix.h>", private, "<QtGui>", public ] },
+ { include: ["<qgenericpluginfactory_qpa.h>", private, "<QGenericPluginFactory>", public ] },
+ { include: ["<qgenericplugin_qpa.h>", private, "<QGenericPluginFactoryInterface>", public ] },
+ { include: ["<qgenericplugin_qpa.h>", private, "<QGenericPlugin>", public ] },
+ { include: ["<qgesture.h>", private, "<QGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QPanGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QPinchGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QSwipeGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QTapAndHoldGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QTapGesture>", public ] },
+ { include: ["<qgesture.h>", private, "<QtGui>", public ] },
+ { include: ["<qgesturerecognizer.h>", private, "<QGestureRecognizer>", public ] },
+ { include: ["<qgesturerecognizer.h>", private, "<QtGui>", public ] },
+ { include: ["<qglbuffer.h>", private, "<QGLBuffer>", public ] },
+ { include: ["<qglbuffer.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglcolormap.h>", private, "<QGLColormap>", public ] },
+ { include: ["<qglcolormap.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglframebufferobject.h>", private, "<QGLFramebufferObjectFormat>", public ] },
+ { include: ["<qglframebufferobject.h>", private, "<QGLFramebufferObject>", public ] },
+ { include: ["<qglframebufferobject.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglfunctions.h>", private, "<QGLFunctionsPrivate>", public ] },
+ { include: ["<qglfunctions.h>", private, "<QGLFunctions>", public ] },
+ { include: ["<qglfunctions.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qgl.h>", private, "<QGLContext>", public ] },
+ { include: ["<qgl.h>", private, "<QGLFormat>", public ] },
+ { include: ["<qgl.h>", private, "<QGL>", public ] },
+ { include: ["<qgl.h>", private, "<QGLWidget>", public ] },
+ { include: ["<qgl.h>", private, "<QMacCompatGLenum>", public ] },
+ { include: ["<qgl.h>", private, "<QMacCompatGLint>", public ] },
+ { include: ["<qgl.h>", private, "<QMacCompatGLuint>", public ] },
+ { include: ["<qgl.h>", private, "<QMacGLCompatTypes>", public ] },
+ { include: ["<qgl.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglobal.h>", private, "<QBool>", public ] },
+ { include: ["<qglobal.h>", private, "<QFlag>", public ] },
+ { include: ["<qglobal.h>", private, "<QFlags>", public ] },
+ { include: ["<qglobal.h>", private, "<QForeachContainerBase>", public ] },
+ { include: ["<qglobal.h>", private, "<QForeachContainer>", public ] },
+ { include: ["<qglobal.h>", private, "<QGlobalStaticDeleter>", public ] },
+ { include: ["<qglobal.h>", private, "<QGlobalStatic>", public ] },
+ { include: ["<qglobal.h>", private, "<QIncompatibleFlag>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_INT16>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_INT32>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_INT64>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_INT8>", public ] },
+ { include: ["<qglobal.h>", private, "<QIntegerForSize>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_LLONG>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_LONG>", public ] },
+ { include: ["<qglobal.h>", private, "<QNoImplicitBoolCast>", public ] },
+ { include: ["<qglobal.h>", private, "<QSysInfo>", public ] },
+ { include: ["<qglobal.h>", private, "<QtCore>", public ] },
+ { include: ["<qglobal.h>", private, "<QtGlobal>", public ] },
+ { include: ["<qglobal.h>", private, "<QtMsgHandler>", public ] },
+ { include: ["<qglobal.h>", private, "<QTypeInfo>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_UINT16>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_UINT32>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_UINT64>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_UINT8>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_ULLONG>", public ] },
+ { include: ["<qglobal.h>", private, "<Q_ULONG>", public ] },
+ { include: ["<qglpixelbuffer.h>", private, "<QGLPixelBuffer>", public ] },
+ { include: ["<qglpixelbuffer.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglscreen_qws.h>", private, "<QGLScreen>", public ] },
+ { include: ["<qglscreen_qws.h>", private, "<QGLScreenSurfaceFunctions>", public ] },
+ { include: ["<qglshaderprogram.h>", private, "<QGLShaderProgram>", public ] },
+ { include: ["<qglshaderprogram.h>", private, "<QGLShader>", public ] },
+ { include: ["<qglshaderprogram.h>", private, "<QtOpenGL>", public ] },
+ { include: ["<qglyphrun.h>", private, "<QGlyphRun>", public ] },
+ { include: ["<qglyphrun.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsanchorlayout.h>", private, "<QGraphicsAnchorLayout>", public ] },
+ { include: ["<qgraphicsanchorlayout.h>", private, "<QGraphicsAnchor>", public ] },
+ { include: ["<qgraphicsanchorlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QGraphicsBlurEffect>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QGraphicsColorizeEffect>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QGraphicsDropShadowEffect>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QGraphicsEffect>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QGraphicsOpacityEffect>", public ] },
+ { include: ["<qgraphicseffect.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsgridlayout.h>", private, "<QGraphicsGridLayout>", public ] },
+ { include: ["<qgraphicsgridlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsitemanimation.h>", private, "<QGraphicsItemAnimation>", public ] },
+ { include: ["<qgraphicsitemanimation.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QAbstractGraphicsShapeItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsEllipseItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsItemGroup>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsLineItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsObject>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsPathItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsPixmapItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsPolygonItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsRectItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsSimpleTextItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QGraphicsTextItem>", public ] },
+ { include: ["<qgraphicsitem.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicslayout.h>", private, "<QGraphicsLayout>", public ] },
+ { include: ["<qgraphicslayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicslayoutitem.h>", private, "<QGraphicsLayoutItem>", public ] },
+ { include: ["<qgraphicslayoutitem.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicslinearlayout.h>", private, "<QGraphicsLinearLayout>", public ] },
+ { include: ["<qgraphicslinearlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsproxywidget.h>", private, "<QGraphicsProxyWidget>", public ] },
+ { include: ["<qgraphicsproxywidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneContextMenuEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneDragDropEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneHelpEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneHoverEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneMouseEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneMoveEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneResizeEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QGraphicsSceneWheelEvent>", public ] },
+ { include: ["<qgraphicssceneevent.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsscene.h>", private, "<QGraphicsScene>", public ] },
+ { include: ["<qgraphicsscene.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicssvgitem.h>", private, "<QGraphicsSvgItem>", public ] },
+ { include: ["<qgraphicssvgitem.h>", private, "<QtSvg>", public ] },
+ { include: ["<qgraphicssystemhelper_symbian.h>", private, "<QSymbianGraphicsSystemHelper>", public ] },
+ { include: ["<qgraphicstransform.h>", private, "<QGraphicsRotation>", public ] },
+ { include: ["<qgraphicstransform.h>", private, "<QGraphicsScale>", public ] },
+ { include: ["<qgraphicstransform.h>", private, "<QGraphicsTransform>", public ] },
+ { include: ["<qgraphicstransform.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicsview.h>", private, "<QGraphicsView>", public ] },
+ { include: ["<qgraphicsview.h>", private, "<QtGui>", public ] },
+ { include: ["<qgraphicswebview.h>", private, "<QGraphicsWebView>", public ] },
+ { include: ["<qgraphicswebview.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qgraphicswidget.h>", private, "<QGraphicsWidget>", public ] },
+ { include: ["<qgraphicswidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qgridlayout.h>", private, "<QGridLayout>", public ] },
+ { include: ["<qgridlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qgroupbox.h>", private, "<QGroupBox>", public ] },
+ { include: ["<qgroupbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qgtkstyle.h>", private, "<QGtkStyle>", public ] },
+ { include: ["<qgtkstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qhash.h>", private, "<QHashData>", public ] },
+ { include: ["<qhash.h>", private, "<QHashDummyNode>", public ] },
+ { include: ["<qhash.h>", private, "<QHashDummyValue>", public ] },
+ { include: ["<qhash.h>", private, "<QHashIterator>", public ] },
+ { include: ["<qhash.h>", private, "<QHashNode>", public ] },
+ { include: ["<qhash.h>", private, "<QHash>", public ] },
+ { include: ["<qhash.h>", private, "<QMultiHash>", public ] },
+ { include: ["<qhash.h>", private, "<QMutableHashIterator>", public ] },
+ { include: ["<qhash.h>", private, "<QtCore>", public ] },
+ { include: ["<qheaderview.h>", private, "<QHeaderView>", public ] },
+ { include: ["<qheaderview.h>", private, "<QtGui>", public ] },
+ { include: ["<qhelpcontentwidget.h>", private, "<QHelpContentItem>", public ] },
+ { include: ["<qhelpcontentwidget.h>", private, "<QHelpContentModel>", public ] },
+ { include: ["<qhelpcontentwidget.h>", private, "<QHelpContentWidget>", public ] },
+ { include: ["<qhelpcontentwidget.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelpenginecore.h>", private, "<QHelpEngineCore>", public ] },
+ { include: ["<qhelpenginecore.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelpengine.h>", private, "<QHelpEngine>", public ] },
+ { include: ["<qhelpengine.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelp_global.h>", private, "<QHelpGlobal>", public ] },
+ { include: ["<qhelpindexwidget.h>", private, "<QHelpIndexModel>", public ] },
+ { include: ["<qhelpindexwidget.h>", private, "<QHelpIndexWidget>", public ] },
+ { include: ["<qhelpindexwidget.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelpsearchengine.h>", private, "<QHelpSearchEngine>", public ] },
+ { include: ["<qhelpsearchengine.h>", private, "<QHelpSearchQuery>", public ] },
+ { include: ["<qhelpsearchengine.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelpsearchquerywidget.h>", private, "<QHelpSearchQueryWidget>", public ] },
+ { include: ["<qhelpsearchquerywidget.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhelpsearchresultwidget.h>", private, "<QHelpSearchResultWidget>", public ] },
+ { include: ["<qhelpsearchresultwidget.h>", private, "<QtHelp>", public ] },
+ { include: ["<qhistorystate.h>", private, "<QHistoryState>", public ] },
+ { include: ["<qhistorystate.h>", private, "<QtCore>", public ] },
+ { include: ["<qhostaddress.h>", private, "<QHostAddress>", public ] },
+ { include: ["<qhostaddress.h>", private, "<QIPv6Address>", public ] },
+ { include: ["<qhostaddress.h>", private, "<Q_IPV6ADDR>", public ] },
+ { include: ["<qhostaddress.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qhostinfo.h>", private, "<QHostInfo>", public ] },
+ { include: ["<qhostinfo.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qhttp.h>", private, "<QHttpHeader>", public ] },
+ { include: ["<qhttp.h>", private, "<QHttp>", public ] },
+ { include: ["<qhttp.h>", private, "<QHttpRequestHeader>", public ] },
+ { include: ["<qhttp.h>", private, "<QHttpResponseHeader>", public ] },
+ { include: ["<qhttp.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qhttpmultipart.h>", private, "<QHttpMultiPart>", public ] },
+ { include: ["<qhttpmultipart.h>", private, "<QHttpPart>", public ] },
+ { include: ["<qhttpmultipart.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qiconengine.h>", private, "<QIconEngine>", public ] },
+ { include: ["<qiconengine.h>", private, "<QIconEngineV2>", public ] },
+ { include: ["<qiconengine.h>", private, "<QtGui>", public ] },
+ { include: ["<qiconengineplugin.h>", private, "<QIconEngineFactoryInterface>", public ] },
+ { include: ["<qiconengineplugin.h>", private, "<QIconEngineFactoryInterfaceV2>", public ] },
+ { include: ["<qiconengineplugin.h>", private, "<QIconEnginePlugin>", public ] },
+ { include: ["<qiconengineplugin.h>", private, "<QIconEnginePluginV2>", public ] },
+ { include: ["<qiconengineplugin.h>", private, "<QtGui>", public ] },
+ { include: ["<qicon.h>", private, "<QIcon>", public ] },
+ { include: ["<qicon.h>", private, "<QIconSet>", public ] },
+ { include: ["<qicon.h>", private, "<QtGui>", public ] },
+ { include: ["<qiconset.h>", private, "<Qt3Support>", public ] },
+ { include: ["<qidentityproxymodel.h>", private, "<QIdentityProxyModel>", public ] },
+ { include: ["<qidentityproxymodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qimage.h>", private, "<QImage>", public ] },
+ { include: ["<qimage.h>", private, "<QImageTextKeyLang>", public ] },
+ { include: ["<qimage.h>", private, "<QtGui>", public ] },
+ { include: ["<qimageiohandler.h>", private, "<QImageIOHandlerFactoryInterface>", public ] },
+ { include: ["<qimageiohandler.h>", private, "<QImageIOHandler>", public ] },
+ { include: ["<qimageiohandler.h>", private, "<QImageIOPlugin>", public ] },
+ { include: ["<qimageiohandler.h>", private, "<QtGui>", public ] },
+ { include: ["<qimagereader.h>", private, "<QImageReader>", public ] },
+ { include: ["<qimagereader.h>", private, "<QtGui>", public ] },
+ { include: ["<qimagewriter.h>", private, "<QImageWriter>", public ] },
+ { include: ["<qimagewriter.h>", private, "<QtGui>", public ] },
+ { include: ["<qinputcontextfactory.h>", private, "<QInputContextFactory>", public ] },
+ { include: ["<qinputcontextfactory.h>", private, "<QtGui>", public ] },
+ { include: ["<qinputcontext.h>", private, "<QInputContext>", public ] },
+ { include: ["<qinputcontext.h>", private, "<QtGui>", public ] },
+ { include: ["<qinputcontextplugin.h>", private, "<QInputContextFactoryInterface>", public ] },
+ { include: ["<qinputcontextplugin.h>", private, "<QInputContextPlugin>", public ] },
+ { include: ["<qinputcontextplugin.h>", private, "<QtGui>", public ] },
+ { include: ["<qinputdialog.h>", private, "<QInputDialog>", public ] },
+ { include: ["<qinputdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qiodevice.h>", private, "<QIODevice>", public ] },
+ { include: ["<qiodevice.h>", private, "<QtCore>", public ] },
+ { include: ["<qitemdelegate.h>", private, "<QItemDelegate>", public ] },
+ { include: ["<qitemdelegate.h>", private, "<QtGui>", public ] },
+ { include: ["<qitemeditorfactory.h>", private, "<QItemEditorCreatorBase>", public ] },
+ { include: ["<qitemeditorfactory.h>", private, "<QItemEditorCreator>", public ] },
+ { include: ["<qitemeditorfactory.h>", private, "<QItemEditorFactory>", public ] },
+ { include: ["<qitemeditorfactory.h>", private, "<QStandardItemEditorCreator>", public ] },
+ { include: ["<qitemeditorfactory.h>", private, "<QtGui>", public ] },
+ { include: ["<qitemselectionmodel.h>", private, "<QItemSelectionModel>", public ] },
+ { include: ["<qitemselectionmodel.h>", private, "<QItemSelection>", public ] },
+ { include: ["<qitemselectionmodel.h>", private, "<QItemSelectionRange>", public ] },
+ { include: ["<qitemselectionmodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qiterator.h>", private, "<QtCore>", public ] },
+ { include: ["<qkbddriverfactory_qws.h>", private, "<QKbdDriverFactory>", public ] },
+ { include: ["<qkbddriverplugin_qws.h>", private, "<QKbdDriverPlugin>", public ] },
+ { include: ["<qkbddriverplugin_qws.h>", private, "<QWSKeyboardHandlerFactoryInterface>", public ] },
+ { include: ["<qkbdintegrity_qws.h>", private, "<QWSIntKeyboardHandler>", public ] },
+ { include: ["<qkbdlinuxinput_qws.h>", private, "<QWSLinuxInputKeyboardHandler>", public ] },
+ { include: ["<qkbdqnx_qws.h>", private, "<QWSQnxKeyboardHandler>", public ] },
+ { include: ["<qkbd_qws.h>", private, "<QWSKeyboardHandler>", public ] },
+ { include: ["<qkbdtty_qws.h>", private, "<QWSTtyKeyboardHandler>", public ] },
+ { include: ["<qkbdum_qws.h>", private, "<QWSUmKeyboardHandler>", public ] },
+ { include: ["<qkbdvfb_qws.h>", private, "<QVFbKeyboardHandler>", public ] },
+ { include: ["<qkeyeventtransition.h>", private, "<QKeyEventTransition>", public ] },
+ { include: ["<qkeyeventtransition.h>", private, "<QtGui>", public ] },
+ { include: ["<qkeysequence.h>", private, "<QKeySequence>", public ] },
+ { include: ["<qkeysequence.h>", private, "<QtGui>", public ] },
+ { include: ["<qlabel.h>", private, "<QLabel>", public ] },
+ { include: ["<qlabel.h>", private, "<QtGui>", public ] },
+ { include: ["<qlayout.h>", private, "<QLayoutIterator>", public ] },
+ { include: ["<qlayout.h>", private, "<QLayout>", public ] },
+ { include: ["<qlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qlayoutitem.h>", private, "<QLayoutItem>", public ] },
+ { include: ["<qlayoutitem.h>", private, "<QSpacerItem>", public ] },
+ { include: ["<qlayoutitem.h>", private, "<QtGui>", public ] },
+ { include: ["<qlayoutitem.h>", private, "<QWidgetItem>", public ] },
+ { include: ["<qlayoutitem.h>", private, "<QWidgetItemV2>", public ] },
+ { include: ["<qlcdnumber.h>", private, "<QLCDNumber>", public ] },
+ { include: ["<qlcdnumber.h>", private, "<QtGui>", public ] },
+ { include: ["<qlibrary.h>", private, "<QLibrary>", public ] },
+ { include: ["<qlibrary.h>", private, "<QtCore>", public ] },
+ { include: ["<qlibraryinfo.h>", private, "<QLibraryInfo>", public ] },
+ { include: ["<qlibraryinfo.h>", private, "<QtCore>", public ] },
+ { include: ["<qlineedit.h>", private, "<QLineEdit>", public ] },
+ { include: ["<qlineedit.h>", private, "<QtGui>", public ] },
+ { include: ["<qline.h>", private, "<QLineF>", public ] },
+ { include: ["<qline.h>", private, "<QLine>", public ] },
+ { include: ["<qline.h>", private, "<QtCore>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QLinkedListData>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QLinkedListIterator>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QLinkedListNode>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QLinkedList>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QMutableLinkedListIterator>", public ] },
+ { include: ["<qlinkedlist.h>", private, "<QtCore>", public ] },
+ { include: ["<qlist.h>", private, "<QListData>", public ] },
+ { include: ["<qlist.h>", private, "<QListIterator>", public ] },
+ { include: ["<qlist.h>", private, "<QList>", public ] },
+ { include: ["<qlist.h>", private, "<QMutableListIterator>", public ] },
+ { include: ["<qlist.h>", private, "<QtCore>", public ] },
+ { include: ["<qlistview.h>", private, "<QListView>", public ] },
+ { include: ["<qlistview.h>", private, "<QtGui>", public ] },
+ { include: ["<qlistwidget.h>", private, "<QListWidgetItem>", public ] },
+ { include: ["<qlistwidget.h>", private, "<QListWidget>", public ] },
+ { include: ["<qlistwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qlocale_blackberry.h>", private, "<QBBSystemLocaleData>", public ] },
+ { include: ["<qlocale.h>", private, "<QLocale>", public ] },
+ { include: ["<qlocale.h>", private, "<QSystemLocale>", public ] },
+ { include: ["<qlocale.h>", private, "<QtCore>", public ] },
+ { include: ["<qlocalserver.h>", private, "<QLocalServer>", public ] },
+ { include: ["<qlocalserver.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qlocalsocket.h>", private, "<QLocalSocket>", public ] },
+ { include: ["<qlocalsocket.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qmaccocoaviewcontainer_mac.h>", private, "<QMacCocoaViewContainer>", public ] },
+ { include: ["<qmacnativewidget_mac.h>", private, "<QMacNativeWidget>", public ] },
+ { include: ["<qmacstyle_mac.h>", private, "<QMacStyle>", public ] },
+ { include: ["<qmainwindow.h>", private, "<QMainWindow>", public ] },
+ { include: ["<qmainwindow.h>", private, "<QtGui>", public ] },
+ { include: ["<qmap.h>", private, "<QMapData>", public ] },
+ { include: ["<qmap.h>", private, "<QMapIterator>", public ] },
+ { include: ["<qmap.h>", private, "<QMapNode>", public ] },
+ { include: ["<qmap.h>", private, "<QMapPayloadNode>", public ] },
+ { include: ["<qmap.h>", private, "<QMap>", public ] },
+ { include: ["<qmap.h>", private, "<QMultiMap>", public ] },
+ { include: ["<qmap.h>", private, "<QMutableMapIterator>", public ] },
+ { include: ["<qmap.h>", private, "<QtCore>", public ] },
+ { include: ["<qmargins.h>", private, "<QMargins>", public ] },
+ { include: ["<qmargins.h>", private, "<QtCore>", public ] },
+ { include: ["<qmath.h>", private, "<QtCore>", public ] },
+ { include: ["<qmatrix4x4.h>", private, "<QMatrix4x4>", public ] },
+ { include: ["<qmatrix4x4.h>", private, "<QtGui>", public ] },
+ { include: ["<qmatrix.h>", private, "<QMatrix>", public ] },
+ { include: ["<qmatrix.h>", private, "<QtGui>", public ] },
+ { include: ["<qmdiarea.h>", private, "<QMdiArea>", public ] },
+ { include: ["<qmdiarea.h>", private, "<QtGui>", public ] },
+ { include: ["<qmdisubwindow.h>", private, "<QMdiSubWindow>", public ] },
+ { include: ["<qmdisubwindow.h>", private, "<QtGui>", public ] },
+ { include: ["<qmenubar.h>", private, "<QMenuBar>", public ] },
+ { include: ["<qmenubar.h>", private, "<QtGui>", public ] },
+ { include: ["<qmenudata.h>", private, "<QMenuItem>", public ] },
+ { include: ["<qmenudata.h>", private, "<QtGui>", public ] },
+ { include: ["<qmenu.h>", private, "<QMenu>", public ] },
+ { include: ["<qmenu.h>", private, "<QtGui>", public ] },
+ { include: ["<qmessagebox.h>", private, "<QMessageBox>", public ] },
+ { include: ["<qmessagebox.h>", private, "<QtGui>", public ] },
+ { include: ["<qmetaobject.h>", private, "<QMetaClassInfo>", public ] },
+ { include: ["<qmetaobject.h>", private, "<QMetaEnum>", public ] },
+ { include: ["<qmetaobject.h>", private, "<QMetaMethod>", public ] },
+ { include: ["<qmetaobject.h>", private, "<QMetaProperty>", public ] },
+ { include: ["<qmetaobject.h>", private, "<QtCore>", public ] },
+ { include: ["<qmetatype.h>", private, "<QMetaTypeId2>", public ] },
+ { include: ["<qmetatype.h>", private, "<QMetaTypeId>", public ] },
+ { include: ["<qmetatype.h>", private, "<QMetaType>", public ] },
+ { include: ["<qmetatype.h>", private, "<QtCore>", public ] },
+ { include: ["<qmimedata.h>", private, "<QMimeData>", public ] },
+ { include: ["<qmimedata.h>", private, "<QtCore>", public ] },
+ { include: ["<qmime.h>", private, "<QMacMime>", public ] },
+ { include: ["<qmime.h>", private, "<QMacPasteboardMime>", public ] },
+ { include: ["<qmime.h>", private, "<QMimeSource>", public ] },
+ { include: ["<qmime.h>", private, "<QtGui>", public ] },
+ { include: ["<qmime.h>", private, "<QWindowsMime>", public ] },
+ { include: ["<qmotifstyle.h>", private, "<QMotifStyle>", public ] },
+ { include: ["<qmotifstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qmousedriverfactory_qws.h>", private, "<QMouseDriverFactory>", public ] },
+ { include: ["<qmousedriverplugin_qws.h>", private, "<QMouseDriverPlugin>", public ] },
+ { include: ["<qmousedriverplugin_qws.h>", private, "<QWSMouseHandlerFactoryInterface>", public ] },
+ { include: ["<qmouseeventtransition.h>", private, "<QMouseEventTransition>", public ] },
+ { include: ["<qmouseeventtransition.h>", private, "<QtGui>", public ] },
+ { include: ["<qmouseintegrity_qws.h>", private, "<QIntMouseHandler>", public ] },
+ { include: ["<qmouselinuxinput_qws.h>", private, "<QWSLinuxInputMouseHandler>", public ] },
+ { include: ["<qmouselinuxtp_qws.h>", private, "<QWSLinuxTPMouseHandler>", public ] },
+ { include: ["<qmousepc_qws.h>", private, "<QWSPcMouseHandler>", public ] },
+ { include: ["<qmouseqnx_qws.h>", private, "<QQnxMouseHandler>", public ] },
+ { include: ["<qmouse_qws.h>", private, "<QWSCalibratedMouseHandler>", public ] },
+ { include: ["<qmouse_qws.h>", private, "<QWSMouseHandler>", public ] },
+ { include: ["<qmouse_qws.h>", private, "<QWSPointerCalibrationData>", public ] },
+ { include: ["<qmousetslib_qws.h>", private, "<QWSTslibMouseHandler>", public ] },
+ { include: ["<qmousevfb_qws.h>", private, "<QVFbMouseHandler>", public ] },
+ { include: ["<qmovie.h>", private, "<QMovie>", public ] },
+ { include: ["<qmovie.h>", private, "<QtGui>", public ] },
+ { include: ["<qmutex.h>", private, "<QMutexData>", public ] },
+ { include: ["<qmutex.h>", private, "<QMutexLocker>", public ] },
+ { include: ["<qmutex.h>", private, "<QMutex>", public ] },
+ { include: ["<qmutex.h>", private, "<QtCore>", public ] },
+ { include: ["<qnamespace.h>", private, "<QCOORD>", public ] },
+ { include: ["<qnamespace.h>", private, "<QInternal>", public ] },
+ { include: ["<qnamespace.h>", private, "<QtCore>", public ] },
+ { include: ["<qnamespace.h>", private, "<Qt>", public ] },
+ { include: ["<qnetworkaccessmanager.h>", private, "<QNetworkAccessManager>", public ] },
+ { include: ["<qnetworkaccessmanager.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkconfigmanager.h>", private, "<QNetworkConfigurationManager>", public ] },
+ { include: ["<qnetworkconfigmanager.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkconfiguration.h>", private, "<QNetworkConfiguration>", public ] },
+ { include: ["<qnetworkconfiguration.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkcookie.h>", private, "<QNetworkCookie>", public ] },
+ { include: ["<qnetworkcookie.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkcookiejar.h>", private, "<QNetworkCookieJar>", public ] },
+ { include: ["<qnetworkcookiejar.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkdiskcache.h>", private, "<QNetworkDiskCache>", public ] },
+ { include: ["<qnetworkdiskcache.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkinterface.h>", private, "<QNetworkAddressEntry>", public ] },
+ { include: ["<qnetworkinterface.h>", private, "<QNetworkInterface>", public ] },
+ { include: ["<qnetworkinterface.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkproxy.h>", private, "<QNetworkProxyFactory>", public ] },
+ { include: ["<qnetworkproxy.h>", private, "<QNetworkProxy>", public ] },
+ { include: ["<qnetworkproxy.h>", private, "<QNetworkProxyQuery>", public ] },
+ { include: ["<qnetworkproxy.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkreply.h>", private, "<QNetworkReply>", public ] },
+ { include: ["<qnetworkreply.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworkrequest.h>", private, "<QNetworkRequest>", public ] },
+ { include: ["<qnetworkrequest.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnetworksession.h>", private, "<QNetworkSession>", public ] },
+ { include: ["<qnetworksession.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qnumeric.h>", private, "<QtCore>", public ] },
+ { include: ["<qobjectcleanuphandler.h>", private, "<QObjectCleanupHandler>", public ] },
+ { include: ["<qobjectcleanuphandler.h>", private, "<QtCore>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QArgument>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QGenericArgument>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QGenericReturnArgument>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QMetaObjectAccessor>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QMetaObjectExtraData>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QMetaObject>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QReturnArgument>", public ] },
+ { include: ["<qobjectdefs.h>", private, "<QtCore>", public ] },
+ { include: ["<qobject.h>", private, "<QObjectData>", public ] },
+ { include: ["<qobject.h>", private, "<QObjectList>", public ] },
+ { include: ["<qobject.h>", private, "<QObject>", public ] },
+ { include: ["<qobject.h>", private, "<QObjectUserData>", public ] },
+ { include: ["<qobject.h>", private, "<QtCore>", public ] },
+ { include: ["<qpagesetupdialog.h>", private, "<QPageSetupDialog>", public ] },
+ { include: ["<qpagesetupdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qpaintdevice.h>", private, "<QPaintDevice>", public ] },
+ { include: ["<qpaintdevice.h>", private, "<QtGui>", public ] },
+ { include: ["<qpaintengine.h>", private, "<QPaintEngine>", public ] },
+ { include: ["<qpaintengine.h>", private, "<QPaintEngineState>", public ] },
+ { include: ["<qpaintengine.h>", private, "<QTextItem>", public ] },
+ { include: ["<qpaintengine.h>", private, "<QtGui>", public ] },
+ { include: ["<qpainter.h>", private, "<QPainter>", public ] },
+ { include: ["<qpainter.h>", private, "<QtGui>", public ] },
+ { include: ["<qpainterpath.h>", private, "<QPainterPathPrivate>", public ] },
+ { include: ["<qpainterpath.h>", private, "<QPainterPath>", public ] },
+ { include: ["<qpainterpath.h>", private, "<QPainterPathStroker>", public ] },
+ { include: ["<qpainterpath.h>", private, "<QtGui>", public ] },
+ { include: ["<qpair.h>", private, "<QPair>", public ] },
+ { include: ["<qpair.h>", private, "<QtCore>", public ] },
+ { include: ["<qpalette.h>", private, "<QColorGroup>", public ] },
+ { include: ["<qpalette.h>", private, "<QPalette>", public ] },
+ { include: ["<qpalette.h>", private, "<QtGui>", public ] },
+ { include: ["<qparallelanimationgroup.h>", private, "<QParallelAnimationGroup>", public ] },
+ { include: ["<qparallelanimationgroup.h>", private, "<QtCore>", public ] },
+ { include: ["<qpauseanimation.h>", private, "<QPauseAnimation>", public ] },
+ { include: ["<qpauseanimation.h>", private, "<QtCore>", public ] },
+ { include: ["<qpen.h>", private, "<QPen>", public ] },
+ { include: ["<qpen.h>", private, "<QtGui>", public ] },
+ { include: ["<qpictureformatplugin.h>", private, "<QPictureFormatInterface>", public ] },
+ { include: ["<qpictureformatplugin.h>", private, "<QPictureFormatPlugin>", public ] },
+ { include: ["<qpictureformatplugin.h>", private, "<QtGui>", public ] },
+ { include: ["<qpicture.h>", private, "<QPictureIO>", public ] },
+ { include: ["<qpicture.h>", private, "<QPicture>", public ] },
+ { include: ["<qpicture.h>", private, "<QtGui>", public ] },
+ { include: ["<qpixmapcache.h>", private, "<QPixmapCache>", public ] },
+ { include: ["<qpixmapcache.h>", private, "<QtGui>", public ] },
+ { include: ["<qpixmap.h>", private, "<QPixmap>", public ] },
+ { include: ["<qpixmap.h>", private, "<QtGui>", public ] },
+ { include: ["<qplaintextedit.h>", private, "<QPlainTextDocumentLayout>", public ] },
+ { include: ["<qplaintextedit.h>", private, "<QPlainTextEdit>", public ] },
+ { include: ["<qplaintextedit.h>", private, "<QtGui>", public ] },
+ { include: ["<qplastiquestyle.h>", private, "<QPlastiqueStyle>", public ] },
+ { include: ["<qplastiquestyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qplatformclipboard_qpa.h>", private, "<QPlatformClipboard>", public ] },
+ { include: ["<qplatformcursor_qpa.h>", private, "<QPlatformCursorImage>", public ] },
+ { include: ["<qplatformcursor_qpa.h>", private, "<QPlatformCursorPrivate>", public ] },
+ { include: ["<qplatformcursor_qpa.h>", private, "<QPlatformCursor>", public ] },
+ { include: ["<qplatformeventloopintegration_qpa.h>", private, "<QPlatformEventLoopIntegration>", public ] },
+ { include: ["<qplatformfontdatabase_qpa.h>", private, "<QPlatformFontDatabase>", public ] },
+ { include: ["<qplatformfontdatabase_qpa.h>", private, "<QSupportedWritingSystems>", public ] },
+ { include: ["<qplatformglcontext_qpa.h>", private, "<QPlatformGLContext>", public ] },
+ { include: ["<qplatformintegrationplugin_qpa.h>", private, "<QPlatformIntegrationFactoryInterface>", public ] },
+ { include: ["<qplatformintegrationplugin_qpa.h>", private, "<QPlatformIntegrationPlugin>", public ] },
+ { include: ["<qplatformintegration_qpa.h>", private, "<QPlatformIntegration>", public ] },
+ { include: ["<qplatformnativeinterface_qpa.h>", private, "<QPlatformNativeInterface>", public ] },
+ { include: ["<qplatformscreen_qpa.h>", private, "<QPlatformScreen>", public ] },
+ { include: ["<qplatformwindowformat_qpa.h>", private, "<QPlatformWindowFormat>", public ] },
+ { include: ["<qplatformwindow_qpa.h>", private, "<QPlatformWindow>", public ] },
+ { include: ["<qplugin.h>", private, "<QtCore>", public ] },
+ { include: ["<qplugin.h>", private, "<QtPluginInstanceFunction>", public ] },
+ { include: ["<qplugin.h>", private, "<QtPlugin>", public ] },
+ { include: ["<qpluginloader.h>", private, "<QPluginLoader>", public ] },
+ { include: ["<qpluginloader.h>", private, "<QtCore>", public ] },
+ { include: ["<qpointer.h>", private, "<QPointer>", public ] },
+ { include: ["<qpointer.h>", private, "<QtCore>", public ] },
+ { include: ["<qpoint.h>", private, "<QPointF>", public ] },
+ { include: ["<qpoint.h>", private, "<QPoint>", public ] },
+ { include: ["<qpoint.h>", private, "<QtCore>", public ] },
+ { include: ["<qpolygon.h>", private, "<QPolygonF>", public ] },
+ { include: ["<qpolygon.h>", private, "<QPolygon>", public ] },
+ { include: ["<qpolygon.h>", private, "<QtGui>", public ] },
+ { include: ["<qprintdialog.h>", private, "<QPrintDialog>", public ] },
+ { include: ["<qprintdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qprintdialog.h>", private, "<QUnixPrintWidget>", public ] },
+ { include: ["<qprintengine.h>", private, "<QPrintEngine>", public ] },
+ { include: ["<qprintengine.h>", private, "<QtGui>", public ] },
+ { include: ["<qprinter.h>", private, "<QPrinter>", public ] },
+ { include: ["<qprinter.h>", private, "<QtGui>", public ] },
+ { include: ["<qprinterinfo.h>", private, "<QPrinterInfo>", public ] },
+ { include: ["<qprinterinfo.h>", private, "<QtGui>", public ] },
+ { include: ["<qprintpreviewdialog.h>", private, "<QPrintPreviewDialog>", public ] },
+ { include: ["<qprintpreviewdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qprintpreviewwidget.h>", private, "<QPrintPreviewWidget>", public ] },
+ { include: ["<qprintpreviewwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qprocess.h>", private, "<Q_PID>", public ] },
+ { include: ["<qprocess.h>", private, "<QProcessEnvironment>", public ] },
+ { include: ["<qprocess.h>", private, "<QProcess>", public ] },
+ { include: ["<qprocess.h>", private, "<QtCore>", public ] },
+ { include: ["<qprogressbar.h>", private, "<QProgressBar>", public ] },
+ { include: ["<qprogressbar.h>", private, "<QtGui>", public ] },
+ { include: ["<qprogressdialog.h>", private, "<QProgressDialog>", public ] },
+ { include: ["<qprogressdialog.h>", private, "<QtGui>", public ] },
+ { include: ["<qpropertyanimation.h>", private, "<QPropertyAnimation>", public ] },
+ { include: ["<qpropertyanimation.h>", private, "<QtCore>", public ] },
+ { include: ["<qproxymodel.h>", private, "<QProxyModel>", public ] },
+ { include: ["<qproxymodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qproxystyle.h>", private, "<QProxyStyle>", public ] },
+ { include: ["<qproxystyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qpushbutton.h>", private, "<QPushButton>", public ] },
+ { include: ["<qpushbutton.h>", private, "<QtGui>", public ] },
+ { include: ["<qquaternion.h>", private, "<QQuaternion>", public ] },
+ { include: ["<qquaternion.h>", private, "<QtGui>", public ] },
+ { include: ["<qqueue.h>", private, "<QQueue>", public ] },
+ { include: ["<qqueue.h>", private, "<QtCore>", public ] },
+ { include: ["<qradiobutton.h>", private, "<QRadioButton>", public ] },
+ { include: ["<qradiobutton.h>", private, "<QtGui>", public ] },
+ { include: ["<qrawfont.h>", private, "<QRawFont>", public ] },
+ { include: ["<qrawfont.h>", private, "<QtGui>", public ] },
+ { include: ["<qreadwritelock.h>", private, "<QReadLocker>", public ] },
+ { include: ["<qreadwritelock.h>", private, "<QReadWriteLock>", public ] },
+ { include: ["<qreadwritelock.h>", private, "<QtCore>", public ] },
+ { include: ["<qreadwritelock.h>", private, "<QWriteLocker>", public ] },
+ { include: ["<qrect.h>", private, "<QRectF>", public ] },
+ { include: ["<qrect.h>", private, "<QRect>", public ] },
+ { include: ["<qrect.h>", private, "<QtCore>", public ] },
+ { include: ["<qregexp.h>", private, "<QRegExp>", public ] },
+ { include: ["<qregexp.h>", private, "<QtCore>", public ] },
+ { include: ["<qregion.h>", private, "<QRegion>", public ] },
+ { include: ["<qregion.h>", private, "<QtGui>", public ] },
+ { include: ["<qresource.h>", private, "<QResource>", public ] },
+ { include: ["<qresource.h>", private, "<QtCore>", public ] },
+ { include: ["<qrgb.h>", private, "<QRgb>", public ] },
+ { include: ["<qrgb.h>", private, "<QtGui>", public ] },
+ { include: ["<qrubberband.h>", private, "<QRubberBand>", public ] },
+ { include: ["<qrubberband.h>", private, "<QtGui>", public ] },
+ { include: ["<qrunnable.h>", private, "<QRunnable>", public ] },
+ { include: ["<qrunnable.h>", private, "<QtCore>", public ] },
+ { include: ["<qs60mainapplication.h>", private, "<QS60MainApplicationBase>", public ] },
+ { include: ["<qs60mainapplication.h>", private, "<QS60MainApplication>", public ] },
+ { include: ["<qs60mainapplication.h>", private, "<QtGui>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60MainAppUiBase>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60MainAppUi>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60StubAknAppUiBase>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60StubAknAppUi>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60StubMAknTouchPaneObserver>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QS60StubMEikStatusPaneObserver>", public ] },
+ { include: ["<qs60mainappui.h>", private, "<QtGui>", public ] },
+ { include: ["<qs60maindocument.h>", private, "<QS60MainDocumentBase>", public ] },
+ { include: ["<qs60maindocument.h>", private, "<QS60MainDocument>", public ] },
+ { include: ["<qs60maindocument.h>", private, "<QtGui>", public ] },
+ { include: ["<qs60style.h>", private, "<QS60Style>", public ] },
+ { include: ["<qs60style.h>", private, "<QtGui>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QScopedArrayPointer>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QScopedPointerArrayDeleter>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QScopedPointerDeleter>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QScopedPointerPodDeleter>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QScopedPointer>", public ] },
+ { include: ["<qscopedpointer.h>", private, "<QtCore>", public ] },
+ { include: ["<qscopedvaluerollback.h>", private, "<QScopedValueRollback>", public ] },
+ { include: ["<qscopedvaluerollback.h>", private, "<QtCore>", public ] },
+ { include: ["<qscreendriverfactory_qws.h>", private, "<QScreenDriverFactory>", public ] },
+ { include: ["<qscreendriverplugin_qws.h>", private, "<QScreenDriverFactoryInterface>", public ] },
+ { include: ["<qscreendriverplugin_qws.h>", private, "<QScreenDriverPlugin>", public ] },
+ { include: ["<qscreenintegrityfb_qws.h>", private, "<QIntfbScreen>", public ] },
+ { include: ["<qscreenlinuxfb_qws.h>", private, "<QLinuxFbScreen>", public ] },
+ { include: ["<qscreenlinuxfb_qws.h>", private, "<QLinuxFb_Shared>", public ] },
+ { include: ["<qscreenproxy_qws.h>", private, "<QProxyScreenCursor>", public ] },
+ { include: ["<qscreenproxy_qws.h>", private, "<QProxyScreen>", public ] },
+ { include: ["<qscreenqnx_qws.h>", private, "<QQnxScreen>", public ] },
+ { include: ["<qscreen_qws.h>", private, "<QPoolEntry>", public ] },
+ { include: ["<qscreen_qws.h>", private, "<QScreenCursor>", public ] },
+ { include: ["<qscreen_qws.h>", private, "<QScreen>", public ] },
+ { include: ["<qscreentransformed_qws.h>", private, "<QTransformedScreen>", public ] },
+ { include: ["<qscreenvfb_qws.h>", private, "<QVFbScreen>", public ] },
+ { include: ["<qscriptable.h>", private, "<QScriptable>", public ] },
+ { include: ["<qscriptable.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptclass.h>", private, "<QScriptClass>", public ] },
+ { include: ["<qscriptclass.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptclasspropertyiterator.h>", private, "<QScriptClassPropertyIterator>", public ] },
+ { include: ["<qscriptclasspropertyiterator.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptcontext.h>", private, "<QScriptContext>", public ] },
+ { include: ["<qscriptcontext.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptcontextinfo.h>", private, "<QScriptContextInfoList>", public ] },
+ { include: ["<qscriptcontextinfo.h>", private, "<QScriptContextInfo>", public ] },
+ { include: ["<qscriptcontextinfo.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptengineagent.h>", private, "<QScriptEngineAgent>", public ] },
+ { include: ["<qscriptengineagent.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptenginedebugger.h>", private, "<QScriptEngineDebugger>", public ] },
+ { include: ["<qscriptenginedebugger.h>", private, "<QtScriptTools>", public ] },
+ { include: ["<qscriptengine.h>", private, "<QScriptEngine>", public ] },
+ { include: ["<qscriptengine.h>", private, "<QScriptSyntaxCheckResult>", public ] },
+ { include: ["<qscriptengine.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptextensioninterface.h>", private, "<QScriptExtensionInterface>", public ] },
+ { include: ["<qscriptextensioninterface.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptextensionplugin.h>", private, "<QScriptExtensionPlugin>", public ] },
+ { include: ["<qscriptextensionplugin.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptprogram.h>", private, "<QScriptProgram>", public ] },
+ { include: ["<qscriptprogram.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptstring.h>", private, "<QScriptString>", public ] },
+ { include: ["<qscriptstring.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptvalue.h>", private, "<QScriptValueList>", public ] },
+ { include: ["<qscriptvalue.h>", private, "<QScriptValue>", public ] },
+ { include: ["<qscriptvalue.h>", private, "<QtScript>", public ] },
+ { include: ["<qscriptvalueiterator.h>", private, "<QScriptValueIterator>", public ] },
+ { include: ["<qscriptvalueiterator.h>", private, "<QtScript>", public ] },
+ { include: ["<qscrollarea.h>", private, "<QScrollArea>", public ] },
+ { include: ["<qscrollarea.h>", private, "<QtGui>", public ] },
+ { include: ["<qscrollbar.h>", private, "<QScrollBar>", public ] },
+ { include: ["<qscrollbar.h>", private, "<QtGui>", public ] },
+ { include: ["<qsemaphore.h>", private, "<QSemaphore>", public ] },
+ { include: ["<qsemaphore.h>", private, "<QtCore>", public ] },
+ { include: ["<qsequentialanimationgroup.h>", private, "<QSequentialAnimationGroup>", public ] },
+ { include: ["<qsequentialanimationgroup.h>", private, "<QtCore>", public ] },
+ { include: ["<qsessionmanager.h>", private, "<QSessionManager>", public ] },
+ { include: ["<qsessionmanager.h>", private, "<QtGui>", public ] },
+ { include: ["<qset.h>", private, "<QMutableSetIterator>", public ] },
+ { include: ["<qset.h>", private, "<QSetIterator>", public ] },
+ { include: ["<qset.h>", private, "<QSet>", public ] },
+ { include: ["<qset.h>", private, "<QtCore>", public ] },
+ { include: ["<qsettings.h>", private, "<QSettings>", public ] },
+ { include: ["<qsettings.h>", private, "<QtCore>", public ] },
+ { include: ["<qshareddata.h>", private, "<QExplicitlySharedDataPointer>", public ] },
+ { include: ["<qshareddata.h>", private, "<QSharedDataPointer>", public ] },
+ { include: ["<qshareddata.h>", private, "<QSharedData>", public ] },
+ { include: ["<qshareddata.h>", private, "<QtCore>", public ] },
+ { include: ["<qsharedmemory.h>", private, "<QSharedMemory>", public ] },
+ { include: ["<qsharedmemory.h>", private, "<QtCore>", public ] },
+ { include: ["<qsharedpointer.h>", private, "<QSharedPointer>", public ] },
+ { include: ["<qsharedpointer.h>", private, "<QtCore>", public ] },
+ { include: ["<qsharedpointer.h>", private, "<QWeakPointer>", public ] },
+ { include: ["<qshortcut.h>", private, "<QShortcut>", public ] },
+ { include: ["<qshortcut.h>", private, "<QtGui>", public ] },
+ { include: ["<qsignalmapper.h>", private, "<QSignalMapper>", public ] },
+ { include: ["<qsignalmapper.h>", private, "<QtCore>", public ] },
+ { include: ["<qsignalspy.h>", private, "<QSignalSpy>", public ] },
+ { include: ["<qsignalspy.h>", private, "<QtTest>", public ] },
+ { include: ["<qsignaltransition.h>", private, "<QSignalTransition>", public ] },
+ { include: ["<qsignaltransition.h>", private, "<QtCore>", public ] },
+ { include: ["<qsimplexmlnodemodel.h>", private, "<QSimpleXmlNodeModel>", public ] },
+ { include: ["<qsimplexmlnodemodel.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qsizegrip.h>", private, "<QSizeGrip>", public ] },
+ { include: ["<qsizegrip.h>", private, "<QtGui>", public ] },
+ { include: ["<qsize.h>", private, "<QSizeF>", public ] },
+ { include: ["<qsize.h>", private, "<QSize>", public ] },
+ { include: ["<qsize.h>", private, "<QtCore>", public ] },
+ { include: ["<qsizepolicy.h>", private, "<QSizePolicy>", public ] },
+ { include: ["<qsizepolicy.h>", private, "<QtGui>", public ] },
+ { include: ["<qslider.h>", private, "<QSlider>", public ] },
+ { include: ["<qslider.h>", private, "<QtGui>", public ] },
+ { include: ["<qsocketnotifier.h>", private, "<QSocketNotifier>", public ] },
+ { include: ["<qsocketnotifier.h>", private, "<QtCore>", public ] },
+ { include: ["<qsortfilterproxymodel.h>", private, "<QSortFilterProxyModel>", public ] },
+ { include: ["<qsortfilterproxymodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qsound.h>", private, "<QSound>", public ] },
+ { include: ["<qsound.h>", private, "<QtGui>", public ] },
+ { include: ["<qsoundqss_qws.h>", private, "<QWSSoundClient>", public ] },
+ { include: ["<qsoundqss_qws.h>", private, "<QWSSoundServer>", public ] },
+ { include: ["<qsoundqss_qws.h>", private, "<QWSSoundServerSocket>", public ] },
+ { include: ["<qsourcelocation.h>", private, "<QSourceLocation>", public ] },
+ { include: ["<qsourcelocation.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qspinbox.h>", private, "<QDoubleSpinBox>", public ] },
+ { include: ["<qspinbox.h>", private, "<QSpinBox>", public ] },
+ { include: ["<qspinbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qsplashscreen.h>", private, "<QSplashScreen>", public ] },
+ { include: ["<qsplashscreen.h>", private, "<QtGui>", public ] },
+ { include: ["<qsplitter.h>", private, "<QSplitterHandle>", public ] },
+ { include: ["<qsplitter.h>", private, "<QSplitter>", public ] },
+ { include: ["<qsplitter.h>", private, "<QtGui>", public ] },
+ { include: ["<qsqldatabase.h>", private, "<QSqlDatabase>", public ] },
+ { include: ["<qsqldatabase.h>", private, "<QSqlDriverCreatorBase>", public ] },
+ { include: ["<qsqldatabase.h>", private, "<QSqlDriverCreator>", public ] },
+ { include: ["<qsqldatabase.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql_db2.h>", private, "<QDB2Driver>", public ] },
+ { include: ["<qsql_db2.h>", private, "<QDB2Result>", public ] },
+ { include: ["<qsqldriver.h>", private, "<QSqlDriver>", public ] },
+ { include: ["<qsqldriver.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqldriverplugin.h>", private, "<QSqlDriverFactoryInterface>", public ] },
+ { include: ["<qsqldriverplugin.h>", private, "<QSqlDriverPlugin>", public ] },
+ { include: ["<qsqldriverplugin.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlerror.h>", private, "<QSqlError>", public ] },
+ { include: ["<qsqlerror.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlfield.h>", private, "<QSqlField>", public ] },
+ { include: ["<qsqlfield.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql_ibase.h>", private, "<QIBaseDriver>", public ] },
+ { include: ["<qsql_ibase.h>", private, "<QIBaseResult>", public ] },
+ { include: ["<qsqlindex.h>", private, "<QSqlIndex>", public ] },
+ { include: ["<qsqlindex.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql_mysql.h>", private, "<QMYSQLDriver>", public ] },
+ { include: ["<qsql_mysql.h>", private, "<QMYSQLResult>", public ] },
+ { include: ["<qsql_oci.h>", private, "<QOCIDriver>", public ] },
+ { include: ["<qsql_oci.h>", private, "<QOCIResult>", public ] },
+ { include: ["<qsql_odbc.h>", private, "<QODBCDriver>", public ] },
+ { include: ["<qsql_odbc.h>", private, "<QODBCResult>", public ] },
+ { include: ["<qsql_psql.h>", private, "<QPSQLDriver>", public ] },
+ { include: ["<qsql_psql.h>", private, "<QPSQLResult>", public ] },
+ { include: ["<qsqlquery.h>", private, "<QSqlQuery>", public ] },
+ { include: ["<qsqlquery.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlquerymodel.h>", private, "<QSqlQueryModel>", public ] },
+ { include: ["<qsqlquerymodel.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlrecord.h>", private, "<QSqlRecord>", public ] },
+ { include: ["<qsqlrecord.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlrelationaldelegate.h>", private, "<QSqlRelationalDelegate>", public ] },
+ { include: ["<qsqlrelationaldelegate.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlrelationaltablemodel.h>", private, "<QSqlRelationalTableModel>", public ] },
+ { include: ["<qsqlrelationaltablemodel.h>", private, "<QSqlRelation>", public ] },
+ { include: ["<qsqlrelationaltablemodel.h>", private, "<QtSql>", public ] },
+ { include: ["<qsqlresult.h>", private, "<QSqlResult>", public ] },
+ { include: ["<qsqlresult.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql_sqlite2.h>", private, "<QSQLite2Driver>", public ] },
+ { include: ["<qsql_sqlite2.h>", private, "<QSQLite2Result>", public ] },
+ { include: ["<qsql_sqlite.h>", private, "<QSQLiteDriver>", public ] },
+ { include: ["<qsql_sqlite.h>", private, "<QSQLiteResult>", public ] },
+ { include: ["<qsql_symsql.h>", private, "<QSymSQLDriver>", public ] },
+ { include: ["<qsql_symsql.h>", private, "<QSymSQLResult>", public ] },
+ { include: ["<qsqltablemodel.h>", private, "<QSqlTableModel>", public ] },
+ { include: ["<qsqltablemodel.h>", private, "<QtSql>", public ] },
+ { include: ["<qsql_tds.h>", private, "<QTDSDriver>", public ] },
+ { include: ["<qsql_tds.h>", private, "<QTDSResult>", public ] },
+ { include: ["<qsslcertificate.h>", private, "<QSslCertificate>", public ] },
+ { include: ["<qsslcertificate.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qsslcipher.h>", private, "<QSslCipher>", public ] },
+ { include: ["<qsslcipher.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qsslconfiguration.h>", private, "<QSslConfiguration>", public ] },
+ { include: ["<qsslconfiguration.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qsslerror.h>", private, "<QSslError>", public ] },
+ { include: ["<qsslerror.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qssl.h>", private, "<QSsl>", public ] },
+ { include: ["<qssl.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qsslkey.h>", private, "<QSslKey>", public ] },
+ { include: ["<qsslkey.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qsslsocket.h>", private, "<QSslSocket>", public ] },
+ { include: ["<qsslsocket.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qstackedlayout.h>", private, "<QStackedLayout>", public ] },
+ { include: ["<qstackedlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qstackedwidget.h>", private, "<QStackedWidget>", public ] },
+ { include: ["<qstackedwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qstack.h>", private, "<QStack>", public ] },
+ { include: ["<qstack.h>", private, "<QtCore>", public ] },
+ { include: ["<qstandarditemmodel.h>", private, "<QStandardItemModel>", public ] },
+ { include: ["<qstandarditemmodel.h>", private, "<QStandardItem>", public ] },
+ { include: ["<qstandarditemmodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qstate.h>", private, "<QState>", public ] },
+ { include: ["<qstate.h>", private, "<QtCore>", public ] },
+ { include: ["<qstatemachine.h>", private, "<QStateMachine>", public ] },
+ { include: ["<qstatemachine.h>", private, "<QtCore>", public ] },
+ { include: ["<qstatictext.h>", private, "<QStaticText>", public ] },
+ { include: ["<qstatictext.h>", private, "<QtGui>", public ] },
+ { include: ["<qstatusbar.h>", private, "<QStatusBar>", public ] },
+ { include: ["<qstatusbar.h>", private, "<QtGui>", public ] },
+ { include: ["<qstringbuilder.h>", private, "<QAbstractConcatenable>", public ] },
+ { include: ["<qstringbuilder.h>", private, "<QConcatenable>", public ] },
+ { include: ["<qstringbuilder.h>", private, "<QLatin1Literal>", public ] },
+ { include: ["<qstringbuilder.h>", private, "<QStringBuilder>", public ] },
+ { include: ["<qstringbuilder.h>", private, "<QtCore>", public ] },
+ { include: ["<qstring.h>", private, "<QCharRef>", public ] },
+ { include: ["<qstring.h>", private, "<QConstString>", public ] },
+ { include: ["<qstring.h>", private, "<QLatin1String>", public ] },
+ { include: ["<qstring.h>", private, "<QStdWString>", public ] },
+ { include: ["<qstring.h>", private, "<QString>", public ] },
+ { include: ["<qstring.h>", private, "<QStringRef>", public ] },
+ { include: ["<qstring.h>", private, "<QtCore>", public ] },
+ { include: ["<qstringlist.h>", private, "<QMutableStringListIterator>", public ] },
+ { include: ["<qstringlist.h>", private, "<QStringListIterator>", public ] },
+ { include: ["<qstringlist.h>", private, "<QStringList>", public ] },
+ { include: ["<qstringlist.h>", private, "<QtCore>", public ] },
+ { include: ["<qstringlistmodel.h>", private, "<QStringListModel>", public ] },
+ { include: ["<qstringlistmodel.h>", private, "<QtGui>", public ] },
+ { include: ["<qstringmatcher.h>", private, "<QStringMatcher>", public ] },
+ { include: ["<qstringmatcher.h>", private, "<QtCore>", public ] },
+ { include: ["<qstyleditemdelegate.h>", private, "<QStyledItemDelegate>", public ] },
+ { include: ["<qstyleditemdelegate.h>", private, "<QtGui>", public ] },
+ { include: ["<qstylefactory.h>", private, "<QStyleFactory>", public ] },
+ { include: ["<qstylefactory.h>", private, "<QtGui>", public ] },
+ { include: ["<qstyle.h>", private, "<QStyle>", public ] },
+ { include: ["<qstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleHintReturnMask>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleHintReturn>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleHintReturnVariant>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionButton>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionComboBox>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionComplex>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionDockWidget>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionDockWidgetV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionFocusRect>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionFrame>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionFrameV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionFrameV3>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionGraphicsItem>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionGroupBox>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionHeader>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionMenuItem>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionProgressBar>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionProgressBarV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOption>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionQ3DockWindow>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionQ3ListViewItem>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionQ3ListView>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionRubberBand>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionSizeGrip>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionSlider>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionSpinBox>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabBarBase>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabBarBaseV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTab>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabV3>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabWidgetFrame>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTabWidgetFrameV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionTitleBar>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionToolBar>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionToolBox>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionToolBoxV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionToolButton>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionViewItem>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionViewItemV2>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionViewItemV3>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QStyleOptionViewItemV4>", public ] },
+ { include: ["<qstyleoption.h>", private, "<QtGui>", public ] },
+ { include: ["<qstylepainter.h>", private, "<QStylePainter>", public ] },
+ { include: ["<qstylepainter.h>", private, "<QtGui>", public ] },
+ { include: ["<qstyleplugin.h>", private, "<QStyleFactoryInterface>", public ] },
+ { include: ["<qstyleplugin.h>", private, "<QStylePlugin>", public ] },
+ { include: ["<qstyleplugin.h>", private, "<QtGui>", public ] },
+ { include: ["<qsvggenerator.h>", private, "<QSvgGenerator>", public ] },
+ { include: ["<qsvggenerator.h>", private, "<QtSvg>", public ] },
+ { include: ["<qsvgrenderer.h>", private, "<QSvgRenderer>", public ] },
+ { include: ["<qsvgrenderer.h>", private, "<QtSvg>", public ] },
+ { include: ["<qsvgwidget.h>", private, "<QSvgWidget>", public ] },
+ { include: ["<qsvgwidget.h>", private, "<QtSvg>", public ] },
+ { include: ["<qsymbianevent.h>", private, "<QSymbianEvent>", public ] },
+ { include: ["<qsymbianevent.h>", private, "<QtGui>", public ] },
+ { include: ["<qsyntaxhighlighter.h>", private, "<QSyntaxHighlighter>", public ] },
+ { include: ["<qsyntaxhighlighter.h>", private, "<QtGui>", public ] },
+ { include: ["<qsystemsemaphore.h>", private, "<QSystemSemaphore>", public ] },
+ { include: ["<qsystemsemaphore.h>", private, "<QtCore>", public ] },
+ { include: ["<qsystemtrayicon.h>", private, "<QSystemTrayIcon>", public ] },
+ { include: ["<qsystemtrayicon.h>", private, "<QtGui>", public ] },
+ { include: ["<qtabbar.h>", private, "<QTabBar>", public ] },
+ { include: ["<qtabbar.h>", private, "<QtGui>", public ] },
+ { include: ["<qtableview.h>", private, "<QTableView>", public ] },
+ { include: ["<qtableview.h>", private, "<QtGui>", public ] },
+ { include: ["<qtablewidget.h>", private, "<QTableWidgetItem>", public ] },
+ { include: ["<qtablewidget.h>", private, "<QTableWidget>", public ] },
+ { include: ["<qtablewidget.h>", private, "<QTableWidgetSelectionRange>", public ] },
+ { include: ["<qtablewidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qtabwidget.h>", private, "<QTabWidget>", public ] },
+ { include: ["<qtabwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qtconcurrentcompilertest.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentexception.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentfilter.h>", private, "<QtConcurrentFilter>", public ] },
+ { include: ["<qtconcurrentfilter.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentfilterkernel.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentfunctionwrappers.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentiteratekernel.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentmap.h>", private, "<QtConcurrentMap>", public ] },
+ { include: ["<qtconcurrentmap.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentmapkernel.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentmedian.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentreducekernel.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentresultstore.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentrunbase.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentrun.h>", private, "<QtConcurrentRun>", public ] },
+ { include: ["<qtconcurrentrun.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentstoredfunctioncall.h>", private, "<QtCore>", public ] },
+ { include: ["<qtconcurrentthreadengine.h>", private, "<QtCore>", public ] },
+ { include: ["<qtcpserver.h>", private, "<QTcpServer>", public ] },
+ { include: ["<qtcpserver.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qtcpsocket.h>", private, "<QTcpSocket>", public ] },
+ { include: ["<qtcpsocket.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qtemporaryfile.h>", private, "<QtCore>", public ] },
+ { include: ["<qtemporaryfile.h>", private, "<QTemporaryFile>", public ] },
+ { include: ["<qtestaccessible.h>", private, "<QTestAccessibilityEvent>", public ] },
+ { include: ["<qtestaccessible.h>", private, "<QTestAccessibility>", public ] },
+ { include: ["<qtestassert.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestbasicstreamer.h>", private, "<QTestBasicStreamer>", public ] },
+ { include: ["<qtestbasicstreamer.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestcase.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestcoreelement.h>", private, "<QTestCoreElement>", public ] },
+ { include: ["<qtestcoreelement.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestcorelist.h>", private, "<QTestCoreList>", public ] },
+ { include: ["<qtestcorelist.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestdata.h>", private, "<QTestData>", public ] },
+ { include: ["<qtestdata.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestelementattribute.h>", private, "<QTestElementAttribute>", public ] },
+ { include: ["<qtestelementattribute.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestelement.h>", private, "<QTestElement>", public ] },
+ { include: ["<qtestelement.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestDelayEvent>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestEventList>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestEvent>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestKeyClicksEvent>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestKeyEvent>", public ] },
+ { include: ["<qtestevent.h>", private, "<QTestMouseEvent>", public ] },
+ { include: ["<qtesteventloop.h>", private, "<QTestEventLoop>", public ] },
+ { include: ["<qtesteventloop.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestfilelogger.h>", private, "<QTestFileLogger>", public ] },
+ { include: ["<qtestfilelogger.h>", private, "<QtTest>", public ] },
+ { include: ["<qtest_gui.h>", private, "<QtTestGui>", public ] },
+ { include: ["<qtest.h>", private, "<QTest>", public ] },
+ { include: ["<qtest.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestlightxmlstreamer.h>", private, "<QTestLightXmlStreamer>", public ] },
+ { include: ["<qtestlightxmlstreamer.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestspontaneevent.h>", private, "<QEventSizeOfChecker>", public ] },
+ { include: ["<qtestspontaneevent.h>", private, "<QSpontaneKeyEvent>", public ] },
+ { include: ["<qtestsystem.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestxmlstreamer.h>", private, "<QTestXmlStreamer>", public ] },
+ { include: ["<qtestxmlstreamer.h>", private, "<QtTest>", public ] },
+ { include: ["<qtestxunitstreamer.h>", private, "<QTestXunitStreamer>", public ] },
+ { include: ["<qtestxunitstreamer.h>", private, "<QtTest>", public ] },
+ { include: ["<qtextboundaryfinder.h>", private, "<QtCore>", public ] },
+ { include: ["<qtextboundaryfinder.h>", private, "<QTextBoundaryFinder>", public ] },
+ { include: ["<qtextbrowser.h>", private, "<QTextBrowser>", public ] },
+ { include: ["<qtextbrowser.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextcodec.h>", private, "<QtCore>", public ] },
+ { include: ["<qtextcodec.h>", private, "<QTextCodec>", public ] },
+ { include: ["<qtextcodec.h>", private, "<QTextDecoder>", public ] },
+ { include: ["<qtextcodec.h>", private, "<QTextEncoder>", public ] },
+ { include: ["<qtextcodecplugin.h>", private, "<QtCore>", public ] },
+ { include: ["<qtextcodecplugin.h>", private, "<QTextCodecFactoryInterface>", public ] },
+ { include: ["<qtextcodecplugin.h>", private, "<QTextCodecPlugin>", public ] },
+ { include: ["<qtextcursor.h>", private, "<QTextCursor>", public ] },
+ { include: ["<qtextcursor.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextdocumentfragment.h>", private, "<QTextDocumentFragment>", public ] },
+ { include: ["<qtextdocumentfragment.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextdocument.h>", private, "<QAbstractUndoItem>", public ] },
+ { include: ["<qtextdocument.h>", private, "<QTextDocument>", public ] },
+ { include: ["<qtextdocument.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextdocumentwriter.h>", private, "<QTextDocumentWriter>", public ] },
+ { include: ["<qtextdocumentwriter.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextedit.h>", private, "<QTextEdit>", public ] },
+ { include: ["<qtextedit.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextBlockFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextCharFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextFrameFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextImageFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextLength>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextListFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextTableCellFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QTextTableFormat>", public ] },
+ { include: ["<qtextformat.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextlayout.h>", private, "<QTextInlineObject>", public ] },
+ { include: ["<qtextlayout.h>", private, "<QTextLayout>", public ] },
+ { include: ["<qtextlayout.h>", private, "<QTextLine>", public ] },
+ { include: ["<qtextlayout.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextlist.h>", private, "<QTextList>", public ] },
+ { include: ["<qtextlist.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextBlockGroup>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextBlock>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextBlockUserData>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextFragment>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextFrameLayoutData>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextFrame>", public ] },
+ { include: ["<qtextobject.h>", private, "<QTextObject>", public ] },
+ { include: ["<qtextobject.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextoption.h>", private, "<QTextOption>", public ] },
+ { include: ["<qtextoption.h>", private, "<QtGui>", public ] },
+ { include: ["<qtextstream.h>", private, "<QtCore>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTextIStream>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTextOStream>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTextStreamFunction>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTextStreamManipulator>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTextStream>", public ] },
+ { include: ["<qtextstream.h>", private, "<QTS>", public ] },
+ { include: ["<qtexttable.h>", private, "<QTextTableCell>", public ] },
+ { include: ["<qtexttable.h>", private, "<QTextTable>", public ] },
+ { include: ["<qtexttable.h>", private, "<QtGui>", public ] },
+ { include: ["<qthread.h>", private, "<QtCore>", public ] },
+ { include: ["<qthread.h>", private, "<QThread>", public ] },
+ { include: ["<qthreadpool.h>", private, "<QtCore>", public ] },
+ { include: ["<qthreadpool.h>", private, "<QThreadPool>", public ] },
+ { include: ["<qthreadstorage.h>", private, "<QtCore>", public ] },
+ { include: ["<qthreadstorage.h>", private, "<QThreadStorageData>", public ] },
+ { include: ["<qthreadstorage.h>", private, "<QThreadStorage>", public ] },
+ { include: ["<qtimeline.h>", private, "<QtCore>", public ] },
+ { include: ["<qtimeline.h>", private, "<QTimeLine>", public ] },
+ { include: ["<qtimer.h>", private, "<QtCore>", public ] },
+ { include: ["<qtimer.h>", private, "<QTimer>", public ] },
+ { include: ["<qtoolbar.h>", private, "<QtGui>", public ] },
+ { include: ["<qtoolbar.h>", private, "<QToolBar>", public ] },
+ { include: ["<qtoolbox.h>", private, "<QtGui>", public ] },
+ { include: ["<qtoolbox.h>", private, "<QToolBox>", public ] },
+ { include: ["<qtoolbutton.h>", private, "<QtGui>", public ] },
+ { include: ["<qtoolbutton.h>", private, "<QToolButton>", public ] },
+ { include: ["<qtooltip.h>", private, "<QtGui>", public ] },
+ { include: ["<qtooltip.h>", private, "<QToolTip>", public ] },
+ { include: ["<qtransform.h>", private, "<QtGui>", public ] },
+ { include: ["<qtransform.h>", private, "<QTransform>", public ] },
+ { include: ["<qtranslator.h>", private, "<QtCore>", public ] },
+ { include: ["<qtranslator.h>", private, "<QTranslator>", public ] },
+ { include: ["<qtransportauth_qws.h>", private, "<QAuthDevice>", public ] },
+ { include: ["<qtransportauth_qws.h>", private, "<QTransportAuth>", public ] },
+ { include: ["<qtreeview.h>", private, "<QtGui>", public ] },
+ { include: ["<qtreeview.h>", private, "<QTreeView>", public ] },
+ { include: ["<qtreewidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qtreewidget.h>", private, "<QTreeWidgetItem>", public ] },
+ { include: ["<qtreewidget.h>", private, "<QTreeWidget>", public ] },
+ { include: ["<qtreewidgetitemiterator.h>", private, "<QtGui>", public ] },
+ { include: ["<qtreewidgetitemiterator.h>", private, "<QTreeWidgetItemIterator>", public ] },
+ { include: ["<qudpsocket.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qudpsocket.h>", private, "<QUdpSocket>", public ] },
+ { include: ["<quiloader.h>", private, "<QtUiTools>", public ] },
+ { include: ["<quiloader.h>", private, "<QUiLoader>", public ] },
+ { include: ["<qundogroup.h>", private, "<QtGui>", public ] },
+ { include: ["<qundogroup.h>", private, "<QUndoGroup>", public ] },
+ { include: ["<qundostack.h>", private, "<QtGui>", public ] },
+ { include: ["<qundostack.h>", private, "<QUndoCommand>", public ] },
+ { include: ["<qundostack.h>", private, "<QUndoStack>", public ] },
+ { include: ["<qundoview.h>", private, "<QtGui>", public ] },
+ { include: ["<qundoview.h>", private, "<QUndoView>", public ] },
+ { include: ["<qurl.h>", private, "<QtCore>", public ] },
+ { include: ["<qurl.h>", private, "<QUrl>", public ] },
+ { include: ["<qurlinfo.h>", private, "<QtNetwork>", public ] },
+ { include: ["<qurlinfo.h>", private, "<QUrlInfo>", public ] },
+ { include: ["<quuid.h>", private, "<QtCore>", public ] },
+ { include: ["<quuid.h>", private, "<QUuid>", public ] },
+ { include: ["<qvalidator.h>", private, "<QDoubleValidator>", public ] },
+ { include: ["<qvalidator.h>", private, "<QIntValidator>", public ] },
+ { include: ["<qvalidator.h>", private, "<QRegExpValidator>", public ] },
+ { include: ["<qvalidator.h>", private, "<QtGui>", public ] },
+ { include: ["<qvalidator.h>", private, "<QValidator>", public ] },
+ { include: ["<qvariantanimation.h>", private, "<QtCore>", public ] },
+ { include: ["<qvariantanimation.h>", private, "<QVariantAnimation>", public ] },
+ { include: ["<qvariant.h>", private, "<QtCore>", public ] },
+ { include: ["<qvariant.h>", private, "<QVariantComparisonHelper>", public ] },
+ { include: ["<qvariant.h>", private, "<QVariantHash>", public ] },
+ { include: ["<qvariant.h>", private, "<QVariantList>", public ] },
+ { include: ["<qvariant.h>", private, "<QVariantMap>", public ] },
+ { include: ["<qvariant.h>", private, "<QVariant>", public ] },
+ { include: ["<qvarlengtharray.h>", private, "<QtCore>", public ] },
+ { include: ["<qvarlengtharray.h>", private, "<QVarLengthArray>", public ] },
+ { include: ["<qvector2d.h>", private, "<QtGui>", public ] },
+ { include: ["<qvector2d.h>", private, "<QVector2D>", public ] },
+ { include: ["<qvector3d.h>", private, "<QtGui>", public ] },
+ { include: ["<qvector3d.h>", private, "<QVector3D>", public ] },
+ { include: ["<qvector4d.h>", private, "<QtGui>", public ] },
+ { include: ["<qvector4d.h>", private, "<QVector4D>", public ] },
+ { include: ["<qvector.h>", private, "<QMutableVectorIterator>", public ] },
+ { include: ["<qvector.h>", private, "<QtCore>", public ] },
+ { include: ["<qvector.h>", private, "<QVectorData>", public ] },
+ { include: ["<qvector.h>", private, "<QVectorIterator>", public ] },
+ { include: ["<qvector.h>", private, "<QVector>", public ] },
+ { include: ["<qvector.h>", private, "<QVectorTypedData>", public ] },
+ { include: ["<qvfbhdr.h>", private, "<QtGui>", public ] },
+ { include: ["<qvfbhdr.h>", private, "<QVFbHeader>", public ] },
+ { include: ["<qvfbhdr.h>", private, "<QVFbKeyData>", public ] },
+ { include: ["<qwaitcondition.h>", private, "<QtCore>", public ] },
+ { include: ["<qwaitcondition.h>", private, "<QWaitCondition>", public ] },
+ { include: ["<qwebdatabase.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebdatabase.h>", private, "<QWebDatabase>", public ] },
+ { include: ["<qwebelement.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebelement.h>", private, "<QWebElementCollection>", public ] },
+ { include: ["<qwebelement.h>", private, "<QWebElement>", public ] },
+ { include: ["<qwebframe.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebframe.h>", private, "<QWebFrame>", public ] },
+ { include: ["<qwebframe.h>", private, "<QWebHitTestResult>", public ] },
+ { include: ["<qwebhistory.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebhistory.h>", private, "<QWebHistoryItem>", public ] },
+ { include: ["<qwebhistory.h>", private, "<QWebHistory>", public ] },
+ { include: ["<qwebhistoryinterface.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebhistoryinterface.h>", private, "<QWebHistoryInterface>", public ] },
+ { include: ["<qwebinspector.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebinspector.h>", private, "<QWebInspector>", public ] },
+ { include: ["<qwebkitglobal.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebFullScreenVideoHandler>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebHapticFeedbackPlayer>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebKitPlatformPlugin>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebNotificationData>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebNotificationPresenter>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebSelectData>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebSelectMethod>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebSpellChecker>", public ] },
+ { include: ["<qwebkitplatformplugin.h>", private, "<QWebTouchModifier>", public ] },
+ { include: ["<qwebkitversion.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebpage.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebpage.h>", private, "<QWebPage>", public ] },
+ { include: ["<qwebpluginfactory.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebpluginfactory.h>", private, "<QWebPluginFactory>", public ] },
+ { include: ["<qwebscriptworld.h>", private, "<QWebScriptWorld>", public ] },
+ { include: ["<qwebsecurityorigin.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebsecurityorigin.h>", private, "<QWebSecurityOrigin>", public ] },
+ { include: ["<qwebsettings.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebsettings.h>", private, "<QWebSettings>", public ] },
+ { include: ["<qwebview.h>", private, "<QtWebKit>", public ] },
+ { include: ["<qwebview.h>", private, "<QWebView>", public ] },
+ { include: ["<qwhatsthis.h>", private, "<QtGui>", public ] },
+ { include: ["<qwhatsthis.h>", private, "<QWhatsThis>", public ] },
+ { include: ["<qwidgetaction.h>", private, "<QtGui>", public ] },
+ { include: ["<qwidgetaction.h>", private, "<QWidgetAction>", public ] },
+ { include: ["<qwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qwidget.h>", private, "<QWidgetData>", public ] },
+ { include: ["<qwidget.h>", private, "<QWidget>", public ] },
+ { include: ["<qwindowdefs.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowdefs.h>", private, "<QWidgetList>", public ] },
+ { include: ["<qwindowdefs.h>", private, "<QWidgetMapper>", public ] },
+ { include: ["<qwindowdefs.h>", private, "<QWidgetSet>", public ] },
+ { include: ["<qwindowscestyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowscestyle.h>", private, "<QWindowsCEStyle>", public ] },
+ { include: ["<qwindowsmobilestyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowsmobilestyle.h>", private, "<QWindowsMobileStyle>", public ] },
+ { include: ["<qwindowsstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowsstyle.h>", private, "<QWindowsStyle>", public ] },
+ { include: ["<qwindowsvistastyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowsvistastyle.h>", private, "<QWindowsVistaStyle>", public ] },
+ { include: ["<qwindowsxpstyle.h>", private, "<QtGui>", public ] },
+ { include: ["<qwindowsxpstyle.h>", private, "<QWindowsXPStyle>", public ] },
+ { include: ["<qwindowsysteminterface_qpa.h>", private, "<QWindowSystemInterface>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSClient>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSCursorMap>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSInputMethod>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSInternalWindowInfo>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSScreenSaver>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSServer>", public ] },
+ { include: ["<qwindowsystem_qws.h>", private, "<QWSWindow>", public ] },
+ { include: ["<qwizard.h>", private, "<QtGui>", public ] },
+ { include: ["<qwizard.h>", private, "<QWizardPage>", public ] },
+ { include: ["<qwizard.h>", private, "<QWizard>", public ] },
+ { include: ["<qwmatrix.h>", private, "<QtGui>", public ] },
+ { include: ["<qwmatrix.h>", private, "<QWMatrix>", public ] },
+ { include: ["<qworkspace.h>", private, "<QtGui>", public ] },
+ { include: ["<qworkspace.h>", private, "<QWorkspace>", public ] },
+ { include: ["<qwscursor_qws.h>", private, "<QWSCursor>", public ] },
+ { include: ["<qwsdisplay_qws.h>", private, "<QWSDisplay>", public ] },
+ { include: ["<qwsdisplay_qws.h>", private, "<QWSWindowInfo>", public ] },
+ { include: ["<qwsembedwidget.h>", private, "<QtGui>", public ] },
+ { include: ["<qwsembedwidget.h>", private, "<QWSEmbedWidget>", public ] },
+ { include: ["<qwsevent_qws.h>", private, "<QWSEvent>", public ] },
+ { include: ["<qwsmanager_qws.h>", private, "<QWSManager>", public ] },
+ { include: ["<qwsproperty_qws.h>", private, "<QWSPropertyManager>", public ] },
+ { include: ["<qwsprotocolitem_qws.h>", private, "<QWSProtocolItem>", public ] },
+ { include: ["<qwssocket_qws.h>", private, "<QWSServerSocket>", public ] },
+ { include: ["<qwssocket_qws.h>", private, "<QWSSocket>", public ] },
+ { include: ["<qx11embed_x11.h>", private, "<QX11EmbedContainer>", public ] },
+ { include: ["<qx11embed_x11.h>", private, "<QX11EmbedWidget>", public ] },
+ { include: ["<qx11info_x11.h>", private, "<QX11Info>", public ] },
+ { include: ["<qxmlformatter.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlformatter.h>", private, "<QXmlFormatter>", public ] },
+ { include: ["<qxml.h>", private, "<QtXml>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlAttributes>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlContentHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlDeclHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlDefaultHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlDTDHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlEntityResolver>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlErrorHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlInputSource>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlLexicalHandler>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlLocator>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlNamespaceSupport>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlParseException>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlReader>", public ] },
+ { include: ["<qxml.h>", private, "<QXmlSimpleReader>", public ] },
+ { include: ["<qxmlname.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlname.h>", private, "<QXmlName>", public ] },
+ { include: ["<qxmlnamepool.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlnamepool.h>", private, "<QXmlNamePool>", public ] },
+ { include: ["<qxmlquery.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlquery.h>", private, "<QXmlQuery>", public ] },
+ { include: ["<qxmlresultitems.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlresultitems.h>", private, "<QXmlResultItems>", public ] },
+ { include: ["<qxmlschema.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlschema.h>", private, "<QXmlSchema>", public ] },
+ { include: ["<qxmlschemavalidator.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlschemavalidator.h>", private, "<QXmlSchemaValidator>", public ] },
+ { include: ["<qxmlserializer.h>", private, "<QtXmlPatterns>", public ] },
+ { include: ["<qxmlserializer.h>", private, "<QXmlSerializer>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QtCore>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QtXml>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamAttribute>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamAttributes>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamEntityDeclaration>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamEntityDeclarations>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamEntityResolver>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamNamespaceDeclaration>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamNamespaceDeclarations>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamNotationDeclaration>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamNotationDeclarations>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamReader>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamStringRef>", public ] },
+ { include: ["<qxmlstream.h>", private, "<QXmlStreamWriter>", public ] },
+ { include: ["<taskmenu.h>", private, "<QDesignerTaskMenuExtension>", public ] },
+ { include: ["<taskmenu.h>", private, "<QtDesigner>", public ] }
+]
diff --git a/qt5_4.imp b/qt5_4.imp
new file mode 100644
index 0000000..4e0a421
--- /dev/null
+++ b/qt5_4.imp
@@ -0,0 +1,2473 @@
+[
+
+# Per le documentation, each class lives in it's own header file. These are the
+# official header files (as far as I can determine, from a scan of the QT includes
+# directory)
+
+ { symbol: [ "ActiveQt", "private", "<ActiveQt>", "public" ] },
+ { symbol: [ "ActiveQtDepends", "private", "<ActiveQtDepends>", "public" ] },
+ { symbol: [ "ActiveQtVersion", "private", "<ActiveQtVersion>", "public" ] },
+ { symbol: [ "Enginio", "private", "<Enginio>", "public" ] },
+ { symbol: [ "EnginioDepends", "private", "<EnginioDepends>", "public" ] },
+ { symbol: [ "EnginioVersion", "private", "<EnginioVersion>", "public" ] },
+ { symbol: [ "QAbstractAnimation", "private", "<QAbstractAnimation>", "public" ] },
+ { symbol: [ "QAbstractAudioDeviceInfo", "private", "<QAbstractAudioDeviceInfo>", "public" ] },
+ { symbol: [ "QAbstractAudioInput", "private", "<QAbstractAudioInput>", "public" ] },
+ { symbol: [ "QAbstractAudioOutput", "private", "<QAbstractAudioOutput>", "public" ] },
+ { symbol: [ "QAbstractButton", "private", "<QAbstractButton>", "public" ] },
+ { symbol: [ "QAbstractEventDispatcher", "private", "<QAbstractEventDispatcher>", "public" ] },
+ { symbol: [ "QAbstractExtensionFactory", "private", "<QAbstractExtensionFactory>", "public" ] },
+ { symbol: [ "QAbstractExtensionManager", "private", "<QAbstractExtensionManager>", "public" ] },
+ { symbol: [ "QAbstractFormBuilder", "private", "<QAbstractFormBuilder>", "public" ] },
+ { symbol: [ "QAbstractGraphicsShapeItem", "private", "<QAbstractGraphicsShapeItem>", "public" ] },
+ { symbol: [ "QAbstractItemDelegate", "private", "<QAbstractItemDelegate>", "public" ] },
+ { symbol: [ "QAbstractItemModel", "private", "<QAbstractItemModel>", "public" ] },
+ { symbol: [ "QAbstractItemView", "private", "<QAbstractItemView>", "public" ] },
+ { symbol: [ "QAbstractListModel", "private", "<QAbstractListModel>", "public" ] },
+ { symbol: [ "QAbstractMessageHandler", "private", "<QAbstractMessageHandler>", "public" ] },
+ { symbol: [ "QAbstractNativeEventFilter", "private", "<QAbstractNativeEventFilter>", "public" ] },
+ { symbol: [ "QAbstractNetworkCache", "private", "<QAbstractNetworkCache>", "public" ] },
+ { symbol: [ "QAbstractPlanarVideoBuffer", "private", "<QAbstractPlanarVideoBuffer>", "public" ] },
+ { symbol: [ "QAbstractPrintDialog", "private", "<QAbstractPrintDialog>", "public" ] },
+ { symbol: [ "QAbstractProxyModel", "private", "<QAbstractProxyModel>", "public" ] },
+ { symbol: [ "QAbstractScrollArea", "private", "<QAbstractScrollArea>", "public" ] },
+ { symbol: [ "QAbstractSlider", "private", "<QAbstractSlider>", "public" ] },
+ { symbol: [ "QAbstractSocket", "private", "<QAbstractSocket>", "public" ] },
+ { symbol: [ "QAbstractSpinBox", "private", "<QAbstractSpinBox>", "public" ] },
+ { symbol: [ "QAbstractState", "private", "<QAbstractState>", "public" ] },
+ { symbol: [ "QAbstractTableModel", "private", "<QAbstractTableModel>", "public" ] },
+ { symbol: [ "QAbstractTextDocumentLayout", "private", "<QAbstractTextDocumentLayout>", "public" ] },
+ { symbol: [ "QAbstractTransition", "private", "<QAbstractTransition>", "public" ] },
+ { symbol: [ "QAbstractUndoItem", "private", "<QAbstractUndoItem>", "public" ] },
+ { symbol: [ "QAbstractUriResolver", "private", "<QAbstractUriResolver>", "public" ] },
+ { symbol: [ "QAbstractVideoBuffer", "private", "<QAbstractVideoBuffer>", "public" ] },
+ { symbol: [ "QAbstractVideoSurface", "private", "<QAbstractVideoSurface>", "public" ] },
+ { symbol: [ "QAbstractXmlNodeModel", "private", "<QAbstractXmlNodeModel>", "public" ] },
+ { symbol: [ "QAbstractXmlReceiver", "private", "<QAbstractXmlReceiver>", "public" ] },
+ { symbol: [ "QAccelerometer", "private", "<QAccelerometer>", "public" ] },
+ { symbol: [ "QAccelerometerFilter", "private", "<QAccelerometerFilter>", "public" ] },
+ { symbol: [ "QAccelerometerReading", "private", "<QAccelerometerReading>", "public" ] },
+ { symbol: [ "QAccessible", "private", "<QAccessible>", "public" ] },
+ { symbol: [ "QAccessibleAbstractScrollArea", "private", "<QAccessibleAbstractScrollArea>", "public" ] },
+ { symbol: [ "QAccessibleAbstractSlider", "private", "<QAccessibleAbstractSlider>", "public" ] },
+ { symbol: [ "QAccessibleAbstractSpinBox", "private", "<QAccessibleAbstractSpinBox>", "public" ] },
+ { symbol: [ "QAccessibleActionInterface", "private", "<QAccessibleActionInterface>", "public" ] },
+ { symbol: [ "QAccessibleApplication", "private", "<QAccessibleApplication>", "public" ] },
+ { symbol: [ "QAccessibleBridge", "private", "<QAccessibleBridge>", "public" ] },
+ { symbol: [ "QAccessibleBridgePlugin", "private", "<QAccessibleBridgePlugin>", "public" ] },
+ { symbol: [ "QAccessibleButton", "private", "<QAccessibleButton>", "public" ] },
+ { symbol: [ "QAccessibleCalendarWidget", "private", "<QAccessibleCalendarWidget>", "public" ] },
+ { symbol: [ "QAccessibleComboBox", "private", "<QAccessibleComboBox>", "public" ] },
+ { symbol: [ "QAccessibleDial", "private", "<QAccessibleDial>", "public" ] },
+ { symbol: [ "QAccessibleDialogButtonBox", "private", "<QAccessibleDialogButtonBox>", "public" ] },
+ { symbol: [ "QAccessibleDisplay", "private", "<QAccessibleDisplay>", "public" ] },
+ { symbol: [ "QAccessibleDockWidget", "private", "<QAccessibleDockWidget>", "public" ] },
+ { symbol: [ "QAccessibleDoubleSpinBox", "private", "<QAccessibleDoubleSpinBox>", "public" ] },
+ { symbol: [ "QAccessibleEditableTextInterface", "private", "<QAccessibleEditableTextInterface>", "public" ] },
+ { symbol: [ "QAccessibleEvent", "private", "<QAccessibleEvent>", "public" ] },
+ { symbol: [ "QAccessibleGroupBox", "private", "<QAccessibleGroupBox>", "public" ] },
+ { symbol: [ "QAccessibleImageInterface", "private", "<QAccessibleImageInterface>", "public" ] },
+ { symbol: [ "QAccessibleInterface", "private", "<QAccessibleInterface>", "public" ] },
+ { symbol: [ "QAccessibleLineEdit", "private", "<QAccessibleLineEdit>", "public" ] },
+ { symbol: [ "QAccessibleMainWindow", "private", "<QAccessibleMainWindow>", "public" ] },
+ { symbol: [ "QAccessibleMdiArea", "private", "<QAccessibleMdiArea>", "public" ] },
+ { symbol: [ "QAccessibleMdiSubWindow", "private", "<QAccessibleMdiSubWindow>", "public" ] },
+ { symbol: [ "QAccessibleMenu", "private", "<QAccessibleMenu>", "public" ] },
+ { symbol: [ "QAccessibleMenuBar", "private", "<QAccessibleMenuBar>", "public" ] },
+ { symbol: [ "QAccessibleMenuItem", "private", "<QAccessibleMenuItem>", "public" ] },
+ { symbol: [ "QAccessibleObject", "private", "<QAccessibleObject>", "public" ] },
+ { symbol: [ "QAccessiblePlainTextEdit", "private", "<QAccessiblePlainTextEdit>", "public" ] },
+ { symbol: [ "QAccessiblePlugin", "private", "<QAccessiblePlugin>", "public" ] },
+ { symbol: [ "QAccessibleProgressBar", "private", "<QAccessibleProgressBar>", "public" ] },
+ { symbol: [ "QAccessibleScrollArea", "private", "<QAccessibleScrollArea>", "public" ] },
+ { symbol: [ "QAccessibleScrollBar", "private", "<QAccessibleScrollBar>", "public" ] },
+ { symbol: [ "QAccessibleSlider", "private", "<QAccessibleSlider>", "public" ] },
+ { symbol: [ "QAccessibleSpinBox", "private", "<QAccessibleSpinBox>", "public" ] },
+ { symbol: [ "QAccessibleStackedWidget", "private", "<QAccessibleStackedWidget>", "public" ] },
+ { symbol: [ "QAccessibleStateChangeEvent", "private", "<QAccessibleStateChangeEvent>", "public" ] },
+ { symbol: [ "QAccessibleTabBar", "private", "<QAccessibleTabBar>", "public" ] },
+ { symbol: [ "QAccessibleTable", "private", "<QAccessibleTable>", "public" ] },
+ { symbol: [ "QAccessibleTableCell", "private", "<QAccessibleTableCell>", "public" ] },
+ { symbol: [ "QAccessibleTableCellInterface", "private", "<QAccessibleTableCellInterface>", "public" ] },
+ { symbol: [ "QAccessibleTableCornerButton", "private", "<QAccessibleTableCornerButton>", "public" ] },
+ { symbol: [ "QAccessibleTableHeaderCell", "private", "<QAccessibleTableHeaderCell>", "public" ] },
+ { symbol: [ "QAccessibleTableInterface", "private", "<QAccessibleTableInterface>", "public" ] },
+ { symbol: [ "QAccessibleTableModelChangeEvent", "private", "<QAccessibleTableModelChangeEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextBrowser", "private", "<QAccessibleTextBrowser>", "public" ] },
+ { symbol: [ "QAccessibleTextCursorEvent", "private", "<QAccessibleTextCursorEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextEdit", "private", "<QAccessibleTextEdit>", "public" ] },
+ { symbol: [ "QAccessibleTextInsertEvent", "private", "<QAccessibleTextInsertEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextInterface", "private", "<QAccessibleTextInterface>", "public" ] },
+ { symbol: [ "QAccessibleTextRemoveEvent", "private", "<QAccessibleTextRemoveEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextSelectionEvent", "private", "<QAccessibleTextSelectionEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextUpdateEvent", "private", "<QAccessibleTextUpdateEvent>", "public" ] },
+ { symbol: [ "QAccessibleTextWidget", "private", "<QAccessibleTextWidget>", "public" ] },
+ { symbol: [ "QAccessibleToolBox", "private", "<QAccessibleToolBox>", "public" ] },
+ { symbol: [ "QAccessibleToolButton", "private", "<QAccessibleToolButton>", "public" ] },
+ { symbol: [ "QAccessibleTree", "private", "<QAccessibleTree>", "public" ] },
+ { symbol: [ "QAccessibleValueChangeEvent", "private", "<QAccessibleValueChangeEvent>", "public" ] },
+ { symbol: [ "QAccessibleValueInterface", "private", "<QAccessibleValueInterface>", "public" ] },
+ { symbol: [ "QAccessibleWidget", "private", "<QAccessibleWidget>", "public" ] },
+ { symbol: [ "QAccessibleWindowContainer", "private", "<QAccessibleWindowContainer>", "public" ] },
+ { symbol: [ "QAction", "private", "<QAction>", "public" ] },
+ { symbol: [ "QActionEvent", "private", "<QActionEvent>", "public" ] },
+ { symbol: [ "QActionGroup", "private", "<QActionGroup>", "public" ] },
+ { symbol: [ "QAltimeter", "private", "<QAltimeter>", "public" ] },
+ { symbol: [ "QAltimeterFilter", "private", "<QAltimeterFilter>", "public" ] },
+ { symbol: [ "QAltimeterReading", "private", "<QAltimeterReading>", "public" ] },
+ { symbol: [ "QAmbientLightFilter", "private", "<QAmbientLightFilter>", "public" ] },
+ { symbol: [ "QAmbientLightReading", "private", "<QAmbientLightReading>", "public" ] },
+ { symbol: [ "QAmbientLightSensor", "private", "<QAmbientLightSensor>", "public" ] },
+ { symbol: [ "QAmbientTemperatureFilter", "private", "<QAmbientTemperatureFilter>", "public" ] },
+ { symbol: [ "QAmbientTemperatureReading", "private", "<QAmbientTemperatureReading>", "public" ] },
+ { symbol: [ "QAmbientTemperatureSensor", "private", "<QAmbientTemperatureSensor>", "public" ] },
+ { symbol: [ "QAnimationDriver", "private", "<QAnimationDriver>", "public" ] },
+ { symbol: [ "QAnimationGroup", "private", "<QAnimationGroup>", "public" ] },
+ { symbol: [ "QApplication", "private", "<QApplication>", "public" ] },
+ { symbol: [ "QApplicationStateChangeEvent", "private", "<QApplicationStateChangeEvent>", "public" ] },
+ { symbol: [ "QArgument", "private", "<QArgument>", "public" ] },
+ { symbol: [ "QArrayData", "private", "<QArrayData>", "public" ] },
+ { symbol: [ "QArrayDataPointer", "private", "<QArrayDataPointer>", "public" ] },
+ { symbol: [ "QArrayDataPointerRef", "private", "<QArrayDataPointerRef>", "public" ] },
+ { symbol: [ "QAssociativeIterable", "private", "<QAssociativeIterable>", "public" ] },
+ { symbol: [ "QAtomicInt", "private", "<QAtomicInt>", "public" ] },
+ { symbol: [ "QAtomicInteger", "private", "<QAtomicInteger>", "public" ] },
+ { symbol: [ "QAtomicPointer", "private", "<QAtomicPointer>", "public" ] },
+ { symbol: [ "QAudio", "private", "<QAudio>", "public" ] },
+ { symbol: [ "QAudioBuffer", "private", "<QAudioBuffer>", "public" ] },
+ { symbol: [ "QAudioDecoder", "private", "<QAudioDecoder>", "public" ] },
+ { symbol: [ "QAudioDecoderControl", "private", "<QAudioDecoderControl>", "public" ] },
+ { symbol: [ "QAudioDeviceInfo", "private", "<QAudioDeviceInfo>", "public" ] },
+ { symbol: [ "QAudioEncoderSettings", "private", "<QAudioEncoderSettings>", "public" ] },
+ { symbol: [ "QAudioEncoderSettingsControl", "private", "<QAudioEncoderSettingsControl>", "public" ] },
+ { symbol: [ "QAudioFormat", "private", "<QAudioFormat>", "public" ] },
+ { symbol: [ "QAudioInput", "private", "<QAudioInput>", "public" ] },
+ { symbol: [ "QAudioInputSelectorControl", "private", "<QAudioInputSelectorControl>", "public" ] },
+ { symbol: [ "QAudioOutput", "private", "<QAudioOutput>", "public" ] },
+ { symbol: [ "QAudioOutputSelectorControl", "private", "<QAudioOutputSelectorControl>", "public" ] },
+ { symbol: [ "QAudioProbe", "private", "<QAudioProbe>", "public" ] },
+ { symbol: [ "QAudioRecorder", "private", "<QAudioRecorder>", "public" ] },
+ { symbol: [ "QAudioSystemFactoryInterface", "private", "<QAudioSystemFactoryInterface>", "public" ] },
+ { symbol: [ "QAudioSystemPlugin", "private", "<QAudioSystemPlugin>", "public" ] },
+ { symbol: [ "QAuthenticator", "private", "<QAuthenticator>", "public" ] },
+ { symbol: [ "QAxAggregated", "private", "<QAxAggregated>", "public" ] },
+ { symbol: [ "QAxBase", "private", "<QAxBase>", "public" ] },
+ { symbol: [ "QAxBindable", "private", "<QAxBindable>", "public" ] },
+ { symbol: [ "QAxFactory", "private", "<QAxFactory>", "public" ] },
+ { symbol: [ "QAxObject", "private", "<QAxObject>", "public" ] },
+ { symbol: [ "QAxScript", "private", "<QAxScript>", "public" ] },
+ { symbol: [ "QAxScriptEngine", "private", "<QAxScriptEngine>", "public" ] },
+ { symbol: [ "QAxScriptManager", "private", "<QAxScriptManager>", "public" ] },
+ { symbol: [ "QAxSelect", "private", "<QAxSelect>", "public" ] },
+ { symbol: [ "QAxWidget", "private", "<QAxWidget>", "public" ] },
+ { symbol: [ "QBBSystemLocaleData", "private", "<QBBSystemLocaleData>", "public" ] },
+ { symbol: [ "QBackingStore", "private", "<QBackingStore>", "public" ] },
+ { symbol: [ "QBasicMutex", "private", "<QBasicMutex>", "public" ] },
+ { symbol: [ "QBasicTimer", "private", "<QBasicTimer>", "public" ] },
+ { symbol: [ "QBitArray", "private", "<QBitArray>", "public" ] },
+ { symbol: [ "QBitRef", "private", "<QBitRef>", "public" ] },
+ { symbol: [ "QBitmap", "private", "<QBitmap>", "public" ] },
+ { symbol: [ "QBluetoothAddress", "private", "<QBluetoothAddress>", "public" ] },
+ { symbol: [ "QBluetoothDeviceDiscoveryAgent", "private", "<QBluetoothDeviceDiscoveryAgent>", "public" ] },
+ { symbol: [ "QBluetoothDeviceInfo", "private", "<QBluetoothDeviceInfo>", "public" ] },
+ { symbol: [ "QBluetoothHostInfo", "private", "<QBluetoothHostInfo>", "public" ] },
+ { symbol: [ "QBluetoothLocalDevice", "private", "<QBluetoothLocalDevice>", "public" ] },
+ { symbol: [ "QBluetoothServer", "private", "<QBluetoothServer>", "public" ] },
+ { symbol: [ "QBluetoothServiceDiscoveryAgent", "private", "<QBluetoothServiceDiscoveryAgent>", "public" ] },
+ { symbol: [ "QBluetoothServiceInfo", "private", "<QBluetoothServiceInfo>", "public" ] },
+ { symbol: [ "QBluetoothSocket", "private", "<QBluetoothSocket>", "public" ] },
+ { symbol: [ "QBluetoothTransferManager", "private", "<QBluetoothTransferManager>", "public" ] },
+ { symbol: [ "QBluetoothTransferReply", "private", "<QBluetoothTransferReply>", "public" ] },
+ { symbol: [ "QBluetoothTransferRequest", "private", "<QBluetoothTransferRequest>", "public" ] },
+ { symbol: [ "QBluetoothUuid", "private", "<QBluetoothUuid>", "public" ] },
+ { symbol: [ "QBoxLayout", "private", "<QBoxLayout>", "public" ] },
+ { symbol: [ "QBrush", "private", "<QBrush>", "public" ] },
+ { symbol: [ "QBrushData", "private", "<QBrushData>", "public" ] },
+ { symbol: [ "QBuffer", "private", "<QBuffer>", "public" ] },
+ { symbol: [ "QButtonGroup", "private", "<QButtonGroup>", "public" ] },
+ { symbol: [ "QByteArray", "private", "<QByteArray>", "public" ] },
+ { symbol: [ "QByteArrayData", "private", "<QByteArrayData>", "public" ] },
+ { symbol: [ "QByteArrayDataPtr", "private", "<QByteArrayDataPtr>", "public" ] },
+ { symbol: [ "QByteArrayList", "private", "<QByteArrayList>", "public" ] },
+ { symbol: [ "QByteArrayListIterator", "private", "<QByteArrayListIterator>", "public" ] },
+ { symbol: [ "QByteArrayMatcher", "private", "<QByteArrayMatcher>", "public" ] },
+ { symbol: [ "QByteRef", "private", "<QByteRef>", "public" ] },
+ { symbol: [ "QCache", "private", "<QCache>", "public" ] },
+ { symbol: [ "QCalendarWidget", "private", "<QCalendarWidget>", "public" ] },
+ { symbol: [ "QCamera", "private", "<QCamera>", "public" ] },
+ { symbol: [ "QCameraCaptureBufferFormatControl", "private", "<QCameraCaptureBufferFormatControl>", "public" ] },
+ { symbol: [ "QCameraCaptureDestinationControl", "private", "<QCameraCaptureDestinationControl>", "public" ] },
+ { symbol: [ "QCameraControl", "private", "<QCameraControl>", "public" ] },
+ { symbol: [ "QCameraExposure", "private", "<QCameraExposure>", "public" ] },
+ { symbol: [ "QCameraExposureControl", "private", "<QCameraExposureControl>", "public" ] },
+ { symbol: [ "QCameraFeedbackControl", "private", "<QCameraFeedbackControl>", "public" ] },
+ { symbol: [ "QCameraFlashControl", "private", "<QCameraFlashControl>", "public" ] },
+ { symbol: [ "QCameraFocus", "private", "<QCameraFocus>", "public" ] },
+ { symbol: [ "QCameraFocusControl", "private", "<QCameraFocusControl>", "public" ] },
+ { symbol: [ "QCameraFocusZone", "private", "<QCameraFocusZone>", "public" ] },
+ { symbol: [ "QCameraFocusZoneList", "private", "<QCameraFocusZoneList>", "public" ] },
+ { symbol: [ "QCameraImageCapture", "private", "<QCameraImageCapture>", "public" ] },
+ { symbol: [ "QCameraImageCaptureControl", "private", "<QCameraImageCaptureControl>", "public" ] },
+ { symbol: [ "QCameraImageProcessing", "private", "<QCameraImageProcessing>", "public" ] },
+ { symbol: [ "QCameraImageProcessingControl", "private", "<QCameraImageProcessingControl>", "public" ] },
+ { symbol: [ "QCameraInfo", "private", "<QCameraInfo>", "public" ] },
+ { symbol: [ "QCameraInfoControl", "private", "<QCameraInfoControl>", "public" ] },
+ { symbol: [ "QCameraLocksControl", "private", "<QCameraLocksControl>", "public" ] },
+ { symbol: [ "QCameraViewfinder", "private", "<QCameraViewfinder>", "public" ] },
+ { symbol: [ "QCameraViewfinderSettingsControl", "private", "<QCameraViewfinderSettingsControl>", "public" ] },
+ { symbol: [ "QCameraZoomControl", "private", "<QCameraZoomControl>", "public" ] },
+ { symbol: [ "QChar", "private", "<QChar>", "public" ] },
+ { symbol: [ "QCharRef", "private", "<QCharRef>", "public" ] },
+ { symbol: [ "QCheckBox", "private", "<QCheckBox>", "public" ] },
+ { symbol: [ "QChildEvent", "private", "<QChildEvent>", "public" ] },
+ { symbol: [ "QClipboard", "private", "<QClipboard>", "public" ] },
+ { symbol: [ "QCloseEvent", "private", "<QCloseEvent>", "public" ] },
+ { symbol: [ "QCocoaNativeContext", "private", "<QCocoaNativeContext>", "public" ] },
+ { symbol: [ "QCollator", "private", "<QCollator>", "public" ] },
+ { symbol: [ "QCollatorSortKey", "private", "<QCollatorSortKey>", "public" ] },
+ { symbol: [ "QColor", "private", "<QColor>", "public" ] },
+ { symbol: [ "QColorDialog", "private", "<QColorDialog>", "public" ] },
+ { symbol: [ "QColormap", "private", "<QColormap>", "public" ] },
+ { symbol: [ "QColumnView", "private", "<QColumnView>", "public" ] },
+ { symbol: [ "QComboBox", "private", "<QComboBox>", "public" ] },
+ { symbol: [ "QCommandLineOption", "private", "<QCommandLineOption>", "public" ] },
+ { symbol: [ "QCommandLineParser", "private", "<QCommandLineParser>", "public" ] },
+ { symbol: [ "QCommandLinkButton", "private", "<QCommandLinkButton>", "public" ] },
+ { symbol: [ "QCommonStyle", "private", "<QCommonStyle>", "public" ] },
+ { symbol: [ "QCompass", "private", "<QCompass>", "public" ] },
+ { symbol: [ "QCompassFilter", "private", "<QCompassFilter>", "public" ] },
+ { symbol: [ "QCompassReading", "private", "<QCompassReading>", "public" ] },
+ { symbol: [ "QCompleter", "private", "<QCompleter>", "public" ] },
+ { symbol: [ "QConicalGradient", "private", "<QConicalGradient>", "public" ] },
+ { symbol: [ "QContextMenuEvent", "private", "<QContextMenuEvent>", "public" ] },
+ { symbol: [ "QContiguousCache", "private", "<QContiguousCache>", "public" ] },
+ { symbol: [ "QContiguousCacheData", "private", "<QContiguousCacheData>", "public" ] },
+ { symbol: [ "QContiguousCacheTypedData", "private", "<QContiguousCacheTypedData>", "public" ] },
+ { symbol: [ "QCoreApplication", "private", "<QCoreApplication>", "public" ] },
+ { symbol: [ "QCryptographicHash", "private", "<QCryptographicHash>", "public" ] },
+ { symbol: [ "QCursor", "private", "<QCursor>", "public" ] },
+ { symbol: [ "QDBusAbstractAdaptor", "private", "<QDBusAbstractAdaptor>", "public" ] },
+ { symbol: [ "QDBusAbstractInterface", "private", "<QDBusAbstractInterface>", "public" ] },
+ { symbol: [ "QDBusAbstractInterfaceBase", "private", "<QDBusAbstractInterfaceBase>", "public" ] },
+ { symbol: [ "QDBusArgument", "private", "<QDBusArgument>", "public" ] },
+ { symbol: [ "QDBusConnection", "private", "<QDBusConnection>", "public" ] },
+ { symbol: [ "QDBusConnectionInterface", "private", "<QDBusConnectionInterface>", "public" ] },
+ { symbol: [ "QDBusContext", "private", "<QDBusContext>", "public" ] },
+ { symbol: [ "QDBusError", "private", "<QDBusError>", "public" ] },
+ { symbol: [ "QDBusInterface", "private", "<QDBusInterface>", "public" ] },
+ { symbol: [ "QDBusMessage", "private", "<QDBusMessage>", "public" ] },
+ { symbol: [ "QDBusMetaType", "private", "<QDBusMetaType>", "public" ] },
+ { symbol: [ "QDBusObjectPath", "private", "<QDBusObjectPath>", "public" ] },
+ { symbol: [ "QDBusPendingCall", "private", "<QDBusPendingCall>", "public" ] },
+ { symbol: [ "QDBusPendingCallWatcher", "private", "<QDBusPendingCallWatcher>", "public" ] },
+ { symbol: [ "QDBusPendingReply", "private", "<QDBusPendingReply>", "public" ] },
+ { symbol: [ "QDBusPendingReplyData", "private", "<QDBusPendingReplyData>", "public" ] },
+ { symbol: [ "QDBusReply", "private", "<QDBusReply>", "public" ] },
+ { symbol: [ "QDBusServer", "private", "<QDBusServer>", "public" ] },
+ { symbol: [ "QDBusServiceWatcher", "private", "<QDBusServiceWatcher>", "public" ] },
+ { symbol: [ "QDBusSignature", "private", "<QDBusSignature>", "public" ] },
+ { symbol: [ "QDBusUnixFileDescriptor", "private", "<QDBusUnixFileDescriptor>", "public" ] },
+ { symbol: [ "QDBusVariant", "private", "<QDBusVariant>", "public" ] },
+ { symbol: [ "QDBusVirtualObject", "private", "<QDBusVirtualObject>", "public" ] },
+ { symbol: [ "QDataStream", "private", "<QDataStream>", "public" ] },
+ { symbol: [ "QDataWidgetMapper", "private", "<QDataWidgetMapper>", "public" ] },
+ { symbol: [ "QDate", "private", "<QDate>", "public" ] },
+ { symbol: [ "QDateEdit", "private", "<QDateEdit>", "public" ] },
+ { symbol: [ "QDateTime", "private", "<QDateTime>", "public" ] },
+ { symbol: [ "QDateTimeEdit", "private", "<QDateTimeEdit>", "public" ] },
+ { symbol: [ "QDebug", "private", "<QDebug>", "public" ] },
+ { symbol: [ "QDebugStateSaver", "private", "<QDebugStateSaver>", "public" ] },
+ { symbol: [ "QDeclarativeAttachedPropertiesFunc", "private", "<QDeclarativeAttachedPropertiesFunc>", "public" ] },
+ { symbol: [ "QDeclarativeComponent", "private", "<QDeclarativeComponent>", "public" ] },
+ { symbol: [ "QDeclarativeContext", "private", "<QDeclarativeContext>", "public" ] },
+ { symbol: [ "QDeclarativeDebuggingEnabler", "private", "<QDeclarativeDebuggingEnabler>", "public" ] },
+ { symbol: [ "QDeclarativeEngine", "private", "<QDeclarativeEngine>", "public" ] },
+ { symbol: [ "QDeclarativeError", "private", "<QDeclarativeError>", "public" ] },
+ { symbol: [ "QDeclarativeExpression", "private", "<QDeclarativeExpression>", "public" ] },
+ { symbol: [ "QDeclarativeExtensionInterface", "private", "<QDeclarativeExtensionInterface>", "public" ] },
+ { symbol: [ "QDeclarativeExtensionPlugin", "private", "<QDeclarativeExtensionPlugin>", "public" ] },
+ { symbol: [ "QDeclarativeImageProvider", "private", "<QDeclarativeImageProvider>", "public" ] },
+ { symbol: [ "QDeclarativeInfo", "private", "<QDeclarativeInfo>", "public" ] },
+ { symbol: [ "QDeclarativeItem", "private", "<QDeclarativeItem>", "public" ] },
+ { symbol: [ "QDeclarativeListProperty", "private", "<QDeclarativeListProperty>", "public" ] },
+ { symbol: [ "QDeclarativeListReference", "private", "<QDeclarativeListReference>", "public" ] },
+ { symbol: [ "QDeclarativeNetworkAccessManagerFactory", "private", "<QDeclarativeNetworkAccessManagerFactory>", "public" ] },
+ { symbol: [ "QDeclarativeParserStatus", "private", "<QDeclarativeParserStatus>", "public" ] },
+ { symbol: [ "QDeclarativeProperties", "private", "<QDeclarativeProperties>", "public" ] },
+ { symbol: [ "QDeclarativeProperty", "private", "<QDeclarativeProperty>", "public" ] },
+ { symbol: [ "QDeclarativePropertyMap", "private", "<QDeclarativePropertyMap>", "public" ] },
+ { symbol: [ "QDeclarativePropertyValueInterceptor", "private", "<QDeclarativePropertyValueInterceptor>", "public" ] },
+ { symbol: [ "QDeclarativePropertyValueSource", "private", "<QDeclarativePropertyValueSource>", "public" ] },
+ { symbol: [ "QDeclarativeScriptString", "private", "<QDeclarativeScriptString>", "public" ] },
+ { symbol: [ "QDeclarativeTypeInfo", "private", "<QDeclarativeTypeInfo>", "public" ] },
+ { symbol: [ "QDeclarativeView", "private", "<QDeclarativeView>", "public" ] },
+ { symbol: [ "QDeferredDeleteEvent", "private", "<QDeferredDeleteEvent>", "public" ] },
+ { symbol: [ "QDesignerActionEditorInterface", "private", "<QDesignerActionEditorInterface>", "public" ] },
+ { symbol: [ "QDesignerComponents", "private", "<QDesignerComponents>", "public" ] },
+ { symbol: [ "QDesignerContainerExtension", "private", "<QDesignerContainerExtension>", "public" ] },
+ { symbol: [ "QDesignerCustomWidgetCollectionInterface", "private", "<QDesignerCustomWidgetCollectionInterface>", "public" ] },
+ { symbol: [ "QDesignerCustomWidgetInterface", "private", "<QDesignerCustomWidgetInterface>", "public" ] },
+ { symbol: [ "QDesignerDnDItemInterface", "private", "<QDesignerDnDItemInterface>", "public" ] },
+ { symbol: [ "QDesignerDynamicPropertySheetExtension", "private", "<QDesignerDynamicPropertySheetExtension>", "public" ] },
+ { symbol: [ "QDesignerExportWidget", "private", "<QDesignerExportWidget>", "public" ] },
+ { symbol: [ "QDesignerExtraInfoExtension", "private", "<QDesignerExtraInfoExtension>", "public" ] },
+ { symbol: [ "QDesignerFormEditorInterface", "private", "<QDesignerFormEditorInterface>", "public" ] },
+ { symbol: [ "QDesignerFormEditorPluginInterface", "private", "<QDesignerFormEditorPluginInterface>", "public" ] },
+ { symbol: [ "QDesignerFormWindowCursorInterface", "private", "<QDesignerFormWindowCursorInterface>", "public" ] },
+ { symbol: [ "QDesignerFormWindowInterface", "private", "<QDesignerFormWindowInterface>", "public" ] },
+ { symbol: [ "QDesignerFormWindowManagerInterface", "private", "<QDesignerFormWindowManagerInterface>", "public" ] },
+ { symbol: [ "QDesignerFormWindowToolInterface", "private", "<QDesignerFormWindowToolInterface>", "public" ] },
+ { symbol: [ "QDesignerIntegration", "private", "<QDesignerIntegration>", "public" ] },
+ { symbol: [ "QDesignerIntegrationInterface", "private", "<QDesignerIntegrationInterface>", "public" ] },
+ { symbol: [ "QDesignerLanguageExtension", "private", "<QDesignerLanguageExtension>", "public" ] },
+ { symbol: [ "QDesignerLayoutDecorationExtension", "private", "<QDesignerLayoutDecorationExtension>", "public" ] },
+ { symbol: [ "QDesignerMemberSheetExtension", "private", "<QDesignerMemberSheetExtension>", "public" ] },
+ { symbol: [ "QDesignerMetaDataBaseInterface", "private", "<QDesignerMetaDataBaseInterface>", "public" ] },
+ { symbol: [ "QDesignerMetaDataBaseItemInterface", "private", "<QDesignerMetaDataBaseItemInterface>", "public" ] },
+ { symbol: [ "QDesignerNewFormWidgetInterface", "private", "<QDesignerNewFormWidgetInterface>", "public" ] },
+ { symbol: [ "QDesignerObjectInspectorInterface", "private", "<QDesignerObjectInspectorInterface>", "public" ] },
+ { symbol: [ "QDesignerOptionsPageInterface", "private", "<QDesignerOptionsPageInterface>", "public" ] },
+ { symbol: [ "QDesignerPromotionInterface", "private", "<QDesignerPromotionInterface>", "public" ] },
+ { symbol: [ "QDesignerPropertyEditorInterface", "private", "<QDesignerPropertyEditorInterface>", "public" ] },
+ { symbol: [ "QDesignerPropertySheetExtension", "private", "<QDesignerPropertySheetExtension>", "public" ] },
+ { symbol: [ "QDesignerResourceBrowserInterface", "private", "<QDesignerResourceBrowserInterface>", "public" ] },
+ { symbol: [ "QDesignerSettingsInterface", "private", "<QDesignerSettingsInterface>", "public" ] },
+ { symbol: [ "QDesignerTaskMenuExtension", "private", "<QDesignerTaskMenuExtension>", "public" ] },
+ { symbol: [ "QDesignerWidgetBoxInterface", "private", "<QDesignerWidgetBoxInterface>", "public" ] },
+ { symbol: [ "QDesignerWidgetDataBaseInterface", "private", "<QDesignerWidgetDataBaseInterface>", "public" ] },
+ { symbol: [ "QDesignerWidgetDataBaseItemInterface", "private", "<QDesignerWidgetDataBaseItemInterface>", "public" ] },
+ { symbol: [ "QDesignerWidgetFactoryInterface", "private", "<QDesignerWidgetFactoryInterface>", "public" ] },
+ { symbol: [ "QDesktopServices", "private", "<QDesktopServices>", "public" ] },
+ { symbol: [ "QDesktopWidget", "private", "<QDesktopWidget>", "public" ] },
+ { symbol: [ "QDial", "private", "<QDial>", "public" ] },
+ { symbol: [ "QDialog", "private", "<QDialog>", "public" ] },
+ { symbol: [ "QDialogButtonBox", "private", "<QDialogButtonBox>", "public" ] },
+ { symbol: [ "QDir", "private", "<QDir>", "public" ] },
+ { symbol: [ "QDirIterator", "private", "<QDirIterator>", "public" ] },
+ { symbol: [ "QDirModel", "private", "<QDirModel>", "public" ] },
+ { symbol: [ "QDistanceFilter", "private", "<QDistanceFilter>", "public" ] },
+ { symbol: [ "QDistanceReading", "private", "<QDistanceReading>", "public" ] },
+ { symbol: [ "QDistanceSensor", "private", "<QDistanceSensor>", "public" ] },
+ { symbol: [ "QDnsDomainNameRecord", "private", "<QDnsDomainNameRecord>", "public" ] },
+ { symbol: [ "QDnsHostAddressRecord", "private", "<QDnsHostAddressRecord>", "public" ] },
+ { symbol: [ "QDnsLookup", "private", "<QDnsLookup>", "public" ] },
+ { symbol: [ "QDnsMailExchangeRecord", "private", "<QDnsMailExchangeRecord>", "public" ] },
+ { symbol: [ "QDnsServiceRecord", "private", "<QDnsServiceRecord>", "public" ] },
+ { symbol: [ "QDnsTextRecord", "private", "<QDnsTextRecord>", "public" ] },
+ { symbol: [ "QDockWidget", "private", "<QDockWidget>", "public" ] },
+ { symbol: [ "QDomAttr", "private", "<QDomAttr>", "public" ] },
+ { symbol: [ "QDomCDATASection", "private", "<QDomCDATASection>", "public" ] },
+ { symbol: [ "QDomCharacterData", "private", "<QDomCharacterData>", "public" ] },
+ { symbol: [ "QDomComment", "private", "<QDomComment>", "public" ] },
+ { symbol: [ "QDomDocument", "private", "<QDomDocument>", "public" ] },
+ { symbol: [ "QDomDocumentFragment", "private", "<QDomDocumentFragment>", "public" ] },
+ { symbol: [ "QDomDocumentType", "private", "<QDomDocumentType>", "public" ] },
+ { symbol: [ "QDomElement", "private", "<QDomElement>", "public" ] },
+ { symbol: [ "QDomEntity", "private", "<QDomEntity>", "public" ] },
+ { symbol: [ "QDomEntityReference", "private", "<QDomEntityReference>", "public" ] },
+ { symbol: [ "QDomImplementation", "private", "<QDomImplementation>", "public" ] },
+ { symbol: [ "QDomNamedNodeMap", "private", "<QDomNamedNodeMap>", "public" ] },
+ { symbol: [ "QDomNode", "private", "<QDomNode>", "public" ] },
+ { symbol: [ "QDomNodeList", "private", "<QDomNodeList>", "public" ] },
+ { symbol: [ "QDomNotation", "private", "<QDomNotation>", "public" ] },
+ { symbol: [ "QDomProcessingInstruction", "private", "<QDomProcessingInstruction>", "public" ] },
+ { symbol: [ "QDomText", "private", "<QDomText>", "public" ] },
+ { symbol: [ "QDoubleSpinBox", "private", "<QDoubleSpinBox>", "public" ] },
+ { symbol: [ "QDoubleValidator", "private", "<QDoubleValidator>", "public" ] },
+ { symbol: [ "QDrag", "private", "<QDrag>", "public" ] },
+ { symbol: [ "QDragEnterEvent", "private", "<QDragEnterEvent>", "public" ] },
+ { symbol: [ "QDragLeaveEvent", "private", "<QDragLeaveEvent>", "public" ] },
+ { symbol: [ "QDragMoveEvent", "private", "<QDragMoveEvent>", "public" ] },
+ { symbol: [ "QDropEvent", "private", "<QDropEvent>", "public" ] },
+ { symbol: [ "QDynamicPropertyChangeEvent", "private", "<QDynamicPropertyChangeEvent>", "public" ] },
+ { symbol: [ "QEGLNativeContext", "private", "<QEGLNativeContext>", "public" ] },
+ { symbol: [ "QEasingCurve", "private", "<QEasingCurve>", "public" ] },
+ { symbol: [ "QEglFSFunctions", "private", "<QEglFSFunctions>", "public" ] },
+ { symbol: [ "QElapsedTimer", "private", "<QElapsedTimer>", "public" ] },
+ { symbol: [ "QEnableSharedFromThis", "private", "<QEnableSharedFromThis>", "public" ] },
+ { symbol: [ "QEnterEvent", "private", "<QEnterEvent>", "public" ] },
+ { symbol: [ "QErrorMessage", "private", "<QErrorMessage>", "public" ] },
+ { symbol: [ "QEvent", "private", "<QEvent>", "public" ] },
+ { symbol: [ "QEventLoop", "private", "<QEventLoop>", "public" ] },
+ { symbol: [ "QEventLoopLocker", "private", "<QEventLoopLocker>", "public" ] },
+ { symbol: [ "QEventSizeOfChecker", "private", "<QEventSizeOfChecker>", "public" ] },
+ { symbol: [ "QEventTransition", "private", "<QEventTransition>", "public" ] },
+ { symbol: [ "QException", "private", "<QException>", "public" ] },
+ { symbol: [ "QExplicitlySharedDataPointer", "private", "<QExplicitlySharedDataPointer>", "public" ] },
+ { symbol: [ "QExposeEvent", "private", "<QExposeEvent>", "public" ] },
+ { symbol: [ "QExtensionFactory", "private", "<QExtensionFactory>", "public" ] },
+ { symbol: [ "QExtensionManager", "private", "<QExtensionManager>", "public" ] },
+ { symbol: [ "QFactoryInterface", "private", "<QFactoryInterface>", "public" ] },
+ { symbol: [ "QFile", "private", "<QFile>", "public" ] },
+ { symbol: [ "QFileDevice", "private", "<QFileDevice>", "public" ] },
+ { symbol: [ "QFileDialog", "private", "<QFileDialog>", "public" ] },
+ { symbol: [ "QFileIconProvider", "private", "<QFileIconProvider>", "public" ] },
+ { symbol: [ "QFileInfo", "private", "<QFileInfo>", "public" ] },
+ { symbol: [ "QFileInfoList", "private", "<QFileInfoList>", "public" ] },
+ { symbol: [ "QFileOpenEvent", "private", "<QFileOpenEvent>", "public" ] },
+ { symbol: [ "QFileSelector", "private", "<QFileSelector>", "public" ] },
+ { symbol: [ "QFileSystemModel", "private", "<QFileSystemModel>", "public" ] },
+ { symbol: [ "QFileSystemWatcher", "private", "<QFileSystemWatcher>", "public" ] },
+ { symbol: [ "QFinalState", "private", "<QFinalState>", "public" ] },
+ { symbol: [ "QFlag", "private", "<QFlag>", "public" ] },
+ { symbol: [ "QFlags", "private", "<QFlags>", "public" ] },
+ { symbol: [ "QFocusEvent", "private", "<QFocusEvent>", "public" ] },
+ { symbol: [ "QFocusFrame", "private", "<QFocusFrame>", "public" ] },
+ { symbol: [ "QFont", "private", "<QFont>", "public" ] },
+ { symbol: [ "QFontComboBox", "private", "<QFontComboBox>", "public" ] },
+ { symbol: [ "QFontDatabase", "private", "<QFontDatabase>", "public" ] },
+ { symbol: [ "QFontDialog", "private", "<QFontDialog>", "public" ] },
+ { symbol: [ "QFontInfo", "private", "<QFontInfo>", "public" ] },
+ { symbol: [ "QFontMetrics", "private", "<QFontMetrics>", "public" ] },
+ { symbol: [ "QFontMetricsF", "private", "<QFontMetricsF>", "public" ] },
+ { symbol: [ "QForeachContainer", "private", "<QForeachContainer>", "public" ] },
+ { symbol: [ "QFormBuilder", "private", "<QFormBuilder>", "public" ] },
+ { symbol: [ "QFormLayout", "private", "<QFormLayout>", "public" ] },
+ { symbol: [ "QFrame", "private", "<QFrame>", "public" ] },
+ { symbol: [ "QFunctionPointer", "private", "<QFunctionPointer>", "public" ] },
+ { symbol: [ "QFuture", "private", "<QFuture>", "public" ] },
+ { symbol: [ "QFutureInterface", "private", "<QFutureInterface>", "public" ] },
+ { symbol: [ "QFutureInterfaceBase", "private", "<QFutureInterfaceBase>", "public" ] },
+ { symbol: [ "QFutureIterator", "private", "<QFutureIterator>", "public" ] },
+ { symbol: [ "QFutureSynchronizer", "private", "<QFutureSynchronizer>", "public" ] },
+ { symbol: [ "QFutureWatcher", "private", "<QFutureWatcher>", "public" ] },
+ { symbol: [ "QFutureWatcherBase", "private", "<QFutureWatcherBase>", "public" ] },
+ { symbol: [ "QGL", "private", "<QGL>", "public" ] },
+ { symbol: [ "QGLBuffer", "private", "<QGLBuffer>", "public" ] },
+ { symbol: [ "QGLColormap", "private", "<QGLColormap>", "public" ] },
+ { symbol: [ "QGLContext", "private", "<QGLContext>", "public" ] },
+ { symbol: [ "QGLFormat", "private", "<QGLFormat>", "public" ] },
+ { symbol: [ "QGLFramebufferObject", "private", "<QGLFramebufferObject>", "public" ] },
+ { symbol: [ "QGLFramebufferObjectFormat", "private", "<QGLFramebufferObjectFormat>", "public" ] },
+ { symbol: [ "QGLFunctions", "private", "<QGLFunctions>", "public" ] },
+ { symbol: [ "QGLFunctionsPrivate", "private", "<QGLFunctionsPrivate>", "public" ] },
+ { symbol: [ "QGLPixelBuffer", "private", "<QGLPixelBuffer>", "public" ] },
+ { symbol: [ "QGLShader", "private", "<QGLShader>", "public" ] },
+ { symbol: [ "QGLShaderProgram", "private", "<QGLShaderProgram>", "public" ] },
+ { symbol: [ "QGLWidget", "private", "<QGLWidget>", "public" ] },
+ { symbol: [ "QGLXNativeContext", "private", "<QGLXNativeContext>", "public" ] },
+ { symbol: [ "QGenericArgument", "private", "<QGenericArgument>", "public" ] },
+ { symbol: [ "QGenericMatrix", "private", "<QGenericMatrix>", "public" ] },
+ { symbol: [ "QGenericPlugin", "private", "<QGenericPlugin>", "public" ] },
+ { symbol: [ "QGenericPluginFactory", "private", "<QGenericPluginFactory>", "public" ] },
+ { symbol: [ "QGenericReturnArgument", "private", "<QGenericReturnArgument>", "public" ] },
+ { symbol: [ "QGeoAddress", "private", "<QGeoAddress>", "public" ] },
+ { symbol: [ "QGeoAreaMonitorInfo", "private", "<QGeoAreaMonitorInfo>", "public" ] },
+ { symbol: [ "QGeoAreaMonitorSource", "private", "<QGeoAreaMonitorSource>", "public" ] },
+ { symbol: [ "QGeoCircle", "private", "<QGeoCircle>", "public" ] },
+ { symbol: [ "QGeoCodeReply", "private", "<QGeoCodeReply>", "public" ] },
+ { symbol: [ "QGeoCodingManager", "private", "<QGeoCodingManager>", "public" ] },
+ { symbol: [ "QGeoCodingManagerEngine", "private", "<QGeoCodingManagerEngine>", "public" ] },
+ { symbol: [ "QGeoCoordinate", "private", "<QGeoCoordinate>", "public" ] },
+ { symbol: [ "QGeoLocation", "private", "<QGeoLocation>", "public" ] },
+ { symbol: [ "QGeoManeuver", "private", "<QGeoManeuver>", "public" ] },
+ { symbol: [ "QGeoPositionInfo", "private", "<QGeoPositionInfo>", "public" ] },
+ { symbol: [ "QGeoPositionInfoSource", "private", "<QGeoPositionInfoSource>", "public" ] },
+ { symbol: [ "QGeoPositionInfoSourceFactory", "private", "<QGeoPositionInfoSourceFactory>", "public" ] },
+ { symbol: [ "QGeoRectangle", "private", "<QGeoRectangle>", "public" ] },
+ { symbol: [ "QGeoRoute", "private", "<QGeoRoute>", "public" ] },
+ { symbol: [ "QGeoRouteReply", "private", "<QGeoRouteReply>", "public" ] },
+ { symbol: [ "QGeoRouteRequest", "private", "<QGeoRouteRequest>", "public" ] },
+ { symbol: [ "QGeoRouteSegment", "private", "<QGeoRouteSegment>", "public" ] },
+ { symbol: [ "QGeoRoutingManager", "private", "<QGeoRoutingManager>", "public" ] },
+ { symbol: [ "QGeoRoutingManagerEngine", "private", "<QGeoRoutingManagerEngine>", "public" ] },
+ { symbol: [ "QGeoSatelliteInfo", "private", "<QGeoSatelliteInfo>", "public" ] },
+ { symbol: [ "QGeoSatelliteInfoSource", "private", "<QGeoSatelliteInfoSource>", "public" ] },
+ { symbol: [ "QGeoServiceProvider", "private", "<QGeoServiceProvider>", "public" ] },
+ { symbol: [ "QGeoServiceProviderFactory", "private", "<QGeoServiceProviderFactory>", "public" ] },
+ { symbol: [ "QGeoShape", "private", "<QGeoShape>", "public" ] },
+ { symbol: [ "QGesture", "private", "<QGesture>", "public" ] },
+ { symbol: [ "QGestureEvent", "private", "<QGestureEvent>", "public" ] },
+ { symbol: [ "QGestureRecognizer", "private", "<QGestureRecognizer>", "public" ] },
+ { symbol: [ "QGlobalStatic", "private", "<QGlobalStatic>", "public" ] },
+ { symbol: [ "QGlyphRun", "private", "<QGlyphRun>", "public" ] },
+ { symbol: [ "QGradient", "private", "<QGradient>", "public" ] },
+ { symbol: [ "QGradientStop", "private", "<QGradientStop>", "public" ] },
+ { symbol: [ "QGradientStops", "private", "<QGradientStops>", "public" ] },
+ { symbol: [ "QGraphicsAnchor", "private", "<QGraphicsAnchor>", "public" ] },
+ { symbol: [ "QGraphicsAnchorLayout", "private", "<QGraphicsAnchorLayout>", "public" ] },
+ { symbol: [ "QGraphicsBlurEffect", "private", "<QGraphicsBlurEffect>", "public" ] },
+ { symbol: [ "QGraphicsColorizeEffect", "private", "<QGraphicsColorizeEffect>", "public" ] },
+ { symbol: [ "QGraphicsDropShadowEffect", "private", "<QGraphicsDropShadowEffect>", "public" ] },
+ { symbol: [ "QGraphicsEffect", "private", "<QGraphicsEffect>", "public" ] },
+ { symbol: [ "QGraphicsEllipseItem", "private", "<QGraphicsEllipseItem>", "public" ] },
+ { symbol: [ "QGraphicsGridLayout", "private", "<QGraphicsGridLayout>", "public" ] },
+ { symbol: [ "QGraphicsItem", "private", "<QGraphicsItem>", "public" ] },
+ { symbol: [ "QGraphicsItemAnimation", "private", "<QGraphicsItemAnimation>", "public" ] },
+ { symbol: [ "QGraphicsItemGroup", "private", "<QGraphicsItemGroup>", "public" ] },
+ { symbol: [ "QGraphicsLayout", "private", "<QGraphicsLayout>", "public" ] },
+ { symbol: [ "QGraphicsLayoutItem", "private", "<QGraphicsLayoutItem>", "public" ] },
+ { symbol: [ "QGraphicsLineItem", "private", "<QGraphicsLineItem>", "public" ] },
+ { symbol: [ "QGraphicsLinearLayout", "private", "<QGraphicsLinearLayout>", "public" ] },
+ { symbol: [ "QGraphicsObject", "private", "<QGraphicsObject>", "public" ] },
+ { symbol: [ "QGraphicsOpacityEffect", "private", "<QGraphicsOpacityEffect>", "public" ] },
+ { symbol: [ "QGraphicsPathItem", "private", "<QGraphicsPathItem>", "public" ] },
+ { symbol: [ "QGraphicsPixmapItem", "private", "<QGraphicsPixmapItem>", "public" ] },
+ { symbol: [ "QGraphicsPolygonItem", "private", "<QGraphicsPolygonItem>", "public" ] },
+ { symbol: [ "QGraphicsProxyWidget", "private", "<QGraphicsProxyWidget>", "public" ] },
+ { symbol: [ "QGraphicsRectItem", "private", "<QGraphicsRectItem>", "public" ] },
+ { symbol: [ "QGraphicsRotation", "private", "<QGraphicsRotation>", "public" ] },
+ { symbol: [ "QGraphicsScale", "private", "<QGraphicsScale>", "public" ] },
+ { symbol: [ "QGraphicsScene", "private", "<QGraphicsScene>", "public" ] },
+ { symbol: [ "QGraphicsSceneContextMenuEvent", "private", "<QGraphicsSceneContextMenuEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneDragDropEvent", "private", "<QGraphicsSceneDragDropEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneEvent", "private", "<QGraphicsSceneEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneHelpEvent", "private", "<QGraphicsSceneHelpEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneHoverEvent", "private", "<QGraphicsSceneHoverEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneMouseEvent", "private", "<QGraphicsSceneMouseEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneMoveEvent", "private", "<QGraphicsSceneMoveEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneResizeEvent", "private", "<QGraphicsSceneResizeEvent>", "public" ] },
+ { symbol: [ "QGraphicsSceneWheelEvent", "private", "<QGraphicsSceneWheelEvent>", "public" ] },
+ { symbol: [ "QGraphicsSimpleTextItem", "private", "<QGraphicsSimpleTextItem>", "public" ] },
+ { symbol: [ "QGraphicsSvgItem", "private", "<QGraphicsSvgItem>", "public" ] },
+ { symbol: [ "QGraphicsTextItem", "private", "<QGraphicsTextItem>", "public" ] },
+ { symbol: [ "QGraphicsTransform", "private", "<QGraphicsTransform>", "public" ] },
+ { symbol: [ "QGraphicsVideoItem", "private", "<QGraphicsVideoItem>", "public" ] },
+ { symbol: [ "QGraphicsView", "private", "<QGraphicsView>", "public" ] },
+ { symbol: [ "QGraphicsWebView", "private", "<QGraphicsWebView>", "public" ] },
+ { symbol: [ "QGraphicsWidget", "private", "<QGraphicsWidget>", "public" ] },
+ { symbol: [ "QGridLayout", "private", "<QGridLayout>", "public" ] },
+ { symbol: [ "QGroupBox", "private", "<QGroupBox>", "public" ] },
+ { symbol: [ "QGuiApplication", "private", "<QGuiApplication>", "public" ] },
+ { symbol: [ "QGyroscope", "private", "<QGyroscope>", "public" ] },
+ { symbol: [ "QGyroscopeFilter", "private", "<QGyroscopeFilter>", "public" ] },
+ { symbol: [ "QGyroscopeReading", "private", "<QGyroscopeReading>", "public" ] },
+ { symbol: [ "QHBoxLayout", "private", "<QHBoxLayout>", "public" ] },
+ { symbol: [ "QHash", "private", "<QHash>", "public" ] },
+ { symbol: [ "QHashData", "private", "<QHashData>", "public" ] },
+ { symbol: [ "QHashDummyValue", "private", "<QHashDummyValue>", "public" ] },
+ { symbol: [ "QHashIterator", "private", "<QHashIterator>", "public" ] },
+ { symbol: [ "QHashNode", "private", "<QHashNode>", "public" ] },
+ { symbol: [ "QHeaderView", "private", "<QHeaderView>", "public" ] },
+ { symbol: [ "QHelpContentItem", "private", "<QHelpContentItem>", "public" ] },
+ { symbol: [ "QHelpContentModel", "private", "<QHelpContentModel>", "public" ] },
+ { symbol: [ "QHelpContentWidget", "private", "<QHelpContentWidget>", "public" ] },
+ { symbol: [ "QHelpEngine", "private", "<QHelpEngine>", "public" ] },
+ { symbol: [ "QHelpEngineCore", "private", "<QHelpEngineCore>", "public" ] },
+ { symbol: [ "QHelpEvent", "private", "<QHelpEvent>", "public" ] },
+ { symbol: [ "QHelpGlobal", "private", "<QHelpGlobal>", "public" ] },
+ { symbol: [ "QHelpIndexModel", "private", "<QHelpIndexModel>", "public" ] },
+ { symbol: [ "QHelpIndexWidget", "private", "<QHelpIndexWidget>", "public" ] },
+ { symbol: [ "QHelpSearchEngine", "private", "<QHelpSearchEngine>", "public" ] },
+ { symbol: [ "QHelpSearchQuery", "private", "<QHelpSearchQuery>", "public" ] },
+ { symbol: [ "QHelpSearchQueryWidget", "private", "<QHelpSearchQueryWidget>", "public" ] },
+ { symbol: [ "QHelpSearchResultWidget", "private", "<QHelpSearchResultWidget>", "public" ] },
+ { symbol: [ "QHideEvent", "private", "<QHideEvent>", "public" ] },
+ { symbol: [ "QHistoryState", "private", "<QHistoryState>", "public" ] },
+ { symbol: [ "QHolsterFilter", "private", "<QHolsterFilter>", "public" ] },
+ { symbol: [ "QHolsterReading", "private", "<QHolsterReading>", "public" ] },
+ { symbol: [ "QHolsterSensor", "private", "<QHolsterSensor>", "public" ] },
+ { symbol: [ "QHostAddress", "private", "<QHostAddress>", "public" ] },
+ { symbol: [ "QHostInfo", "private", "<QHostInfo>", "public" ] },
+ { symbol: [ "QHoverEvent", "private", "<QHoverEvent>", "public" ] },
+ { symbol: [ "QHttpMultiPart", "private", "<QHttpMultiPart>", "public" ] },
+ { symbol: [ "QHttpPart", "private", "<QHttpPart>", "public" ] },
+ { symbol: [ "QIODevice", "private", "<QIODevice>", "public" ] },
+ { symbol: [ "QIPv6Address", "private", "<QIPv6Address>", "public" ] },
+ { symbol: [ "QIRProximityFilter", "private", "<QIRProximityFilter>", "public" ] },
+ { symbol: [ "QIRProximityReading", "private", "<QIRProximityReading>", "public" ] },
+ { symbol: [ "QIRProximitySensor", "private", "<QIRProximitySensor>", "public" ] },
+ { symbol: [ "QIcon", "private", "<QIcon>", "public" ] },
+ { symbol: [ "QIconDragEvent", "private", "<QIconDragEvent>", "public" ] },
+ { symbol: [ "QIconEngine", "private", "<QIconEngine>", "public" ] },
+ { symbol: [ "QIconEnginePlugin", "private", "<QIconEnginePlugin>", "public" ] },
+ { symbol: [ "QIconEngineV2", "private", "<QIconEngineV2>", "public" ] },
+ { symbol: [ "QIdentityProxyModel", "private", "<QIdentityProxyModel>", "public" ] },
+ { symbol: [ "QImage", "private", "<QImage>", "public" ] },
+ { symbol: [ "QImageCleanupFunction", "private", "<QImageCleanupFunction>", "public" ] },
+ { symbol: [ "QImageEncoderControl", "private", "<QImageEncoderControl>", "public" ] },
+ { symbol: [ "QImageEncoderSettings", "private", "<QImageEncoderSettings>", "public" ] },
+ { symbol: [ "QImageIOHandler", "private", "<QImageIOHandler>", "public" ] },
+ { symbol: [ "QImageIOPlugin", "private", "<QImageIOPlugin>", "public" ] },
+ { symbol: [ "QImageReader", "private", "<QImageReader>", "public" ] },
+ { symbol: [ "QImageTextKeyLang", "private", "<QImageTextKeyLang>", "public" ] },
+ { symbol: [ "QImageWriter", "private", "<QImageWriter>", "public" ] },
+ { symbol: [ "QIncompatibleFlag", "private", "<QIncompatibleFlag>", "public" ] },
+ { symbol: [ "QInputDialog", "private", "<QInputDialog>", "public" ] },
+ { symbol: [ "QInputEvent", "private", "<QInputEvent>", "public" ] },
+ { symbol: [ "QInputMethod", "private", "<QInputMethod>", "public" ] },
+ { symbol: [ "QInputMethodEvent", "private", "<QInputMethodEvent>", "public" ] },
+ { symbol: [ "QInputMethodQueryEvent", "private", "<QInputMethodQueryEvent>", "public" ] },
+ { symbol: [ "QIntValidator", "private", "<QIntValidator>", "public" ] },
+ { symbol: [ "QIntegerForSize", "private", "<QIntegerForSize>", "public" ] },
+ { symbol: [ "QInternal", "private", "<QInternal>", "public" ] },
+ { symbol: [ "QItemDelegate", "private", "<QItemDelegate>", "public" ] },
+ { symbol: [ "QItemEditorCreator", "private", "<QItemEditorCreator>", "public" ] },
+ { symbol: [ "QItemEditorCreatorBase", "private", "<QItemEditorCreatorBase>", "public" ] },
+ { symbol: [ "QItemEditorFactory", "private", "<QItemEditorFactory>", "public" ] },
+ { symbol: [ "QItemSelection", "private", "<QItemSelection>", "public" ] },
+ { symbol: [ "QItemSelectionModel", "private", "<QItemSelectionModel>", "public" ] },
+ { symbol: [ "QItemSelectionRange", "private", "<QItemSelectionRange>", "public" ] },
+ { symbol: [ "QJSEngine", "private", "<QJSEngine>", "public" ] },
+ { symbol: [ "QJSValue", "private", "<QJSValue>", "public" ] },
+ { symbol: [ "QJSValueIterator", "private", "<QJSValueIterator>", "public" ] },
+ { symbol: [ "QJSValueList", "private", "<QJSValueList>", "public" ] },
+ { symbol: [ "QJsonArray", "private", "<QJsonArray>", "public" ] },
+ { symbol: [ "QJsonDocument", "private", "<QJsonDocument>", "public" ] },
+ { symbol: [ "QJsonObject", "private", "<QJsonObject>", "public" ] },
+ { symbol: [ "QJsonParseError", "private", "<QJsonParseError>", "public" ] },
+ { symbol: [ "QJsonValue", "private", "<QJsonValue>", "public" ] },
+ { symbol: [ "QJsonValuePtr", "private", "<QJsonValuePtr>", "public" ] },
+ { symbol: [ "QJsonValueRef", "private", "<QJsonValueRef>", "public" ] },
+ { symbol: [ "QJsonValueRefPtr", "private", "<QJsonValueRefPtr>", "public" ] },
+ { symbol: [ "QKeyEvent", "private", "<QKeyEvent>", "public" ] },
+ { symbol: [ "QKeyEventTransition", "private", "<QKeyEventTransition>", "public" ] },
+ { symbol: [ "QKeySequence", "private", "<QKeySequence>", "public" ] },
+ { symbol: [ "QKeySequenceEdit", "private", "<QKeySequenceEdit>", "public" ] },
+ { symbol: [ "QLCDNumber", "private", "<QLCDNumber>", "public" ] },
+ { symbol: [ "QLabel", "private", "<QLabel>", "public" ] },
+ { symbol: [ "QLatin1Char", "private", "<QLatin1Char>", "public" ] },
+ { symbol: [ "QLatin1Literal", "private", "<QLatin1Literal>", "public" ] },
+ { symbol: [ "QLatin1String", "private", "<QLatin1String>", "public" ] },
+ { symbol: [ "QLayout", "private", "<QLayout>", "public" ] },
+ { symbol: [ "QLayoutItem", "private", "<QLayoutItem>", "public" ] },
+ { symbol: [ "QLibrary", "private", "<QLibrary>", "public" ] },
+ { symbol: [ "QLibraryInfo", "private", "<QLibraryInfo>", "public" ] },
+ { symbol: [ "QLightFilter", "private", "<QLightFilter>", "public" ] },
+ { symbol: [ "QLightReading", "private", "<QLightReading>", "public" ] },
+ { symbol: [ "QLightSensor", "private", "<QLightSensor>", "public" ] },
+ { symbol: [ "QLine", "private", "<QLine>", "public" ] },
+ { symbol: [ "QLineEdit", "private", "<QLineEdit>", "public" ] },
+ { symbol: [ "QLineF", "private", "<QLineF>", "public" ] },
+ { symbol: [ "QLinearGradient", "private", "<QLinearGradient>", "public" ] },
+ { symbol: [ "QLinkedList", "private", "<QLinkedList>", "public" ] },
+ { symbol: [ "QLinkedListData", "private", "<QLinkedListData>", "public" ] },
+ { symbol: [ "QLinkedListIterator", "private", "<QLinkedListIterator>", "public" ] },
+ { symbol: [ "QLinkedListNode", "private", "<QLinkedListNode>", "public" ] },
+ { symbol: [ "QList", "private", "<QList>", "public" ] },
+ { symbol: [ "QListData", "private", "<QListData>", "public" ] },
+ { symbol: [ "QListIterator", "private", "<QListIterator>", "public" ] },
+ { symbol: [ "QListSpecialMethods", "private", "<QListSpecialMethods>", "public" ] },
+ { symbol: [ "QListView", "private", "<QListView>", "public" ] },
+ { symbol: [ "QListWidget", "private", "<QListWidget>", "public" ] },
+ { symbol: [ "QListWidgetItem", "private", "<QListWidgetItem>", "public" ] },
+ { symbol: [ "QLocalServer", "private", "<QLocalServer>", "public" ] },
+ { symbol: [ "QLocalSocket", "private", "<QLocalSocket>", "public" ] },
+ { symbol: [ "QLocale", "private", "<QLocale>", "public" ] },
+ { symbol: [ "QLocation", "private", "<QLocation>", "public" ] },
+ { symbol: [ "QLockFile", "private", "<QLockFile>", "public" ] },
+ { symbol: [ "QLockFile", "private", "<QLockFile>", "public" ] },
+ { symbol: [ "QLoggingCategory", "private", "<QLoggingCategory>", "public" ] },
+ { symbol: [ "QLowEnergyCharacteristic", "private", "<QLowEnergyCharacteristic>", "public" ] },
+ { symbol: [ "QLowEnergyController", "private", "<QLowEnergyController>", "public" ] },
+ { symbol: [ "QLowEnergyDescriptor", "private", "<QLowEnergyDescriptor>", "public" ] },
+ { symbol: [ "QLowEnergyHandle", "private", "<QLowEnergyHandle>", "public" ] },
+ { symbol: [ "QLowEnergyService", "private", "<QLowEnergyService>", "public" ] },
+ { symbol: [ "QMacCocoaViewContainer", "private", "<QMacCocoaViewContainer>", "public" ] },
+ { symbol: [ "QMacNativeWidget", "private", "<QMacNativeWidget>", "public" ] },
+ { symbol: [ "QMagnetometer", "private", "<QMagnetometer>", "public" ] },
+ { symbol: [ "QMagnetometerFilter", "private", "<QMagnetometerFilter>", "public" ] },
+ { symbol: [ "QMagnetometerReading", "private", "<QMagnetometerReading>", "public" ] },
+ { symbol: [ "QMainWindow", "private", "<QMainWindow>", "public" ] },
+ { symbol: [ "QMap", "private", "<QMap>", "public" ] },
+ { symbol: [ "QMapData", "private", "<QMapData>", "public" ] },
+ { symbol: [ "QMapDataBase", "private", "<QMapDataBase>", "public" ] },
+ { symbol: [ "QMapIterator", "private", "<QMapIterator>", "public" ] },
+ { symbol: [ "QMapNode", "private", "<QMapNode>", "public" ] },
+ { symbol: [ "QMapNodeBase", "private", "<QMapNodeBase>", "public" ] },
+ { symbol: [ "QMargins", "private", "<QMargins>", "public" ] },
+ { symbol: [ "QMarginsF", "private", "<QMarginsF>", "public" ] },
+ { symbol: [ "QMaskGenerator", "private", "<QMaskGenerator>", "public" ] },
+ { symbol: [ "QMatrix", "private", "<QMatrix>", "public" ] },
+ { symbol: [ "QMatrix2x2", "private", "<QMatrix2x2>", "public" ] },
+ { symbol: [ "QMatrix2x3", "private", "<QMatrix2x3>", "public" ] },
+ { symbol: [ "QMatrix2x4", "private", "<QMatrix2x4>", "public" ] },
+ { symbol: [ "QMatrix3x2", "private", "<QMatrix3x2>", "public" ] },
+ { symbol: [ "QMatrix3x3", "private", "<QMatrix3x3>", "public" ] },
+ { symbol: [ "QMatrix3x4", "private", "<QMatrix3x4>", "public" ] },
+ { symbol: [ "QMatrix4x2", "private", "<QMatrix4x2>", "public" ] },
+ { symbol: [ "QMatrix4x3", "private", "<QMatrix4x3>", "public" ] },
+ { symbol: [ "QMatrix4x4", "private", "<QMatrix4x4>", "public" ] },
+ { symbol: [ "QMdiArea", "private", "<QMdiArea>", "public" ] },
+ { symbol: [ "QMdiSubWindow", "private", "<QMdiSubWindow>", "public" ] },
+ { symbol: [ "QMediaAudioProbeControl", "private", "<QMediaAudioProbeControl>", "public" ] },
+ { symbol: [ "QMediaAvailabilityControl", "private", "<QMediaAvailabilityControl>", "public" ] },
+ { symbol: [ "QMediaBindableInterface", "private", "<QMediaBindableInterface>", "public" ] },
+ { symbol: [ "QMediaContainerControl", "private", "<QMediaContainerControl>", "public" ] },
+ { symbol: [ "QMediaContent", "private", "<QMediaContent>", "public" ] },
+ { symbol: [ "QMediaControl", "private", "<QMediaControl>", "public" ] },
+ { symbol: [ "QMediaGaplessPlaybackControl", "private", "<QMediaGaplessPlaybackControl>", "public" ] },
+ { symbol: [ "QMediaMetaData", "private", "<QMediaMetaData>", "public" ] },
+ { symbol: [ "QMediaNetworkAccessControl", "private", "<QMediaNetworkAccessControl>", "public" ] },
+ { symbol: [ "QMediaObject", "private", "<QMediaObject>", "public" ] },
+ { symbol: [ "QMediaPlayer", "private", "<QMediaPlayer>", "public" ] },
+ { symbol: [ "QMediaPlayerControl", "private", "<QMediaPlayerControl>", "public" ] },
+ { symbol: [ "QMediaPlaylist", "private", "<QMediaPlaylist>", "public" ] },
+ { symbol: [ "QMediaRecorder", "private", "<QMediaRecorder>", "public" ] },
+ { symbol: [ "QMediaRecorderControl", "private", "<QMediaRecorderControl>", "public" ] },
+ { symbol: [ "QMediaResource", "private", "<QMediaResource>", "public" ] },
+ { symbol: [ "QMediaResourceList", "private", "<QMediaResourceList>", "public" ] },
+ { symbol: [ "QMediaService", "private", "<QMediaService>", "public" ] },
+ { symbol: [ "QMediaServiceCameraInfoInterface", "private", "<QMediaServiceCameraInfoInterface>", "public" ] },
+ { symbol: [ "QMediaServiceDefaultDeviceInterface", "private", "<QMediaServiceDefaultDeviceInterface>", "public" ] },
+ { symbol: [ "QMediaServiceFeaturesInterface", "private", "<QMediaServiceFeaturesInterface>", "public" ] },
+ { symbol: [ "QMediaServiceProviderFactoryInterface", "private", "<QMediaServiceProviderFactoryInterface>", "public" ] },
+ { symbol: [ "QMediaServiceProviderHint", "private", "<QMediaServiceProviderHint>", "public" ] },
+ { symbol: [ "QMediaServiceProviderPlugin", "private", "<QMediaServiceProviderPlugin>", "public" ] },
+ { symbol: [ "QMediaServiceSupportedDevicesInterface", "private", "<QMediaServiceSupportedDevicesInterface>", "public" ] },
+ { symbol: [ "QMediaServiceSupportedFormatsInterface", "private", "<QMediaServiceSupportedFormatsInterface>", "public" ] },
+ { symbol: [ "QMediaStreamsControl", "private", "<QMediaStreamsControl>", "public" ] },
+ { symbol: [ "QMediaTimeInterval", "private", "<QMediaTimeInterval>", "public" ] },
+ { symbol: [ "QMediaTimeRange", "private", "<QMediaTimeRange>", "public" ] },
+ { symbol: [ "QMediaVideoProbeControl", "private", "<QMediaVideoProbeControl>", "public" ] },
+ { symbol: [ "QMenu", "private", "<QMenu>", "public" ] },
+ { symbol: [ "QMenuBar", "private", "<QMenuBar>", "public" ] },
+ { symbol: [ "QMessageAuthenticationCode", "private", "<QMessageAuthenticationCode>", "public" ] },
+ { symbol: [ "QMessageBox", "private", "<QMessageBox>", "public" ] },
+ { symbol: [ "QMessageLogContext", "private", "<QMessageLogContext>", "public" ] },
+ { symbol: [ "QMessageLogger", "private", "<QMessageLogger>", "public" ] },
+ { symbol: [ "QMetaClassInfo", "private", "<QMetaClassInfo>", "public" ] },
+ { symbol: [ "QMetaDataReaderControl", "private", "<QMetaDataReaderControl>", "public" ] },
+ { symbol: [ "QMetaDataWriterControl", "private", "<QMetaDataWriterControl>", "public" ] },
+ { symbol: [ "QMetaEnum", "private", "<QMetaEnum>", "public" ] },
+ { symbol: [ "QMetaMethod", "private", "<QMetaMethod>", "public" ] },
+ { symbol: [ "QMetaObject", "private", "<QMetaObject>", "public" ] },
+ { symbol: [ "QMetaProperty", "private", "<QMetaProperty>", "public" ] },
+ { symbol: [ "QMetaType", "private", "<QMetaType>", "public" ] },
+ { symbol: [ "QMetaTypeId", "private", "<QMetaTypeId>", "public" ] },
+ { symbol: [ "QMetaTypeId2", "private", "<QMetaTypeId2>", "public" ] },
+ { symbol: [ "QMetaTypeIdQObject", "private", "<QMetaTypeIdQObject>", "public" ] },
+ { symbol: [ "QMimeData", "private", "<QMimeData>", "public" ] },
+ { symbol: [ "QMimeDatabase", "private", "<QMimeDatabase>", "public" ] },
+ { symbol: [ "QMimeType", "private", "<QMimeType>", "public" ] },
+ { symbol: [ "QModelIndex", "private", "<QModelIndex>", "public" ] },
+ { symbol: [ "QModelIndexList", "private", "<QModelIndexList>", "public" ] },
+ { symbol: [ "QMouseEvent", "private", "<QMouseEvent>", "public" ] },
+ { symbol: [ "QMouseEventTransition", "private", "<QMouseEventTransition>", "public" ] },
+ { symbol: [ "QMoveEvent", "private", "<QMoveEvent>", "public" ] },
+ { symbol: [ "QMovie", "private", "<QMovie>", "public" ] },
+ { symbol: [ "QMultiHash", "private", "<QMultiHash>", "public" ] },
+ { symbol: [ "QMultiMap", "private", "<QMultiMap>", "public" ] },
+ { symbol: [ "QMultimedia", "private", "<QMultimedia>", "public" ] },
+ { symbol: [ "QMutableByteArrayListIterator", "private", "<QMutableByteArrayListIterator>", "public" ] },
+ { symbol: [ "QMutableFutureIterator", "private", "<QMutableFutureIterator>", "public" ] },
+ { symbol: [ "QMutableHashIterator", "private", "<QMutableHashIterator>", "public" ] },
+ { symbol: [ "QMutableLinkedListIterator", "private", "<QMutableLinkedListIterator>", "public" ] },
+ { symbol: [ "QMutableListIterator", "private", "<QMutableListIterator>", "public" ] },
+ { symbol: [ "QMutableMapIterator", "private", "<QMutableMapIterator>", "public" ] },
+ { symbol: [ "QMutableSetIterator", "private", "<QMutableSetIterator>", "public" ] },
+ { symbol: [ "QMutableStringListIterator", "private", "<QMutableStringListIterator>", "public" ] },
+ { symbol: [ "QMutableVectorIterator", "private", "<QMutableVectorIterator>", "public" ] },
+ { symbol: [ "QMutex", "private", "<QMutex>", "public" ] },
+ { symbol: [ "QMutexLocker", "private", "<QMutexLocker>", "public" ] },
+ { symbol: [ "QNativeGestureEvent", "private", "<QNativeGestureEvent>", "public" ] },
+ { symbol: [ "QNdefFilter", "private", "<QNdefFilter>", "public" ] },
+ { symbol: [ "QNdefMessage", "private", "<QNdefMessage>", "public" ] },
+ { symbol: [ "QNdefNfcIconRecord", "private", "<QNdefNfcIconRecord>", "public" ] },
+ { symbol: [ "QNdefNfcSmartPosterRecord", "private", "<QNdefNfcSmartPosterRecord>", "public" ] },
+ { symbol: [ "QNdefNfcTextRecord", "private", "<QNdefNfcTextRecord>", "public" ] },
+ { symbol: [ "QNdefNfcUriRecord", "private", "<QNdefNfcUriRecord>", "public" ] },
+ { symbol: [ "QNdefRecord", "private", "<QNdefRecord>", "public" ] },
+ { symbol: [ "QNearFieldManager", "private", "<QNearFieldManager>", "public" ] },
+ { symbol: [ "QNearFieldShareManager", "private", "<QNearFieldShareManager>", "public" ] },
+ { symbol: [ "QNearFieldShareTarget", "private", "<QNearFieldShareTarget>", "public" ] },
+ { symbol: [ "QNearFieldTarget", "private", "<QNearFieldTarget>", "public" ] },
+ { symbol: [ "QNetworkAccessManager", "private", "<QNetworkAccessManager>", "public" ] },
+ { symbol: [ "QNetworkAddressEntry", "private", "<QNetworkAddressEntry>", "public" ] },
+ { symbol: [ "QNetworkCacheMetaData", "private", "<QNetworkCacheMetaData>", "public" ] },
+ { symbol: [ "QNetworkConfiguration", "private", "<QNetworkConfiguration>", "public" ] },
+ { symbol: [ "QNetworkConfigurationManager", "private", "<QNetworkConfigurationManager>", "public" ] },
+ { symbol: [ "QNetworkCookie", "private", "<QNetworkCookie>", "public" ] },
+ { symbol: [ "QNetworkCookieJar", "private", "<QNetworkCookieJar>", "public" ] },
+ { symbol: [ "QNetworkDiskCache", "private", "<QNetworkDiskCache>", "public" ] },
+ { symbol: [ "QNetworkInterface", "private", "<QNetworkInterface>", "public" ] },
+ { symbol: [ "QNetworkProxy", "private", "<QNetworkProxy>", "public" ] },
+ { symbol: [ "QNetworkProxyFactory", "private", "<QNetworkProxyFactory>", "public" ] },
+ { symbol: [ "QNetworkProxyQuery", "private", "<QNetworkProxyQuery>", "public" ] },
+ { symbol: [ "QNetworkReply", "private", "<QNetworkReply>", "public" ] },
+ { symbol: [ "QNetworkRequest", "private", "<QNetworkRequest>", "public" ] },
+ { symbol: [ "QNetworkSession", "private", "<QNetworkSession>", "public" ] },
+ { symbol: [ "QNmeaPositionInfoSource", "private", "<QNmeaPositionInfoSource>", "public" ] },
+ { symbol: [ "QNoDebug", "private", "<QNoDebug>", "public" ] },
+ { symbol: [ "QObject", "private", "<QObject>", "public" ] },
+ { symbol: [ "QObjectCleanupHandler", "private", "<QObjectCleanupHandler>", "public" ] },
+ { symbol: [ "QObjectData", "private", "<QObjectData>", "public" ] },
+ { symbol: [ "QObjectList", "private", "<QObjectList>", "public" ] },
+ { symbol: [ "QObjectUserData", "private", "<QObjectUserData>", "public" ] },
+ { symbol: [ "QOffscreenSurface", "private", "<QOffscreenSurface>", "public" ] },
+ { symbol: [ "QOpenGLBuffer", "private", "<QOpenGLBuffer>", "public" ] },
+ { symbol: [ "QOpenGLContext", "private", "<QOpenGLContext>", "public" ] },
+ { symbol: [ "QOpenGLContextGroup", "private", "<QOpenGLContextGroup>", "public" ] },
+ { symbol: [ "QOpenGLDebugLogger", "private", "<QOpenGLDebugLogger>", "public" ] },
+ { symbol: [ "QOpenGLDebugMessage", "private", "<QOpenGLDebugMessage>", "public" ] },
+ { symbol: [ "QOpenGLExtensions", "private", "<QOpenGLExtensions>", "public" ] },
+ { symbol: [ "QOpenGLFramebufferObject", "private", "<QOpenGLFramebufferObject>", "public" ] },
+ { symbol: [ "QOpenGLFramebufferObjectFormat", "private", "<QOpenGLFramebufferObjectFormat>", "public" ] },
+ { symbol: [ "QOpenGLFunctions", "private", "<QOpenGLFunctions>", "public" ] },
+ { symbol: [ "QOpenGLFunctionsPrivate", "private", "<QOpenGLFunctionsPrivate>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_0", "private", "<QOpenGLFunctions_1_0>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_1", "private", "<QOpenGLFunctions_1_1>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_2", "private", "<QOpenGLFunctions_1_2>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_3", "private", "<QOpenGLFunctions_1_3>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_4", "private", "<QOpenGLFunctions_1_4>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_1_5", "private", "<QOpenGLFunctions_1_5>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_2_0", "private", "<QOpenGLFunctions_2_0>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_2_1", "private", "<QOpenGLFunctions_2_1>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_0", "private", "<QOpenGLFunctions_3_0>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_1", "private", "<QOpenGLFunctions_3_1>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_2_Compatibility", "private", "<QOpenGLFunctions_3_2_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_2_Core", "private", "<QOpenGLFunctions_3_2_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_3_Compatibility", "private", "<QOpenGLFunctions_3_3_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_3_3_Core", "private", "<QOpenGLFunctions_3_3_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_0_Compatibility", "private", "<QOpenGLFunctions_4_0_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_0_Core", "private", "<QOpenGLFunctions_4_0_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_1_Compatibility", "private", "<QOpenGLFunctions_4_1_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_1_Core", "private", "<QOpenGLFunctions_4_1_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_2_Compatibility", "private", "<QOpenGLFunctions_4_2_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_2_Core", "private", "<QOpenGLFunctions_4_2_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_3_Compatibility", "private", "<QOpenGLFunctions_4_3_Compatibility>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_4_3_Core", "private", "<QOpenGLFunctions_4_3_Core>", "public" ] },
+ { symbol: [ "QOpenGLFunctions_ES2", "private", "<QOpenGLFunctions_ES2>", "public" ] },
+ { symbol: [ "QOpenGLPaintDevice", "private", "<QOpenGLPaintDevice>", "public" ] },
+ { symbol: [ "QOpenGLPixelTransferOptions", "private", "<QOpenGLPixelTransferOptions>", "public" ] },
+ { symbol: [ "QOpenGLShader", "private", "<QOpenGLShader>", "public" ] },
+ { symbol: [ "QOpenGLShaderProgram", "private", "<QOpenGLShaderProgram>", "public" ] },
+ { symbol: [ "QOpenGLTexture", "private", "<QOpenGLTexture>", "public" ] },
+ { symbol: [ "QOpenGLTimeMonitor", "private", "<QOpenGLTimeMonitor>", "public" ] },
+ { symbol: [ "QOpenGLTimerQuery", "private", "<QOpenGLTimerQuery>", "public" ] },
+ { symbol: [ "QOpenGLVersionFunctions", "private", "<QOpenGLVersionFunctions>", "public" ] },
+ { symbol: [ "QOpenGLVersionProfile", "private", "<QOpenGLVersionProfile>", "public" ] },
+ { symbol: [ "QOpenGLVertexArrayObject", "private", "<QOpenGLVertexArrayObject>", "public" ] },
+ { symbol: [ "QOpenGLWidget", "private", "<QOpenGLWidget>", "public" ] },
+ { symbol: [ "QOpenGLWindow", "private", "<QOpenGLWindow>", "public" ] },
+ { symbol: [ "QOrientationFilter", "private", "<QOrientationFilter>", "public" ] },
+ { symbol: [ "QOrientationReading", "private", "<QOrientationReading>", "public" ] },
+ { symbol: [ "QOrientationSensor", "private", "<QOrientationSensor>", "public" ] },
+ { symbol: [ "QPageLayout", "private", "<QPageLayout>", "public" ] },
+ { symbol: [ "QPageSetupDialog", "private", "<QPageSetupDialog>", "public" ] },
+ { symbol: [ "QPageSize", "private", "<QPageSize>", "public" ] },
+ { symbol: [ "QPagedPaintDevice", "private", "<QPagedPaintDevice>", "public" ] },
+ { symbol: [ "QPaintDevice", "private", "<QPaintDevice>", "public" ] },
+ { symbol: [ "QPaintDeviceWindow", "private", "<QPaintDeviceWindow>", "public" ] },
+ { symbol: [ "QPaintEngine", "private", "<QPaintEngine>", "public" ] },
+ { symbol: [ "QPaintEngineState", "private", "<QPaintEngineState>", "public" ] },
+ { symbol: [ "QPaintEvent", "private", "<QPaintEvent>", "public" ] },
+ { symbol: [ "QPainter", "private", "<QPainter>", "public" ] },
+ { symbol: [ "QPainterPath", "private", "<QPainterPath>", "public" ] },
+ { symbol: [ "QPainterPathStroker", "private", "<QPainterPathStroker>", "public" ] },
+ { symbol: [ "QPair", "private", "<QPair>", "public" ] },
+ { symbol: [ "QPalette", "private", "<QPalette>", "public" ] },
+ { symbol: [ "QPanGesture", "private", "<QPanGesture>", "public" ] },
+ { symbol: [ "QParallelAnimationGroup", "private", "<QParallelAnimationGroup>", "public" ] },
+ { symbol: [ "QPauseAnimation", "private", "<QPauseAnimation>", "public" ] },
+ { symbol: [ "QPdfWriter", "private", "<QPdfWriter>", "public" ] },
+ { symbol: [ "QPen", "private", "<QPen>", "public" ] },
+ { symbol: [ "QPersistentModelIndex", "private", "<QPersistentModelIndex>", "public" ] },
+ { symbol: [ "QPicture", "private", "<QPicture>", "public" ] },
+ { symbol: [ "QPictureFormatPlugin", "private", "<QPictureFormatPlugin>", "public" ] },
+ { symbol: [ "QPictureIO", "private", "<QPictureIO>", "public" ] },
+ { symbol: [ "QPinchGesture", "private", "<QPinchGesture>", "public" ] },
+ { symbol: [ "QPixelFormat", "private", "<QPixelFormat>", "public" ] },
+ { symbol: [ "QPixmap", "private", "<QPixmap>", "public" ] },
+ { symbol: [ "QPixmapCache", "private", "<QPixmapCache>", "public" ] },
+ { symbol: [ "QPlace", "private", "<QPlace>", "public" ] },
+ { symbol: [ "QPlaceAttribute", "private", "<QPlaceAttribute>", "public" ] },
+ { symbol: [ "QPlaceCategory", "private", "<QPlaceCategory>", "public" ] },
+ { symbol: [ "QPlaceContactDetail", "private", "<QPlaceContactDetail>", "public" ] },
+ { symbol: [ "QPlaceContent", "private", "<QPlaceContent>", "public" ] },
+ { symbol: [ "QPlaceContentReply", "private", "<QPlaceContentReply>", "public" ] },
+ { symbol: [ "QPlaceContentRequest", "private", "<QPlaceContentRequest>", "public" ] },
+ { symbol: [ "QPlaceDetailsReply", "private", "<QPlaceDetailsReply>", "public" ] },
+ { symbol: [ "QPlaceEditorial", "private", "<QPlaceEditorial>", "public" ] },
+ { symbol: [ "QPlaceIcon", "private", "<QPlaceIcon>", "public" ] },
+ { symbol: [ "QPlaceIdReply", "private", "<QPlaceIdReply>", "public" ] },
+ { symbol: [ "QPlaceImage", "private", "<QPlaceImage>", "public" ] },
+ { symbol: [ "QPlaceManager", "private", "<QPlaceManager>", "public" ] },
+ { symbol: [ "QPlaceManagerEngine", "private", "<QPlaceManagerEngine>", "public" ] },
+ { symbol: [ "QPlaceMatchReply", "private", "<QPlaceMatchReply>", "public" ] },
+ { symbol: [ "QPlaceMatchRequest", "private", "<QPlaceMatchRequest>", "public" ] },
+ { symbol: [ "QPlaceProposedSearchResult", "private", "<QPlaceProposedSearchResult>", "public" ] },
+ { symbol: [ "QPlaceRatings", "private", "<QPlaceRatings>", "public" ] },
+ { symbol: [ "QPlaceReply", "private", "<QPlaceReply>", "public" ] },
+ { symbol: [ "QPlaceResult", "private", "<QPlaceResult>", "public" ] },
+ { symbol: [ "QPlaceReview", "private", "<QPlaceReview>", "public" ] },
+ { symbol: [ "QPlaceSearchReply", "private", "<QPlaceSearchReply>", "public" ] },
+ { symbol: [ "QPlaceSearchRequest", "private", "<QPlaceSearchRequest>", "public" ] },
+ { symbol: [ "QPlaceSearchResult", "private", "<QPlaceSearchResult>", "public" ] },
+ { symbol: [ "QPlaceSearchSuggestionReply", "private", "<QPlaceSearchSuggestionReply>", "public" ] },
+ { symbol: [ "QPlaceSupplier", "private", "<QPlaceSupplier>", "public" ] },
+ { symbol: [ "QPlaceUser", "private", "<QPlaceUser>", "public" ] },
+ { symbol: [ "QPlainTextDocumentLayout", "private", "<QPlainTextDocumentLayout>", "public" ] },
+ { symbol: [ "QPlainTextEdit", "private", "<QPlainTextEdit>", "public" ] },
+ { symbol: [ "QPluginLoader", "private", "<QPluginLoader>", "public" ] },
+ { symbol: [ "QPoint", "private", "<QPoint>", "public" ] },
+ { symbol: [ "QPointF", "private", "<QPointF>", "public" ] },
+ { symbol: [ "QPointer", "private", "<QPointer>", "public" ] },
+ { symbol: [ "QPolygon", "private", "<QPolygon>", "public" ] },
+ { symbol: [ "QPolygonF", "private", "<QPolygonF>", "public" ] },
+ { symbol: [ "QPressureFilter", "private", "<QPressureFilter>", "public" ] },
+ { symbol: [ "QPressureReading", "private", "<QPressureReading>", "public" ] },
+ { symbol: [ "QPressureSensor", "private", "<QPressureSensor>", "public" ] },
+ { symbol: [ "QPrintDialog", "private", "<QPrintDialog>", "public" ] },
+ { symbol: [ "QPrintEngine", "private", "<QPrintEngine>", "public" ] },
+ { symbol: [ "QPrintPreviewDialog", "private", "<QPrintPreviewDialog>", "public" ] },
+ { symbol: [ "QPrintPreviewWidget", "private", "<QPrintPreviewWidget>", "public" ] },
+ { symbol: [ "QPrinter", "private", "<QPrinter>", "public" ] },
+ { symbol: [ "QPrinterInfo", "private", "<QPrinterInfo>", "public" ] },
+ { symbol: [ "QProcess", "private", "<QProcess>", "public" ] },
+ { symbol: [ "QProcessEnvironment", "private", "<QProcessEnvironment>", "public" ] },
+ { symbol: [ "QProgressBar", "private", "<QProgressBar>", "public" ] },
+ { symbol: [ "QProgressDialog", "private", "<QProgressDialog>", "public" ] },
+ { symbol: [ "QPropertyAnimation", "private", "<QPropertyAnimation>", "public" ] },
+ { symbol: [ "QProximityFilter", "private", "<QProximityFilter>", "public" ] },
+ { symbol: [ "QProximityReading", "private", "<QProximityReading>", "public" ] },
+ { symbol: [ "QProximitySensor", "private", "<QProximitySensor>", "public" ] },
+ { symbol: [ "QProxyStyle", "private", "<QProxyStyle>", "public" ] },
+ { symbol: [ "QPushButton", "private", "<QPushButton>", "public" ] },
+ { symbol: [ "QQmlAbstractUrlInterceptor", "private", "<QQmlAbstractUrlInterceptor>", "public" ] },
+ { symbol: [ "QQmlApplicationEngine", "private", "<QQmlApplicationEngine>", "public" ] },
+ { symbol: [ "QQmlAttachedPropertiesFunc", "private", "<QQmlAttachedPropertiesFunc>", "public" ] },
+ { symbol: [ "QQmlComponent", "private", "<QQmlComponent>", "public" ] },
+ { symbol: [ "QQmlContext", "private", "<QQmlContext>", "public" ] },
+ { symbol: [ "QQmlDebuggingEnabler", "private", "<QQmlDebuggingEnabler>", "public" ] },
+ { symbol: [ "QQmlEngine", "private", "<QQmlEngine>", "public" ] },
+ { symbol: [ "QQmlError", "private", "<QQmlError>", "public" ] },
+ { symbol: [ "QQmlExpression", "private", "<QQmlExpression>", "public" ] },
+ { symbol: [ "QQmlExtensionInterface", "private", "<QQmlExtensionInterface>", "public" ] },
+ { symbol: [ "QQmlExtensionPlugin", "private", "<QQmlExtensionPlugin>", "public" ] },
+ { symbol: [ "QQmlFile", "private", "<QQmlFile>", "public" ] },
+ { symbol: [ "QQmlFileSelector", "private", "<QQmlFileSelector>", "public" ] },
+ { symbol: [ "QQmlImageProviderBase", "private", "<QQmlImageProviderBase>", "public" ] },
+ { symbol: [ "QQmlIncubationController", "private", "<QQmlIncubationController>", "public" ] },
+ { symbol: [ "QQmlIncubator", "private", "<QQmlIncubator>", "public" ] },
+ { symbol: [ "QQmlInfo", "private", "<QQmlInfo>", "public" ] },
+ { symbol: [ "QQmlListProperty", "private", "<QQmlListProperty>", "public" ] },
+ { symbol: [ "QQmlListReference", "private", "<QQmlListReference>", "public" ] },
+ { symbol: [ "QQmlNdefRecord", "private", "<QQmlNdefRecord>", "public" ] },
+ { symbol: [ "QQmlNetworkAccessManagerFactory", "private", "<QQmlNetworkAccessManagerFactory>", "public" ] },
+ { symbol: [ "QQmlParserStatus", "private", "<QQmlParserStatus>", "public" ] },
+ { symbol: [ "QQmlProperties", "private", "<QQmlProperties>", "public" ] },
+ { symbol: [ "QQmlProperty", "private", "<QQmlProperty>", "public" ] },
+ { symbol: [ "QQmlPropertyMap", "private", "<QQmlPropertyMap>", "public" ] },
+ { symbol: [ "QQmlPropertyValueSource", "private", "<QQmlPropertyValueSource>", "public" ] },
+ { symbol: [ "QQmlScriptString", "private", "<QQmlScriptString>", "public" ] },
+ { symbol: [ "QQmlTypeInfo", "private", "<QQmlTypeInfo>", "public" ] },
+ { symbol: [ "QQmlTypesExtensionInterface", "private", "<QQmlTypesExtensionInterface>", "public" ] },
+ { symbol: [ "QQmlWebChannel", "private", "<QQmlWebChannel>", "public" ] },
+ { symbol: [ "QQuaternion", "private", "<QQuaternion>", "public" ] },
+ { symbol: [ "QQueue", "private", "<QQueue>", "public" ] },
+ { symbol: [ "QQuickFramebufferObject", "private", "<QQuickFramebufferObject>", "public" ] },
+ { symbol: [ "QQuickImageProvider", "private", "<QQuickImageProvider>", "public" ] },
+ { symbol: [ "QQuickItem", "private", "<QQuickItem>", "public" ] },
+ { symbol: [ "QQuickItemGrabResult", "private", "<QQuickItemGrabResult>", "public" ] },
+ { symbol: [ "QQuickPaintedItem", "private", "<QQuickPaintedItem>", "public" ] },
+ { symbol: [ "QQuickRenderControl", "private", "<QQuickRenderControl>", "public" ] },
+ { symbol: [ "QQuickTextDocument", "private", "<QQuickTextDocument>", "public" ] },
+ { symbol: [ "QQuickTextureFactory", "private", "<QQuickTextureFactory>", "public" ] },
+ { symbol: [ "QQuickTransform", "private", "<QQuickTransform>", "public" ] },
+ { symbol: [ "QQuickView", "private", "<QQuickView>", "public" ] },
+ { symbol: [ "QQuickWidget", "private", "<QQuickWidget>", "public" ] },
+ { symbol: [ "QQuickWindow", "private", "<QQuickWindow>", "public" ] },
+ { symbol: [ "QRadialGradient", "private", "<QRadialGradient>", "public" ] },
+ { symbol: [ "QRadioButton", "private", "<QRadioButton>", "public" ] },
+ { symbol: [ "QRadioData", "private", "<QRadioData>", "public" ] },
+ { symbol: [ "QRadioDataControl", "private", "<QRadioDataControl>", "public" ] },
+ { symbol: [ "QRadioTuner", "private", "<QRadioTuner>", "public" ] },
+ { symbol: [ "QRadioTunerControl", "private", "<QRadioTunerControl>", "public" ] },
+ { symbol: [ "QRasterWindow", "private", "<QRasterWindow>", "public" ] },
+ { symbol: [ "QRawFont", "private", "<QRawFont>", "public" ] },
+ { symbol: [ "QReadLocker", "private", "<QReadLocker>", "public" ] },
+ { symbol: [ "QReadWriteLock", "private", "<QReadWriteLock>", "public" ] },
+ { symbol: [ "QRect", "private", "<QRect>", "public" ] },
+ { symbol: [ "QRectF", "private", "<QRectF>", "public" ] },
+ { symbol: [ "QRegExp", "private", "<QRegExp>", "public" ] },
+ { symbol: [ "QRegExpValidator", "private", "<QRegExpValidator>", "public" ] },
+ { symbol: [ "QRegion", "private", "<QRegion>", "public" ] },
+ { symbol: [ "QRegularExpression", "private", "<QRegularExpression>", "public" ] },
+ { symbol: [ "QRegularExpressionMatch", "private", "<QRegularExpressionMatch>", "public" ] },
+ { symbol: [ "QRegularExpressionMatchIterator", "private", "<QRegularExpressionMatchIterator>", "public" ] },
+ { symbol: [ "QRegularExpressionValidator", "private", "<QRegularExpressionValidator>", "public" ] },
+ { symbol: [ "QResizeEvent", "private", "<QResizeEvent>", "public" ] },
+ { symbol: [ "QResource", "private", "<QResource>", "public" ] },
+ { symbol: [ "QReturnArgument", "private", "<QReturnArgument>", "public" ] },
+ { symbol: [ "QRgb", "private", "<QRgb>", "public" ] },
+ { symbol: [ "QRotationFilter", "private", "<QRotationFilter>", "public" ] },
+ { symbol: [ "QRotationReading", "private", "<QRotationReading>", "public" ] },
+ { symbol: [ "QRotationSensor", "private", "<QRotationSensor>", "public" ] },
+ { symbol: [ "QRubberBand", "private", "<QRubberBand>", "public" ] },
+ { symbol: [ "QRunnable", "private", "<QRunnable>", "public" ] },
+ { symbol: [ "QSGAbstractRenderer", "private", "<QSGAbstractRenderer>", "public" ] },
+ { symbol: [ "QSGBasicGeometryNode", "private", "<QSGBasicGeometryNode>", "public" ] },
+ { symbol: [ "QSGClipNode", "private", "<QSGClipNode>", "public" ] },
+ { symbol: [ "QSGDynamicTexture", "private", "<QSGDynamicTexture>", "public" ] },
+ { symbol: [ "QSGEngine", "private", "<QSGEngine>", "public" ] },
+ { symbol: [ "QSGFlatColorMaterial", "private", "<QSGFlatColorMaterial>", "public" ] },
+ { symbol: [ "QSGGeometry", "private", "<QSGGeometry>", "public" ] },
+ { symbol: [ "QSGGeometryNode", "private", "<QSGGeometryNode>", "public" ] },
+ { symbol: [ "QSGMaterial", "private", "<QSGMaterial>", "public" ] },
+ { symbol: [ "QSGMaterialShader", "private", "<QSGMaterialShader>", "public" ] },
+ { symbol: [ "QSGMaterialType", "private", "<QSGMaterialType>", "public" ] },
+ { symbol: [ "QSGNode", "private", "<QSGNode>", "public" ] },
+ { symbol: [ "QSGNodeVisitor", "private", "<QSGNodeVisitor>", "public" ] },
+ { symbol: [ "QSGOpacityNode", "private", "<QSGOpacityNode>", "public" ] },
+ { symbol: [ "QSGOpaqueTextureMaterial", "private", "<QSGOpaqueTextureMaterial>", "public" ] },
+ { symbol: [ "QSGRootNode", "private", "<QSGRootNode>", "public" ] },
+ { symbol: [ "QSGSimpleMaterial", "private", "<QSGSimpleMaterial>", "public" ] },
+ { symbol: [ "QSGSimpleMaterialComparableMaterial", "private", "<QSGSimpleMaterialComparableMaterial>", "public" ] },
+ { symbol: [ "QSGSimpleMaterialShader", "private", "<QSGSimpleMaterialShader>", "public" ] },
+ { symbol: [ "QSGSimpleRectNode", "private", "<QSGSimpleRectNode>", "public" ] },
+ { symbol: [ "QSGSimpleTextureNode", "private", "<QSGSimpleTextureNode>", "public" ] },
+ { symbol: [ "QSGTexture", "private", "<QSGTexture>", "public" ] },
+ { symbol: [ "QSGTextureMaterial", "private", "<QSGTextureMaterial>", "public" ] },
+ { symbol: [ "QSGTextureProvider", "private", "<QSGTextureProvider>", "public" ] },
+ { symbol: [ "QSGTransformNode", "private", "<QSGTransformNode>", "public" ] },
+ { symbol: [ "QSGVertexColorMaterial", "private", "<QSGVertexColorMaterial>", "public" ] },
+ { symbol: [ "QSGVideoNodeFactory_I420", "private", "<QSGVideoNodeFactory_I420>", "public" ] },
+ { symbol: [ "QSGVideoNodeFactory_RGB", "private", "<QSGVideoNodeFactory_RGB>", "public" ] },
+ { symbol: [ "QSGVideoNodeFactory_Texture", "private", "<QSGVideoNodeFactory_Texture>", "public" ] },
+ { symbol: [ "QSGVideoNode_I420", "private", "<QSGVideoNode_I420>", "public" ] },
+ { symbol: [ "QSGVideoNode_RGB", "private", "<QSGVideoNode_RGB>", "public" ] },
+ { symbol: [ "QSGVideoNode_Texture", "private", "<QSGVideoNode_Texture>", "public" ] },
+ { symbol: [ "QSaveFile", "private", "<QSaveFile>", "public" ] },
+ { symbol: [ "QScopedArrayPointer", "private", "<QScopedArrayPointer>", "public" ] },
+ { symbol: [ "QScopedPointer", "private", "<QScopedPointer>", "public" ] },
+ { symbol: [ "QScopedPointerArrayDeleter", "private", "<QScopedPointerArrayDeleter>", "public" ] },
+ { symbol: [ "QScopedPointerDeleteLater", "private", "<QScopedPointerDeleteLater>", "public" ] },
+ { symbol: [ "QScopedPointerDeleter", "private", "<QScopedPointerDeleter>", "public" ] },
+ { symbol: [ "QScopedPointerObjectDeleteLater", "private", "<QScopedPointerObjectDeleteLater>", "public" ] },
+ { symbol: [ "QScopedPointerPodDeleter", "private", "<QScopedPointerPodDeleter>", "public" ] },
+ { symbol: [ "QScopedValueRollback", "private", "<QScopedValueRollback>", "public" ] },
+ { symbol: [ "QScreen", "private", "<QScreen>", "public" ] },
+ { symbol: [ "QScreenOrientationChangeEvent", "private", "<QScreenOrientationChangeEvent>", "public" ] },
+ { symbol: [ "QScriptClass", "private", "<QScriptClass>", "public" ] },
+ { symbol: [ "QScriptClassPropertyIterator", "private", "<QScriptClassPropertyIterator>", "public" ] },
+ { symbol: [ "QScriptContext", "private", "<QScriptContext>", "public" ] },
+ { symbol: [ "QScriptContextInfo", "private", "<QScriptContextInfo>", "public" ] },
+ { symbol: [ "QScriptContextInfoList", "private", "<QScriptContextInfoList>", "public" ] },
+ { symbol: [ "QScriptEngine", "private", "<QScriptEngine>", "public" ] },
+ { symbol: [ "QScriptEngineAgent", "private", "<QScriptEngineAgent>", "public" ] },
+ { symbol: [ "QScriptEngineDebugger", "private", "<QScriptEngineDebugger>", "public" ] },
+ { symbol: [ "QScriptExtensionInterface", "private", "<QScriptExtensionInterface>", "public" ] },
+ { symbol: [ "QScriptExtensionPlugin", "private", "<QScriptExtensionPlugin>", "public" ] },
+ { symbol: [ "QScriptProgram", "private", "<QScriptProgram>", "public" ] },
+ { symbol: [ "QScriptString", "private", "<QScriptString>", "public" ] },
+ { symbol: [ "QScriptSyntaxCheckResult", "private", "<QScriptSyntaxCheckResult>", "public" ] },
+ { symbol: [ "QScriptValue", "private", "<QScriptValue>", "public" ] },
+ { symbol: [ "QScriptValueIterator", "private", "<QScriptValueIterator>", "public" ] },
+ { symbol: [ "QScriptValueList", "private", "<QScriptValueList>", "public" ] },
+ { symbol: [ "QScriptable", "private", "<QScriptable>", "public" ] },
+ { symbol: [ "QScrollArea", "private", "<QScrollArea>", "public" ] },
+ { symbol: [ "QScrollBar", "private", "<QScrollBar>", "public" ] },
+ { symbol: [ "QScrollEvent", "private", "<QScrollEvent>", "public" ] },
+ { symbol: [ "QScrollPrepareEvent", "private", "<QScrollPrepareEvent>", "public" ] },
+ { symbol: [ "QScroller", "private", "<QScroller>", "public" ] },
+ { symbol: [ "QScrollerProperties", "private", "<QScrollerProperties>", "public" ] },
+ { symbol: [ "QSemaphore", "private", "<QSemaphore>", "public" ] },
+ { symbol: [ "QSensor", "private", "<QSensor>", "public" ] },
+ { symbol: [ "QSensorBackend", "private", "<QSensorBackend>", "public" ] },
+ { symbol: [ "QSensorBackendFactory", "private", "<QSensorBackendFactory>", "public" ] },
+ { symbol: [ "QSensorChangesInterface", "private", "<QSensorChangesInterface>", "public" ] },
+ { symbol: [ "QSensorFilter", "private", "<QSensorFilter>", "public" ] },
+ { symbol: [ "QSensorGesture", "private", "<QSensorGesture>", "public" ] },
+ { symbol: [ "QSensorGestureManager", "private", "<QSensorGestureManager>", "public" ] },
+ { symbol: [ "QSensorGesturePluginInterface", "private", "<QSensorGesturePluginInterface>", "public" ] },
+ { symbol: [ "QSensorGestureRecognizer", "private", "<QSensorGestureRecognizer>", "public" ] },
+ { symbol: [ "QSensorManager", "private", "<QSensorManager>", "public" ] },
+ { symbol: [ "QSensorPluginInterface", "private", "<QSensorPluginInterface>", "public" ] },
+ { symbol: [ "QSensorReading", "private", "<QSensorReading>", "public" ] },
+ { symbol: [ "QSequentialAnimationGroup", "private", "<QSequentialAnimationGroup>", "public" ] },
+ { symbol: [ "QSequentialIterable", "private", "<QSequentialIterable>", "public" ] },
+ { symbol: [ "QSerialPort", "private", "<QSerialPort>", "public" ] },
+ { symbol: [ "QSerialPortInfo", "private", "<QSerialPortInfo>", "public" ] },
+ { symbol: [ "QSessionManager", "private", "<QSessionManager>", "public" ] },
+ { symbol: [ "QSet", "private", "<QSet>", "public" ] },
+ { symbol: [ "QSetIterator", "private", "<QSetIterator>", "public" ] },
+ { symbol: [ "QSettings", "private", "<QSettings>", "public" ] },
+ { symbol: [ "QSharedData", "private", "<QSharedData>", "public" ] },
+ { symbol: [ "QSharedDataPointer", "private", "<QSharedDataPointer>", "public" ] },
+ { symbol: [ "QSharedMemory", "private", "<QSharedMemory>", "public" ] },
+ { symbol: [ "QSharedPointer", "private", "<QSharedPointer>", "public" ] },
+ { symbol: [ "QShortcut", "private", "<QShortcut>", "public" ] },
+ { symbol: [ "QShortcutEvent", "private", "<QShortcutEvent>", "public" ] },
+ { symbol: [ "QShowEvent", "private", "<QShowEvent>", "public" ] },
+ { symbol: [ "QSignalBlocker", "private", "<QSignalBlocker>", "public" ] },
+ { symbol: [ "QSignalMapper", "private", "<QSignalMapper>", "public" ] },
+ { symbol: [ "QSignalSpy", "private", "<QSignalSpy>", "public" ] },
+ { symbol: [ "QSignalTransition", "private", "<QSignalTransition>", "public" ] },
+ { symbol: [ "QSimpleXmlNodeModel", "private", "<QSimpleXmlNodeModel>", "public" ] },
+ { symbol: [ "QSize", "private", "<QSize>", "public" ] },
+ { symbol: [ "QSizeF", "private", "<QSizeF>", "public" ] },
+ { symbol: [ "QSizeGrip", "private", "<QSizeGrip>", "public" ] },
+ { symbol: [ "QSizePolicy", "private", "<QSizePolicy>", "public" ] },
+ { symbol: [ "QSlider", "private", "<QSlider>", "public" ] },
+ { symbol: [ "QSocketNotifier", "private", "<QSocketNotifier>", "public" ] },
+ { symbol: [ "QSortFilterProxyModel", "private", "<QSortFilterProxyModel>", "public" ] },
+ { symbol: [ "QSound", "private", "<QSound>", "public" ] },
+ { symbol: [ "QSoundEffect", "private", "<QSoundEffect>", "public" ] },
+ { symbol: [ "QSourceLocation", "private", "<QSourceLocation>", "public" ] },
+ { symbol: [ "QSpacerItem", "private", "<QSpacerItem>", "public" ] },
+ { symbol: [ "QSpinBox", "private", "<QSpinBox>", "public" ] },
+ { symbol: [ "QSplashScreen", "private", "<QSplashScreen>", "public" ] },
+ { symbol: [ "QSplitter", "private", "<QSplitter>", "public" ] },
+ { symbol: [ "QSplitterHandle", "private", "<QSplitterHandle>", "public" ] },
+ { symbol: [ "QSpontaneKeyEvent", "private", "<QSpontaneKeyEvent>", "public" ] },
+ { symbol: [ "QSql", "private", "<QSql>", "public" ] },
+ { symbol: [ "QSqlDatabase", "private", "<QSqlDatabase>", "public" ] },
+ { symbol: [ "QSqlDriver", "private", "<QSqlDriver>", "public" ] },
+ { symbol: [ "QSqlDriverCreator", "private", "<QSqlDriverCreator>", "public" ] },
+ { symbol: [ "QSqlDriverCreatorBase", "private", "<QSqlDriverCreatorBase>", "public" ] },
+ { symbol: [ "QSqlDriverPlugin", "private", "<QSqlDriverPlugin>", "public" ] },
+ { symbol: [ "QSqlError", "private", "<QSqlError>", "public" ] },
+ { symbol: [ "QSqlField", "private", "<QSqlField>", "public" ] },
+ { symbol: [ "QSqlIndex", "private", "<QSqlIndex>", "public" ] },
+ { symbol: [ "QSqlQuery", "private", "<QSqlQuery>", "public" ] },
+ { symbol: [ "QSqlQueryModel", "private", "<QSqlQueryModel>", "public" ] },
+ { symbol: [ "QSqlRecord", "private", "<QSqlRecord>", "public" ] },
+ { symbol: [ "QSqlRelation", "private", "<QSqlRelation>", "public" ] },
+ { symbol: [ "QSqlRelationalDelegate", "private", "<QSqlRelationalDelegate>", "public" ] },
+ { symbol: [ "QSqlRelationalTableModel", "private", "<QSqlRelationalTableModel>", "public" ] },
+ { symbol: [ "QSqlResult", "private", "<QSqlResult>", "public" ] },
+ { symbol: [ "QSqlTableModel", "private", "<QSqlTableModel>", "public" ] },
+ { symbol: [ "QSsl", "private", "<QSsl>", "public" ] },
+ { symbol: [ "QSslCertificate", "private", "<QSslCertificate>", "public" ] },
+ { symbol: [ "QSslCertificateExtension", "private", "<QSslCertificateExtension>", "public" ] },
+ { symbol: [ "QSslCipher", "private", "<QSslCipher>", "public" ] },
+ { symbol: [ "QSslConfiguration", "private", "<QSslConfiguration>", "public" ] },
+ { symbol: [ "QSslError", "private", "<QSslError>", "public" ] },
+ { symbol: [ "QSslKey", "private", "<QSslKey>", "public" ] },
+ { symbol: [ "QSslSocket", "private", "<QSslSocket>", "public" ] },
+ { symbol: [ "QStack", "private", "<QStack>", "public" ] },
+ { symbol: [ "QStackedLayout", "private", "<QStackedLayout>", "public" ] },
+ { symbol: [ "QStackedWidget", "private", "<QStackedWidget>", "public" ] },
+ { symbol: [ "QStandardItem", "private", "<QStandardItem>", "public" ] },
+ { symbol: [ "QStandardItemEditorCreator", "private", "<QStandardItemEditorCreator>", "public" ] },
+ { symbol: [ "QStandardItemModel", "private", "<QStandardItemModel>", "public" ] },
+ { symbol: [ "QStandardPaths", "private", "<QStandardPaths>", "public" ] },
+ { symbol: [ "QState", "private", "<QState>", "public" ] },
+ { symbol: [ "QStateMachine", "private", "<QStateMachine>", "public" ] },
+ { symbol: [ "QStaticArrayData", "private", "<QStaticArrayData>", "public" ] },
+ { symbol: [ "QStaticAssertFailure", "private", "<QStaticAssertFailure>", "public" ] },
+ { symbol: [ "QStaticByteArrayData", "private", "<QStaticByteArrayData>", "public" ] },
+ { symbol: [ "QStaticPlugin", "private", "<QStaticPlugin>", "public" ] },
+ { symbol: [ "QStaticStringData", "private", "<QStaticStringData>", "public" ] },
+ { symbol: [ "QStaticText", "private", "<QStaticText>", "public" ] },
+ { symbol: [ "QStatusBar", "private", "<QStatusBar>", "public" ] },
+ { symbol: [ "QStatusTipEvent", "private", "<QStatusTipEvent>", "public" ] },
+ { symbol: [ "QStorageInfo", "private", "<QStorageInfo>", "public" ] },
+ { symbol: [ "QString", "private", "<QString>", "public" ] },
+ { symbol: [ "QStringBuilder", "private", "<QStringBuilder>", "public" ] },
+ { symbol: [ "QStringData", "private", "<QStringData>", "public" ] },
+ { symbol: [ "QStringDataPtr", "private", "<QStringDataPtr>", "public" ] },
+ { symbol: [ "QStringList", "private", "<QStringList>", "public" ] },
+ { symbol: [ "QStringListIterator", "private", "<QStringListIterator>", "public" ] },
+ { symbol: [ "QStringListModel", "private", "<QStringListModel>", "public" ] },
+ { symbol: [ "QStringMatcher", "private", "<QStringMatcher>", "public" ] },
+ { symbol: [ "QStringRef", "private", "<QStringRef>", "public" ] },
+ { symbol: [ "QStyle", "private", "<QStyle>", "public" ] },
+ { symbol: [ "QStyleFactory", "private", "<QStyleFactory>", "public" ] },
+ { symbol: [ "QStyleHintReturn", "private", "<QStyleHintReturn>", "public" ] },
+ { symbol: [ "QStyleHintReturnMask", "private", "<QStyleHintReturnMask>", "public" ] },
+ { symbol: [ "QStyleHintReturnVariant", "private", "<QStyleHintReturnVariant>", "public" ] },
+ { symbol: [ "QStyleHints", "private", "<QStyleHints>", "public" ] },
+ { symbol: [ "QStyleOption", "private", "<QStyleOption>", "public" ] },
+ { symbol: [ "QStyleOptionButton", "private", "<QStyleOptionButton>", "public" ] },
+ { symbol: [ "QStyleOptionComboBox", "private", "<QStyleOptionComboBox>", "public" ] },
+ { symbol: [ "QStyleOptionComplex", "private", "<QStyleOptionComplex>", "public" ] },
+ { symbol: [ "QStyleOptionDockWidget", "private", "<QStyleOptionDockWidget>", "public" ] },
+ { symbol: [ "QStyleOptionDockWidgetV2", "private", "<QStyleOptionDockWidgetV2>", "public" ] },
+ { symbol: [ "QStyleOptionFocusRect", "private", "<QStyleOptionFocusRect>", "public" ] },
+ { symbol: [ "QStyleOptionFrame", "private", "<QStyleOptionFrame>", "public" ] },
+ { symbol: [ "QStyleOptionFrameV2", "private", "<QStyleOptionFrameV2>", "public" ] },
+ { symbol: [ "QStyleOptionFrameV3", "private", "<QStyleOptionFrameV3>", "public" ] },
+ { symbol: [ "QStyleOptionGraphicsItem", "private", "<QStyleOptionGraphicsItem>", "public" ] },
+ { symbol: [ "QStyleOptionGroupBox", "private", "<QStyleOptionGroupBox>", "public" ] },
+ { symbol: [ "QStyleOptionHeader", "private", "<QStyleOptionHeader>", "public" ] },
+ { symbol: [ "QStyleOptionMenuItem", "private", "<QStyleOptionMenuItem>", "public" ] },
+ { symbol: [ "QStyleOptionProgressBar", "private", "<QStyleOptionProgressBar>", "public" ] },
+ { symbol: [ "QStyleOptionProgressBarV2", "private", "<QStyleOptionProgressBarV2>", "public" ] },
+ { symbol: [ "QStyleOptionRubberBand", "private", "<QStyleOptionRubberBand>", "public" ] },
+ { symbol: [ "QStyleOptionSizeGrip", "private", "<QStyleOptionSizeGrip>", "public" ] },
+ { symbol: [ "QStyleOptionSlider", "private", "<QStyleOptionSlider>", "public" ] },
+ { symbol: [ "QStyleOptionSpinBox", "private", "<QStyleOptionSpinBox>", "public" ] },
+ { symbol: [ "QStyleOptionTab", "private", "<QStyleOptionTab>", "public" ] },
+ { symbol: [ "QStyleOptionTabBarBase", "private", "<QStyleOptionTabBarBase>", "public" ] },
+ { symbol: [ "QStyleOptionTabBarBaseV2", "private", "<QStyleOptionTabBarBaseV2>", "public" ] },
+ { symbol: [ "QStyleOptionTabV2", "private", "<QStyleOptionTabV2>", "public" ] },
+ { symbol: [ "QStyleOptionTabV3", "private", "<QStyleOptionTabV3>", "public" ] },
+ { symbol: [ "QStyleOptionTabWidgetFrame", "private", "<QStyleOptionTabWidgetFrame>", "public" ] },
+ { symbol: [ "QStyleOptionTabWidgetFrameV2", "private", "<QStyleOptionTabWidgetFrameV2>", "public" ] },
+ { symbol: [ "QStyleOptionTitleBar", "private", "<QStyleOptionTitleBar>", "public" ] },
+ { symbol: [ "QStyleOptionToolBar", "private", "<QStyleOptionToolBar>", "public" ] },
+ { symbol: [ "QStyleOptionToolBox", "private", "<QStyleOptionToolBox>", "public" ] },
+ { symbol: [ "QStyleOptionToolBoxV2", "private", "<QStyleOptionToolBoxV2>", "public" ] },
+ { symbol: [ "QStyleOptionToolButton", "private", "<QStyleOptionToolButton>", "public" ] },
+ { symbol: [ "QStyleOptionViewItem", "private", "<QStyleOptionViewItem>", "public" ] },
+ { symbol: [ "QStyleOptionViewItemV2", "private", "<QStyleOptionViewItemV2>", "public" ] },
+ { symbol: [ "QStyleOptionViewItemV3", "private", "<QStyleOptionViewItemV3>", "public" ] },
+ { symbol: [ "QStyleOptionViewItemV4", "private", "<QStyleOptionViewItemV4>", "public" ] },
+ { symbol: [ "QStylePainter", "private", "<QStylePainter>", "public" ] },
+ { symbol: [ "QStylePlugin", "private", "<QStylePlugin>", "public" ] },
+ { symbol: [ "QStyledItemDelegate", "private", "<QStyledItemDelegate>", "public" ] },
+ { symbol: [ "QSurface", "private", "<QSurface>", "public" ] },
+ { symbol: [ "QSurfaceFormat", "private", "<QSurfaceFormat>", "public" ] },
+ { symbol: [ "QSvgGenerator", "private", "<QSvgGenerator>", "public" ] },
+ { symbol: [ "QSvgRenderer", "private", "<QSvgRenderer>", "public" ] },
+ { symbol: [ "QSvgWidget", "private", "<QSvgWidget>", "public" ] },
+ { symbol: [ "QSwipeGesture", "private", "<QSwipeGesture>", "public" ] },
+ { symbol: [ "QSyntaxHighlighter", "private", "<QSyntaxHighlighter>", "public" ] },
+ { symbol: [ "QSysInfo", "private", "<QSysInfo>", "public" ] },
+ { symbol: [ "QSystemSemaphore", "private", "<QSystemSemaphore>", "public" ] },
+ { symbol: [ "QSystemTrayIcon", "private", "<QSystemTrayIcon>", "public" ] },
+ { symbol: [ "QTabBar", "private", "<QTabBar>", "public" ] },
+ { symbol: [ "QTabWidget", "private", "<QTabWidget>", "public" ] },
+ { symbol: [ "QTableView", "private", "<QTableView>", "public" ] },
+ { symbol: [ "QTableWidget", "private", "<QTableWidget>", "public" ] },
+ { symbol: [ "QTableWidgetItem", "private", "<QTableWidgetItem>", "public" ] },
+ { symbol: [ "QTableWidgetSelectionRange", "private", "<QTableWidgetSelectionRange>", "public" ] },
+ { symbol: [ "QTabletEvent", "private", "<QTabletEvent>", "public" ] },
+ { symbol: [ "QTapAndHoldGesture", "private", "<QTapAndHoldGesture>", "public" ] },
+ { symbol: [ "QTapFilter", "private", "<QTapFilter>", "public" ] },
+ { symbol: [ "QTapGesture", "private", "<QTapGesture>", "public" ] },
+ { symbol: [ "QTapReading", "private", "<QTapReading>", "public" ] },
+ { symbol: [ "QTapSensor", "private", "<QTapSensor>", "public" ] },
+ { symbol: [ "QTcpServer", "private", "<QTcpServer>", "public" ] },
+ { symbol: [ "QTcpSocket", "private", "<QTcpSocket>", "public" ] },
+ { symbol: [ "QTemporaryDir", "private", "<QTemporaryDir>", "public" ] },
+ { symbol: [ "QTemporaryFile", "private", "<QTemporaryFile>", "public" ] },
+ { symbol: [ "QTest", "private", "<QTest>", "public" ] },
+ { symbol: [ "QTestAccessibility", "private", "<QTestAccessibility>", "public" ] },
+ { symbol: [ "QTestData", "private", "<QTestData>", "public" ] },
+ { symbol: [ "QTestDelayEvent", "private", "<QTestDelayEvent>", "public" ] },
+ { symbol: [ "QTestEvent", "private", "<QTestEvent>", "public" ] },
+ { symbol: [ "QTestEventList", "private", "<QTestEventList>", "public" ] },
+ { symbol: [ "QTestEventLoop", "private", "<QTestEventLoop>", "public" ] },
+ { symbol: [ "QTestKeyClicksEvent", "private", "<QTestKeyClicksEvent>", "public" ] },
+ { symbol: [ "QTestKeyEvent", "private", "<QTestKeyEvent>", "public" ] },
+ { symbol: [ "QTestMouseEvent", "private", "<QTestMouseEvent>", "public" ] },
+ { symbol: [ "QTextBlock", "private", "<QTextBlock>", "public" ] },
+ { symbol: [ "QTextBlockFormat", "private", "<QTextBlockFormat>", "public" ] },
+ { symbol: [ "QTextBlockGroup", "private", "<QTextBlockGroup>", "public" ] },
+ { symbol: [ "QTextBlockUserData", "private", "<QTextBlockUserData>", "public" ] },
+ { symbol: [ "QTextBoundaryFinder", "private", "<QTextBoundaryFinder>", "public" ] },
+ { symbol: [ "QTextBrowser", "private", "<QTextBrowser>", "public" ] },
+ { symbol: [ "QTextCharFormat", "private", "<QTextCharFormat>", "public" ] },
+ { symbol: [ "QTextCodec", "private", "<QTextCodec>", "public" ] },
+ { symbol: [ "QTextCursor", "private", "<QTextCursor>", "public" ] },
+ { symbol: [ "QTextDecoder", "private", "<QTextDecoder>", "public" ] },
+ { symbol: [ "QTextDocument", "private", "<QTextDocument>", "public" ] },
+ { symbol: [ "QTextDocumentFragment", "private", "<QTextDocumentFragment>", "public" ] },
+ { symbol: [ "QTextDocumentWriter", "private", "<QTextDocumentWriter>", "public" ] },
+ { symbol: [ "QTextEdit", "private", "<QTextEdit>", "public" ] },
+ { symbol: [ "QTextEncoder", "private", "<QTextEncoder>", "public" ] },
+ { symbol: [ "QTextFormat", "private", "<QTextFormat>", "public" ] },
+ { symbol: [ "QTextFragment", "private", "<QTextFragment>", "public" ] },
+ { symbol: [ "QTextFrame", "private", "<QTextFrame>", "public" ] },
+ { symbol: [ "QTextFrameFormat", "private", "<QTextFrameFormat>", "public" ] },
+ { symbol: [ "QTextFrameLayoutData", "private", "<QTextFrameLayoutData>", "public" ] },
+ { symbol: [ "QTextImageFormat", "private", "<QTextImageFormat>", "public" ] },
+ { symbol: [ "QTextInlineObject", "private", "<QTextInlineObject>", "public" ] },
+ { symbol: [ "QTextItem", "private", "<QTextItem>", "public" ] },
+ { symbol: [ "QTextLayout", "private", "<QTextLayout>", "public" ] },
+ { symbol: [ "QTextLength", "private", "<QTextLength>", "public" ] },
+ { symbol: [ "QTextLine", "private", "<QTextLine>", "public" ] },
+ { symbol: [ "QTextList", "private", "<QTextList>", "public" ] },
+ { symbol: [ "QTextListFormat", "private", "<QTextListFormat>", "public" ] },
+ { symbol: [ "QTextObject", "private", "<QTextObject>", "public" ] },
+ { symbol: [ "QTextObjectInterface", "private", "<QTextObjectInterface>", "public" ] },
+ { symbol: [ "QTextOption", "private", "<QTextOption>", "public" ] },
+ { symbol: [ "QTextStream", "private", "<QTextStream>", "public" ] },
+ { symbol: [ "QTextStreamFunction", "private", "<QTextStreamFunction>", "public" ] },
+ { symbol: [ "QTextStreamManipulator", "private", "<QTextStreamManipulator>", "public" ] },
+ { symbol: [ "QTextTable", "private", "<QTextTable>", "public" ] },
+ { symbol: [ "QTextTableCell", "private", "<QTextTableCell>", "public" ] },
+ { symbol: [ "QTextTableCellFormat", "private", "<QTextTableCellFormat>", "public" ] },
+ { symbol: [ "QTextTableFormat", "private", "<QTextTableFormat>", "public" ] },
+ { symbol: [ "QThread", "private", "<QThread>", "public" ] },
+ { symbol: [ "QThreadPool", "private", "<QThreadPool>", "public" ] },
+ { symbol: [ "QThreadStorage", "private", "<QThreadStorage>", "public" ] },
+ { symbol: [ "QThreadStorageData", "private", "<QThreadStorageData>", "public" ] },
+ { symbol: [ "QTileRules", "private", "<QTileRules>", "public" ] },
+ { symbol: [ "QTiltFilter", "private", "<QTiltFilter>", "public" ] },
+ { symbol: [ "QTiltReading", "private", "<QTiltReading>", "public" ] },
+ { symbol: [ "QTiltSensor", "private", "<QTiltSensor>", "public" ] },
+ { symbol: [ "QTime", "private", "<QTime>", "public" ] },
+ { symbol: [ "QTimeEdit", "private", "<QTimeEdit>", "public" ] },
+ { symbol: [ "QTimeLine", "private", "<QTimeLine>", "public" ] },
+ { symbol: [ "QTimeZone", "private", "<QTimeZone>", "public" ] },
+ { symbol: [ "QTimer", "private", "<QTimer>", "public" ] },
+ { symbol: [ "QTimerEvent", "private", "<QTimerEvent>", "public" ] },
+ { symbol: [ "QToolBar", "private", "<QToolBar>", "public" ] },
+ { symbol: [ "QToolBarChangeEvent", "private", "<QToolBarChangeEvent>", "public" ] },
+ { symbol: [ "QToolBox", "private", "<QToolBox>", "public" ] },
+ { symbol: [ "QToolButton", "private", "<QToolButton>", "public" ] },
+ { symbol: [ "QToolTip", "private", "<QToolTip>", "public" ] },
+ { symbol: [ "QTouchDevice", "private", "<QTouchDevice>", "public" ] },
+ { symbol: [ "QTouchEvent", "private", "<QTouchEvent>", "public" ] },
+ { symbol: [ "QTransform", "private", "<QTransform>", "public" ] },
+ { symbol: [ "QTranslator", "private", "<QTranslator>", "public" ] },
+ { symbol: [ "QTreeView", "private", "<QTreeView>", "public" ] },
+ { symbol: [ "QTreeWidget", "private", "<QTreeWidget>", "public" ] },
+ { symbol: [ "QTreeWidgetItem", "private", "<QTreeWidgetItem>", "public" ] },
+ { symbol: [ "QTreeWidgetItemIterator", "private", "<QTreeWidgetItemIterator>", "public" ] },
+ { symbol: [ "QTypeInfo", "private", "<QTypeInfo>", "public" ] },
+ { symbol: [ "QTypeInfoMerger", "private", "<QTypeInfoMerger>", "public" ] },
+ { symbol: [ "QUdpSocket", "private", "<QUdpSocket>", "public" ] },
+ { symbol: [ "QUiLoader", "private", "<QUiLoader>", "public" ] },
+ { symbol: [ "QUndoCommand", "private", "<QUndoCommand>", "public" ] },
+ { symbol: [ "QUndoGroup", "private", "<QUndoGroup>", "public" ] },
+ { symbol: [ "QUndoStack", "private", "<QUndoStack>", "public" ] },
+ { symbol: [ "QUndoView", "private", "<QUndoView>", "public" ] },
+ { symbol: [ "QUnhandledException", "private", "<QUnhandledException>", "public" ] },
+ { symbol: [ "QUrl", "private", "<QUrl>", "public" ] },
+ { symbol: [ "QUrlQuery", "private", "<QUrlQuery>", "public" ] },
+ { symbol: [ "QUrlTwoFlags", "private", "<QUrlTwoFlags>", "public" ] },
+ { symbol: [ "QUuid", "private", "<QUuid>", "public" ] },
+ { symbol: [ "QVBoxLayout", "private", "<QVBoxLayout>", "public" ] },
+ { symbol: [ "QValidator", "private", "<QValidator>", "public" ] },
+ { symbol: [ "QVarLengthArray", "private", "<QVarLengthArray>", "public" ] },
+ { symbol: [ "QVariant", "private", "<QVariant>", "public" ] },
+ { symbol: [ "QVariantAnimation", "private", "<QVariantAnimation>", "public" ] },
+ { symbol: [ "QVariantComparisonHelper", "private", "<QVariantComparisonHelper>", "public" ] },
+ { symbol: [ "QVariantHash", "private", "<QVariantHash>", "public" ] },
+ { symbol: [ "QVariantList", "private", "<QVariantList>", "public" ] },
+ { symbol: [ "QVariantMap", "private", "<QVariantMap>", "public" ] },
+ { symbol: [ "QVector", "private", "<QVector>", "public" ] },
+ { symbol: [ "QVector2D", "private", "<QVector2D>", "public" ] },
+ { symbol: [ "QVector3D", "private", "<QVector3D>", "public" ] },
+ { symbol: [ "QVector4D", "private", "<QVector4D>", "public" ] },
+ { symbol: [ "QVectorIterator", "private", "<QVectorIterator>", "public" ] },
+ { symbol: [ "QVideoDeviceSelectorControl", "private", "<QVideoDeviceSelectorControl>", "public" ] },
+ { symbol: [ "QVideoEncoderSettings", "private", "<QVideoEncoderSettings>", "public" ] },
+ { symbol: [ "QVideoEncoderSettingsControl", "private", "<QVideoEncoderSettingsControl>", "public" ] },
+ { symbol: [ "QVideoFrame", "private", "<QVideoFrame>", "public" ] },
+ { symbol: [ "QVideoProbe", "private", "<QVideoProbe>", "public" ] },
+ { symbol: [ "QVideoRendererControl", "private", "<QVideoRendererControl>", "public" ] },
+ { symbol: [ "QVideoSurfaceFormat", "private", "<QVideoSurfaceFormat>", "public" ] },
+ { symbol: [ "QVideoWidget", "private", "<QVideoWidget>", "public" ] },
+ { symbol: [ "QVideoWidgetControl", "private", "<QVideoWidgetControl>", "public" ] },
+ { symbol: [ "QVideoWindowControl", "private", "<QVideoWindowControl>", "public" ] },
+ { symbol: [ "QWGLNativeContext", "private", "<QWGLNativeContext>", "public" ] },
+ { symbol: [ "QWaitCondition", "private", "<QWaitCondition>", "public" ] },
+ { symbol: [ "QWeakPointer", "private", "<QWeakPointer>", "public" ] },
+ { symbol: [ "QWebChannel", "private", "<QWebChannel>", "public" ] },
+ { symbol: [ "QWebChannelAbstractTransport", "private", "<QWebChannelAbstractTransport>", "public" ] },
+ { symbol: [ "QWebDatabase", "private", "<QWebDatabase>", "public" ] },
+ { symbol: [ "QWebElement", "private", "<QWebElement>", "public" ] },
+ { symbol: [ "QWebElementCollection", "private", "<QWebElementCollection>", "public" ] },
+ { symbol: [ "QWebFrame", "private", "<QWebFrame>", "public" ] },
+ { symbol: [ "QWebFullScreenVideoHandler", "private", "<QWebFullScreenVideoHandler>", "public" ] },
+ { symbol: [ "QWebHapticFeedbackPlayer", "private", "<QWebHapticFeedbackPlayer>", "public" ] },
+ { symbol: [ "QWebHistory", "private", "<QWebHistory>", "public" ] },
+ { symbol: [ "QWebHistoryInterface", "private", "<QWebHistoryInterface>", "public" ] },
+ { symbol: [ "QWebHistoryItem", "private", "<QWebHistoryItem>", "public" ] },
+ { symbol: [ "QWebHitTestResult", "private", "<QWebHitTestResult>", "public" ] },
+ { symbol: [ "QWebInspector", "private", "<QWebInspector>", "public" ] },
+ { symbol: [ "QWebKitPlatformPlugin", "private", "<QWebKitPlatformPlugin>", "public" ] },
+ { symbol: [ "QWebNotificationData", "private", "<QWebNotificationData>", "public" ] },
+ { symbol: [ "QWebNotificationPresenter", "private", "<QWebNotificationPresenter>", "public" ] },
+ { symbol: [ "QWebPage", "private", "<QWebPage>", "public" ] },
+ { symbol: [ "QWebPluginFactory", "private", "<QWebPluginFactory>", "public" ] },
+ { symbol: [ "QWebSecurityOrigin", "private", "<QWebSecurityOrigin>", "public" ] },
+ { symbol: [ "QWebSelectData", "private", "<QWebSelectData>", "public" ] },
+ { symbol: [ "QWebSelectMethod", "private", "<QWebSelectMethod>", "public" ] },
+ { symbol: [ "QWebSettings", "private", "<QWebSettings>", "public" ] },
+ { symbol: [ "QWebSocket", "private", "<QWebSocket>", "public" ] },
+ { symbol: [ "QWebSocketCorsAuthenticator", "private", "<QWebSocketCorsAuthenticator>", "public" ] },
+ { symbol: [ "QWebSocketServer", "private", "<QWebSocketServer>", "public" ] },
+ { symbol: [ "QWebSpellChecker", "private", "<QWebSpellChecker>", "public" ] },
+ { symbol: [ "QWebTouchModifier", "private", "<QWebTouchModifier>", "public" ] },
+ { symbol: [ "QWebView", "private", "<QWebView>", "public" ] },
+ { symbol: [ "QWhatsThis", "private", "<QWhatsThis>", "public" ] },
+ { symbol: [ "QWhatsThisClickedEvent", "private", "<QWhatsThisClickedEvent>", "public" ] },
+ { symbol: [ "QWheelEvent", "private", "<QWheelEvent>", "public" ] },
+ { symbol: [ "QWidget", "private", "<QWidget>", "public" ] },
+ { symbol: [ "QWidgetAction", "private", "<QWidgetAction>", "public" ] },
+ { symbol: [ "QWidgetData", "private", "<QWidgetData>", "public" ] },
+ { symbol: [ "QWidgetItem", "private", "<QWidgetItem>", "public" ] },
+ { symbol: [ "QWidgetItemV2", "private", "<QWidgetItemV2>", "public" ] },
+ { symbol: [ "QWidgetList", "private", "<QWidgetList>", "public" ] },
+ { symbol: [ "QWidgetMapper", "private", "<QWidgetMapper>", "public" ] },
+ { symbol: [ "QWidgetSet", "private", "<QWidgetSet>", "public" ] },
+ { symbol: [ "QWinColorizationChangeEvent", "private", "<QWinColorizationChangeEvent>", "public" ] },
+ { symbol: [ "QWinCompositionChangeEvent", "private", "<QWinCompositionChangeEvent>", "public" ] },
+ { symbol: [ "QWinEvent", "private", "<QWinEvent>", "public" ] },
+ { symbol: [ "QWinEventNotifier", "private", "<QWinEventNotifier>", "public" ] },
+ { symbol: [ "QWinEventNotifier", "private", "<QWinEventNotifier>", "public" ] },
+ { symbol: [ "QWinJumpList", "private", "<QWinJumpList>", "public" ] },
+ { symbol: [ "QWinJumpListCategory", "private", "<QWinJumpListCategory>", "public" ] },
+ { symbol: [ "QWinJumpListItem", "private", "<QWinJumpListItem>", "public" ] },
+ { symbol: [ "QWinMime", "private", "<QWinMime>", "public" ] },
+ { symbol: [ "QWinTaskbarButton", "private", "<QWinTaskbarButton>", "public" ] },
+ { symbol: [ "QWinTaskbarProgress", "private", "<QWinTaskbarProgress>", "public" ] },
+ { symbol: [ "QWinThumbnailToolBar", "private", "<QWinThumbnailToolBar>", "public" ] },
+ { symbol: [ "QWinThumbnailToolButton", "private", "<QWinThumbnailToolButton>", "public" ] },
+ { symbol: [ "QWindow", "private", "<QWindow>", "public" ] },
+ { symbol: [ "QWindowList", "private", "<QWindowList>", "public" ] },
+ { symbol: [ "QWindowStateChangeEvent", "private", "<QWindowStateChangeEvent>", "public" ] },
+ { symbol: [ "QWizard", "private", "<QWizard>", "public" ] },
+ { symbol: [ "QWizardPage", "private", "<QWizardPage>", "public" ] },
+ { symbol: [ "QWriteLocker", "private", "<QWriteLocker>", "public" ] },
+ { symbol: [ "QXcbWindowFunctions", "private", "<QXcbWindowFunctions>", "public" ] },
+ { symbol: [ "QXmlAttributes", "private", "<QXmlAttributes>", "public" ] },
+ { symbol: [ "QXmlContentHandler", "private", "<QXmlContentHandler>", "public" ] },
+ { symbol: [ "QXmlDTDHandler", "private", "<QXmlDTDHandler>", "public" ] },
+ { symbol: [ "QXmlDeclHandler", "private", "<QXmlDeclHandler>", "public" ] },
+ { symbol: [ "QXmlDefaultHandler", "private", "<QXmlDefaultHandler>", "public" ] },
+ { symbol: [ "QXmlEntityResolver", "private", "<QXmlEntityResolver>", "public" ] },
+ { symbol: [ "QXmlErrorHandler", "private", "<QXmlErrorHandler>", "public" ] },
+ { symbol: [ "QXmlFormatter", "private", "<QXmlFormatter>", "public" ] },
+ { symbol: [ "QXmlInputSource", "private", "<QXmlInputSource>", "public" ] },
+ { symbol: [ "QXmlItem", "private", "<QXmlItem>", "public" ] },
+ { symbol: [ "QXmlLexicalHandler", "private", "<QXmlLexicalHandler>", "public" ] },
+ { symbol: [ "QXmlLocator", "private", "<QXmlLocator>", "public" ] },
+ { symbol: [ "QXmlName", "private", "<QXmlName>", "public" ] },
+ { symbol: [ "QXmlNamePool", "private", "<QXmlNamePool>", "public" ] },
+ { symbol: [ "QXmlNamespaceSupport", "private", "<QXmlNamespaceSupport>", "public" ] },
+ { symbol: [ "QXmlNodeModelIndex", "private", "<QXmlNodeModelIndex>", "public" ] },
+ { symbol: [ "QXmlParseException", "private", "<QXmlParseException>", "public" ] },
+ { symbol: [ "QXmlQuery", "private", "<QXmlQuery>", "public" ] },
+ { symbol: [ "QXmlReader", "private", "<QXmlReader>", "public" ] },
+ { symbol: [ "QXmlResultItems", "private", "<QXmlResultItems>", "public" ] },
+ { symbol: [ "QXmlSchema", "private", "<QXmlSchema>", "public" ] },
+ { symbol: [ "QXmlSchemaValidator", "private", "<QXmlSchemaValidator>", "public" ] },
+ { symbol: [ "QXmlSerializer", "private", "<QXmlSerializer>", "public" ] },
+ { symbol: [ "QXmlSimpleReader", "private", "<QXmlSimpleReader>", "public" ] },
+ { symbol: [ "QXmlStreamAttribute", "private", "<QXmlStreamAttribute>", "public" ] },
+ { symbol: [ "QXmlStreamAttributes", "private", "<QXmlStreamAttributes>", "public" ] },
+ { symbol: [ "QXmlStreamEntityDeclaration", "private", "<QXmlStreamEntityDeclaration>", "public" ] },
+ { symbol: [ "QXmlStreamEntityDeclarations", "private", "<QXmlStreamEntityDeclarations>", "public" ] },
+ { symbol: [ "QXmlStreamEntityResolver", "private", "<QXmlStreamEntityResolver>", "public" ] },
+ { symbol: [ "QXmlStreamNamespaceDeclaration", "private", "<QXmlStreamNamespaceDeclaration>", "public" ] },
+ { symbol: [ "QXmlStreamNamespaceDeclarations", "private", "<QXmlStreamNamespaceDeclarations>", "public" ] },
+ { symbol: [ "QXmlStreamNotationDeclaration", "private", "<QXmlStreamNotationDeclaration>", "public" ] },
+ { symbol: [ "QXmlStreamNotationDeclarations", "private", "<QXmlStreamNotationDeclarations>", "public" ] },
+ { symbol: [ "QXmlStreamReader", "private", "<QXmlStreamReader>", "public" ] },
+ { symbol: [ "QXmlStreamStringRef", "private", "<QXmlStreamStringRef>", "public" ] },
+ { symbol: [ "QXmlStreamWriter", "private", "<QXmlStreamWriter>", "public" ] },
+ { symbol: [ "Q_IPV6ADDR", "private", "<Q_IPV6ADDR>", "public" ] },
+ { symbol: [ "Q_PID", "private", "<Q_PID>", "public" ] },
+ { symbol: [ "Qt", "private", "<Qt>", "public" ] },
+ { symbol: [ "QtAlgorithms", "private", "<QtAlgorithms>", "public" ] },
+ { symbol: [ "QtBluetooth", "private", "<QtBluetooth>", "public" ] },
+ { symbol: [ "QtBluetoothDepends", "private", "<QtBluetoothDepends>", "public" ] },
+ { symbol: [ "QtBluetoothVersion", "private", "<QtBluetoothVersion>", "public" ] },
+ { symbol: [ "QtCLucene", "private", "<QtCLucene>", "public" ] },
+ { symbol: [ "QtCLuceneDepends", "private", "<QtCLuceneDepends>", "public" ] },
+ { symbol: [ "QtCLuceneVersion", "private", "<QtCLuceneVersion>", "public" ] },
+ { symbol: [ "QtCleanUpFunction", "private", "<QtCleanUpFunction>", "public" ] },
+ { symbol: [ "QtConcurrent", "private", "<QtConcurrent>", "public" ] },
+ { symbol: [ "QtConcurrentDepends", "private", "<QtConcurrentDepends>", "public" ] },
+ { symbol: [ "QtConcurrentFilter", "private", "<QtConcurrentFilter>", "public" ] },
+ { symbol: [ "QtConcurrentMap", "private", "<QtConcurrentMap>", "public" ] },
+ { symbol: [ "QtConcurrentRun", "private", "<QtConcurrentRun>", "public" ] },
+ { symbol: [ "QtConcurrentVersion", "private", "<QtConcurrentVersion>", "public" ] },
+ { symbol: [ "QtConfig", "private", "<QtConfig>", "public" ] },
+ { symbol: [ "QtContainerFwd", "private", "<QtContainerFwd>", "public" ] },
+ { symbol: [ "QtCore", "private", "<QtCore>", "public" ] },
+ { symbol: [ "QtCoreDepends", "private", "<QtCoreDepends>", "public" ] },
+ { symbol: [ "QtCoreVersion", "private", "<QtCoreVersion>", "public" ] },
+ { symbol: [ "QtDBus", "private", "<QtDBus>", "public" ] },
+ { symbol: [ "QtDBusDepends", "private", "<QtDBusDepends>", "public" ] },
+ { symbol: [ "QtDBusVersion", "private", "<QtDBusVersion>", "public" ] },
+ { symbol: [ "QtDebug", "private", "<QtDebug>", "public" ] },
+ { symbol: [ "QtDeclarative", "private", "<QtDeclarative>", "public" ] },
+ { symbol: [ "QtDeclarativeDepends", "private", "<QtDeclarativeDepends>", "public" ] },
+ { symbol: [ "QtDeclarativeVersion", "private", "<QtDeclarativeVersion>", "public" ] },
+ { symbol: [ "QtDesigner", "private", "<QtDesigner>", "public" ] },
+ { symbol: [ "QtDesignerComponents", "private", "<QtDesignerComponents>", "public" ] },
+ { symbol: [ "QtDesignerComponentsDepends", "private", "<QtDesignerComponentsDepends>", "public" ] },
+ { symbol: [ "QtDesignerComponentsVersion", "private", "<QtDesignerComponentsVersion>", "public" ] },
+ { symbol: [ "QtDesignerDepends", "private", "<QtDesignerDepends>", "public" ] },
+ { symbol: [ "QtDesignerVersion", "private", "<QtDesignerVersion>", "public" ] },
+ { symbol: [ "QtEndian", "private", "<QtEndian>", "public" ] },
+ { symbol: [ "QtEvents", "private", "<QtEvents>", "public" ] },
+ { symbol: [ "QtGlobal", "private", "<QtGlobal>", "public" ] },
+ { symbol: [ "QtGui", "private", "<QtGui>", "public" ] },
+ { symbol: [ "QtGuiDepends", "private", "<QtGuiDepends>", "public" ] },
+ { symbol: [ "QtGuiVersion", "private", "<QtGuiVersion>", "public" ] },
+ { symbol: [ "QtHelp", "private", "<QtHelp>", "public" ] },
+ { symbol: [ "QtHelpDepends", "private", "<QtHelpDepends>", "public" ] },
+ { symbol: [ "QtHelpVersion", "private", "<QtHelpVersion>", "public" ] },
+ { symbol: [ "QtLocation", "private", "<QtLocation>", "public" ] },
+ { symbol: [ "QtLocationDepends", "private", "<QtLocationDepends>", "public" ] },
+ { symbol: [ "QtLocationVersion", "private", "<QtLocationVersion>", "public" ] },
+ { symbol: [ "QtMath", "private", "<QtMath>", "public" ] },
+ { symbol: [ "QtMessageHandler", "private", "<QtMessageHandler>", "public" ] },
+ { symbol: [ "QtMsgHandler", "private", "<QtMsgHandler>", "public" ] },
+ { symbol: [ "QtMultimedia", "private", "<QtMultimedia>", "public" ] },
+ { symbol: [ "QtMultimediaDepends", "private", "<QtMultimediaDepends>", "public" ] },
+ { symbol: [ "QtMultimediaQuick_p", "private", "<QtMultimediaQuick_p>", "public" ] },
+ { symbol: [ "QtMultimediaQuick_pDepends", "private", "<QtMultimediaQuick_pDepends>", "public" ] },
+ { symbol: [ "QtMultimediaQuick_pVersion", "private", "<QtMultimediaQuick_pVersion>", "public" ] },
+ { symbol: [ "QtMultimediaVersion", "private", "<QtMultimediaVersion>", "public" ] },
+ { symbol: [ "QtMultimediaWidgets", "private", "<QtMultimediaWidgets>", "public" ] },
+ { symbol: [ "QtMultimediaWidgetsDepends", "private", "<QtMultimediaWidgetsDepends>", "public" ] },
+ { symbol: [ "QtMultimediaWidgetsVersion", "private", "<QtMultimediaWidgetsVersion>", "public" ] },
+ { symbol: [ "QtNetwork", "private", "<QtNetwork>", "public" ] },
+ { symbol: [ "QtNetworkDepends", "private", "<QtNetworkDepends>", "public" ] },
+ { symbol: [ "QtNetworkVersion", "private", "<QtNetworkVersion>", "public" ] },
+ { symbol: [ "QtNfc", "private", "<QtNfc>", "public" ] },
+ { symbol: [ "QtNfcDepends", "private", "<QtNfcDepends>", "public" ] },
+ { symbol: [ "QtNfcVersion", "private", "<QtNfcVersion>", "public" ] },
+ { symbol: [ "QtNumeric", "private", "<QtNumeric>", "public" ] },
+ { symbol: [ "QtOpenGL", "private", "<QtOpenGL>", "public" ] },
+ { symbol: [ "QtOpenGLDepends", "private", "<QtOpenGLDepends>", "public" ] },
+ { symbol: [ "QtOpenGLExtensions", "private", "<QtOpenGLExtensions>", "public" ] },
+ { symbol: [ "QtOpenGLExtensionsDepends", "private", "<QtOpenGLExtensionsDepends>", "public" ] },
+ { symbol: [ "QtOpenGLExtensionsVersion", "private", "<QtOpenGLExtensionsVersion>", "public" ] },
+ { symbol: [ "QtOpenGLVersion", "private", "<QtOpenGLVersion>", "public" ] },
+ { symbol: [ "QtPlatformHeaders", "private", "<QtPlatformHeaders>", "public" ] },
+ { symbol: [ "QtPlatformHeadersDepends", "private", "<QtPlatformHeadersDepends>", "public" ] },
+ { symbol: [ "QtPlatformHeadersVersion", "private", "<QtPlatformHeadersVersion>", "public" ] },
+ { symbol: [ "QtPlatformSupport", "private", "<QtPlatformSupport>", "public" ] },
+ { symbol: [ "QtPlatformSupportDepends", "private", "<QtPlatformSupportDepends>", "public" ] },
+ { symbol: [ "QtPlatformSupportVersion", "private", "<QtPlatformSupportVersion>", "public" ] },
+ { symbol: [ "QtPlugin", "private", "<QtPlugin>", "public" ] },
+ { symbol: [ "QtPluginInstanceFunction", "private", "<QtPluginInstanceFunction>", "public" ] },
+ { symbol: [ "QtPluginMetaDataFunction", "private", "<QtPluginMetaDataFunction>", "public" ] },
+ { symbol: [ "QtPositioning", "private", "<QtPositioning>", "public" ] },
+ { symbol: [ "QtPositioningDepends", "private", "<QtPositioningDepends>", "public" ] },
+ { symbol: [ "QtPositioningVersion", "private", "<QtPositioningVersion>", "public" ] },
+ { symbol: [ "QtPrintSupport", "private", "<QtPrintSupport>", "public" ] },
+ { symbol: [ "QtPrintSupportDepends", "private", "<QtPrintSupportDepends>", "public" ] },
+ { symbol: [ "QtPrintSupportVersion", "private", "<QtPrintSupportVersion>", "public" ] },
+ { symbol: [ "QtQml", "private", "<QtQml>", "public" ] },
+ { symbol: [ "QtQmlDepends", "private", "<QtQmlDepends>", "public" ] },
+ { symbol: [ "QtQmlVersion", "private", "<QtQmlVersion>", "public" ] },
+ { symbol: [ "QtQuick", "private", "<QtQuick>", "public" ] },
+ { symbol: [ "QtQuickDepends", "private", "<QtQuickDepends>", "public" ] },
+ { symbol: [ "QtQuickParticles", "private", "<QtQuickParticles>", "public" ] },
+ { symbol: [ "QtQuickParticlesDepends", "private", "<QtQuickParticlesDepends>", "public" ] },
+ { symbol: [ "QtQuickParticlesVersion", "private", "<QtQuickParticlesVersion>", "public" ] },
+ { symbol: [ "QtQuickTest", "private", "<QtQuickTest>", "public" ] },
+ { symbol: [ "QtQuickTestDepends", "private", "<QtQuickTestDepends>", "public" ] },
+ { symbol: [ "QtQuickTestVersion", "private", "<QtQuickTestVersion>", "public" ] },
+ { symbol: [ "QtQuickVersion", "private", "<QtQuickVersion>", "public" ] },
+ { symbol: [ "QtQuickWidgets", "private", "<QtQuickWidgets>", "public" ] },
+ { symbol: [ "QtQuickWidgetsDepends", "private", "<QtQuickWidgetsDepends>", "public" ] },
+ { symbol: [ "QtQuickWidgetsVersion", "private", "<QtQuickWidgetsVersion>", "public" ] },
+ { symbol: [ "QtScript", "private", "<QtScript>", "public" ] },
+ { symbol: [ "QtScriptDepends", "private", "<QtScriptDepends>", "public" ] },
+ { symbol: [ "QtScriptTools", "private", "<QtScriptTools>", "public" ] },
+ { symbol: [ "QtScriptToolsDepends", "private", "<QtScriptToolsDepends>", "public" ] },
+ { symbol: [ "QtScriptToolsVersion", "private", "<QtScriptToolsVersion>", "public" ] },
+ { symbol: [ "QtScriptVersion", "private", "<QtScriptVersion>", "public" ] },
+ { symbol: [ "QtSensors", "private", "<QtSensors>", "public" ] },
+ { symbol: [ "QtSensorsDepends", "private", "<QtSensorsDepends>", "public" ] },
+ { symbol: [ "QtSensorsVersion", "private", "<QtSensorsVersion>", "public" ] },
+ { symbol: [ "QtSerialPort", "private", "<QtSerialPort>", "public" ] },
+ { symbol: [ "QtSerialPortDepends", "private", "<QtSerialPortDepends>", "public" ] },
+ { symbol: [ "QtSerialPortVersion", "private", "<QtSerialPortVersion>", "public" ] },
+ { symbol: [ "QtSql", "private", "<QtSql>", "public" ] },
+ { symbol: [ "QtSqlDepends", "private", "<QtSqlDepends>", "public" ] },
+ { symbol: [ "QtSqlVersion", "private", "<QtSqlVersion>", "public" ] },
+ { symbol: [ "QtSvg", "private", "<QtSvg>", "public" ] },
+ { symbol: [ "QtSvgDepends", "private", "<QtSvgDepends>", "public" ] },
+ { symbol: [ "QtSvgVersion", "private", "<QtSvgVersion>", "public" ] },
+ { symbol: [ "QtTest", "private", "<QtTest>", "public" ] },
+ { symbol: [ "QtTestDepends", "private", "<QtTestDepends>", "public" ] },
+ { symbol: [ "QtTestGui", "private", "<QtTestGui>", "public" ] },
+ { symbol: [ "QtTestVersion", "private", "<QtTestVersion>", "public" ] },
+ { symbol: [ "QtTestWidgets", "private", "<QtTestWidgets>", "public" ] },
+ { symbol: [ "QtUiTools", "private", "<QtUiTools>", "public" ] },
+ { symbol: [ "QtUiToolsDepends", "private", "<QtUiToolsDepends>", "public" ] },
+ { symbol: [ "QtUiToolsVersion", "private", "<QtUiToolsVersion>", "public" ] },
+ { symbol: [ "QtWebChannel", "private", "<QtWebChannel>", "public" ] },
+ { symbol: [ "QtWebChannelDepends", "private", "<QtWebChannelDepends>", "public" ] },
+ { symbol: [ "QtWebChannelVersion", "private", "<QtWebChannelVersion>", "public" ] },
+ { symbol: [ "QtWebKit", "private", "<QtWebKit>", "public" ] },
+ { symbol: [ "QtWebKitDepends", "private", "<QtWebKitDepends>", "public" ] },
+ { symbol: [ "QtWebKitVersion", "private", "<QtWebKitVersion>", "public" ] },
+ { symbol: [ "QtWebKitWidgets", "private", "<QtWebKitWidgets>", "public" ] },
+ { symbol: [ "QtWebKitWidgetsDepends", "private", "<QtWebKitWidgetsDepends>", "public" ] },
+ { symbol: [ "QtWebKitWidgetsVersion", "private", "<QtWebKitWidgetsVersion>", "public" ] },
+ { symbol: [ "QtWebSockets", "private", "<QtWebSockets>", "public" ] },
+ { symbol: [ "QtWebSocketsDepends", "private", "<QtWebSocketsDepends>", "public" ] },
+ { symbol: [ "QtWebSocketsVersion", "private", "<QtWebSocketsVersion>", "public" ] },
+ { symbol: [ "QtWidgets", "private", "<QtWidgets>", "public" ] },
+ { symbol: [ "QtWidgetsDepends", "private", "<QtWidgetsDepends>", "public" ] },
+ { symbol: [ "QtWidgetsVersion", "private", "<QtWidgetsVersion>", "public" ] },
+ { symbol: [ "QtWin", "private", "<QtWin>", "public" ] },
+ { symbol: [ "QtWinExtras", "private", "<QtWinExtras>", "public" ] },
+ { symbol: [ "QtWinExtrasDepends", "private", "<QtWinExtrasDepends>", "public" ] },
+ { symbol: [ "QtWinExtrasVersion", "private", "<QtWinExtrasVersion>", "public" ] },
+ { symbol: [ "QtXml", "private", "<QtXml>", "public" ] },
+ { symbol: [ "QtXmlDepends", "private", "<QtXmlDepends>", "public" ] },
+ { symbol: [ "QtXmlPatterns", "private", "<QtXmlPatterns>", "public" ] },
+ { symbol: [ "QtXmlPatternsDepends", "private", "<QtXmlPatternsDepends>", "public" ] },
+ { symbol: [ "QtXmlPatternsVersion", "private", "<QtXmlPatternsVersion>", "public" ] },
+ { symbol: [ "QtXmlVersion", "private", "<QtXmlVersion>", "public" ] },
+
+# This is necessary because QList::toSet ends up in QSet which is wrong. See note
+# at top as to why this shouldn't be necessary
+
+ { symbol: [ "QList::toSet", "private", "<QList>", "public" ] },
+
+# All these are needed for
+# a) Identifiers of the form A::B where A is any of the classes above
+# b) Free operators
+
+# Generated with
+# perl -le "use File::Find;use File::Basename; sub wanted { $x = lc $_. '.h'; print ' { include: [ -@\-('.basename($File::Find::dir).'/)?'.$x.'\--, -private-, -<'.$_.'>-, -public- ] },' if -e $x } find(\&wanted, '.')"
+# on windows
+
+ { include: [ "@\"(ActiveQt/)?activeqtversion\\.h\"", "private", "<ActiveQtVersion>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxaggregated\\.h\"", "private", "<QAxAggregated>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxbase\\.h\"", "private", "<QAxBase>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxbindable\\.h\"", "private", "<QAxBindable>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxfactory\\.h\"", "private", "<QAxFactory>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxobject\\.h\"", "private", "<QAxObject>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxscript\\.h\"", "private", "<QAxScript>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxselect\\.h\"", "private", "<QAxSelect>", "public" ] },
+ { include: [ "@\"(ActiveQt/)?qaxwidget\\.h\"", "private", "<QAxWidget>", "public" ] },
+ { include: [ "@\"(Enginio/)?enginio\\.h\"", "private", "<Enginio>", "public" ] },
+ { include: [ "@\"(Enginio/)?enginioversion\\.h\"", "private", "<EnginioVersion>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothaddress\\.h\"", "private", "<QBluetoothAddress>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothdevicediscoveryagent\\.h\"", "private", "<QBluetoothDeviceDiscoveryAgent>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothdeviceinfo\\.h\"", "private", "<QBluetoothDeviceInfo>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothhostinfo\\.h\"", "private", "<QBluetoothHostInfo>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothlocaldevice\\.h\"", "private", "<QBluetoothLocalDevice>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothserver\\.h\"", "private", "<QBluetoothServer>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothservicediscoveryagent\\.h\"", "private", "<QBluetoothServiceDiscoveryAgent>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothserviceinfo\\.h\"", "private", "<QBluetoothServiceInfo>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothsocket\\.h\"", "private", "<QBluetoothSocket>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothtransfermanager\\.h\"", "private", "<QBluetoothTransferManager>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothtransferreply\\.h\"", "private", "<QBluetoothTransferReply>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothtransferrequest\\.h\"", "private", "<QBluetoothTransferRequest>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qbluetoothuuid\\.h\"", "private", "<QBluetoothUuid>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qlowenergycharacteristic\\.h\"", "private", "<QLowEnergyCharacteristic>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qlowenergycontroller\\.h\"", "private", "<QLowEnergyController>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qlowenergydescriptor\\.h\"", "private", "<QLowEnergyDescriptor>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qlowenergyservice\\.h\"", "private", "<QLowEnergyService>", "public" ] },
+ { include: [ "@\"(QtBluetooth/)?qtbluetoothversion\\.h\"", "private", "<QtBluetoothVersion>", "public" ] },
+ { include: [ "@\"(QtCLucene/)?qtcluceneversion\\.h\"", "private", "<QtCLuceneVersion>", "public" ] },
+ { include: [ "@\"(QtConcurrent/)?qtconcurrentfilter\\.h\"", "private", "<QtConcurrentFilter>", "public" ] },
+ { include: [ "@\"(QtConcurrent/)?qtconcurrentmap\\.h\"", "private", "<QtConcurrentMap>", "public" ] },
+ { include: [ "@\"(QtConcurrent/)?qtconcurrentrun\\.h\"", "private", "<QtConcurrentRun>", "public" ] },
+ { include: [ "@\"(QtConcurrent/)?qtconcurrentversion\\.h\"", "private", "<QtConcurrentVersion>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstractanimation\\.h\"", "private", "<QAbstractAnimation>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstracteventdispatcher\\.h\"", "private", "<QAbstractEventDispatcher>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstractitemmodel\\.h\"", "private", "<QAbstractItemModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstractnativeeventfilter\\.h\"", "private", "<QAbstractNativeEventFilter>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstractproxymodel\\.h\"", "private", "<QAbstractProxyModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstractstate\\.h\"", "private", "<QAbstractState>", "public" ] },
+ { include: [ "@\"(QtCore/)?qabstracttransition\\.h\"", "private", "<QAbstractTransition>", "public" ] },
+ { include: [ "@\"(QtCore/)?qanimationgroup\\.h\"", "private", "<QAnimationGroup>", "public" ] },
+ { include: [ "@\"(QtCore/)?qarraydata\\.h\"", "private", "<QArrayData>", "public" ] },
+ { include: [ "@\"(QtCore/)?qarraydatapointer\\.h\"", "private", "<QArrayDataPointer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbasictimer\\.h\"", "private", "<QBasicTimer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbitarray\\.h\"", "private", "<QBitArray>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbuffer\\.h\"", "private", "<QBuffer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbytearray\\.h\"", "private", "<QByteArray>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbytearraylist\\.h\"", "private", "<QByteArrayList>", "public" ] },
+ { include: [ "@\"(QtCore/)?qbytearraymatcher\\.h\"", "private", "<QByteArrayMatcher>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcache\\.h\"", "private", "<QCache>", "public" ] },
+ { include: [ "@\"(QtCore/)?qchar\\.h\"", "private", "<QChar>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcollator\\.h\"", "private", "<QCollator>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcommandlineoption\\.h\"", "private", "<QCommandLineOption>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcommandlineparser\\.h\"", "private", "<QCommandLineParser>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcontiguouscache\\.h\"", "private", "<QContiguousCache>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcoreapplication\\.h\"", "private", "<QCoreApplication>", "public" ] },
+ { include: [ "@\"(QtCore/)?qcryptographichash\\.h\"", "private", "<QCryptographicHash>", "public" ] },
+ { include: [ "@\"(QtCore/)?qdatastream\\.h\"", "private", "<QDataStream>", "public" ] },
+ { include: [ "@\"(QtCore/)?qdatetime\\.h\"", "private", "<QDateTime>", "public" ] },
+ { include: [ "@\"(QtCore/)?qdebug\\.h\"", "private", "<QDebug>", "public" ] },
+ { include: [ "@\"(QtCore/)?qdir\\.h\"", "private", "<QDir>", "public" ] },
+ { include: [ "@\"(QtCore/)?qdiriterator\\.h\"", "private", "<QDirIterator>", "public" ] },
+ { include: [ "@\"(QtCore/)?qeasingcurve\\.h\"", "private", "<QEasingCurve>", "public" ] },
+ { include: [ "@\"(QtCore/)?qelapsedtimer\\.h\"", "private", "<QElapsedTimer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qeventloop\\.h\"", "private", "<QEventLoop>", "public" ] },
+ { include: [ "@\"(QtCore/)?qeventtransition\\.h\"", "private", "<QEventTransition>", "public" ] },
+ { include: [ "@\"(QtCore/)?qexception\\.h\"", "private", "<QException>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfactoryinterface\\.h\"", "private", "<QFactoryInterface>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfile\\.h\"", "private", "<QFile>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfiledevice\\.h\"", "private", "<QFileDevice>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfileinfo\\.h\"", "private", "<QFileInfo>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfileselector\\.h\"", "private", "<QFileSelector>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfilesystemwatcher\\.h\"", "private", "<QFileSystemWatcher>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfinalstate\\.h\"", "private", "<QFinalState>", "public" ] },
+ { include: [ "@\"(QtCore/)?qflags\\.h\"", "private", "<QFlags>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfuture\\.h\"", "private", "<QFuture>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfutureinterface\\.h\"", "private", "<QFutureInterface>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfuturesynchronizer\\.h\"", "private", "<QFutureSynchronizer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qfuturewatcher\\.h\"", "private", "<QFutureWatcher>", "public" ] },
+ { include: [ "@\"(QtCore/)?qglobalstatic\\.h\"", "private", "<QGlobalStatic>", "public" ] },
+ { include: [ "@\"(QtCore/)?qhash\\.h\"", "private", "<QHash>", "public" ] },
+ { include: [ "@\"(QtCore/)?qhistorystate\\.h\"", "private", "<QHistoryState>", "public" ] },
+ { include: [ "@\"(QtCore/)?qidentityproxymodel\\.h\"", "private", "<QIdentityProxyModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qiodevice\\.h\"", "private", "<QIODevice>", "public" ] },
+ { include: [ "@\"(QtCore/)?qitemselectionmodel\\.h\"", "private", "<QItemSelectionModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qjsonarray\\.h\"", "private", "<QJsonArray>", "public" ] },
+ { include: [ "@\"(QtCore/)?qjsondocument\\.h\"", "private", "<QJsonDocument>", "public" ] },
+ { include: [ "@\"(QtCore/)?qjsonobject\\.h\"", "private", "<QJsonObject>", "public" ] },
+ { include: [ "@\"(QtCore/)?qjsonvalue\\.h\"", "private", "<QJsonValue>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlibrary\\.h\"", "private", "<QLibrary>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlibraryinfo\\.h\"", "private", "<QLibraryInfo>", "public" ] },
+ { include: [ "@\"(QtCore/)?qline\\.h\"", "private", "<QLine>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlinkedlist\\.h\"", "private", "<QLinkedList>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlist\\.h\"", "private", "<QList>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlocale\\.h\"", "private", "<QLocale>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlockfile\\.h\"", "private", "<QLockFile>", "public" ] },
+ { include: [ "@\"(QtCore/)?qloggingcategory\\.h\"", "private", "<QLoggingCategory>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmap\\.h\"", "private", "<QMap>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmargins\\.h\"", "private", "<QMargins>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmessageauthenticationcode\\.h\"", "private", "<QMessageAuthenticationCode>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmetaobject\\.h\"", "private", "<QMetaObject>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmetatype\\.h\"", "private", "<QMetaType>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmimedata\\.h\"", "private", "<QMimeData>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmimedatabase\\.h\"", "private", "<QMimeDatabase>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmimetype\\.h\"", "private", "<QMimeType>", "public" ] },
+ { include: [ "@\"(QtCore/)?qmutex\\.h\"", "private", "<QMutex>", "public" ] },
+ { include: [ "@\"(QtCore/)?qobject\\.h\"", "private", "<QObject>", "public" ] },
+ { include: [ "@\"(QtCore/)?qobjectcleanuphandler\\.h\"", "private", "<QObjectCleanupHandler>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpair\\.h\"", "private", "<QPair>", "public" ] },
+ { include: [ "@\"(QtCore/)?qparallelanimationgroup\\.h\"", "private", "<QParallelAnimationGroup>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpauseanimation\\.h\"", "private", "<QPauseAnimation>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpluginloader\\.h\"", "private", "<QPluginLoader>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpoint\\.h\"", "private", "<QPoint>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpointer\\.h\"", "private", "<QPointer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qprocess\\.h\"", "private", "<QProcess>", "public" ] },
+ { include: [ "@\"(QtCore/)?qpropertyanimation\\.h\"", "private", "<QPropertyAnimation>", "public" ] },
+ { include: [ "@\"(QtCore/)?qqueue\\.h\"", "private", "<QQueue>", "public" ] },
+ { include: [ "@\"(QtCore/)?qreadwritelock\\.h\"", "private", "<QReadWriteLock>", "public" ] },
+ { include: [ "@\"(QtCore/)?qrect\\.h\"", "private", "<QRect>", "public" ] },
+ { include: [ "@\"(QtCore/)?qregexp\\.h\"", "private", "<QRegExp>", "public" ] },
+ { include: [ "@\"(QtCore/)?qregularexpression\\.h\"", "private", "<QRegularExpression>", "public" ] },
+ { include: [ "@\"(QtCore/)?qresource\\.h\"", "private", "<QResource>", "public" ] },
+ { include: [ "@\"(QtCore/)?qrunnable\\.h\"", "private", "<QRunnable>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsavefile\\.h\"", "private", "<QSaveFile>", "public" ] },
+ { include: [ "@\"(QtCore/)?qscopedpointer\\.h\"", "private", "<QScopedPointer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qscopedvaluerollback\\.h\"", "private", "<QScopedValueRollback>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsemaphore\\.h\"", "private", "<QSemaphore>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsequentialanimationgroup\\.h\"", "private", "<QSequentialAnimationGroup>", "public" ] },
+ { include: [ "@\"(QtCore/)?qset\\.h\"", "private", "<QSet>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsettings\\.h\"", "private", "<QSettings>", "public" ] },
+ { include: [ "@\"(QtCore/)?qshareddata\\.h\"", "private", "<QSharedData>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsharedmemory\\.h\"", "private", "<QSharedMemory>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsharedpointer\\.h\"", "private", "<QSharedPointer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsignalmapper\\.h\"", "private", "<QSignalMapper>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsignaltransition\\.h\"", "private", "<QSignalTransition>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsize\\.h\"", "private", "<QSize>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsocketnotifier\\.h\"", "private", "<QSocketNotifier>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsortfilterproxymodel\\.h\"", "private", "<QSortFilterProxyModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstack\\.h\"", "private", "<QStack>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstandardpaths\\.h\"", "private", "<QStandardPaths>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstate\\.h\"", "private", "<QState>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstatemachine\\.h\"", "private", "<QStateMachine>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstorageinfo\\.h\"", "private", "<QStorageInfo>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstring\\.h\"", "private", "<QString>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstringbuilder\\.h\"", "private", "<QStringBuilder>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstringlist\\.h\"", "private", "<QStringList>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstringlistmodel\\.h\"", "private", "<QStringListModel>", "public" ] },
+ { include: [ "@\"(QtCore/)?qstringmatcher\\.h\"", "private", "<QStringMatcher>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsysinfo\\.h\"", "private", "<QSysInfo>", "public" ] },
+ { include: [ "@\"(QtCore/)?qsystemsemaphore\\.h\"", "private", "<QSystemSemaphore>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtcoreversion\\.h\"", "private", "<QtCoreVersion>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtemporarydir\\.h\"", "private", "<QTemporaryDir>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtemporaryfile\\.h\"", "private", "<QTemporaryFile>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtextboundaryfinder\\.h\"", "private", "<QTextBoundaryFinder>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtextcodec\\.h\"", "private", "<QTextCodec>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtextstream\\.h\"", "private", "<QTextStream>", "public" ] },
+ { include: [ "@\"(QtCore/)?qthread\\.h\"", "private", "<QThread>", "public" ] },
+ { include: [ "@\"(QtCore/)?qthreadpool\\.h\"", "private", "<QThreadPool>", "public" ] },
+ { include: [ "@\"(QtCore/)?qthreadstorage\\.h\"", "private", "<QThreadStorage>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtimeline\\.h\"", "private", "<QTimeLine>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtimer\\.h\"", "private", "<QTimer>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtimezone\\.h\"", "private", "<QTimeZone>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtranslator\\.h\"", "private", "<QTranslator>", "public" ] },
+ { include: [ "@\"(QtCore/)?qtypeinfo\\.h\"", "private", "<QTypeInfo>", "public" ] },
+ { include: [ "@\"(QtCore/)?qurl\\.h\"", "private", "<QUrl>", "public" ] },
+ { include: [ "@\"(QtCore/)?qurlquery\\.h\"", "private", "<QUrlQuery>", "public" ] },
+ { include: [ "@\"(QtCore/)?quuid\\.h\"", "private", "<QUuid>", "public" ] },
+ { include: [ "@\"(QtCore/)?qvariant\\.h\"", "private", "<QVariant>", "public" ] },
+ { include: [ "@\"(QtCore/)?qvariantanimation\\.h\"", "private", "<QVariantAnimation>", "public" ] },
+ { include: [ "@\"(QtCore/)?qvarlengtharray\\.h\"", "private", "<QVarLengthArray>", "public" ] },
+ { include: [ "@\"(QtCore/)?qvector\\.h\"", "private", "<QVector>", "public" ] },
+ { include: [ "@\"(QtCore/)?qwaitcondition\\.h\"", "private", "<QWaitCondition>", "public" ] },
+ { include: [ "@\"(QtCore/)?qwineventnotifier\\.h\"", "private", "<QWinEventNotifier>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusabstractadaptor\\.h\"", "private", "<QDBusAbstractAdaptor>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusabstractinterface\\.h\"", "private", "<QDBusAbstractInterface>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusargument\\.h\"", "private", "<QDBusArgument>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusconnection\\.h\"", "private", "<QDBusConnection>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusconnectioninterface\\.h\"", "private", "<QDBusConnectionInterface>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbuscontext\\.h\"", "private", "<QDBusContext>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbuserror\\.h\"", "private", "<QDBusError>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusinterface\\.h\"", "private", "<QDBusInterface>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusmessage\\.h\"", "private", "<QDBusMessage>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusmetatype\\.h\"", "private", "<QDBusMetaType>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbuspendingcall\\.h\"", "private", "<QDBusPendingCall>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbuspendingreply\\.h\"", "private", "<QDBusPendingReply>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusreply\\.h\"", "private", "<QDBusReply>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusserver\\.h\"", "private", "<QDBusServer>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusservicewatcher\\.h\"", "private", "<QDBusServiceWatcher>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusunixfiledescriptor\\.h\"", "private", "<QDBusUnixFileDescriptor>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qdbusvirtualobject\\.h\"", "private", "<QDBusVirtualObject>", "public" ] },
+ { include: [ "@\"(QtDBus/)?qtdbusversion\\.h\"", "private", "<QtDBusVersion>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativecomponent\\.h\"", "private", "<QDeclarativeComponent>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativecontext\\.h\"", "private", "<QDeclarativeContext>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeengine\\.h\"", "private", "<QDeclarativeEngine>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeerror\\.h\"", "private", "<QDeclarativeError>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeexpression\\.h\"", "private", "<QDeclarativeExpression>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeextensioninterface\\.h\"", "private", "<QDeclarativeExtensionInterface>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeextensionplugin\\.h\"", "private", "<QDeclarativeExtensionPlugin>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeimageprovider\\.h\"", "private", "<QDeclarativeImageProvider>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeinfo\\.h\"", "private", "<QDeclarativeInfo>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeitem\\.h\"", "private", "<QDeclarativeItem>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativenetworkaccessmanagerfactory\\.h\"", "private", "<QDeclarativeNetworkAccessManagerFactory>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeparserstatus\\.h\"", "private", "<QDeclarativeParserStatus>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeproperty\\.h\"", "private", "<QDeclarativeProperty>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativepropertymap\\.h\"", "private", "<QDeclarativePropertyMap>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativepropertyvalueinterceptor\\.h\"", "private", "<QDeclarativePropertyValueInterceptor>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativepropertyvaluesource\\.h\"", "private", "<QDeclarativePropertyValueSource>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativescriptstring\\.h\"", "private", "<QDeclarativeScriptString>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qdeclarativeview\\.h\"", "private", "<QDeclarativeView>", "public" ] },
+ { include: [ "@\"(QtDeclarative/)?qtdeclarativeversion\\.h\"", "private", "<QtDeclarativeVersion>", "public" ] },
+ { include: [ "@\"(QtDesigner/)?qdesignerexportwidget\\.h\"", "private", "<QDesignerExportWidget>", "public" ] },
+ { include: [ "@\"(QtDesigner/)?qextensionmanager\\.h\"", "private", "<QExtensionManager>", "public" ] },
+ { include: [ "@\"(QtDesigner/)?qtdesignerversion\\.h\"", "private", "<QtDesignerVersion>", "public" ] },
+ { include: [ "@\"(QtDesignerComponents/)?qtdesignercomponentsversion\\.h\"", "private", "<QtDesignerComponentsVersion>", "public" ] },
+ { include: [ "@\"(QtGui/)?qabstracttextdocumentlayout\\.h\"", "private", "<QAbstractTextDocumentLayout>", "public" ] },
+ { include: [ "@\"(QtGui/)?qaccessible\\.h\"", "private", "<QAccessible>", "public" ] },
+ { include: [ "@\"(QtGui/)?qaccessiblebridge\\.h\"", "private", "<QAccessibleBridge>", "public" ] },
+ { include: [ "@\"(QtGui/)?qaccessibleobject\\.h\"", "private", "<QAccessibleObject>", "public" ] },
+ { include: [ "@\"(QtGui/)?qaccessibleplugin\\.h\"", "private", "<QAccessiblePlugin>", "public" ] },
+ { include: [ "@\"(QtGui/)?qbackingstore\\.h\"", "private", "<QBackingStore>", "public" ] },
+ { include: [ "@\"(QtGui/)?qbitmap\\.h\"", "private", "<QBitmap>", "public" ] },
+ { include: [ "@\"(QtGui/)?qbrush\\.h\"", "private", "<QBrush>", "public" ] },
+ { include: [ "@\"(QtGui/)?qclipboard\\.h\"", "private", "<QClipboard>", "public" ] },
+ { include: [ "@\"(QtGui/)?qcolor\\.h\"", "private", "<QColor>", "public" ] },
+ { include: [ "@\"(QtGui/)?qcursor\\.h\"", "private", "<QCursor>", "public" ] },
+ { include: [ "@\"(QtGui/)?qdesktopservices\\.h\"", "private", "<QDesktopServices>", "public" ] },
+ { include: [ "@\"(QtGui/)?qdrag\\.h\"", "private", "<QDrag>", "public" ] },
+ { include: [ "@\"(QtGui/)?qfont\\.h\"", "private", "<QFont>", "public" ] },
+ { include: [ "@\"(QtGui/)?qfontdatabase\\.h\"", "private", "<QFontDatabase>", "public" ] },
+ { include: [ "@\"(QtGui/)?qfontinfo\\.h\"", "private", "<QFontInfo>", "public" ] },
+ { include: [ "@\"(QtGui/)?qfontmetrics\\.h\"", "private", "<QFontMetrics>", "public" ] },
+ { include: [ "@\"(QtGui/)?qgenericmatrix\\.h\"", "private", "<QGenericMatrix>", "public" ] },
+ { include: [ "@\"(QtGui/)?qgenericplugin\\.h\"", "private", "<QGenericPlugin>", "public" ] },
+ { include: [ "@\"(QtGui/)?qgenericpluginfactory\\.h\"", "private", "<QGenericPluginFactory>", "public" ] },
+ { include: [ "@\"(QtGui/)?qglyphrun\\.h\"", "private", "<QGlyphRun>", "public" ] },
+ { include: [ "@\"(QtGui/)?qguiapplication\\.h\"", "private", "<QGuiApplication>", "public" ] },
+ { include: [ "@\"(QtGui/)?qicon\\.h\"", "private", "<QIcon>", "public" ] },
+ { include: [ "@\"(QtGui/)?qiconengine\\.h\"", "private", "<QIconEngine>", "public" ] },
+ { include: [ "@\"(QtGui/)?qiconengineplugin\\.h\"", "private", "<QIconEnginePlugin>", "public" ] },
+ { include: [ "@\"(QtGui/)?qimage\\.h\"", "private", "<QImage>", "public" ] },
+ { include: [ "@\"(QtGui/)?qimageiohandler\\.h\"", "private", "<QImageIOHandler>", "public" ] },
+ { include: [ "@\"(QtGui/)?qimagereader\\.h\"", "private", "<QImageReader>", "public" ] },
+ { include: [ "@\"(QtGui/)?qimagewriter\\.h\"", "private", "<QImageWriter>", "public" ] },
+ { include: [ "@\"(QtGui/)?qinputmethod\\.h\"", "private", "<QInputMethod>", "public" ] },
+ { include: [ "@\"(QtGui/)?qkeysequence\\.h\"", "private", "<QKeySequence>", "public" ] },
+ { include: [ "@\"(QtGui/)?qmatrix4x4\\.h\"", "private", "<QMatrix4x4>", "public" ] },
+ { include: [ "@\"(QtGui/)?qmatrix\\.h\"", "private", "<QMatrix>", "public" ] },
+ { include: [ "@\"(QtGui/)?qmovie\\.h\"", "private", "<QMovie>", "public" ] },
+ { include: [ "@\"(QtGui/)?qoffscreensurface\\.h\"", "private", "<QOffscreenSurface>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglbuffer\\.h\"", "private", "<QOpenGLBuffer>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglcontext\\.h\"", "private", "<QOpenGLContext>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglframebufferobject\\.h\"", "private", "<QOpenGLFramebufferObject>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions\\.h\"", "private", "<QOpenGLFunctions>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_0\\.h\"", "private", "<QOpenGLFunctions_1_0>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_1\\.h\"", "private", "<QOpenGLFunctions_1_1>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_2\\.h\"", "private", "<QOpenGLFunctions_1_2>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_3\\.h\"", "private", "<QOpenGLFunctions_1_3>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_4\\.h\"", "private", "<QOpenGLFunctions_1_4>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_1_5\\.h\"", "private", "<QOpenGLFunctions_1_5>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_2_0\\.h\"", "private", "<QOpenGLFunctions_2_0>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_2_1\\.h\"", "private", "<QOpenGLFunctions_2_1>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_0\\.h\"", "private", "<QOpenGLFunctions_3_0>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_1\\.h\"", "private", "<QOpenGLFunctions_3_1>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_2_compatibility\\.h\"", "private", "<QOpenGLFunctions_3_2_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_2_core\\.h\"", "private", "<QOpenGLFunctions_3_2_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_3_compatibility\\.h\"", "private", "<QOpenGLFunctions_3_3_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_3_3_core\\.h\"", "private", "<QOpenGLFunctions_3_3_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_0_compatibility\\.h\"", "private", "<QOpenGLFunctions_4_0_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_0_core\\.h\"", "private", "<QOpenGLFunctions_4_0_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_1_compatibility\\.h\"", "private", "<QOpenGLFunctions_4_1_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_1_core\\.h\"", "private", "<QOpenGLFunctions_4_1_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_2_compatibility\\.h\"", "private", "<QOpenGLFunctions_4_2_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_2_core\\.h\"", "private", "<QOpenGLFunctions_4_2_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_3_compatibility\\.h\"", "private", "<QOpenGLFunctions_4_3_Compatibility>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_4_3_core\\.h\"", "private", "<QOpenGLFunctions_4_3_Core>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglfunctions_es2\\.h\"", "private", "<QOpenGLFunctions_ES2>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglpaintdevice\\.h\"", "private", "<QOpenGLPaintDevice>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglpixeltransferoptions\\.h\"", "private", "<QOpenGLPixelTransferOptions>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglshaderprogram\\.h\"", "private", "<QOpenGLShaderProgram>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopengltexture\\.h\"", "private", "<QOpenGLTexture>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopengltimerquery\\.h\"", "private", "<QOpenGLTimerQuery>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglversionfunctions\\.h\"", "private", "<QOpenGLVersionFunctions>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglvertexarrayobject\\.h\"", "private", "<QOpenGLVertexArrayObject>", "public" ] },
+ { include: [ "@\"(QtGui/)?qopenglwindow\\.h\"", "private", "<QOpenGLWindow>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpagedpaintdevice\\.h\"", "private", "<QPagedPaintDevice>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpagelayout\\.h\"", "private", "<QPageLayout>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpagesize\\.h\"", "private", "<QPageSize>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpaintdevice\\.h\"", "private", "<QPaintDevice>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpaintdevicewindow\\.h\"", "private", "<QPaintDeviceWindow>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpaintengine\\.h\"", "private", "<QPaintEngine>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpainter\\.h\"", "private", "<QPainter>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpainterpath\\.h\"", "private", "<QPainterPath>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpalette\\.h\"", "private", "<QPalette>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpdfwriter\\.h\"", "private", "<QPdfWriter>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpen\\.h\"", "private", "<QPen>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpicture\\.h\"", "private", "<QPicture>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpictureformatplugin\\.h\"", "private", "<QPictureFormatPlugin>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpixelformat\\.h\"", "private", "<QPixelFormat>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpixmap\\.h\"", "private", "<QPixmap>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpixmapcache\\.h\"", "private", "<QPixmapCache>", "public" ] },
+ { include: [ "@\"(QtGui/)?qpolygon\\.h\"", "private", "<QPolygon>", "public" ] },
+ { include: [ "@\"(QtGui/)?qquaternion\\.h\"", "private", "<QQuaternion>", "public" ] },
+ { include: [ "@\"(QtGui/)?qrasterwindow\\.h\"", "private", "<QRasterWindow>", "public" ] },
+ { include: [ "@\"(QtGui/)?qrawfont\\.h\"", "private", "<QRawFont>", "public" ] },
+ { include: [ "@\"(QtGui/)?qregion\\.h\"", "private", "<QRegion>", "public" ] },
+ { include: [ "@\"(QtGui/)?qrgb\\.h\"", "private", "<QRgb>", "public" ] },
+ { include: [ "@\"(QtGui/)?qscreen\\.h\"", "private", "<QScreen>", "public" ] },
+ { include: [ "@\"(QtGui/)?qsessionmanager\\.h\"", "private", "<QSessionManager>", "public" ] },
+ { include: [ "@\"(QtGui/)?qstandarditemmodel\\.h\"", "private", "<QStandardItemModel>", "public" ] },
+ { include: [ "@\"(QtGui/)?qstatictext\\.h\"", "private", "<QStaticText>", "public" ] },
+ { include: [ "@\"(QtGui/)?qstylehints\\.h\"", "private", "<QStyleHints>", "public" ] },
+ { include: [ "@\"(QtGui/)?qsurface\\.h\"", "private", "<QSurface>", "public" ] },
+ { include: [ "@\"(QtGui/)?qsurfaceformat\\.h\"", "private", "<QSurfaceFormat>", "public" ] },
+ { include: [ "@\"(QtGui/)?qsyntaxhighlighter\\.h\"", "private", "<QSyntaxHighlighter>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextcursor\\.h\"", "private", "<QTextCursor>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextdocument\\.h\"", "private", "<QTextDocument>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextdocumentfragment\\.h\"", "private", "<QTextDocumentFragment>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextdocumentwriter\\.h\"", "private", "<QTextDocumentWriter>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextformat\\.h\"", "private", "<QTextFormat>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextlayout\\.h\"", "private", "<QTextLayout>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextlist\\.h\"", "private", "<QTextList>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextobject\\.h\"", "private", "<QTextObject>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtextoption\\.h\"", "private", "<QTextOption>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtexttable\\.h\"", "private", "<QTextTable>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtguiversion\\.h\"", "private", "<QtGuiVersion>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtouchdevice\\.h\"", "private", "<QTouchDevice>", "public" ] },
+ { include: [ "@\"(QtGui/)?qtransform\\.h\"", "private", "<QTransform>", "public" ] },
+ { include: [ "@\"(QtGui/)?qvalidator\\.h\"", "private", "<QValidator>", "public" ] },
+ { include: [ "@\"(QtGui/)?qvector2d\\.h\"", "private", "<QVector2D>", "public" ] },
+ { include: [ "@\"(QtGui/)?qvector3d\\.h\"", "private", "<QVector3D>", "public" ] },
+ { include: [ "@\"(QtGui/)?qvector4d\\.h\"", "private", "<QVector4D>", "public" ] },
+ { include: [ "@\"(QtGui/)?qwindow\\.h\"", "private", "<QWindow>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpcontentwidget\\.h\"", "private", "<QHelpContentWidget>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpengine\\.h\"", "private", "<QHelpEngine>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpenginecore\\.h\"", "private", "<QHelpEngineCore>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpindexwidget\\.h\"", "private", "<QHelpIndexWidget>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpsearchengine\\.h\"", "private", "<QHelpSearchEngine>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpsearchquerywidget\\.h\"", "private", "<QHelpSearchQueryWidget>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qhelpsearchresultwidget\\.h\"", "private", "<QHelpSearchResultWidget>", "public" ] },
+ { include: [ "@\"(QtHelp/)?qthelpversion\\.h\"", "private", "<QtHelpVersion>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeocodereply\\.h\"", "private", "<QGeoCodeReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeocodingmanager\\.h\"", "private", "<QGeoCodingManager>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeocodingmanagerengine\\.h\"", "private", "<QGeoCodingManagerEngine>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeomaneuver\\.h\"", "private", "<QGeoManeuver>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoroute\\.h\"", "private", "<QGeoRoute>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoroutereply\\.h\"", "private", "<QGeoRouteReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeorouterequest\\.h\"", "private", "<QGeoRouteRequest>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoroutesegment\\.h\"", "private", "<QGeoRouteSegment>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoroutingmanager\\.h\"", "private", "<QGeoRoutingManager>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoroutingmanagerengine\\.h\"", "private", "<QGeoRoutingManagerEngine>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoserviceprovider\\.h\"", "private", "<QGeoServiceProvider>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qgeoserviceproviderfactory\\.h\"", "private", "<QGeoServiceProviderFactory>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qlocation\\.h\"", "private", "<QLocation>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplace\\.h\"", "private", "<QPlace>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceattribute\\.h\"", "private", "<QPlaceAttribute>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacecategory\\.h\"", "private", "<QPlaceCategory>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacecontactdetail\\.h\"", "private", "<QPlaceContactDetail>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacecontent\\.h\"", "private", "<QPlaceContent>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacecontentreply\\.h\"", "private", "<QPlaceContentReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacecontentrequest\\.h\"", "private", "<QPlaceContentRequest>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacedetailsreply\\.h\"", "private", "<QPlaceDetailsReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceeditorial\\.h\"", "private", "<QPlaceEditorial>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceicon\\.h\"", "private", "<QPlaceIcon>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceidreply\\.h\"", "private", "<QPlaceIdReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceimage\\.h\"", "private", "<QPlaceImage>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacemanager\\.h\"", "private", "<QPlaceManager>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacemanagerengine\\.h\"", "private", "<QPlaceManagerEngine>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacematchreply\\.h\"", "private", "<QPlaceMatchReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacematchrequest\\.h\"", "private", "<QPlaceMatchRequest>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceproposedsearchresult\\.h\"", "private", "<QPlaceProposedSearchResult>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceratings\\.h\"", "private", "<QPlaceRatings>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacereply\\.h\"", "private", "<QPlaceReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceresult\\.h\"", "private", "<QPlaceResult>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacereview\\.h\"", "private", "<QPlaceReview>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacesearchreply\\.h\"", "private", "<QPlaceSearchReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacesearchrequest\\.h\"", "private", "<QPlaceSearchRequest>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacesearchresult\\.h\"", "private", "<QPlaceSearchResult>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacesearchsuggestionreply\\.h\"", "private", "<QPlaceSearchSuggestionReply>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplacesupplier\\.h\"", "private", "<QPlaceSupplier>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qplaceuser\\.h\"", "private", "<QPlaceUser>", "public" ] },
+ { include: [ "@\"(QtLocation/)?qtlocationversion\\.h\"", "private", "<QtLocationVersion>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qabstractvideobuffer\\.h\"", "private", "<QAbstractVideoBuffer>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qabstractvideosurface\\.h\"", "private", "<QAbstractVideoSurface>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudio\\.h\"", "private", "<QAudio>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiobuffer\\.h\"", "private", "<QAudioBuffer>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiodecoder\\.h\"", "private", "<QAudioDecoder>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiodecodercontrol\\.h\"", "private", "<QAudioDecoderControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiodeviceinfo\\.h\"", "private", "<QAudioDeviceInfo>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudioencodersettingscontrol\\.h\"", "private", "<QAudioEncoderSettingsControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudioformat\\.h\"", "private", "<QAudioFormat>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudioinput\\.h\"", "private", "<QAudioInput>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudioinputselectorcontrol\\.h\"", "private", "<QAudioInputSelectorControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiooutput\\.h\"", "private", "<QAudioOutput>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiooutputselectorcontrol\\.h\"", "private", "<QAudioOutputSelectorControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudioprobe\\.h\"", "private", "<QAudioProbe>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiorecorder\\.h\"", "private", "<QAudioRecorder>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qaudiosystemplugin\\.h\"", "private", "<QAudioSystemPlugin>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamera\\.h\"", "private", "<QCamera>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameracapturebufferformatcontrol\\.h\"", "private", "<QCameraCaptureBufferFormatControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameracapturedestinationcontrol\\.h\"", "private", "<QCameraCaptureDestinationControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameracontrol\\.h\"", "private", "<QCameraControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraexposure\\.h\"", "private", "<QCameraExposure>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraexposurecontrol\\.h\"", "private", "<QCameraExposureControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerafeedbackcontrol\\.h\"", "private", "<QCameraFeedbackControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraflashcontrol\\.h\"", "private", "<QCameraFlashControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerafocus\\.h\"", "private", "<QCameraFocus>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerafocuscontrol\\.h\"", "private", "<QCameraFocusControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraimagecapture\\.h\"", "private", "<QCameraImageCapture>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraimagecapturecontrol\\.h\"", "private", "<QCameraImageCaptureControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraimageprocessing\\.h\"", "private", "<QCameraImageProcessing>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraimageprocessingcontrol\\.h\"", "private", "<QCameraImageProcessingControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerainfo\\.h\"", "private", "<QCameraInfo>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerainfocontrol\\.h\"", "private", "<QCameraInfoControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameralockscontrol\\.h\"", "private", "<QCameraLocksControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcameraviewfindersettingscontrol\\.h\"", "private", "<QCameraViewfinderSettingsControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qcamerazoomcontrol\\.h\"", "private", "<QCameraZoomControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qimageencodercontrol\\.h\"", "private", "<QImageEncoderControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaaudioprobecontrol\\.h\"", "private", "<QMediaAudioProbeControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaavailabilitycontrol\\.h\"", "private", "<QMediaAvailabilityControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediabindableinterface\\.h\"", "private", "<QMediaBindableInterface>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediacontainercontrol\\.h\"", "private", "<QMediaContainerControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediacontent\\.h\"", "private", "<QMediaContent>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediacontrol\\.h\"", "private", "<QMediaControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediagaplessplaybackcontrol\\.h\"", "private", "<QMediaGaplessPlaybackControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediametadata\\.h\"", "private", "<QMediaMetaData>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmedianetworkaccesscontrol\\.h\"", "private", "<QMediaNetworkAccessControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaobject\\.h\"", "private", "<QMediaObject>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaplayer\\.h\"", "private", "<QMediaPlayer>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaplayercontrol\\.h\"", "private", "<QMediaPlayerControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaplaylist\\.h\"", "private", "<QMediaPlaylist>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediarecorder\\.h\"", "private", "<QMediaRecorder>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediarecordercontrol\\.h\"", "private", "<QMediaRecorderControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaresource\\.h\"", "private", "<QMediaResource>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaservice\\.h\"", "private", "<QMediaService>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediaserviceproviderplugin\\.h\"", "private", "<QMediaServiceProviderPlugin>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediastreamscontrol\\.h\"", "private", "<QMediaStreamsControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediatimerange\\.h\"", "private", "<QMediaTimeRange>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmediavideoprobecontrol\\.h\"", "private", "<QMediaVideoProbeControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmetadatareadercontrol\\.h\"", "private", "<QMetaDataReaderControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmetadatawritercontrol\\.h\"", "private", "<QMetaDataWriterControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qmultimedia\\.h\"", "private", "<QMultimedia>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qradiodata\\.h\"", "private", "<QRadioData>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qradiodatacontrol\\.h\"", "private", "<QRadioDataControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qradiotuner\\.h\"", "private", "<QRadioTuner>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qradiotunercontrol\\.h\"", "private", "<QRadioTunerControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qsound\\.h\"", "private", "<QSound>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qsoundeffect\\.h\"", "private", "<QSoundEffect>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qtmultimediaversion\\.h\"", "private", "<QtMultimediaVersion>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideodeviceselectorcontrol\\.h\"", "private", "<QVideoDeviceSelectorControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideoencodersettingscontrol\\.h\"", "private", "<QVideoEncoderSettingsControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideoframe\\.h\"", "private", "<QVideoFrame>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideoprobe\\.h\"", "private", "<QVideoProbe>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideorenderercontrol\\.h\"", "private", "<QVideoRendererControl>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideosurfaceformat\\.h\"", "private", "<QVideoSurfaceFormat>", "public" ] },
+ { include: [ "@\"(QtMultimedia/)?qvideowindowcontrol\\.h\"", "private", "<QVideoWindowControl>", "public" ] },
+ { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_i420\\.h\"", "private", "<QSGVideoNode_I420>", "public" ] },
+ { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_rgb\\.h\"", "private", "<QSGVideoNode_RGB>", "public" ] },
+ { include: [ "@\"(QtMultimediaQuick_p/)?qsgvideonode_texture\\.h\"", "private", "<QSGVideoNode_Texture>", "public" ] },
+ { include: [ "@\"(QtMultimediaQuick_p/)?qtmultimediaquick_pversion\\.h\"", "private", "<QtMultimediaQuick_pVersion>", "public" ] },
+ { include: [ "@\"(QtMultimediaWidgets/)?qcameraviewfinder\\.h\"", "private", "<QCameraViewfinder>", "public" ] },
+ { include: [ "@\"(QtMultimediaWidgets/)?qgraphicsvideoitem\\.h\"", "private", "<QGraphicsVideoItem>", "public" ] },
+ { include: [ "@\"(QtMultimediaWidgets/)?qtmultimediawidgetsversion\\.h\"", "private", "<QtMultimediaWidgetsVersion>", "public" ] },
+ { include: [ "@\"(QtMultimediaWidgets/)?qvideowidget\\.h\"", "private", "<QVideoWidget>", "public" ] },
+ { include: [ "@\"(QtMultimediaWidgets/)?qvideowidgetcontrol\\.h\"", "private", "<QVideoWidgetControl>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qabstractnetworkcache\\.h\"", "private", "<QAbstractNetworkCache>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qabstractsocket\\.h\"", "private", "<QAbstractSocket>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qauthenticator\\.h\"", "private", "<QAuthenticator>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qdnslookup\\.h\"", "private", "<QDnsLookup>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qhostaddress\\.h\"", "private", "<QHostAddress>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qhostinfo\\.h\"", "private", "<QHostInfo>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qhttpmultipart\\.h\"", "private", "<QHttpMultiPart>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qlocalserver\\.h\"", "private", "<QLocalServer>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qlocalsocket\\.h\"", "private", "<QLocalSocket>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkaccessmanager\\.h\"", "private", "<QNetworkAccessManager>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkconfiguration\\.h\"", "private", "<QNetworkConfiguration>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkcookie\\.h\"", "private", "<QNetworkCookie>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkcookiejar\\.h\"", "private", "<QNetworkCookieJar>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkdiskcache\\.h\"", "private", "<QNetworkDiskCache>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkinterface\\.h\"", "private", "<QNetworkInterface>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkproxy\\.h\"", "private", "<QNetworkProxy>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkreply\\.h\"", "private", "<QNetworkReply>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworkrequest\\.h\"", "private", "<QNetworkRequest>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qnetworksession\\.h\"", "private", "<QNetworkSession>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qssl\\.h\"", "private", "<QSsl>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslcertificate\\.h\"", "private", "<QSslCertificate>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslcertificateextension\\.h\"", "private", "<QSslCertificateExtension>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslcipher\\.h\"", "private", "<QSslCipher>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslconfiguration\\.h\"", "private", "<QSslConfiguration>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslerror\\.h\"", "private", "<QSslError>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslkey\\.h\"", "private", "<QSslKey>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qsslsocket\\.h\"", "private", "<QSslSocket>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qtcpserver\\.h\"", "private", "<QTcpServer>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qtcpsocket\\.h\"", "private", "<QTcpSocket>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qtnetworkversion\\.h\"", "private", "<QtNetworkVersion>", "public" ] },
+ { include: [ "@\"(QtNetwork/)?qudpsocket\\.h\"", "private", "<QUdpSocket>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndeffilter\\.h\"", "private", "<QNdefFilter>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndefmessage\\.h\"", "private", "<QNdefMessage>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndefnfcsmartposterrecord\\.h\"", "private", "<QNdefNfcSmartPosterRecord>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndefnfctextrecord\\.h\"", "private", "<QNdefNfcTextRecord>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndefnfcurirecord\\.h\"", "private", "<QNdefNfcUriRecord>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qndefrecord\\.h\"", "private", "<QNdefRecord>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qnearfieldmanager\\.h\"", "private", "<QNearFieldManager>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qnearfieldsharemanager\\.h\"", "private", "<QNearFieldShareManager>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qnearfieldsharetarget\\.h\"", "private", "<QNearFieldShareTarget>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qnearfieldtarget\\.h\"", "private", "<QNearFieldTarget>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qqmlndefrecord\\.h\"", "private", "<QQmlNdefRecord>", "public" ] },
+ { include: [ "@\"(QtNfc/)?qtnfcversion\\.h\"", "private", "<QtNfcVersion>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qgl\\.h\"", "private", "<QGL>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglbuffer\\.h\"", "private", "<QGLBuffer>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglcolormap\\.h\"", "private", "<QGLColormap>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglframebufferobject\\.h\"", "private", "<QGLFramebufferObject>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglfunctions\\.h\"", "private", "<QGLFunctions>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglpixelbuffer\\.h\"", "private", "<QGLPixelBuffer>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qglshaderprogram\\.h\"", "private", "<QGLShaderProgram>", "public" ] },
+ { include: [ "@\"(QtOpenGL/)?qtopenglversion\\.h\"", "private", "<QtOpenGLVersion>", "public" ] },
+ { include: [ "@\"(QtOpenGLExtensions/)?qopenglextensions\\.h\"", "private", "<QOpenGLExtensions>", "public" ] },
+ { include: [ "@\"(QtOpenGLExtensions/)?qtopenglextensionsversion\\.h\"", "private", "<QtOpenGLExtensionsVersion>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qcocoanativecontext\\.h\"", "private", "<QCocoaNativeContext>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qeglfsfunctions\\.h\"", "private", "<QEglFSFunctions>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qeglnativecontext\\.h\"", "private", "<QEGLNativeContext>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qglxnativecontext\\.h\"", "private", "<QGLXNativeContext>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qtplatformheadersversion\\.h\"", "private", "<QtPlatformHeadersVersion>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qwglnativecontext\\.h\"", "private", "<QWGLNativeContext>", "public" ] },
+ { include: [ "@\"(QtPlatformHeaders/)?qxcbwindowfunctions\\.h\"", "private", "<QXcbWindowFunctions>", "public" ] },
+ { include: [ "@\"(QtPlatformSupport/)?qtplatformsupportversion\\.h\"", "private", "<QtPlatformSupportVersion>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeoaddress\\.h\"", "private", "<QGeoAddress>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeoareamonitorinfo\\.h\"", "private", "<QGeoAreaMonitorInfo>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeoareamonitorsource\\.h\"", "private", "<QGeoAreaMonitorSource>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeocircle\\.h\"", "private", "<QGeoCircle>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeocoordinate\\.h\"", "private", "<QGeoCoordinate>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeolocation\\.h\"", "private", "<QGeoLocation>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeopositioninfo\\.h\"", "private", "<QGeoPositionInfo>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeopositioninfosource\\.h\"", "private", "<QGeoPositionInfoSource>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeopositioninfosourcefactory\\.h\"", "private", "<QGeoPositionInfoSourceFactory>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeorectangle\\.h\"", "private", "<QGeoRectangle>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeosatelliteinfo\\.h\"", "private", "<QGeoSatelliteInfo>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeosatelliteinfosource\\.h\"", "private", "<QGeoSatelliteInfoSource>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qgeoshape\\.h\"", "private", "<QGeoShape>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qnmeapositioninfosource\\.h\"", "private", "<QNmeaPositionInfoSource>", "public" ] },
+ { include: [ "@\"(QtPositioning/)?qtpositioningversion\\.h\"", "private", "<QtPositioningVersion>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qabstractprintdialog\\.h\"", "private", "<QAbstractPrintDialog>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qpagesetupdialog\\.h\"", "private", "<QPageSetupDialog>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprintdialog\\.h\"", "private", "<QPrintDialog>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprintengine\\.h\"", "private", "<QPrintEngine>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprinter\\.h\"", "private", "<QPrinter>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprinterinfo\\.h\"", "private", "<QPrinterInfo>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprintpreviewdialog\\.h\"", "private", "<QPrintPreviewDialog>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qprintpreviewwidget\\.h\"", "private", "<QPrintPreviewWidget>", "public" ] },
+ { include: [ "@\"(QtPrintSupport/)?qtprintsupportversion\\.h\"", "private", "<QtPrintSupportVersion>", "public" ] },
+ { include: [ "@\"(QtQml/)?qjsengine\\.h\"", "private", "<QJSEngine>", "public" ] },
+ { include: [ "@\"(QtQml/)?qjsvalue\\.h\"", "private", "<QJSValue>", "public" ] },
+ { include: [ "@\"(QtQml/)?qjsvalueiterator\\.h\"", "private", "<QJSValueIterator>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlabstracturlinterceptor\\.h\"", "private", "<QQmlAbstractUrlInterceptor>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlapplicationengine\\.h\"", "private", "<QQmlApplicationEngine>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlcomponent\\.h\"", "private", "<QQmlComponent>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlcontext\\.h\"", "private", "<QQmlContext>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlengine\\.h\"", "private", "<QQmlEngine>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlerror\\.h\"", "private", "<QQmlError>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlexpression\\.h\"", "private", "<QQmlExpression>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlextensioninterface\\.h\"", "private", "<QQmlExtensionInterface>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlextensionplugin\\.h\"", "private", "<QQmlExtensionPlugin>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlfile\\.h\"", "private", "<QQmlFile>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlfileselector\\.h\"", "private", "<QQmlFileSelector>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlincubator\\.h\"", "private", "<QQmlIncubator>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlinfo\\.h\"", "private", "<QQmlInfo>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlnetworkaccessmanagerfactory\\.h\"", "private", "<QQmlNetworkAccessManagerFactory>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlparserstatus\\.h\"", "private", "<QQmlParserStatus>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlproperty\\.h\"", "private", "<QQmlProperty>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlpropertymap\\.h\"", "private", "<QQmlPropertyMap>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlpropertyvaluesource\\.h\"", "private", "<QQmlPropertyValueSource>", "public" ] },
+ { include: [ "@\"(QtQml/)?qqmlscriptstring\\.h\"", "private", "<QQmlScriptString>", "public" ] },
+ { include: [ "@\"(QtQml/)?qtqmlversion\\.h\"", "private", "<QtQmlVersion>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickframebufferobject\\.h\"", "private", "<QQuickFramebufferObject>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickimageprovider\\.h\"", "private", "<QQuickImageProvider>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickitem\\.h\"", "private", "<QQuickItem>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickitemgrabresult\\.h\"", "private", "<QQuickItemGrabResult>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickpainteditem\\.h\"", "private", "<QQuickPaintedItem>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickrendercontrol\\.h\"", "private", "<QQuickRenderControl>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquicktextdocument\\.h\"", "private", "<QQuickTextDocument>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickview\\.h\"", "private", "<QQuickView>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qquickwindow\\.h\"", "private", "<QQuickWindow>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgabstractrenderer\\.h\"", "private", "<QSGAbstractRenderer>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgengine\\.h\"", "private", "<QSGEngine>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgflatcolormaterial\\.h\"", "private", "<QSGFlatColorMaterial>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsggeometry\\.h\"", "private", "<QSGGeometry>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgmaterial\\.h\"", "private", "<QSGMaterial>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgnode\\.h\"", "private", "<QSGNode>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgsimplematerial\\.h\"", "private", "<QSGSimpleMaterial>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgsimplerectnode\\.h\"", "private", "<QSGSimpleRectNode>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgsimpletexturenode\\.h\"", "private", "<QSGSimpleTextureNode>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgtexture\\.h\"", "private", "<QSGTexture>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgtexturematerial\\.h\"", "private", "<QSGTextureMaterial>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgtextureprovider\\.h\"", "private", "<QSGTextureProvider>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qsgvertexcolormaterial\\.h\"", "private", "<QSGVertexColorMaterial>", "public" ] },
+ { include: [ "@\"(QtQuick/)?qtquickversion\\.h\"", "private", "<QtQuickVersion>", "public" ] },
+ { include: [ "@\"(QtQuickParticles/)?qtquickparticlesversion\\.h\"", "private", "<QtQuickParticlesVersion>", "public" ] },
+ { include: [ "@\"(QtQuickTest/)?qtquicktestversion\\.h\"", "private", "<QtQuickTestVersion>", "public" ] },
+ { include: [ "@\"(QtQuickWidgets/)?qquickwidget\\.h\"", "private", "<QQuickWidget>", "public" ] },
+ { include: [ "@\"(QtQuickWidgets/)?qtquickwidgetsversion\\.h\"", "private", "<QtQuickWidgetsVersion>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptable\\.h\"", "private", "<QScriptable>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptclass\\.h\"", "private", "<QScriptClass>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptclasspropertyiterator\\.h\"", "private", "<QScriptClassPropertyIterator>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptcontext\\.h\"", "private", "<QScriptContext>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptcontextinfo\\.h\"", "private", "<QScriptContextInfo>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptengine\\.h\"", "private", "<QScriptEngine>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptengineagent\\.h\"", "private", "<QScriptEngineAgent>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptextensioninterface\\.h\"", "private", "<QScriptExtensionInterface>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptextensionplugin\\.h\"", "private", "<QScriptExtensionPlugin>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptprogram\\.h\"", "private", "<QScriptProgram>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptstring\\.h\"", "private", "<QScriptString>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptvalue\\.h\"", "private", "<QScriptValue>", "public" ] },
+ { include: [ "@\"(QtScript/)?qscriptvalueiterator\\.h\"", "private", "<QScriptValueIterator>", "public" ] },
+ { include: [ "@\"(QtScript/)?qtscriptversion\\.h\"", "private", "<QtScriptVersion>", "public" ] },
+ { include: [ "@\"(QtScriptTools/)?qscriptenginedebugger\\.h\"", "private", "<QScriptEngineDebugger>", "public" ] },
+ { include: [ "@\"(QtScriptTools/)?qtscripttoolsversion\\.h\"", "private", "<QtScriptToolsVersion>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qaccelerometer\\.h\"", "private", "<QAccelerometer>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qaltimeter\\.h\"", "private", "<QAltimeter>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qambientlightsensor\\.h\"", "private", "<QAmbientLightSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qambienttemperaturesensor\\.h\"", "private", "<QAmbientTemperatureSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qcompass\\.h\"", "private", "<QCompass>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qdistancesensor\\.h\"", "private", "<QDistanceSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qgyroscope\\.h\"", "private", "<QGyroscope>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qholstersensor\\.h\"", "private", "<QHolsterSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qirproximitysensor\\.h\"", "private", "<QIRProximitySensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qlightsensor\\.h\"", "private", "<QLightSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qmagnetometer\\.h\"", "private", "<QMagnetometer>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qorientationsensor\\.h\"", "private", "<QOrientationSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qpressuresensor\\.h\"", "private", "<QPressureSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qproximitysensor\\.h\"", "private", "<QProximitySensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qrotationsensor\\.h\"", "private", "<QRotationSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensor\\.h\"", "private", "<QSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensorbackend\\.h\"", "private", "<QSensorBackend>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensorgesture\\.h\"", "private", "<QSensorGesture>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensorgesturemanager\\.h\"", "private", "<QSensorGestureManager>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensorgestureplugininterface\\.h\"", "private", "<QSensorGesturePluginInterface>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensorgesturerecognizer\\.h\"", "private", "<QSensorGestureRecognizer>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qsensormanager\\.h\"", "private", "<QSensorManager>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qtapsensor\\.h\"", "private", "<QTapSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qtiltsensor\\.h\"", "private", "<QTiltSensor>", "public" ] },
+ { include: [ "@\"(QtSensors/)?qtsensorsversion\\.h\"", "private", "<QtSensorsVersion>", "public" ] },
+ { include: [ "@\"(QtSerialPort/)?qlockfile\\.h\"", "private", "<QLockFile>", "public" ] },
+ { include: [ "@\"(QtSerialPort/)?qserialport\\.h\"", "private", "<QSerialPort>", "public" ] },
+ { include: [ "@\"(QtSerialPort/)?qserialportinfo\\.h\"", "private", "<QSerialPortInfo>", "public" ] },
+ { include: [ "@\"(QtSerialPort/)?qtserialportversion\\.h\"", "private", "<QtSerialPortVersion>", "public" ] },
+ { include: [ "@\"(QtSerialPort/)?qwineventnotifier\\.h\"", "private", "<QWinEventNotifier>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsql\\.h\"", "private", "<QSql>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqldatabase\\.h\"", "private", "<QSqlDatabase>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqldriver\\.h\"", "private", "<QSqlDriver>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqldriverplugin\\.h\"", "private", "<QSqlDriverPlugin>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlerror\\.h\"", "private", "<QSqlError>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlfield\\.h\"", "private", "<QSqlField>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlindex\\.h\"", "private", "<QSqlIndex>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlquery\\.h\"", "private", "<QSqlQuery>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlquerymodel\\.h\"", "private", "<QSqlQueryModel>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlrecord\\.h\"", "private", "<QSqlRecord>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlrelationaldelegate\\.h\"", "private", "<QSqlRelationalDelegate>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlrelationaltablemodel\\.h\"", "private", "<QSqlRelationalTableModel>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqlresult\\.h\"", "private", "<QSqlResult>", "public" ] },
+ { include: [ "@\"(QtSql/)?qsqltablemodel\\.h\"", "private", "<QSqlTableModel>", "public" ] },
+ { include: [ "@\"(QtSql/)?qtsqlversion\\.h\"", "private", "<QtSqlVersion>", "public" ] },
+ { include: [ "@\"(QtSvg/)?qgraphicssvgitem\\.h\"", "private", "<QGraphicsSvgItem>", "public" ] },
+ { include: [ "@\"(QtSvg/)?qsvggenerator\\.h\"", "private", "<QSvgGenerator>", "public" ] },
+ { include: [ "@\"(QtSvg/)?qsvgrenderer\\.h\"", "private", "<QSvgRenderer>", "public" ] },
+ { include: [ "@\"(QtSvg/)?qsvgwidget\\.h\"", "private", "<QSvgWidget>", "public" ] },
+ { include: [ "@\"(QtSvg/)?qtsvgversion\\.h\"", "private", "<QtSvgVersion>", "public" ] },
+ { include: [ "@\"(QtTest/)?qsignalspy\\.h\"", "private", "<QSignalSpy>", "public" ] },
+ { include: [ "@\"(QtTest/)?qtest\\.h\"", "private", "<QTest>", "public" ] },
+ { include: [ "@\"(QtTest/)?qtestdata\\.h\"", "private", "<QTestData>", "public" ] },
+ { include: [ "@\"(QtTest/)?qtestevent\\.h\"", "private", "<QTestEvent>", "public" ] },
+ { include: [ "@\"(QtTest/)?qtesteventloop\\.h\"", "private", "<QTestEventLoop>", "public" ] },
+ { include: [ "@\"(QtTest/)?qttestversion\\.h\"", "private", "<QtTestVersion>", "public" ] },
+ { include: [ "@\"(QtUiTools/)?qtuitoolsversion\\.h\"", "private", "<QtUiToolsVersion>", "public" ] },
+ { include: [ "@\"(QtUiTools/)?quiloader\\.h\"", "private", "<QUiLoader>", "public" ] },
+ { include: [ "@\"(QtWebChannel/)?qqmlwebchannel\\.h\"", "private", "<QQmlWebChannel>", "public" ] },
+ { include: [ "@\"(QtWebChannel/)?qtwebchannelversion\\.h\"", "private", "<QtWebChannelVersion>", "public" ] },
+ { include: [ "@\"(QtWebChannel/)?qwebchannel\\.h\"", "private", "<QWebChannel>", "public" ] },
+ { include: [ "@\"(QtWebChannel/)?qwebchannelabstracttransport\\.h\"", "private", "<QWebChannelAbstractTransport>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qtwebkitversion\\.h\"", "private", "<QtWebKitVersion>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebdatabase\\.h\"", "private", "<QWebDatabase>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebelement\\.h\"", "private", "<QWebElement>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebhistory\\.h\"", "private", "<QWebHistory>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebhistoryinterface\\.h\"", "private", "<QWebHistoryInterface>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebkitplatformplugin\\.h\"", "private", "<QWebKitPlatformPlugin>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebpluginfactory\\.h\"", "private", "<QWebPluginFactory>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebsecurityorigin\\.h\"", "private", "<QWebSecurityOrigin>", "public" ] },
+ { include: [ "@\"(QtWebKit/)?qwebsettings\\.h\"", "private", "<QWebSettings>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qgraphicswebview\\.h\"", "private", "<QGraphicsWebView>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qtwebkitwidgetsversion\\.h\"", "private", "<QtWebKitWidgetsVersion>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qwebframe\\.h\"", "private", "<QWebFrame>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qwebinspector\\.h\"", "private", "<QWebInspector>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qwebpage\\.h\"", "private", "<QWebPage>", "public" ] },
+ { include: [ "@\"(QtWebKitWidgets/)?qwebview\\.h\"", "private", "<QWebView>", "public" ] },
+ { include: [ "@\"(QtWebSockets/)?qmaskgenerator\\.h\"", "private", "<QMaskGenerator>", "public" ] },
+ { include: [ "@\"(QtWebSockets/)?qtwebsocketsversion\\.h\"", "private", "<QtWebSocketsVersion>", "public" ] },
+ { include: [ "@\"(QtWebSockets/)?qwebsocket\\.h\"", "private", "<QWebSocket>", "public" ] },
+ { include: [ "@\"(QtWebSockets/)?qwebsocketcorsauthenticator\\.h\"", "private", "<QWebSocketCorsAuthenticator>", "public" ] },
+ { include: [ "@\"(QtWebSockets/)?qwebsocketserver\\.h\"", "private", "<QWebSocketServer>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractbutton\\.h\"", "private", "<QAbstractButton>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractitemdelegate\\.h\"", "private", "<QAbstractItemDelegate>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractitemview\\.h\"", "private", "<QAbstractItemView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractscrollarea\\.h\"", "private", "<QAbstractScrollArea>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractslider\\.h\"", "private", "<QAbstractSlider>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qabstractspinbox\\.h\"", "private", "<QAbstractSpinBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qaccessiblemenu\\.h\"", "private", "<QAccessibleMenu>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qaccessiblewidget\\.h\"", "private", "<QAccessibleWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qaction\\.h\"", "private", "<QAction>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qactiongroup\\.h\"", "private", "<QActionGroup>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qapplication\\.h\"", "private", "<QApplication>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qboxlayout\\.h\"", "private", "<QBoxLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qbuttongroup\\.h\"", "private", "<QButtonGroup>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcalendarwidget\\.h\"", "private", "<QCalendarWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcheckbox\\.h\"", "private", "<QCheckBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcolordialog\\.h\"", "private", "<QColorDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcolormap\\.h\"", "private", "<QColormap>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcolumnview\\.h\"", "private", "<QColumnView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcombobox\\.h\"", "private", "<QComboBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcommandlinkbutton\\.h\"", "private", "<QCommandLinkButton>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcommonstyle\\.h\"", "private", "<QCommonStyle>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qcompleter\\.h\"", "private", "<QCompleter>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdatawidgetmapper\\.h\"", "private", "<QDataWidgetMapper>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdatetimeedit\\.h\"", "private", "<QDateTimeEdit>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdesktopwidget\\.h\"", "private", "<QDesktopWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdial\\.h\"", "private", "<QDial>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdialog\\.h\"", "private", "<QDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdialogbuttonbox\\.h\"", "private", "<QDialogButtonBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdirmodel\\.h\"", "private", "<QDirModel>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qdockwidget\\.h\"", "private", "<QDockWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qerrormessage\\.h\"", "private", "<QErrorMessage>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfiledialog\\.h\"", "private", "<QFileDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfileiconprovider\\.h\"", "private", "<QFileIconProvider>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfilesystemmodel\\.h\"", "private", "<QFileSystemModel>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfocusframe\\.h\"", "private", "<QFocusFrame>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfontcombobox\\.h\"", "private", "<QFontComboBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qfontdialog\\.h\"", "private", "<QFontDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qformlayout\\.h\"", "private", "<QFormLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qframe\\.h\"", "private", "<QFrame>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgesture\\.h\"", "private", "<QGesture>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgesturerecognizer\\.h\"", "private", "<QGestureRecognizer>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsanchorlayout\\.h\"", "private", "<QGraphicsAnchorLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicseffect\\.h\"", "private", "<QGraphicsEffect>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsgridlayout\\.h\"", "private", "<QGraphicsGridLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsitem\\.h\"", "private", "<QGraphicsItem>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsitemanimation\\.h\"", "private", "<QGraphicsItemAnimation>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicslayout\\.h\"", "private", "<QGraphicsLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicslayoutitem\\.h\"", "private", "<QGraphicsLayoutItem>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicslinearlayout\\.h\"", "private", "<QGraphicsLinearLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsproxywidget\\.h\"", "private", "<QGraphicsProxyWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsscene\\.h\"", "private", "<QGraphicsScene>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicssceneevent\\.h\"", "private", "<QGraphicsSceneEvent>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicstransform\\.h\"", "private", "<QGraphicsTransform>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicsview\\.h\"", "private", "<QGraphicsView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgraphicswidget\\.h\"", "private", "<QGraphicsWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgridlayout\\.h\"", "private", "<QGridLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qgroupbox\\.h\"", "private", "<QGroupBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qheaderview\\.h\"", "private", "<QHeaderView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qinputdialog\\.h\"", "private", "<QInputDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qitemdelegate\\.h\"", "private", "<QItemDelegate>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qitemeditorfactory\\.h\"", "private", "<QItemEditorFactory>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qkeyeventtransition\\.h\"", "private", "<QKeyEventTransition>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qkeysequenceedit\\.h\"", "private", "<QKeySequenceEdit>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlabel\\.h\"", "private", "<QLabel>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlayout\\.h\"", "private", "<QLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlayoutitem\\.h\"", "private", "<QLayoutItem>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlcdnumber\\.h\"", "private", "<QLCDNumber>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlineedit\\.h\"", "private", "<QLineEdit>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlistview\\.h\"", "private", "<QListView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qlistwidget\\.h\"", "private", "<QListWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmainwindow\\.h\"", "private", "<QMainWindow>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmdiarea\\.h\"", "private", "<QMdiArea>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmdisubwindow\\.h\"", "private", "<QMdiSubWindow>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmenu\\.h\"", "private", "<QMenu>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmenubar\\.h\"", "private", "<QMenuBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmessagebox\\.h\"", "private", "<QMessageBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qmouseeventtransition\\.h\"", "private", "<QMouseEventTransition>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qopenglwidget\\.h\"", "private", "<QOpenGLWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qplaintextedit\\.h\"", "private", "<QPlainTextEdit>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qprogressbar\\.h\"", "private", "<QProgressBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qprogressdialog\\.h\"", "private", "<QProgressDialog>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qproxystyle\\.h\"", "private", "<QProxyStyle>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qpushbutton\\.h\"", "private", "<QPushButton>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qradiobutton\\.h\"", "private", "<QRadioButton>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qrubberband\\.h\"", "private", "<QRubberBand>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qscrollarea\\.h\"", "private", "<QScrollArea>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qscrollbar\\.h\"", "private", "<QScrollBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qscroller\\.h\"", "private", "<QScroller>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qscrollerproperties\\.h\"", "private", "<QScrollerProperties>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qshortcut\\.h\"", "private", "<QShortcut>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qsizegrip\\.h\"", "private", "<QSizeGrip>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qsizepolicy\\.h\"", "private", "<QSizePolicy>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qslider\\.h\"", "private", "<QSlider>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qspinbox\\.h\"", "private", "<QSpinBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qsplashscreen\\.h\"", "private", "<QSplashScreen>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qsplitter\\.h\"", "private", "<QSplitter>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstackedlayout\\.h\"", "private", "<QStackedLayout>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstackedwidget\\.h\"", "private", "<QStackedWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstatusbar\\.h\"", "private", "<QStatusBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstyle\\.h\"", "private", "<QStyle>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstyleditemdelegate\\.h\"", "private", "<QStyledItemDelegate>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstylefactory\\.h\"", "private", "<QStyleFactory>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstyleoption\\.h\"", "private", "<QStyleOption>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstylepainter\\.h\"", "private", "<QStylePainter>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qstyleplugin\\.h\"", "private", "<QStylePlugin>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qsystemtrayicon\\.h\"", "private", "<QSystemTrayIcon>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtabbar\\.h\"", "private", "<QTabBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtableview\\.h\"", "private", "<QTableView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtablewidget\\.h\"", "private", "<QTableWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtabwidget\\.h\"", "private", "<QTabWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtextbrowser\\.h\"", "private", "<QTextBrowser>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtextedit\\.h\"", "private", "<QTextEdit>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtoolbar\\.h\"", "private", "<QToolBar>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtoolbox\\.h\"", "private", "<QToolBox>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtoolbutton\\.h\"", "private", "<QToolButton>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtooltip\\.h\"", "private", "<QToolTip>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtreeview\\.h\"", "private", "<QTreeView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtreewidget\\.h\"", "private", "<QTreeWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtreewidgetitemiterator\\.h\"", "private", "<QTreeWidgetItemIterator>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qtwidgetsversion\\.h\"", "private", "<QtWidgetsVersion>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qundogroup\\.h\"", "private", "<QUndoGroup>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qundostack\\.h\"", "private", "<QUndoStack>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qundoview\\.h\"", "private", "<QUndoView>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qwhatsthis\\.h\"", "private", "<QWhatsThis>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qwidget\\.h\"", "private", "<QWidget>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qwidgetaction\\.h\"", "private", "<QWidgetAction>", "public" ] },
+ { include: [ "@\"(QtWidgets/)?qwizard\\.h\"", "private", "<QWizard>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qtwinextrasversion\\.h\"", "private", "<QtWinExtrasVersion>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinevent\\.h\"", "private", "<QWinEvent>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinjumplist\\.h\"", "private", "<QWinJumpList>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinjumplistcategory\\.h\"", "private", "<QWinJumpListCategory>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinjumplistitem\\.h\"", "private", "<QWinJumpListItem>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinmime\\.h\"", "private", "<QWinMime>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwintaskbarbutton\\.h\"", "private", "<QWinTaskbarButton>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwintaskbarprogress\\.h\"", "private", "<QWinTaskbarProgress>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinthumbnailtoolbar\\.h\"", "private", "<QWinThumbnailToolBar>", "public" ] },
+ { include: [ "@\"(QtWinExtras/)?qwinthumbnailtoolbutton\\.h\"", "private", "<QWinThumbnailToolButton>", "public" ] },
+ { include: [ "@\"(QtXml/)?qtxmlversion\\.h\"", "private", "<QtXmlVersion>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qabstractmessagehandler\\.h\"", "private", "<QAbstractMessageHandler>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qabstracturiresolver\\.h\"", "private", "<QAbstractUriResolver>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qabstractxmlnodemodel\\.h\"", "private", "<QAbstractXmlNodeModel>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qabstractxmlreceiver\\.h\"", "private", "<QAbstractXmlReceiver>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qsimplexmlnodemodel\\.h\"", "private", "<QSimpleXmlNodeModel>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qsourcelocation\\.h\"", "private", "<QSourceLocation>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qtxmlpatternsversion\\.h\"", "private", "<QtXmlPatternsVersion>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlformatter\\.h\"", "private", "<QXmlFormatter>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlname\\.h\"", "private", "<QXmlName>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlnamepool\\.h\"", "private", "<QXmlNamePool>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlquery\\.h\"", "private", "<QXmlQuery>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlresultitems\\.h\"", "private", "<QXmlResultItems>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlschema\\.h\"", "private", "<QXmlSchema>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlschemavalidator\\.h\"", "private", "<QXmlSchemaValidator>", "public" ] },
+ { include: [ "@\"(QtXmlPatterns/)?qxmlserializer\\.h\"", "private", "<QXmlSerializer>", "public" ] },
+
+# And lastly, things stored in difficult places
+ { include: [ "@\"(QtCore/)?qobjectdefs\\.h\"", "private", "<QObject>", "public" ] },
+ { include: [ "@\"(QtCore/)?qglobal\\.h\"", "private", "<QtGlobal>", "public" ] },
+ { include: [ "@\"(QtCore/)?qnamespace\\.h\"", "private", "<Qt>", "public" ] },
+ { include: [ "@\"(QtCore/)?qlogging\\.h\"", "private", "<QtDebug>", "public" ] }, #qDebug, qWarning, etc
+ { include: [ "@\"(QtCore/)?qalgorithms\\.h\"", "private", "<QtAlgorithms>", "public" ] }, #qSort, etc
+ { include: [ "@\"(QtWinExtras/)?qwinfunctions\\.h\"", "private", "<QtWin>", "public" ] }, # for fromHICON
+
+# These ones are just madness. For instance, why with the above do we get
+# #include "QtCore/qcoreevent.h" // for QEvent (ptr only), etc
+ { include: [ "@\"(QtCore/)?qcoreevent\\.h\"", "private", "<QEvent>", "public" ] },
+
+# You'll get these and probably have to ignore them. I'm not sure how to deal with these.
+#include "QtCore/qtypetraits.h" // for remove_reference<>::type
+#include "QtCore/qsharedpointer_impl.h" // for swap
+#include "QtCore/qatomic_msvc.h"
+
+]
diff --git a/run_iwyu_tests.py b/run_iwyu_tests.py
new file mode 100755
index 0000000..7e31b19
--- /dev/null
+++ b/run_iwyu_tests.py
@@ -0,0 +1,264 @@
+#!/usr/bin/env python
+
+##===--- run_iwyu_tests.py - include-what-you-use test framework driver ---===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+"""A test harness for IWYU testing."""
+
+__author__ = 'dsturtevant@google.com (Dean Sturtevant)'
+
+import glob
+import os
+import re
+import sys
+import unittest
+import logging
+logging.basicConfig(level=logging.INFO)
+import posixpath
+from fnmatch import fnmatch
+import iwyu_test_util
+
+
+def PosixPath(path):
+ """Normalize Windows path separators to POSIX path separators."""
+ return path.replace('\\', '/')
+
+
+def Partition(l, delimiter):
+ try:
+ delim_index = l.index(delimiter)
+ except ValueError:
+ return l, []
+
+ return l[:delim_index], l[delim_index+1:]
+
+
+class OneIwyuTest(unittest.TestCase):
+ """Superclass for tests. A subclass per test-file is created at runtime."""
+
+ def CheckAlsoExtension(self, extension):
+ """Return a suitable iwyu flag for checking files with the given extension.
+ """
+ return '--check_also="%s"' % posixpath.join(self.rootdir, '*' + extension)
+
+ def MappingFile(self, filename):
+ """Return a suitable iwyu flag for adding the given mapping file."""
+ return '--mapping_file=%s' % posixpath.join(self.rootdir, filename)
+
+ def Include(self, filename):
+ """Return a -include switch for clang to force include of file."""
+ return '-include %s' % posixpath.join(self.rootdir, filename)
+
+ def setUp(self):
+ # Iwyu flags for specific tests.
+ # Map from filename to flag list. If any test requires special
+ # iwyu flags to run properly, add an entry to the map with
+ # key=cc-filename (relative to self.rootdir), value=list of flags.
+ flags_map = {
+ 'backwards_includes.cc': [self.CheckAlsoExtension('-d*.h')],
+ 'badinc.cc': [self.MappingFile('badinc.imp')],
+ 'check_also.cc': [self.CheckAlsoExtension('-d1.h')],
+ 'implicit_ctor.cc': [self.CheckAlsoExtension('-d1.h')],
+ 'iwyu_stricter_than_cpp.cc': [self.CheckAlsoExtension('-autocast.h'),
+ self.CheckAlsoExtension('-fnreturn.h'),
+ self.CheckAlsoExtension('-typedefs.h'),
+ self.CheckAlsoExtension('-d2.h')],
+ 'keep_mapping.cc': [self.CheckAlsoExtension('-public.h'),
+ self.MappingFile('keep_mapping.imp')],
+ 'macro_location.cc': [self.CheckAlsoExtension('-d2.h')],
+ 'non_transitive_include.cc': [self.CheckAlsoExtension('-d*.h'),
+ '--transitive_includes_only'],
+ 'no_h_includes_cc.cc': [self.CheckAlsoExtension('.c')],
+ 'no_comments.cc': ['--no_comments'],
+ 'overloaded_class.cc': [self.CheckAlsoExtension('-i1.h')],
+ 'pch_in_code.cc': ['--pch_in_code', '--prefix_header_includes=remove'],
+ 'prefix_header_attribution.cc': ['--prefix_header_includes=remove'],
+ 'prefix_header_includes_add.cc': ['--prefix_header_includes=add'],
+ 'prefix_header_includes_keep.cc': ['--prefix_header_includes=keep'],
+ 'prefix_header_includes_remove.cc': ['--prefix_header_includes=remove'],
+ 'prefix_header_operator_new.cc': ['--prefix_header_includes=remove'],
+ }
+ prefix_headers = [self.Include('prefix_header_includes-d1.h'),
+ self.Include('prefix_header_includes-d2.h'),
+ self.Include('prefix_header_includes-d3.h'),
+ self.Include('prefix_header_includes-d4.h')]
+ clang_flags_map = {
+ 'alias_template.cc': ['-std=c++11'],
+ 'auto_type_within_template.cc': ['-std=c++11'],
+ # MSVC targets need to explicitly enable exceptions, so we do it for all.
+ 'catch.cc': ['-fcxx-exceptions', '-fexceptions'],
+ 'clmode.cc': ['--driver-mode=cl', '/GF', '/Os', '/W2'],
+ 'conversion_ctor.cc': ['-std=c++11'],
+ 'deleted_implicit.cc' : ['-std=c++11'],
+ 'funcptrs.cc': ['-Wno-unused'],
+ 'lambda_fwd_decl.cc': ['-std=c++11'],
+ 'lateparsed_template.cc': ['-fdelayed-template-parsing'],
+ 'macro_defined_by_includer.cc': [
+ '-std=c++11', '-DCOMMAND_LINE_TYPE=double',
+ self.Include('macro_defined_by_includer-prefix.h')],
+ 'ms_inline_asm.cc': ['-fms-extensions'],
+ 'prefix_header_attribution.cc': [self.Include('prefix_header_attribution-d1.h')],
+ 'prefix_header_includes_add.cc': prefix_headers,
+ 'prefix_header_includes_keep.cc': prefix_headers,
+ 'prefix_header_includes_remove.cc': prefix_headers,
+ 'typedef_in_template.cc': ['-std=c++11'],
+ 'inheriting_ctor.cc': ['-std=c++11'],
+ }
+ include_map = {
+ 'alias_template.cc': ['.'],
+ 'array.cc': ['.'],
+ 'associated_h_file_heuristic.cc': ['.'],
+ 'associated_include.cc': ['.'],
+ 'backwards_includes.cc': ['.'],
+ 'badinc.cc': ['.'],
+ 'badinc-extradef.cc': ['.'],
+ 'funcptrs.cc': ['.'],
+ 'casts.cc': ['.'],
+ 'catch.cc': ['.'],
+ 'check_also.cc': ['.'],
+ 'clmode.cc': ['.'],
+ 'comment_pragmas.cc': ['.'],
+ 'computed_include.cc': ['.'],
+ 'conversion_ctor.cc': ['.'],
+ 'cvr.cc': ['.'],
+ 'default_template_arg_other_file.cc': ['.'],
+ 'depopulated_h_file.cc': ['.'],
+ 'derived_function_tpl_args.cc': ['.'],
+ 'double_include.cc': ['.'],
+ 'elaborated_struct.c': ['.'],
+ 'elaborated_type.cc': ['.'],
+ 'external_including_internal.cc': ['.'],
+ 'forward_declare_in_macro.cc': ['.'],
+ 'fullinfo_for_templates.cc': ['.'],
+ 'fwd_decl_class_template.cc': ['.'],
+ 'fwd_decl_static_member.cc': ['.'],
+ 'fwd_decl_with_instantiation.cc': ['.'],
+ 'header_in_subfolder.cc': ['.'],
+ 'implicit_ctor.cc': ['.'],
+ 'include_cycle.cc': ['.'],
+ 'include_with_using.cc': ['.'],
+ 'internal/internal_files.cc': ['.'],
+ 'iwyu_stricter_than_cpp.cc': ['.'],
+ 'keep_mapping.cc': ['.'],
+ 'lateparsed_template.cc': ['.'],
+ 'macro_defined_by_includer.cc': ['.'],
+ 'macro_location.cc': ['.'],
+ 'member_expr.cc': ['.'],
+ 'multiple_include_paths.cc': ['.'],
+ 'new_header_path_provided.cc': ['.'],
+ 'no_comments.cc': ['.'],
+ 'no_fwd_decl_nested_class.cc': ['.'],
+ 'no_h_includes_cc.cc': ['.'],
+ 'non_transitive_include.cc': ['.'],
+ 'overloaded_class.cc': ['.'],
+ 'pch_in_code.cc': ['.'],
+ 'pointer_arith.cc': ['.'],
+ 'pragma_associated.cc': ['.'],
+ 'precomputed_tpl_args.cc': ['.'],
+ 'prefix_header_attribution.cc': ['.'],
+ 'prefix_header_includes_add.cc': ['.'],
+ 'prefix_header_includes_keep.cc': ['.'],
+ 'prefix_header_includes_remove.cc': ['.'],
+ 're_fwd_decl.cc': ['.'],
+ 'redecls.cc': ['.'],
+ 'remove_fwd_decl_when_including.cc': ['.'],
+ 'self_include.cc': ['.'],
+ 'sizeof_reference.cc': ['.'],
+ 'specialization_needs_decl.cc': ['.'],
+ 'system_namespaces.cc': ['.'],
+ 'template_args.cc': ['.'],
+ 'templated_constructor.cc': ['.'],
+ 'template_specialization.cc': ['.'],
+ 'typedef_chain_in_template.cc': ['.'],
+ 'typedef_chain_no_follow.cc': ['.'],
+ 'typedef_in_template.cc': ['.'],
+ 'typedefs_and_resugaring.cc': ['.'],
+ 'unused_class_template_ctor.cc': ['.'],
+ 'uses_printf.cc': ['.'],
+ 'using_aliased_symbol.cc': ['.'],
+ 'using_aliased_symbol_unused.cc': ['.'],
+ 'varargs_and_references.cc': ['.'],
+ 'virtual_tpl_method.cc': ['.'],
+ }
+ # Internally, we like it when the paths start with rootdir.
+ self._iwyu_flags_map = dict((posixpath.join(self.rootdir, k), v)
+ for (k,v) in flags_map.items())
+ self._clang_flags_map = dict((posixpath.join(self.rootdir, k), v)
+ for (k,v) in clang_flags_map.items())
+ self._include_map = dict((posixpath.join(self.rootdir, k), ['-I ' + include for include in v])
+ for (k,v) in include_map.items())
+
+ def RunOneTest(self, filename):
+ logging.info('Testing iwyu on %s', filename)
+ # Split full/path/to/foo.cc into full/path/to/foo and .cc.
+ (all_but_extension, _) = os.path.splitext(filename)
+ (dirname, basename) = os.path.split(all_but_extension)
+ # Generate diagnostics on all foo-* files (well, not other
+ # foo-*.cc files, which is not kosher but is legal), in addition
+ # to foo.h (if present) and foo.cc.
+ all_files = (glob.glob('%s-*' % all_but_extension) +
+ glob.glob('%s/*/%s-*' % (dirname, basename)) +
+ glob.glob('%s.h' % all_but_extension) +
+ glob.glob('%s/*/%s.h' % (dirname, basename)))
+ files_to_check = [f for f in all_files if not fnmatch(f, self.pattern)]
+ files_to_check.append(filename)
+
+ # IWYU emits summaries with canonicalized filepaths, where all the
+ # directory separators are set to '/'. In order for the testsuite to
+ # correctly match up file summaries, we must canonicalize the filepaths
+ # in the same way here.
+ files_to_check = [PosixPath(f) for f in files_to_check]
+
+ iwyu_flags = self._iwyu_flags_map.get(filename, None)
+ clang_flags = self._clang_flags_map.get(filename, [])
+ clang_flags.extend(self._include_map.get(filename, []))
+ iwyu_test_util.TestIwyuOnRelativeFile(self, filename, files_to_check,
+ iwyu_flags, clang_flags, verbose=True)
+
+
+def RegisterFilesForTesting(rootdir, pattern):
+ """Create a test-class for every file in rootdir matching pattern."""
+ filenames = []
+ for (dirpath, dirs, files) in os.walk(rootdir):
+ dirpath = PosixPath(dirpath) # Normalize path separators.
+ filenames.extend(posixpath.join(dirpath, f) for f in files
+ if fnmatch(f, pattern))
+ if not filenames:
+ print('No tests found in %s!' % os.path.abspath(rootdir))
+ return
+
+ module = sys.modules[__name__]
+
+ for filename in filenames:
+ all_but_extension = os.path.splitext(filename)[0]
+ basename = os.path.basename(all_but_extension)
+ class_name = re.sub('[^0-9a-zA-Z_]', '_', basename) # python-clean
+ if class_name[0].isdigit(): # classes can't start with a number
+ class_name = '_' + class_name
+ while class_name in module.__dict__: # already have a class with that name
+ class_name += '2' # just append a suffix :-)
+
+ logging.info('Registering %s to test %s', class_name, filename)
+ test_class = type(class_name, # class name
+ (OneIwyuTest,), # superclass
+ # and attrs. f=filename is required for proper scoping
+ {'runTest': lambda self, f=filename: self.RunOneTest(f),
+ 'rootdir': rootdir,
+ 'pattern': pattern})
+ setattr(module, test_class.__name__, test_class)
+
+
+if __name__ == '__main__':
+ unittest_args, additional_args = Partition(sys.argv, '--')
+ if additional_args:
+ iwyu_test_util.SetIwyuPath(additional_args[0])
+
+ RegisterFilesForTesting('tests/cxx', '*.cc')
+ RegisterFilesForTesting('tests/c', '*.c')
+ unittest.main(argv=unittest_args)
diff --git a/scrub-logs.py b/scrub-logs.py
new file mode 100755
index 0000000..d314862
--- /dev/null
+++ b/scrub-logs.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+
+##===---------- scrub-logs.py - generate README from Wiki sources ---------===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+"""Scrub irrelevant details from IWYU/Clang logs.
+
+When Clang changes upstream, we usually look for differences in the AST to
+explain the new behavior. This script makes that easier by scrubbing pointer
+values and path prefixes from ast-dump output, so they can be diffed directly.
+"""
+
+import re
+import sys
+import fileinput
+
+
+def strip_path_prefix(line):
+ line = re.sub(r'<.*(llvm[\\/]tools[\\/].*):', r'<\1:', line)
+ return line
+
+
+def strip_addrs(line):
+ line = re.sub(r'\b(0x)?[0-9A-Fa-f]{6,16}', '', line)
+ return line
+
+
+def main():
+ for line in fileinput.input():
+ line = line.strip()
+ line = strip_addrs(line)
+ line = strip_path_prefix(line)
+ print(line)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/stl.c.headers.imp b/stl.c.headers.imp
new file mode 100644
index 0000000..59a238d
--- /dev/null
+++ b/stl.c.headers.imp
@@ -0,0 +1,42 @@
+[
+ # Allow the C++ wrappers around C files. Without these mappings,
+ # if you #include <cstdio>, iwyu will tell you to replace it with
+ # <stdio.h>, which is where the symbols are actually defined. We
+ # inhibit that behavior to keep the <cstdio> alone. Note this is a
+ # public-to-public mapping: we don't want to *replace* <assert.h>
+ # with <cassert>, we just want to avoid suggesting changing
+ # <cassert> back to <assert.h>. (If you *did* want to replace
+ # assert.h with cassert, you'd change it to a public->private
+ # mapping.) Here is how I identified the files to map:
+ # $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
+ #
+ # These headers are defined in C++14 [headers]p3. You can get them with
+ # $ sed -n '/begin{floattable}.*{tab:cpp.c.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{<c(.*)>}/ && print qq@ { include: [ "<$1.h>", public, "<c$1>", public ] },@' | sort
+ # on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
+ { include: [ "<assert.h>", public, "<cassert>", public ] },
+ { include: [ "<complex.h>", public, "<ccomplex>", public ] },
+ { include: [ "<ctype.h>", public, "<cctype>", public ] },
+ { include: [ "<errno.h>", public, "<cerrno>", public ] },
+ { include: [ "<fenv.h>", public, "<cfenv>", public ] },
+ { include: [ "<float.h>", public, "<cfloat>", public ] },
+ { include: [ "<inttypes.h>", public, "<cinttypes>", public ] },
+ { include: [ "<iso646.h>", public, "<ciso646>", public ] },
+ { include: [ "<limits.h>", public, "<climits>", public ] },
+ { include: [ "<locale.h>", public, "<clocale>", public ] },
+ { include: [ "<math.h>", public, "<cmath>", public ] },
+ { include: [ "<setjmp.h>", public, "<csetjmp>", public ] },
+ { include: [ "<signal.h>", public, "<csignal>", public ] },
+ { include: [ "<stdalign.h>", public, "<cstdalign>", public ] },
+ { include: [ "<stdarg.h>", public, "<cstdarg>", public ] },
+ { include: [ "<stdbool.h>", public, "<cstdbool>", public ] },
+ { include: [ "<stddef.h>", public, "<cstddef>", public ] },
+ { include: [ "<stdint.h>", public, "<cstdint>", public ] },
+ { include: [ "<stdio.h>", public, "<cstdio>", public ] },
+ { include: [ "<stdlib.h>", public, "<cstdlib>", public ] },
+ { include: [ "<string.h>", public, "<cstring>", public ] },
+ { include: [ "<tgmath.h>", public, "<ctgmath>", public ] },
+ { include: [ "<time.h>", public, "<ctime>", public ] },
+ { include: [ "<uchar.h>", public, "<cuchar>", public ] },
+ { include: [ "<wchar.h>", public, "<cwchar>", public ] },
+ { include: [ "<wctype.h>", public, "<cwctype>", public ] },
+]
diff --git a/tests/c/elaborated_struct-d1.h b/tests/c/elaborated_struct-d1.h
new file mode 100644
index 0000000..8c530e9
--- /dev/null
+++ b/tests/c/elaborated_struct-d1.h
@@ -0,0 +1,13 @@
+//===--- elaborated_struct-d1.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct Struct {
+ int a;
+ int b;
+};
diff --git a/tests/c/elaborated_struct.c b/tests/c/elaborated_struct.c
new file mode 100644
index 0000000..4aa1088
--- /dev/null
+++ b/tests/c/elaborated_struct.c
@@ -0,0 +1,35 @@
+//===--- elaborated_struct.c - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/c/elaborated_struct-d1.h"
+
+// C basically never requires an explicit forward declaration, all uses of
+// structs are elaborated.
+struct AnotherStruct* s = 0; // No diagnostic expected.
+struct YetAnotherStruct* ReturnAStruct(); // No diagnostic expected.
+typedef struct TypedeffedStruct TypedeffedStruct; // No diagnostic expected.
+
+// However, if an elaborated struct declaration appears in the parameter list
+// of a function declaration, Clang will throw a warning that the declaration
+// won't be visible outside the function. We avoid that warning by suggesting
+// that an explicit forward declaration would be better.
+int UseStruct(struct Struct* s);
+
+/**** IWYU_SUMMARY
+
+tests/c/elaborated_struct.c should add these lines:
+struct Struct;
+
+tests/c/elaborated_struct.c should remove these lines:
+- #include "tests/c/elaborated_struct-d1.h" // lines XX-XX
+
+The full include-list for tests/c/elaborated_struct.c:
+struct Struct;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/alias_template.cc b/tests/cxx/alias_template.cc
new file mode 100644
index 0000000..e25032b
--- /dev/null
+++ b/tests/cxx/alias_template.cc
@@ -0,0 +1,47 @@
+//===--- alias_template.cc - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests alias templates. Does not test type aliases.
+
+#include "tests/cxx/direct.h"
+
+template<class T> struct FullUseTemplateArg {
+ char argument[sizeof(T)];
+};
+
+// Test that we go through alias template and handle aliased template
+// specialization.
+template<class T> using Alias = FullUseTemplateArg<T>;
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*indirect.h
+Alias<IndirectClass> alias;
+
+// Test following through entire chain of aliases.
+template<class T> using AliasChain1 = FullUseTemplateArg<T>;
+template<class T> using AliasChain2 = AliasChain1<T>;
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*indirect.h
+AliasChain2<IndirectClass> aliasChain;
+
+// Test the case when aliased type isn't a template specialization.
+template<class T> using Pointer = T*;
+Pointer<int> intPtr;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/alias_template.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/alias_template.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/alias_template.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/anonymous_struct.cc b/tests/cxx/anonymous_struct.cc
new file mode 100644
index 0000000..37f9925
--- /dev/null
+++ b/tests/cxx/anonymous_struct.cc
@@ -0,0 +1,80 @@
+//===--- anonymous_struct.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that anonymous structs, unions, and enums don't cause iwyu problems.
+
+union {
+ int x;
+ int y;
+} my_union;
+
+struct {
+ int a;
+ int b;
+} my_struct;
+
+enum { A, B } my_enum;
+
+// This isn't an anonymous struct, but I'm sneaking it in anyway,
+// since it's used in the same context we often see anonymous structs
+// used.
+
+struct DefinePlusVarStruct {
+ int d1;
+ int d2;
+} my_define_plus_struct;
+
+// Inside a struct
+
+struct Foo {
+ union {
+ int sx;
+ int sy;
+ } struct_union;
+ struct {
+ int sa;
+ int sb;
+ } struct_struct;
+ struct DefinePlusVarStruct {
+ int sd1;
+ int sd2;
+ } struct_define_plus_struct;
+ enum { SA, SB } struct_enum;
+};
+
+// Part of a typedef (very common in C!)
+
+typedef union {
+ int tu;
+ int ty;
+} typedef_union;
+
+typedef struct {
+ int ta;
+ int tb;
+} typedef_struct;
+
+typedef struct typedef_struct_with_label {
+ int td1;
+ int td2;
+} typedef_struct_with_label;
+
+typedef enum { TA, TB } typedef_enum;
+
+typedef_union tu;
+typedef_struct ts;
+typedef_struct_with_label tswl;
+typedef_enum te;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/anonymous_struct.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/array.cc b/tests/cxx/array.cc
new file mode 100644
index 0000000..73c8311
--- /dev/null
+++ b/tests/cxx/array.cc
@@ -0,0 +1,41 @@
+//===--- array.cc - test input file for iwyu ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we handle correctly identify a[i] as a full use of a.
+
+#include "tests/cxx/direct.h"
+
+class A {
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass *getIndirectClass(int i) {
+ // IWYU: IndirectClass is...*indirect.h
+ (void) sizeof(_b[i]); // requires full type
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ (void) sizeof(&(_b[i])); // requires full type
+ // IWYU: IndirectClass is...*indirect.h
+ return &(_b[i]);
+ }
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass *_b;
+};
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/array.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/array.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/array.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/associated_h_file_heuristic.cc b/tests/cxx/associated_h_file_heuristic.cc
new file mode 100644
index 0000000..e92565b
--- /dev/null
+++ b/tests/cxx/associated_h_file_heuristic.cc
@@ -0,0 +1,30 @@
+//===--- associated_h_file_heuristic.cc - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we correctly say that a .h is an 'associated' .h file
+// of a .cc file if it occurs first and shares a basename.
+
+#include "tests/cxx/internal/associated_h_file_heuristic.h"
+#include <stdio.h>
+#include <time.h>
+
+FILE* f = 0;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/associated_h_file_heuristic.cc should add these lines:
+
+tests/cxx/associated_h_file_heuristic.cc should remove these lines:
+- #include <time.h> // lines XX-XX
+
+The full include-list for tests/cxx/associated_h_file_heuristic.cc:
+#include "tests/cxx/internal/associated_h_file_heuristic.h"
+#include <stdio.h> // for FILE
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/associated_include-i1.h b/tests/cxx/associated_include-i1.h
new file mode 100644
index 0000000..2d16325
--- /dev/null
+++ b/tests/cxx/associated_include-i1.h
@@ -0,0 +1,10 @@
+//===--- associated_include-i1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class AssociatedIncludeClass { };
diff --git a/tests/cxx/associated_include.cc b/tests/cxx/associated_include.cc
new file mode 100644
index 0000000..3f48bd6
--- /dev/null
+++ b/tests/cxx/associated_include.cc
@@ -0,0 +1,31 @@
+//===--- associated_include.cc - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that if we remove an include from an 'associated' .h file, we
+// add it to the .cc file, but if we keep an include in an
+// 'associated' .h file, we don't try to add it to the .cc file.
+
+#include "tests/cxx/associated_include.h"
+
+IndirectClass ic;
+AssociatedIncludeClass aic;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/associated_include.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/associated_include.cc should remove these lines:
+
+The full include-list for tests/cxx/associated_include.cc:
+#include "tests/cxx/associated_include.h"
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/associated_include.h b/tests/cxx/associated_include.h
new file mode 100644
index 0000000..05fdffd
--- /dev/null
+++ b/tests/cxx/associated_include.h
@@ -0,0 +1,27 @@
+//===--- associated_include.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/indirect.h"
+#include "tests/cxx/associated_include-i1.h"
+
+namespace hfile {
+AssociatedIncludeClass aic;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/associated_include.h should add these lines:
+
+tests/cxx/associated_include.h should remove these lines:
+- #include "tests/cxx/indirect.h" // lines XX-XX
+
+The full include-list for tests/cxx/associated_include.h:
+#include "tests/cxx/associated_include-i1.h" // for AssociatedIncludeClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/auto_type_within_template.cc b/tests/cxx/auto_type_within_template.cc
new file mode 100644
index 0000000..6f16e5e
--- /dev/null
+++ b/tests/cxx/auto_type_within_template.cc
@@ -0,0 +1,22 @@
+//===--- auto_type_within_template.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that IWYU doesn't crash when auto type is within template and has no
+// deduced type.
+
+template<typename T>
+void foo(T x) {
+ auto y = x;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/auto_type_within_template.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/avoids_double_specialization.cc b/tests/cxx/avoids_double_specialization.cc
new file mode 100644
index 0000000..e57f70d
--- /dev/null
+++ b/tests/cxx/avoids_double_specialization.cc
@@ -0,0 +1,40 @@
+//===--- avoids_double_specialization.cc - test input file for iwyu -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This tests a bug I had that was causing a class to get explicitly
+// instantiated twice. iwyu explicitly instantiates typedefed
+// classes, but it's supposed to have a check that avoids doing it
+// twice (which causes clang to complain). This check was buggy
+// before: the instantiated visitor and the normal visitor were each
+// keeping separate values. Hence this test tests two typedefs of the
+// same thing: one in a template and one outside it.
+
+template<class T> struct Foo {
+ static int statici;
+};
+template<class T> int Foo<T>::statici = 0;
+
+template<class T> struct Bar {
+ typedef Foo<T> value;
+};
+
+// Apparently the bug only evidences when Foo is also implicitly
+// instantiated. I'm not sure why.
+Foo<float> implicit_foo;
+typedef Foo<float> Baz;
+
+// This implicit instantiation forces evaluation of the typedef, which
+// forces another explicitly instantiation of Foo<float>.
+Bar<float> implicit_bar;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/avoids_double_specialization.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/backwards_includes-d1-inl.h b/tests/cxx/backwards_includes-d1-inl.h
new file mode 100644
index 0000000..db2e6b1
--- /dev/null
+++ b/tests/cxx/backwards_includes-d1-inl.h
@@ -0,0 +1,28 @@
+//===--- backwards_includes-d1-inl.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Situation #2:
+// d1.h: #if MACRO ... #endif
+// d1-inl.h #define MACRO 1 #include "foo.h"
+#define MACRO 1
+
+#include "tests/cxx/backwards_includes-d1.h"
+
+// Situation #1:
+// d1.h: class MyClass { class NestedClass; typedef NestedClass MyTypedef; };
+// d1-inl.h: class MyClass::NestedClass { ... }
+class MyClass::NestedClass { };
+
+class Dummy { };
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/backwards_includes-d1-inl.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/backwards_includes-d1.h b/tests/cxx/backwards_includes-d1.h
new file mode 100644
index 0000000..20f6dbf
--- /dev/null
+++ b/tests/cxx/backwards_includes-d1.h
@@ -0,0 +1,29 @@
+//===--- backwards_includes-d1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Situation #1:
+// d1.h: class MyClass { class NestedClass; typedef NestedClass MyTypedef; };
+// d1-inl.h: class MyClass::NestedClass { ... }
+class MyClass {
+ class NestedClass;
+ typedef NestedClass MyTypedef;
+};
+
+// Situation #2:
+// d1.h: #if MACRO ... #endif
+// d1-inl.h #define MACRO 1 #include "foo.h"
+#if MACRO
+const int kMacro = 1;
+#endif
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/backwards_includes-d1.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/backwards_includes-d2.h b/tests/cxx/backwards_includes-d2.h
new file mode 100644
index 0000000..34b7ea3
--- /dev/null
+++ b/tests/cxx/backwards_includes-d2.h
@@ -0,0 +1,21 @@
+//===--- backwards_includes-d2.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Situation #3:
+// d2.h: class A {};
+// d3.h: A global_a;
+// d.cc: #include "d2.h" / #include "d3.h"
+
+class A {};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/backwards_includes-d2.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/backwards_includes-d3.h b/tests/cxx/backwards_includes-d3.h
new file mode 100644
index 0000000..5c72032
--- /dev/null
+++ b/tests/cxx/backwards_includes-d3.h
@@ -0,0 +1,28 @@
+//===--- backwards_includes-d3.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Situation #3:
+// d2.h: class A {};
+// d3.h: A global_a;
+// d.cc: #include "d2.h" / #include "d3.h"
+
+// IWYU: A is...*backwards_includes-d2.h
+A global_a;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/backwards_includes-d3.h should add these lines:
+#include "tests/cxx/backwards_includes-d2.h"
+
+tests/cxx/backwards_includes-d3.h should remove these lines:
+
+The full include-list for tests/cxx/backwards_includes-d3.h:
+#include "tests/cxx/backwards_includes-d2.h" // for A
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/backwards_includes.cc b/tests/cxx/backwards_includes.cc
new file mode 100644
index 0000000..09f3315
--- /dev/null
+++ b/tests/cxx/backwards_includes.cc
@@ -0,0 +1,46 @@
+//===--- backwards_includes.cc - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This tests a few situations where iwyu sometimes attributes uses
+// incorrectly. We want to make sure we catch these errors in our
+// sanity-checking phase and don't suggest ridiculous #includes as
+// a result.
+//
+// Situation #1:
+// d1.h: class MyClass { class NestedClass; typedef NestedClass MyTypedef; };
+// d1-inl.h: class MyClass::NestedClass { ... }
+// foo-inl.h should #include foo.h, but foo.h should *not* include foo-inl.h.
+// iwyu might think it needs to, because of the typedef.
+//
+// Situation #2:
+// d1.h: #if MACRO ... #endif
+// d1-inl.h #define MACRO 1 #include "foo.h"
+// Again, foo.h should *not* #include foo-inl.h, even though iwyu might
+// think it ought to to get the definition of MACRO.
+//
+// However, we want to make sure to still make proper suggestions for
+// this case, which bears similarities to the above:
+// Situation #3:
+// d2.h: class A {};
+// d3.h: A global_a;
+// d.cc: #include "d2.h" / #include "d3.h"
+
+#include "tests/cxx/backwards_includes-d1-inl.h"
+#include "tests/cxx/backwards_includes-d2.h"
+#include "tests/cxx/backwards_includes-d3.h"
+
+Dummy d; // Just so we use something from d1-inl.h
+
+A a_copy = global_a; // use something from -d2.h and -d3.h
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/backwards_includes.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/badinc-d1.h b/tests/cxx/badinc-d1.h
new file mode 100644
index 0000000..eb566c8
--- /dev/null
+++ b/tests/cxx/badinc-d1.h
@@ -0,0 +1,108 @@
+//===--- badinc-d1.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D1_H_
+
+#include <stdlib.h>
+#include <errno.h> // not used, but iwyu shouldn't warn about that
+// i1.h should come first, to make sure d3.h is seen after i1.h
+#include "tests/cxx/badinc-i1.h"
+#include "tests/cxx/badinc-d3.h"
+#include "tests/cxx/badinc-i4.h"
+
+// This uses a macro in an indirect-included file, but shouldn't be a
+// violation, since we hard-coded this as an exception in iwyu_macromap.js.
+#define MACRO_CALLING_I4_FUNCTION I4_Function()
+
+#define UNUSED_MACRO Unknown_Function()
+
+// The types.
+enum D1_Enum { D11, D12, D13 };
+
+class D1_Class {
+ public:
+ D1_Class(int a) { a_ = a; }
+ D1_Class() { a_ = 1; }
+ int a() { return a_; }
+ D1_Enum b() const { return static_cast<D1_Enum>(a_); }
+ I1_Typedef c() const { return static_cast<I2_EnumForTypedefs>(a_); }
+ I1_Struct unused_c() const { return I1_Struct(); }
+ int d() { return rand(); }
+ ~D1_Class() {
+ printf("%d/%d/%d\n", b(), c(), e_);
+ }
+ D1_Class& operator=(const D1_Class& that) {
+ this->a_ = that.a_;
+ return *this;
+ }
+ bool operator==(const D1_Class& that) const {
+ return this->a_ == that.a_;
+ }
+
+ static I1_Enum e_;
+ static I1_Enum f_;
+ private:
+ int a_;
+};
+I1_Enum D1_Class::e_ = I11;
+I1_Enum D1_Class::f_ = I12;
+
+class D1_Subclass : public I1_Class {
+};
+
+template<typename FOO>
+class D1_TemplateClass {
+ public:
+ D1_TemplateClass(FOO a) { a_ = a; }
+ FOO a() { return a_; }
+ private:
+ FOO a_;
+};
+
+class D1_CopyClass {
+ public:
+ D1_CopyClass(int a) { a_ = a; }
+ int a() const { return a_; }
+ D1_Class d1;
+ int a_;
+ // This class uses default copy constructor and operator=
+};
+
+template<typename FOO, typename BAR=I1_Enum>
+struct D1_TemplateStructWithDefaultParam {
+ FOO a;
+ BAR b;
+};
+
+typedef I1_Typedef_Class D1_I1_Typedef;
+
+typedef D1_Class* D1_StructPtr;
+
+typedef int (*D1_FunctionPtr)(int, D1_Enum);
+
+D1_Enum D1_Function(D1_Class* c) {
+ return D11;
+}
+
+class D1_ForwardDeclareClass;
+
+int D1Function(I1_Enum i=I11) {
+ return static_cast<int>(i);
+}
+
+D1_CopyClass D1CopyClassFn(I1_Enum i) {
+ return D1_CopyClass(static_cast<int>(i));
+}
+
+// The vars. Just a few.
+D1_Enum d1_d1_enum;
+I1_Class d1_i1_class;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D1_H_
diff --git a/tests/cxx/badinc-d2.h b/tests/cxx/badinc-d2.h
new file mode 100644
index 0000000..c3c0ff3
--- /dev/null
+++ b/tests/cxx/badinc-d2.h
@@ -0,0 +1,59 @@
+//===--- badinc-d2.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D2_H_
+
+// Forward-declare classes from badinc-i1.h before #including them.
+// This tests that we find the real class definition, not the
+// forward-declare just because it happens to come first.
+namespace i1_ns { struct I1_NamespaceStruct; }
+template<typename FOO, typename BAR> class I1_TemplateClassFwdDeclaredInD2;
+
+#include "tests/cxx/badinc-i2-inl.h"
+
+// Everything defined in this file is only forward-declared in badinc.cc.
+
+enum D2_Enum { D21, D22, D23 };
+
+class D2_Class {
+ public:
+ D2_Class(int a) { a_ = a; }
+ D2_Class() { a_ = 1; }
+ int a() { return a_; }
+ D2_Enum b() const { return static_cast<D2_Enum>(a_); }
+ I2_Class* c() const { return NULL; }
+ private:
+ int a_;
+};
+
+class D2_Subclass : public D2_Class {
+};
+
+template<typename FOO>
+class D2_TemplateClass {
+ public:
+ D2_TemplateClass(FOO a) { a_ = a; }
+ FOO a() { return a_; }
+ private:
+ FOO a_;
+};
+
+typedef D2_Class* D2_StructPtr;
+
+typedef int (*D2_FunctionPtr)(int, D2_Enum);
+
+// This shouldn't give an error because badinc-d2 isn't in the main CU.
+I2_Enum D2_Function(D2_Class* c) {
+ return I21;
+}
+
+class D2_ForwardDeclareClass;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D2_H_
diff --git a/tests/cxx/badinc-d3.h b/tests/cxx/badinc-d3.h
new file mode 100644
index 0000000..b128a5e
--- /dev/null
+++ b/tests/cxx/badinc-d3.h
@@ -0,0 +1,26 @@
+//===--- badinc-d3.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D3_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D3_H_
+
+#include <stdio.h>
+#include "tests/cxx/badinc-i3.h"
+
+namespace d3_namespace {
+struct D3_Struct;
+}
+
+enum D3_Enum { D31, D32, D33 };
+
+D3_Enum D3_Function(d3_namespace::D3_Struct* c) {
+ return D31;
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D3_H_
diff --git a/tests/cxx/badinc-d4.h b/tests/cxx/badinc-d4.h
new file mode 100644
index 0000000..c2e71d9
--- /dev/null
+++ b/tests/cxx/badinc-d4.h
@@ -0,0 +1,26 @@
+//===--- badinc-d4.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file tests operators and references. Even though
+// badinc.cc only uses D4_ClassForOperator as a reference,
+// we still need to #include this file to get operator<<.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D4_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D4_H_
+
+class D4_ClassForOperator {
+ public:
+ int a() { return 1; }
+};
+
+int operator<<(int i, const D4_ClassForOperator& d4) {
+ return i;
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_D4_H_
diff --git a/tests/cxx/badinc-extradef.cc b/tests/cxx/badinc-extradef.cc
new file mode 100644
index 0000000..0ae9294
--- /dev/null
+++ b/tests/cxx/badinc-extradef.cc
@@ -0,0 +1,24 @@
+//===--- badinc-extradef.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is to test defining some methods in another translation unit.
+
+#include "tests/cxx/badinc-i2.h"
+
+int I2_Class::AnotherTranslationUnitFn() {
+ return 1;
+}
+int I2_Class::s;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/badinc-extradef.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/badinc-i1.h b/tests/cxx/badinc-i1.h
new file mode 100644
index 0000000..26b8280
--- /dev/null
+++ b/tests/cxx/badinc-i1.h
@@ -0,0 +1,289 @@
+//===--- badinc-i1.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I1_H_
+
+#include <stddef.h> // For offsetof (in badinc.cc).
+#include <stdlib.h> // also included from badinc-d1.h -- before this file
+#include <stdio.h> // also included from badinc-d3.h -- after this file
+#include "tests/cxx/badinc-d2.h"
+#include "tests/cxx/badinc-i2.h"
+#if 0
+#include "tests/cxx/badinc-i5.h"
+#endif
+#include "tests/cxx/badinc-i6.h"
+
+#define MACRO_CALLING_I6_FUNCTION I6_Function()
+#define I1_MACRO_SYMBOL_WITHOUT_VALUE
+#define I1_MACRO_SYMBOL_WITH_VALUE 1
+#define I1_MACRO_SYMBOL_WITH_VALUE0 0
+#define I1_MACRO_SYMBOL_WITH_VALUE2 2
+
+// Lets us test handling of operator<< when first argument is a macro.
+#define I1_MACRO_LOGGING_CLASS \
+ I2_OperatorDefinedInI1Class logging_class = I2_OperatorDefinedInI1Class()
+
+// The types.
+enum I1_Enum { I11, I12, I13 };
+
+const int kI1ConstInt = 5;
+
+typedef I2_Typedef I1_Typedef; // nested typedefs
+
+struct I1_Struct {
+ int a;
+ float b;
+ I1_Enum c;
+};
+
+union I1_Union {
+ I1_Struct* a;
+ I1_Enum b;
+ int c;
+};
+
+typedef struct {
+ int a;
+ float b;
+} I1_UnnamedStruct;
+
+class I1_Base {
+ public:
+ virtual ~I1_Base() {}
+};
+
+class I1_Class : public I1_Base {
+ public:
+ explicit I1_Class(int a) { a_ = a; }
+ I1_Class() { a_ = 1; }
+ // Call with T == I1_NamespaceClass, say.
+ template<typename T> I1_Class(const T* obj, int dummy) : a_(obj->a) { }
+ struct NestedStruct; // defined below
+ template<class T> struct NestedTemplateStruct { };
+ int a() const { return a_; }
+ I1_Typedef b() const { return static_cast<I2_EnumForTypedefs>(a_); }
+ template<typename A> I1_Enum I1_ClassTemplateFunction(A a) { return I11; }
+ template<typename A> static I1_Enum I1_StaticClassTemplateFunction(A a) {
+ return I12;
+ }
+ static int s() { return 1; }
+ typedef int I1_Class_int;
+ private:
+ int a_;
+ static I1_Class_int s_;
+};
+I1_Class::I1_Class_int I1_Class::s_;
+struct I1_Class::NestedStruct {
+ typedef int NestedStructTypedef;
+};
+
+class I1_SiblingClass : public I1_Base {
+};
+
+class I1_Subclass : public D2_Class {
+};
+
+template<typename FOO, typename BAR=FOO>
+class I1_TemplateClass {
+ public:
+ I1_TemplateClass() { BAR bar; (void)bar; }
+ I1_TemplateClass(FOO a) { a_ = a; }
+ I1_TemplateClass(I1_Union a) { }
+ template<typename CTOR> I1_TemplateClass(CTOR ctor_arg, bool unused) { }
+ ~I1_TemplateClass() { FOO* tmp; tmp = &a_; BAR bar; (void)bar; }
+ FOO a() { return a_; }
+ void new_delete_bar() { BAR* bar = new BAR(); delete bar; }
+ typedef int I1_TemplateClass_int;
+ private:
+ FOO a_;
+ I1_TemplateClass<FOO>* next_; // test type-recursion
+};
+
+template<typename FOO, typename BAR=FOO>
+class I1_TemplateSubclass : public I1_TemplateClass<FOO,BAR> {
+};
+
+template<typename FOO, typename UNUSED = I1_Union>
+class I1_TemplateMethodOnlyClass {
+ public:
+ FOO a() { FOO retval; return retval; }
+ FOO* b() { FOO* retval = NULL; return retval; }
+ template<typename BAR> BAR c() { return BAR(); }
+ template<typename BAR> BAR* d() { BAR* retval = NULL; return retval; }
+ template<typename BAR> int e(BAR* b) { return (int)b->size(); }
+ template<typename BAR> static int s(BAR b) { // BAR should be a ptr type
+ FOO foo;
+ return foo.a() + (int)b->size();
+ }
+ template<typename BAR> static int t() { // BAR should be I1_Class
+ I1_TemplateClass<typename BAR::I1_Class_int> tc;
+ return tc.a();
+ }
+ // BAR should be I1_TemplateClass
+ template<template<typename T, typename U=T> class BAR> static int tt() {
+ BAR<I1_Class> t;
+ return t.a().a();
+ }
+};
+
+template<typename FOO, typename BAR> class I1_TemplateClassFwdDeclaredInD2 {
+};
+
+template<typename FOO> class I1_TypedefOnly_Class {
+ public:
+ typedef typename FOO::I1_Class_int i; // best if FOO == I1_Class
+};
+
+// This class is only referenced via D1_I1_Typedef, in badinc-d1.h
+class I1_Typedef_Class {
+ public:
+ I1_Typedef_Class() { a_ = 1; }
+ int a() { return a_; }
+ private:
+ int a_;
+};
+
+template<typename T> class I1_const_ptr {
+ public:
+ explicit I1_const_ptr(const T* ptr) : ptr_(ptr) { }
+ ~I1_const_ptr() { delete ptr_; }
+ const T& operator*() { return *ptr_; }
+ const T* operator->() { return ptr_; }
+ int operator~() { return deref_a(); }
+ void del() { delete (((ptr_))); }
+ void indirect_del() { del(); }
+ int deref_a() { return (*ptr_)->a(); }
+ private:
+ const T* ptr_;
+};
+// Try an out-of-line operator too, both regular-style and yoda-style.
+template<typename T> bool operator==(I1_const_ptr<T>& ptr, const T& val) {
+ return &*ptr == &val;
+}
+template<typename T> bool operator==(const T& val, I1_const_ptr<T>& ptr) {
+ return &*ptr == &val;
+}
+
+class I1_DefinedInCc_Class;
+
+// This class is never used, but has an empty destructor defined in
+// badinc.cc. We want to make sure we don't get '(ptr only)' for it.
+class EmptyDestructorClass {
+ public:
+ EmptyDestructorClass() { }
+ ~EmptyDestructorClass();
+};
+
+// This is needed by Cc_TemplateClass. OperateOn is from badinc.h
+template<class T> class OperateOn; // forward declare, from badinc.h
+template<> class OperateOn<I1_Struct> { };
+template<class T> class OperateOn<I1_TemplateClass<T> > { };
+
+typedef I2_Class I1_I2_Class_Typedef;
+typedef I1_Class* I1_ClassPtr;
+
+typedef I1_Enum (*I1_FunctionPtr)(I1_Class*);
+
+I1_Enum I1_Function(I1_Class* c) {
+ return I11;
+}
+
+inline void I1_OverloadedFunction(int i) { }
+inline void I1_OverloadedFunction(float f) { }
+template<typename T> void I1_OverloadedFunction(const T& t) { }
+
+inline void I1_And_I2_OverloadedFunction(int i) { }
+
+template<typename A> I1_Enum I1_TemplateFunction(A a) {
+ return I11;
+}
+
+
+I2_OperatorDefinedInI1Class& I2_OperatorDefinedInI1Class::operator<<(int i) {
+ return *this;
+}
+
+class I1_ForwardDeclareClass;
+
+struct I1_ManyPtrStruct {
+ int a;
+};
+
+struct I1_PtrDereferenceStruct {
+ int a;
+};
+
+class I1_PtrDereferenceClass {
+ public:
+ int a() { return 1; }
+};
+
+class I1_PtrDereferenceStatic {
+ public:
+ static int a() { return 1; }
+};
+
+class I1_StaticMethod {
+ public:
+ static int a() { return 1; }
+};
+
+class I1_MemberPtr {
+ public:
+ int a() { return 1; }
+};
+
+class I1_PtrAndUseOnSameLine {
+ public:
+ int a() { return 1; }
+};
+
+class I1_SubclassesI2Class : public I2_Class {
+ public:
+ int a() { return 1; }
+};
+
+namespace i1_ns {
+class I1_NamespaceClass {
+ public:
+ int a;
+};
+struct I1_NamespaceStruct {
+ int a;
+};
+struct I1_UnusedNamespaceStruct {
+ int a;
+};
+template<typename T> void I1_NamespaceTemplateFn(T t) { }
+}
+
+// Defines a class that's declared in badinc.h.
+class H_Class::H_Class_DefinedInI1 { };
+
+
+// The vars. Just a few.
+int i1_int = 6;
+I1_Enum i1_i1_enum;
+I1_Union i1_i1_union;
+I1_UnnamedStruct i1_i1_unnamed_struct;
+I1_Class* i1_i1_classptr;
+D2_Class i1_d2_class;
+namespace i1_ns { int i1_int_global; }
+namespace i1_ns { namespace i1_subns { int i1_int_globalsub; } }
+namespace i1_ns2 { int i1_int_global2; }
+namespace i1_ns2 { namespace i1_subns { int i1_int_global2sub; } }
+namespace i1_ns3 { int i1_int_global3; }
+namespace i1_ns3 { namespace i1_subns { int i1_int_global3sub; } }
+namespace i1_ns4 { int i1_int_global4; }
+namespace i1_ns4 { namespace i1_subns { int i1_int_global4sub; } }
+namespace i1_ns5 { int i1_unused_global; }
+int i1_GlobalFunction(void) { return 1; }
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I1_H_
diff --git a/tests/cxx/badinc-i2-inl.h b/tests/cxx/badinc-i2-inl.h
new file mode 100644
index 0000000..f196ab4
--- /dev/null
+++ b/tests/cxx/badinc-i2-inl.h
@@ -0,0 +1,74 @@
+//===--- badinc-i2-inl.h - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This defines a variety of methods, functions, classes, and
+// variables that are declared in badinc-i2.h. The goal is to make
+// sure that badinc.cc realizes it needs these definitios, and not
+// just the declarations in badinc-i2.h.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_INL_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_INL_H_
+
+#include "tests/cxx/badinc-i2.h"
+
+
+inline I2_Class::I2_Class(const char*) {
+}
+
+inline I2_Class::~I2_Class() {
+}
+
+inline int I2_Class::InlFileFn() {
+ return 3;
+}
+
+template<typename T> inline int I2_Class::InlFileTemplateFn() {
+ return 4;
+}
+
+/*static*/ inline int I2_Class::InlFileStaticFn() {
+ return 5;
+}
+
+template<typename T> inline I2_TemplateClass<T>::I2_TemplateClass(
+ T a, const char* b) {
+}
+
+template<typename T> I2_TemplateClass<T>::~I2_TemplateClass() {
+}
+
+template<typename T> inline int I2_TemplateClass<T>::InlFileTemplateClassFn() {
+ return 6;
+}
+
+class I2_InlFileClass {
+ public:
+ int a;
+};
+
+template<typename T> class I2_InlFileTemplateClass {
+ public:
+ T a;
+};
+
+inline int InlFileFreeFn() {
+ return 7;
+}
+
+template<typename T> int InlFileFreeTemplateFn() {
+ return 8;
+}
+
+template<> int InlFileFreeTemplateFn<int>() {
+ return 9;
+}
+
+int inlfile_var;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_INL_H_
diff --git a/tests/cxx/badinc-i2.h b/tests/cxx/badinc-i2.h
new file mode 100644
index 0000000..421ca61
--- /dev/null
+++ b/tests/cxx/badinc-i2.h
@@ -0,0 +1,146 @@
+//===--- badinc-i2.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_H_
+
+#include <vector>
+#include <list> // I only ever use a pointer to stuff in this file
+#include <set> // only used in badinc.h
+
+#define I2_MACRO 2
+
+// The types.
+enum I2_Enum { I21, I22, I23, I2_LAST = I23 };
+
+enum I2_EnumForTypedefs { I21t, I22t, I23t, I2t_LAST = I23t };
+
+typedef I2_EnumForTypedefs I2_Typedef;
+
+struct I2_Struct {
+ int a;
+ float b;
+ I2_Enum c;
+ operator bool() { return true; }
+};
+
+union I2_Union {
+ I2_Struct a;
+ I2_Enum b;
+ int c;
+};
+
+class I2_Class {
+ public:
+ I2_Class(int a) { a_ = a; }
+ I2_Class(I2_Struct& s) { }
+ I2_Class(I2_Union u) { }
+ I2_Class() { a_ = 1; }
+ operator int() { return a_; }
+ operator I2_Union() { I2_Union retval; return retval; }
+ inline I2_Class(const char*); // defined in badinc-i2-inl.h
+ inline ~I2_Class(); // defined in badinc-i2-inl.h
+ int a() { return a_; }
+ int size() { return a_; } // needed by I1_TemplateMethodOnlyClass::e()
+ I2_Typedef b() const { return static_cast<I2_EnumForTypedefs>(a_); }
+ int CcFileFn(); // defined in badinc.cc
+ int AnotherTranslationUnitFn(); // defined in badinc-extradef.cc
+ inline int InlFileFn(); // defined in badinc-i2-inl.h
+ template<typename T> inline int InlFileTemplateFn(); // ditto
+ static inline int InlFileStaticFn(); // ditto
+ static int s; // defined in badinc-extradef.cc
+ private:
+ int a_;
+};
+
+template<typename FOO>
+class I2_TemplateClass {
+ public:
+ I2_TemplateClass(FOO a) { a_ = a; }
+ inline I2_TemplateClass(FOO a, const char* b); // defined in badinc-i2-inl.h
+ ~I2_TemplateClass(); // defined in badinc-i2-inl.h
+ FOO a() { return a_; }
+ int CcFileFn(); // defined in badinc.cc
+ inline int InlFileTemplateClassFn(); // defined in badinc-i2-inl.h
+ private:
+ FOO a_;
+};
+
+template<typename FOO> class I2_TypedefOnly_Class {
+ public:
+ typedef FOO value_type;
+ template<typename BAR> void TplFunction(BAR* bar) { }
+};
+
+// FOO should be an I1_Class* or I2_Class*.
+template<typename FOO> int I2_TemplateFn(int i, FOO f) {
+ return i + f->a();
+}
+
+typedef I2_Class* I2_StructPtr;
+
+typedef int (*I2_FunctionPtr)(int, I2_Enum);
+
+inline I2_Struct I2_Function(I2_Class* c) {
+ return I2_Struct();
+}
+
+inline void I2_UnionFunction(const I2_Union& u) { }
+
+inline void I1_And_I2_OverloadedFunction(float f) { }
+
+template <typename A> struct TemplateForHClassTplFn {
+ A value;
+};
+
+class I2_OperatorDefinedInI1Class {
+ public:
+ I2_OperatorDefinedInI1Class& operator<<(int i);
+};
+
+class I2_ForwardDeclareClass;
+
+class I2_ThisClassIsOnlyNewed {
+};
+class I2_ThisClassIsOnlyDeleted {
+};
+class I2_ThisClassIsOnlyDeletedPtr {
+};
+class I2_ThisClassIsOnlySubclassed {
+ public:
+ int a() { return 5; }
+};
+class I2_ThisClassIsOnlySubclassedWithVirtualMethod {
+ public:
+ virtual int Impl() { return 1; }
+ virtual int Abstract() = 0;
+ virtual int BaseOnly() { return 2; }
+ int NonvirtualBaseOnly() { return 3; }
+ virtual ~I2_ThisClassIsOnlySubclassedWithVirtualMethod() { }
+};
+class I2_Subclass : public I2_ThisClassIsOnlySubclassedWithVirtualMethod {
+ public:
+ virtual int Impl() { return 2; }
+ virtual int Abstract() { return 3; }
+ virtual ~I2_Subclass() { }
+};
+
+class I2_InlFileClass; // defined in badinc-i2-inl.h
+template<typename T> class I2_InlFileTemplateClass; // ditto
+
+inline int InlFileFreeFn(); // defined in badinc-d1-inl.h
+template<typename T> int InlFileFreeTemplateFn(); // ditto
+
+extern int inlfile_var; // defined in badinc-d1-inl.h
+
+#if 1
+ # define MACRO_CALLING_I2_FUNCTION I2_Function(NULL)
+#endif
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I2_H_
diff --git a/tests/cxx/badinc-i3.h b/tests/cxx/badinc-i3.h
new file mode 100644
index 0000000..9866635
--- /dev/null
+++ b/tests/cxx/badinc-i3.h
@@ -0,0 +1,61 @@
+//===--- badinc-i3.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I3_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I3_H_
+
+// I only forward-declare things from this file.
+
+class I3_ForwardDeclareClass {
+ public:
+ int a;
+};
+
+struct I3_ForwardDeclareStruct {
+ int a;
+};
+
+template<typename A>
+struct I3_SimpleForwardDeclareTemplateStruct {
+ A a;
+};
+
+template<typename A, int B, char C>
+struct I3_ForwardDeclareTemplateStruct {
+ A a;
+};
+
+class I3_UnusedClass { // unused by badinc.cc
+ public:
+ int a;
+};
+
+namespace i3_ns1 {
+
+namespace {
+struct I3_UnnamedNamespaceStruct {};
+} // namespace
+
+namespace i3_ns2 {
+namespace i3_ns3 {
+
+struct I3_ForwardDeclareNamespaceStruct {
+ int a;
+};
+
+template<typename A, int B>
+struct I3_ForwardDeclareNamespaceTemplateStruct {
+ A a;
+};
+
+}
+}
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I3_H_
diff --git a/tests/cxx/badinc-i4.h b/tests/cxx/badinc-i4.h
new file mode 100644
index 0000000..0a90c51
--- /dev/null
+++ b/tests/cxx/badinc-i4.h
@@ -0,0 +1,15 @@
+//===--- badinc-i4.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I4_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I4_H_
+
+int I4_Function() { return 1; }
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I4_H_
diff --git a/tests/cxx/badinc-i5.h b/tests/cxx/badinc-i5.h
new file mode 100644
index 0000000..3c240de
--- /dev/null
+++ b/tests/cxx/badinc-i5.h
@@ -0,0 +1,20 @@
+//===--- badinc-i5.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file defines some crazy macros, but is not actually
+// included in real life (it's protected by '#if 0'). We want
+// to make sure we don't take these macros seriously.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I5_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I5_H_
+
+#define hash_map map
+#define printf fabs
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I5_H_
diff --git a/tests/cxx/badinc-i6.h b/tests/cxx/badinc-i6.h
new file mode 100644
index 0000000..7304df2
--- /dev/null
+++ b/tests/cxx/badinc-i6.h
@@ -0,0 +1,19 @@
+//===--- badinc-i6.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Like badinc-i4, this file includes only routines that are used via
+// macros from other files. It's used to test a second codepath for
+// the macro handling code (the "some more macro handling" in iwyu.js).
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I6_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I6_H_
+
+int I6_Function() { return 1; }
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_I6_H_
diff --git a/tests/cxx/badinc-inl.h b/tests/cxx/badinc-inl.h
new file mode 100644
index 0000000..58c5147
--- /dev/null
+++ b/tests/cxx/badinc-inl.h
@@ -0,0 +1,32 @@
+//===--- badinc-inl.h - test input file for iwyu --------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_INL_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_INL_H_
+
+#include <locale.h> // the way to get NULL without size_t
+#include "tests/cxx/badinc-private.h"
+#include "tests/cxx/badinc-private2.h"
+
+typedef int (*InlH_FunctionPtr)(int);
+
+InlH_FunctionPtr InlH_Function(class InlH_Class* c=NULL) {
+ return NULL;
+}
+
+HPrivate_Enum InlH_PrivateFunction() { return HP1; }
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_INL_H_
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/badinc-inl.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/badinc-private.h b/tests/cxx/badinc-private.h
new file mode 100644
index 0000000..89ee461
--- /dev/null
+++ b/tests/cxx/badinc-private.h
@@ -0,0 +1,18 @@
+//===--- badinc-private.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a 'private' header file re-exported by badinc-inl.h
+// (the relevant mapping is in iwyu_include_picker.cc).
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE_H_
+
+enum HPrivate_Enum { HP1, HP2, HP3 };
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE_H_
diff --git a/tests/cxx/badinc-private2.h b/tests/cxx/badinc-private2.h
new file mode 100644
index 0000000..b6a7dc9
--- /dev/null
+++ b/tests/cxx/badinc-private2.h
@@ -0,0 +1,19 @@
+//===--- badinc-private2.h - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a 'private' header file re-exported by badinc-inl.h
+// (the relevant mapping is in iwyu_include_picker.cc),
+// that badinc-inl.h never uses any symbols from.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE2_H_
+
+#define UNUSED_BADINC_PRIVATE2_MACRO true
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_PRIVATE2_H_
diff --git a/tests/cxx/badinc.cc b/tests/cxx/badinc.cc
new file mode 100644
index 0000000..136d79b
--- /dev/null
+++ b/tests/cxx/badinc.cc
@@ -0,0 +1,1982 @@
+//===--- badinc.cc - test input file for iwyu -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a unittest for include-what-you-use.
+//
+// NOTE: Historically, all end-to-end testing was done in this file,
+// NOTE: which is why it is so large and covers so many things.
+// NOTE: However, new tests should *NOT* be added to this file.
+// NOTE: Instead, create a new .cc file in this directory (tests/cxx/)
+// NOTE: that tests just one aspect of include-what-you-use.
+//
+// This unittest tries to test most combination of good and bad
+// possibilities: functions that are and aren't declared in the
+// right place, vars that are and aren't declared in the right
+// place, var types that are and aren't declared in the right place.
+// We get the list of types-of-interest from
+// https://developer.mozilla.org/En/Dehydra/Object_Reference#Type_Objects
+//
+// There are several files (this is not necesarily a complete list):
+// badinc.cc: this file, part of the 'compilation unit'.
+// badinc.h: also part of the 'compilation unit'.
+// badinc-inl.h: also part of the 'compilation unit'.
+// badinc-d1.h: directly included from badinc.cc
+// badinc-d2.h: directly included from badinc.h and badinc.cc (ptr only use)
+// badinc-d3.h: included from badinc_d1.h and badinc.h: a direct include
+// badinc-d4.h: included from badinc.h: tests operators and ptr-only
+// badinc-i1.h: included from badinc_d1.h -- an indirect include
+// badinc-i2.h: included from badinc_d2.h and from badinc_i1.h
+// badinc-i3.h: included from badinc_d3.h (forward declarations only).
+// badinc-i4.h: included from badinc_d1.h (macro definitions only).
+// badinc-i5.h: included from badinc_i1.h (unused macro definitions only).
+// badinc-i6.h: included from badinc_i1.h (more macro definitions).
+//
+// Every IWYU violation is commented, in the line above, by what the
+// violation is:
+// // IWYU: <symbol or type name> is...*<file where type is defined>
+// The '...*' is just a normal '.*'. The extra dots are added to improve
+// readability.
+
+#define USED_INC "tests/cxx/badinc-d4.h"
+#define UNUSED_INC <locale>
+
+#if 0
+// computed #includes.
+#include <locale>
+#include "tests/cxx/badinc-d4.h"
+#endif
+
+// Some of the #include lines are deliberately formatted wrong, in
+// order to test that IWYU handles them correctly.
+#include <math.h> // not actually used
+#include <typeinfo> // for typeid
+#include "tests/cxx/badinc-inl.h"
+#include "tests/cxx/badinc.h"
+#include "tests/cxx/badinc-d1.h"
+#include "tests/cxx/badinc-d2.h"
+#include USED_INC // testing computed #includes
+#include <string> // not sorted properly (before the #include ""'s).
+// The following line is needed, but use a 'keep' pragma anyway.
+#include <fstream> // IWYU pragma: keep
+#include <algorithm> // for find
+#include UNUSED_INC
+// The following ilne is not needed, but use a 'keep' pragma anyway.
+#include <setjmp.h> // IWYU pragma: keep
+#include <clocale> // for NULL (though we get NULL via badinc.h's stdio.h).
+ // clocale is chosen as it provides NULL but not size_t.
+#include <algorithm> // try #including the same file twice
+#include <algorithm> // ...and then 3 times
+
+// This should given an IWYU error even though MACRO_CALLING_I1_MACRO
+// is never actually called.
+// IWYU: MACRO_CALLING_I6_FUNCTION is...*badinc-i1.h
+#define MACRO_CALLING_I1_MACRO MACRO_CALLING_I6_FUNCTION
+
+// IWYU: I1_MACRO_SYMBOL_WITHOUT_VALUE is...*badinc-i1.h
+#ifdef I1_MACRO_SYMBOL_WITHOUT_VALUE
+int i1_macro_symbol_without_value_var;
+#endif
+
+// IWYU: I1_MACRO_SYMBOL_WITHOUT_VALUE is...*badinc-i1.h
+#ifndef I1_MACRO_SYMBOL_WITHOUT_VALUE
+int i1_macro_symbol_without_value_var;
+#endif
+
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE is...*badinc-i1.h
+#if I1_MACRO_SYMBOL_WITH_VALUE
+int i1_macro_symbol_with_value_var;
+#endif
+
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE0 is...*badinc-i1.h
+#if I1_MACRO_SYMBOL_WITH_VALUE0
+int 11_macro_symbol_with_value0_var;
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE2 is...*badinc-i1.h
+#elif I1_MACRO_SYMBOL_WITH_VALUE2
+int i1_macro_symbol_with_value2_var;
+#endif
+
+// IWYU: I1_MACRO_SYMBOL_WITHOUT_VALUE is...*badinc-i1.h
+#if defined(I1_MACRO_SYMBOL_WITHOUT_VALUE)
+int i1_macro_symbol_without_value_var2;
+#endif
+
+#if 0
+// IWYU: I1_MACRO_SYMBOL_WITHOUT_VALUE is...*badinc-i1.h
+#elif defined(I1_MACRO_SYMBOL_WITHOUT_VALUE)
+int i1_macro_symbol_without_value_var3;
+#endif
+
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE is...*badinc-i1.h
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE2 is...*badinc-i1.h
+#if I1_MACRO_SYMBOL_WITH_VALUE && I1_MACRO_SYMBOL_WITH_VALUE2
+int i1_macro_symbol_with_value_and_value2_var;
+#endif
+
+// A slightly more complex example.
+#if 0
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE is...*badinc-i1.h
+// IWYU: I1_MACRO_SYMBOL_WITH_VALUE2 is...*badinc-i1.h
+#elif !I1_MACRO_SYMBOL_WITH_VALUE && !(I1_MACRO_SYMBOL_WITH_VALUE2)
+int i1_macro_symbol_with_value_and_value2_var2;
+#endif
+
+// Test we don't try to report an iwyu violation for a built-in macro
+#if __LINE__ || __STDC__ || defined(__cplusplus)
+#endif
+
+// Using declarations and statements.
+// TODO(csilvers): I don't see a consistent way to say whether
+// "i1_ns2" is an iwyu violation or not, since namespaces can be
+// re-opened in many different files. So let this go, even though all
+// uses of this namespace are in badinc-i1.h; we'll get the iwyu
+// violation later when we try to use symbols from i1_ns2.
+using namespace i1_ns2;
+using i1_ns3::i1_int_global3;
+// IWYU: i1_ns4 is...*badinc-i1.h
+namespace cc_ns_alias = i1_ns4;
+using i1_ns::I1_NamespaceStruct;
+// IWYU: i1_ns::I1_NamespaceTemplateFn is...*badinc-i1.h
+using i1_ns::I1_NamespaceTemplateFn;
+// TODO(csilvers): mark this using declaration as redundant and remove it?
+// IWYU: i1_ns::I1_UnusedNamespaceStruct needs a declaration
+using i1_ns::I1_UnusedNamespaceStruct;
+// TODO(csilvers): mark this using statement as redundant and remove it.
+using namespace i1_ns5;
+
+// We do some proper forward-declaring here, and also some unnecessary
+// forward-declaring. And of course we leave a lot of necessary
+// forward-declaring out.
+class I3_ForwardDeclareClass;
+template<typename T>
+struct I3_SimpleForwardDeclareTemplateStruct;
+class I3_UnusedClass;
+namespace i3_ns1 { namespace i3_ns2 { namespace i3_ns3 {
+struct I3_ForwardDeclareNamespaceStruct;
+} } }
+
+class ForwardDeclareOnlyClass;
+ForwardDeclareOnlyClass* forward_declare_only;
+
+class MacroClass;
+
+class ForwardDeclareOnlyForTypedefClass;
+typedef ForwardDeclareOnlyForTypedefClass NeedFwdDeclarationForThisClass;
+
+// Here's an example of specialization where we never define the base
+// class. IWYU should not ask us to remove the initial declaration!
+template <class T> struct Cc_OnlySpecializedStruct;
+template<> struct Cc_OnlySpecializedStruct<int> { };
+Cc_OnlySpecializedStruct<int>* cc_onlyspecializedstruct_ptr;
+
+// Try a type that only needs a forward-declare because of the language linkage.
+extern "C" struct Cc_C_Struct;
+struct Cc_C_Struct* cc_c_struct_ptr = NULL;
+
+// The types.
+typedef std::string Cc_string; // Nobody should use this.
+// IWYU: I1_Class is...*badinc-i1.h
+typedef I1_Class Cc_typedef;
+// IWYU: kI1ConstInt is...*badinc-i1.h
+// IWYU: I1_Class is...*badinc-i1.h
+typedef I1_Class Cc_typedef_array[kI1ConstInt];
+// We need the full definition of template types (I1_TemplateClass in
+// this case) since we're re-exporting them. Note we need a full
+// definition even of I2_Class, since we don't know if clients will be
+// using the no-arg Cc_tpl_typedef ctor, which requires the full
+// definition of I2_Class.
+// IWYU: I1_Class needs a declaration
+// IWYU: I2_Class needs a declaration
+// IWYU: I1_TemplateClass is...*badinc-i1.h.*#included\.
+// IWYU: I1_TemplateClass is...*badinc-i1.h.*for autocast
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+typedef I1_TemplateClass<I1_TemplateClass<I1_Class,I2_Class> > Cc_tpl_typedef;
+// TODO(csilvers): it would be nice to be able to take this line out and
+// still have the above tests pass:
+Cc_tpl_typedef cc_tpl_typedef;
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::I2_Class is...*badinc-i2-inl.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+// IWYU: I2_Class::InlFileFn is...*badinc-i2-inl.h
+// IWYU: I2_Class::InlFileTemplateFn is...*badinc-i2-inl.h
+// IWYU: I2_Class::InlFileStaticFn is...*badinc-i2-inl.h
+typedef I2_Class Cc_I2_Class_Typedef;
+// IWYU: I1_Struct needs a declaration
+// IWYU: OperateOn is...*badinc-i1.h
+typedef H_TemplateStruct<I1_Struct> Cc_H_TemplateStruct_I1Class_Typedef;
+
+// IWYU: kI1ConstInt is...*badinc-i1.h
+enum Cc_Enum { CC1 = kI1ConstInt };
+
+struct Cc_Struct {
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ int a : kI1ConstInt;
+ float b;
+ // IWYU: I1_Enum is...*badinc-i1.h
+ I1_Enum d;
+};
+
+// This is best instantiated with T=I1_Class. :-)
+template<class T> class Cc_TypenameTemplateStruct {
+ typename T::I1_Class_int a;
+ struct T::NestedStruct c;
+};
+
+// Needs full type information for CC_Subclass's (implicit) dtor of scoped_ptr.
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_ThisClassIsOnlySubclassed is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+class Cc_Subclass : public I2_ThisClassIsOnlySubclassed {
+ public:
+ // IWYU: I1_MemberPtr is...*badinc-i1.h
+ Cc_Subclass() : ptr_(&I1_MemberPtr::a), scoped_ptr_() {
+ // IWYU: I1_MemberPtr is...*badinc-i1.h
+ I1_MemberPtr m;
+ (m.*ptr_)();
+ a(); // defined in the superclass
+ }
+ // IWYU: I1_MemberPtr is...*badinc-i1.h
+ int (I1_MemberPtr::*ptr_)();
+ // IWYU: I2_Class needs a declaration
+ H_ScopedPtr<I2_Class> scoped_ptr_;
+
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ int foo() throw(I1_Class, I2_Class);
+};
+
+// IWYU: I2_ThisClassIsOnlySubclassed is...*badinc-i2.h
+class MultipleInheritanceSubclass : public I2_ThisClassIsOnlySubclassed,
+ // IWYU: I2_Class is...*badinc-i2.h
+ virtual I2_Class {
+ public:
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Struct is...*badinc-i2.h
+ // IWYU: I2_MACRO is...*badinc-i2.h
+ MultipleInheritanceSubclass() : I2_Class(I2_Struct().a + I2_MACRO) { }
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ ~MultipleInheritanceSubclass() { }
+};
+
+// This template struct is never instantiated, and neither is the
+// struct that includes it as a member. Even so, we should call its
+// methods to be instantiated for our testing, so we notice the
+// requirement for I1_Class's full type (via the default constructor).
+template<class T> struct NeverCalledTemplateStruct {
+ NeverCalledTemplateStruct() { T t; }
+};
+// IWYU: I1_Class is...*badinc-i1.h
+struct NeverCalledStruct {
+ // IWYU: I1_Class needs a declaration
+ NeverCalledTemplateStruct<I1_Class> c;
+};
+
+struct Cc_DeclOrderStruct {
+ void Fn() {
+ // This should not require a fwd-decl even though it's not defined
+ // until after its use: that's legal inside a class/struct.
+ NestedStructDefinedAfterUse* n;
+ (void)n;
+ }
+ struct NestedStructDefinedAfterUse {};
+};
+
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: I11 is...*badinc-i1.h
+template<class T, I1_Enum E = I11> struct Cc_TemplateStruct { };
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+template<I1_Enum E> struct Cc_TemplateStruct<I1_Class, E> { I1_Class i; };
+// IWYU: I1_Class needs a declaration
+// IWYU: I12 is...*badinc-i1.h
+template<> struct Cc_TemplateStruct<I1_Class, I12> { I1_Class* i; };
+// TODO(csilvers): I1_Class is technically forward-declarable.
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: I11 is...*badinc-i1.h
+template<class T = I1_Class, I1_Enum E = I11> class Cc_DeclareOnlyTemplateClass;
+
+// I2_Class has a non-explicit constructor (actually, two), so we need
+// the full type here even though it's a const reference. I1_Class
+// has no implicit, one-argument constructor, so fwd declaring is ok.
+// IWYU: I2_Class needs a declaration
+const I2_Class& Cc_Function(
+ // IWYU: I1_Class needs a declaration
+ const I1_Class& i1,
+ // IWYU: I2_Class is...*badinc-i2.h.*for autocast
+ // IWYU: I2_Class needs a declaration
+ const I2_Class& i2,
+ // A subtle c++ point: forward-declaring is ok for i2b, because
+ // you can't do implicit conversion to a non-const reference
+ // (implicit conversion involves creating a temporary, which
+ // doesn't bind to non-const references).
+ // IWYU: I2_Class needs a declaration
+ I2_Class& i2_nonconst,
+ // Forward-declaring is ok because we a const reference to a *pointer*.
+ // IWYU: I2_Class needs a declaration
+ I2_Class* const & i2_ptrref,
+ // IWYU: I1_Class is...*badinc-i1.h
+ I1_Class i1_nonref,
+ // IWYU: I2_Class is...*badinc-i2.h
+ I2_Class i2_nonref) {
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ static I2_Class retval; // something we can safely return a reference to
+ return retval;
+}
+
+// Now try the same, but with templatized functions (which can't have
+// default arguments, who knew?)
+// IWYU: I1_Enum is...*badinc-i1.h
+template<class T, I1_Enum E> int Cc_TemplateFunction() { return T().a(); }
+// IWYU: I1_Class needs a declaration
+// IWYU: I12 is...*badinc-i1.h
+template<> int Cc_TemplateFunction<I1_Class, I12>() { return 3; }
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I13 is...*badinc-i1.h
+template<> int Cc_TemplateFunction<I1_Class, I13>() { return I1_Class().a(); }
+// IWYU: I1_Enum is...*badinc-i1.h
+template<class T, I1_Enum E> T Cc_DeclareOnlyTemplateFunction();
+// TODO(csilvers): also test calling these functions, including an
+// implicit specialization.
+
+template<class T> int Cc_TemplateNewer() { new T; return 0; }
+
+// Here's a tricky example of template specialization taken from
+// http://msdn.microsoft.com/en-us/library/3967w96f%28VS.80%29.aspx
+template <class T> struct Cc_PTS {
+ enum { IsPointer = 0, IsPointerToDataMember = 0 };
+};
+template <class T> struct Cc_PTS<T*> {
+ enum { IsPointer = 1, IsPointerToDataMember = 0 };
+};
+template <class T, class U> struct Cc_PTS<T U::*> {
+ enum { IsPointer = 0, IsPointerToDataMember = 1 };
+};
+
+template<class T,int> class Cc_TemplateSubclass : public H_TemplateTypedef { };
+
+// Let's test that we detect overloaded functions correctly when all
+// overloads are in the same file, and then when they're in different files.
+template<typename T> void CallOverloadedFunctionSameFile(T t) {
+ // IWYU: I1_OverloadedFunction is...*badinc-i1.h
+ I1_OverloadedFunction(t);
+}
+
+template<typename T> void CallOverloadedFunctionDifferentFiles(T t) {
+ // Since this method is overloaded in several places, we do the iwyu
+ // check at the instantiation site, not here.
+ I1_And_I2_OverloadedFunction(t);
+}
+
+template<typename T> void CallOverloadWithUsingShadowDecl(T t) {
+ // This is only defined in one place, but because we get to it via
+ // a using expression, it generates a UsingShadowExpr. Make sure we
+ // "see through" that properly.
+ // IWYU: i1_ns::I1_NamespaceTemplateFn is...*badinc-i1.h
+ I1_NamespaceTemplateFn(t);
+}
+
+template<typename T> void CallPlacementNew(T t) {
+ static char buffer[sizeof(t)];
+ // These should all be iwyu violations here, even though we can't be
+ // *sure* some of these are actually placment-new until we get a
+ // specific type for T (at template-instantiation time).
+ // IWYU: operator new is...*<new>
+ new (&t) int;
+ // IWYU: operator new is...*<new>
+ new (buffer) T();
+ // IWYU: operator new is...*<new>
+ new (&t) T();
+}
+
+// This is defining a class declared in badinc-i1.h, but I think it's
+// correct that it's not an IWYU violation to leave out badinc-i1.h.
+class I1_DefinedInCc_Class {
+ public:
+ // IWYU: I1_Enum is...*badinc-i1.h
+ I1_Enum i1_enum;
+};
+
+// For function declarations, we don't need complete type info for
+// arguments. But we do for the return type unless we explicitly
+// say we don't want to (by providing a forward-declare).
+// IWYU: I1_Class is...*badinc-i1.h.*for fn return type
+// IWYU: I1_Class needs a declaration
+// IWYU: I2_Struct needs a declaration
+I1_Class Cc_DeclareOnlyFn(I2_Struct i2_class);
+
+// IWYU: I2_Struct needs a declaration
+I3_ForwardDeclareClass Cc_DeclareOnlyFnWithFwdDecl(I2_Struct i2_class);
+
+
+class Cc_DeclareOnlyClass {
+ // IWYU: I1_Class needs a declaration
+ Cc_DeclareOnlyClass(I1_Class);
+ // IWYU: I2_Struct needs a declaration
+ I3_ForwardDeclareClass DeclareOnlyFn(I2_Struct);
+};
+
+// The implicit constructor for i1tc uses I2_Class.
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+struct Cc_ImplicitConstructorStruct {
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ I1_TemplateClass<I1_Class, I2_Class> i1tc;
+};
+
+// The implicit destructor for i1tc uses I2_Class.
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+struct Cc_ImplicitInitializerStruct {
+ // The implicit initializer of i1tc creates an I2_Class in the I1_TC ctor
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ Cc_ImplicitInitializerStruct() {}
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ I1_TemplateClass<I1_Class, I2_Class> i1tc;
+};
+
+// The implicit destructor for sp uses I2_Class.
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+struct Cc_ImplicitDestructorStruct {
+ Cc_ImplicitDestructorStruct() : sp() { }
+ // IWYU: I2_Class needs a declaration
+ H_ScopedPtr<I2_Class> sp;
+};
+
+// IWYU: EmptyDestructorClass is...*badinc-i1.h
+EmptyDestructorClass::~EmptyDestructorClass() { }
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I22 is...*badinc-i2.h
+I2_Enum H_Class::ff_ = I22;
+// IWYU: I2_Enum is...*badinc-i2.h
+int H_Class::f(I2_Enum i2_enum) { return 1; }
+// IWYU: I2_Enum is...*badinc-i2.h
+/*static*/ int H_Class::static_out_of_line(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = NULL;
+ return 1;
+}
+// IWYU: I2_Enum is...*badinc-i2.h
+int H_Class::H_NestedStruct::nested(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = 0;
+ return 1;
+}
+// IWYU: I2_Enum is...*badinc-i2.h
+int H_Class::H_NestedStruct::static_nested(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = 0;
+ return 1;
+}
+class H_Class::H_Class_UnusedSubdecl {};
+void H_Class::DefinedInBadincCc() {}
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Struct is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+H_Pimpl_ExplicitCtorDtor::~H_Pimpl_ExplicitCtorDtor() {}
+
+template<typename FOO> FOO H_TemplateClass<FOO>::h_template_foo_static_;
+template<typename FOO>
+// IWYU: I2_Enum is...*badinc-i2.h
+FOO H_TemplateClass<FOO>::static_out_of_line(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = NULL;
+ return FOO();
+}
+template<typename FOO>
+// IWYU: I2_Enum is...*badinc-i2.h
+int H_TemplateClass<FOO>::H_TplNestedStruct::tplnested(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = NULL;
+ return 1;
+}
+template<typename FOO>
+// IWYU: I2_Enum is...*badinc-i2.h
+FOO H_TemplateClass<FOO>::H_TplNestedStruct::static_tplnested(I2_Enum i2_enum) {
+ // IWYU: I1_Class needs a declaration
+ I1_Class* i1_class;
+ i1_class = NULL;
+ return FOO();
+}
+
+// IWYU: I2_Class is...*badinc-i2.h
+int I2_Class::CcFileFn() { return 1; }
+
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+template<typename FOO> int I2_TemplateClass<FOO>::CcFileFn() {
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ // IWYU: I2_TemplateClass needs a declaration
+ // IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ I2_TemplateClass<int>* ptr = new I2_TemplateClass<int>(42, "hi"); // NewExpr
+
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ // IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ // IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ I2_TemplateClass<int> x(42, "hi"); // CXXConstructExpr
+ (void)x;
+
+ // IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ delete ptr; // CXXDeleteExpr
+
+ // IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ delete this; // CXXDeleteExpr
+
+ // IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ return InlFileTemplateClassFn(); // CXXMemberCallExpr
+}
+
+
+// Let's make some global variables of various types.
+
+// badinc.cc
+Cc_Struct cc_struct;
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+Cc_TypenameTemplateStruct<I1_Class> cc_typename_template_struct;
+Cc_Enum cc_enum = CC1;
+Cc_Subclass cc_subclass;
+MultipleInheritanceSubclass cc_multipleinheritancesubclass;
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I11 is...*badinc-i1.h
+int cc_template_function_val = Cc_TemplateFunction<I1_Class, I11>();
+int cc_tricky_template_function_val =
+ // IWYU: I1_Class needs a declaration
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ // IWYU: I12 is...*badinc-i1.h
+ // IWYU: I13 is...*badinc-i1.h
+ Cc_TemplateFunction<I1_Class, kI1ConstInt == 4 ? I12 : I13>(); // is I13
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+int cc_tpl_newer = Cc_TemplateNewer<I1_Class>();
+// IWYU: I1_Class needs a declaration
+int cc_ptr_check1 = Cc_PTS<I1_Class>::IsPointer;
+// IWYU: I1_Class needs a declaration
+int cc_ptr_check2 = Cc_PTS<I1_Class*>::IsPointer;
+// IWYU: I1_Class needs a declaration
+int cc_ptr_check3 = Cc_PTS<int I1_Class::*>::IsPointer;
+
+// badinc.h
+H_Typedef h_typedef;
+// TODO(csilvers): it would be nice to be able to remove this and
+// still have all tests pass. As it is, we need this to instantiate
+// the template's underlying type, which we need to find its violations.
+// We are responsible for the underlying type of this typedef because
+// the .h file has signalled (by forward-declaring the underlying type,
+// and not directly including it) that it doesn't want responsibility.
+// IWYU: I2_TypedefOnly_Class is...*badinc-i2.h
+H_I1_Class_Typedef h_i1_class_typedef;
+H_I2Enum_Set h_i2enum_set;
+H_I2Enum_Set* h_i2enum_set_ptr;
+H_Class h_class;
+H_Class h_class2(2);
+H_StructPtr h_structptr;
+H_TemplateClass<H_Enum> h_templateclass1(H1);
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: I11 is...*badinc-i1.h
+H_TemplateClass<I1_Enum> h_templateclass2(I11);
+// IWYU: I1_Struct needs a declaration
+H_TemplateStruct<I1_Struct> h_template_struct;
+// IWYU: I1_Struct needs a declaration
+H_TemplateStructHelper<I1_Struct> h_template_struct_helper;
+// IWYU: I1_Struct needs a declaration
+H_TemplateStruct<I1_Struct>* h_template_struct_ptr;
+// IWYU: I1_Struct needs a declaration
+H_TemplateStruct<I1_Struct, Cc_Struct> h_template_struct2;
+// We need full type info for i1_templateclass because we never
+// fwd-declare a class with default template parameters.
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+H_TemplateStruct<I1_TemplateClass<int> > h_template_struct_tplclass_arg;
+// TODO(csilvers): this should be attributed to the .h, since it comes
+// via a default template argument.
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+H_TemplateTemplateClass<> h_templatetemplateclass;
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class needs a declaration
+// IWYU: I2_TemplateFn is...*badinc-i2.h
+H_FunctionPtr h_functionpointer = I2_TemplateFn<I2_Class*>;
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class needs a declaration
+// IWYU: I2_TemplateFn is...*badinc-i2.h
+H_FunctionPtr h_functionpointer_amp = &((I2_TemplateFn<I2_Class*>));
+H_FunctionPtr &h_functionpointer_ref = h_functionpointer;
+// IWYU: H_Class::H_Class_DefinedInI1 is...*badinc-i1.h
+H_Class::H_Class_DefinedInI1 h_class_subclass_in_i1;
+// Note: H_Class::H_Class_DefinedInI1 is forward-declared in badinc.h,
+// hence we get it for free.
+H_Class::H_Class_DefinedInI1* h_class_subclass_in_i1_ptr;
+// This requires the full type for two reasons: because of the
+// H_ScopedPtr typedef and because we "own" the destructor call.
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+H_ScopedPtr<I1_Class> h_scoped_ptr;
+// This should also require I1_Class, because of the scoped_ptr it holds.
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+H_ScopedPtrHolder<I1_Class> h_scoped_ptr_holder;
+
+InlH_FunctionPtr inlh_functionptr = InlH_Function(); // badinc-inl.h
+
+D1_Class d1_class; // badinc-d1.h
+D1_TemplateClass<D1_Enum> d1_templateclass1(D11);
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I2_LAST is...*badinc-i2.h
+D1_TemplateClass<I2_Enum> d1_templateclass2(I2_LAST);
+// IWYU: I2_Enum is...*badinc-i2.h
+D1_TemplateClass<I2_Enum> *d1_templateclass2_ptr;
+// IWYU: I2_Enum is...*badinc-i2.h
+D1_TemplateClass<I2_Enum> &d1_templateclass_ref = d1_templateclass2;
+D1_TemplateStructWithDefaultParam<D1_Enum> d1_templatestructwithdefaultparam;
+int d1_fn = D1Function();
+
+// IWYU: D2_ForwardDeclareClass needs a declaration
+D2_ForwardDeclareClass* d2_forward_declare_class; // badinc-d2.h
+D2_Subclass* d2_subclass_ptr_array[10];
+// The reinterpret-cast here should mean we don't need the full type.
+D2_Class& d2_classref = reinterpret_cast<D2_Class&>(*d2_subclass_ptr_array[0]);
+
+// IWYU: d3_namespace::D3_Struct needs a declaration
+d3_namespace::D3_Struct* d3_struct_ptr; // badinc-d3.h
+
+// Now the expected errors: badinc-i1.h and badinc_i2.h
+// IWYU: I1_Enum is...*badinc-i1.h
+I1_Enum i1_enum;
+// IWYU: I1_Typedef is...*badinc-i1.h
+I1_Typedef i1_typedef;
+// IWYU: I1_Struct is...*badinc-i1.h
+I1_Struct i1_struct;
+// IWYU: i1_ns::I1_NamespaceStruct is...*badinc-i1.h
+I1_NamespaceStruct i1_namespace_struct;
+// IWYU: I1_Union is...*badinc-i1.h
+I1_Union i1_union;
+// IWYU: I1_UnnamedStruct is...*badinc-i1.h
+I1_UnnamedStruct i1_unnamedstruct;
+// Test having this ns class forward-declared first, then used fully.
+// IWYU: I1_NamespaceClass needs a declaration
+i1_ns::I1_NamespaceClass* i1_namespace_class_ptr;
+// A declaration which includes namespace-qualification cannot serve
+// as a forward-declaration.
+// IWYU: i1_ns::I1_NamespaceClass needs a declaration
+class i1_ns::I1_NamespaceClass* i1_namespace_class_ptr2;
+// IWYU: i1_ns::I1_NamespaceClass is...*badinc-i1.h
+i1_ns::I1_NamespaceClass i1_namespace_class;
+// As above, a namespace-qualified friend declaration requires a
+// previous full declaration.
+// IWYU: I1_NamespaceClass needs a declaration
+class FriendsNamespaceClass { friend class i1_ns::I1_NamespaceClass; };
+namespace i1_ns {
+// No forward declaration needed if no namespace-qualification.
+class FriendsNamespaceClassInNS { friend class I1_NamespaceClass; };
+} // namespace i1_ns
+
+// IWYU: I1_Class is...*badinc-i1.h
+I1_Class i1_class;
+// IWYU: I1_Class is...*badinc-i1.h
+I1_Class i1_class_init(5);
+// IWYU: I1_Class is...*badinc-i1.h
+I1_Class i1_class_array[10];
+// IWYU: I1_Class needs a declaration
+// IWYU: kI1ConstInt is...*badinc-i1.h
+I1_Class *i1_class_array_ptr[kI1ConstInt];
+// IWYU: I1_Class needs a declaration
+I1_Class *i1_class_ptr;
+// IWYU: I1_Class needs a declaration
+I1_Class &i1_class_ref = i1_class;
+// IWYU: I1_Class is...*badinc-i1.h
+I1_Class::NestedStruct *i1_nestedstruct_ptr;
+// Even adding an explicit 'struct' doesn't make it fwd-declarable.
+// IWYU: I1_Class is...*badinc-i1.h
+struct I1_Class::NestedStruct *i1_nestedstruct_ptr2;
+// IWYU: I1_Class::NestedStruct is...*badinc-i1.h
+// IWYU: I1_Class is...*badinc-i1.h
+I1_Class::NestedStruct i1_nestedstruct;
+// IWYU: I1_Class::NestedStruct is...*badinc-i1.h
+// IWYU: I1_Class is...*badinc-i1.h
+struct I1_Class::NestedStruct i1_nestedstruct2;
+
+// IWYU: I1_Base needs a declaration
+I1_Base *i1_base_ptr;
+
+// I1_Enum is here twice because we need it in two places: once for
+// the I1_TemplateClass<I1_Enum> object, and once in the constructor.
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: I11 is...*badinc-i1.h
+I1_TemplateClass<I1_Enum> i1_templateclass(I11);
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<int> i1_templateclass2(10);
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<I1_Class*> i1_templateclass3(NULL);
+// We need full type info for i1_templateclass because we never
+// fwd-declare a class with default template parameters.
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+I1_TemplateClass<I1_Class>* i1_templateclass_ptr;
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<I1_Class> i1_templateclass_object;
+// IWYU: std::vector is...*<vector>
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+I1_TemplateClass<std::vector<I1_Class> > i1_nested_templateclass(i1_union);
+// We need full type info for i1_templateclass because we never
+// fwd-declare a class with default template parameters.
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+// IWYU: std::vector is...*<vector>
+I1_TemplateClass<std::vector<I1_Class> >* i1_nested_templateclass_ptr;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+// IWYU: std::vector is...*<vector>
+I1_TemplateClass<std::vector<I1_Class>*> i1_nested_templateclass_ptr2(NULL);
+// IWYU: I1_TemplateSubclass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I2_Class needs a declaration
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+I1_TemplateSubclass<I1_Class, I2_Class> i1_template_subclass;
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: std::vector is...*<vector>
+std::vector<I1_Enum> enum_vec;
+// IWYU: std::vector is...*<vector>
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Enum is...*badinc-i1.h
+I1_TemplateClass<std::vector<I1_Enum> > i1_nested_templateclass_enum(enum_vec);
+// We need full type info for i1_templateclass because we never
+// fwd-declare a class with default template parameters.
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: std::vector is...*<vector>
+I1_TemplateClass<std::vector<I1_Enum> >* i1_nested_templateclass_enum_ptr;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_Enum is...*badinc-i1.h
+// IWYU: std::vector is...*<vector>
+I1_TemplateClass<std::vector<I1_Enum>*> i1_nested_templateclass_enum_ptr2(NULL);
+// Note: we have to avoid the most vexing parse, here!
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<D1_I1_Typedef> i1_tplclass_with_typedef((D1_I1_Typedef()));
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<D1_I1_Typedef*> i1_templateclass_with_typedef_ptr(NULL);
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<D1_Enum> i1_templateclass_d(D11);
+// I1_Class is needed as a used template arg to this template-constructor.
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I2_Struct needs a declaration
+// IWYU: I2_Struct is...*badinc-i2.h
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+I1_TemplateClass<I2_Struct> i1_templateclass_tpl_ctor(i1_class, true);
+// Accessing a macro in the same file should still cause an iwyu warning.
+// The trick here is that the NNS doesn't have its own location info.
+#define CC_DEFINE_VAR(typ) typ cc_define_var ## __LINE__
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_TemplateClass<.*>::I1_TemplateClass_int is...*badinc-i1.h
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class needs a declaration
+CC_DEFINE_VAR(I1_TemplateClass<I2_Class>::I1_TemplateClass_int);
+
+// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+I1_TemplateMethodOnlyClass<I1_Class> i1_template_method_only_class;
+// IWYU: I2_TemplateClass needs a declaration
+// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+// IWYU: I1_Class needs a declaration
+I1_TemplateMethodOnlyClass<I2_TemplateClass<const I1_Class> > i1_tpl_tpl_class;
+// IWYU: I1_TemplateClassFwdDeclaredInD2 needs a declaration
+I1_TemplateClassFwdDeclaredInD2<int, float>* i1_tpl_class_fwd_declared_in_d2;
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I1_TypedefOnly_Class is...*badinc-i1.h
+I1_TypedefOnly_Class<I1_Class> i1_typedefonly_class;
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+// IWYU: I1_TypedefOnly_Class is...*badinc-i1.h
+// IWYU: I1_TypedefOnly_Class<.*>::i is...*badinc-i1.h
+I1_TypedefOnly_Class<I1_Class>::i i1_typedefonly_class_int;
+// IWYU: I1_I2_Class_Typedef is...*badinc-i1.h
+int i1_i2_class_typedef_int = I1_I2_Class_Typedef::s;
+
+// IWYU: I1_Subclass is...*badinc-i1.h
+I1_Subclass i1_subclass;
+
+// IWYU: I1_ManyPtrStruct needs a declaration
+I1_ManyPtrStruct ***i1_manyptrstruct_ptr_ptr_ptr;
+// IWYU: I1_ClassPtr is...*badinc-i1.h
+I1_ClassPtr i1_classptr;
+// IWYU: I1_FunctionPtr is...*badinc-i1.h
+// IWYU: I1_Function is...*badinc-i1.h
+I1_FunctionPtr i1_functionptr = I1_Function;
+// IWYU: I1_FunctionPtr is...*badinc-i1.h
+I1_FunctionPtr *i1_functionptr_ptr = &i1_functionptr;
+// IWYU: I1_ForwardDeclareClass needs a declaration
+I1_ForwardDeclareClass* i1_forwarddeclareptr;
+// IWYU: I1_Function is...*badinc-i1.h
+int i1_function_value = I1_Function(0);
+
+// Two different uses of an indirect global. The first is a function call
+// which is exposed in the compiler-generated function for global
+// constructors/destructors. The second is similar, but it requires no
+// call since its a simple initialization.
+// IWYU: i1_GlobalFunction is...*badinc-i1.h
+int i1_globalfunctionval = i1_GlobalFunction();
+// IWYU: i1_GlobalFunction is...*badinc-i1.h
+int (*i1_globalfunctionptr)(void) = i1_GlobalFunction;
+// IWYU: i1_GlobalFunction is...*badinc-i1.h
+int (*i1_globalfunctionptr2)(void) = &i1_GlobalFunction;
+
+// IWYU: I2_InlFileClass is...*badinc-i2-inl.h
+I2_InlFileClass i2_inlfileclass;
+// IWYU: I2_InlFileTemplateClass is...*badinc-i2-inl.h
+I2_InlFileTemplateClass<int> i2_inlfiletemplateclass;
+// IWYU: I2_Class...*badinc-i2.h
+// IWYU: I2_Class::I2_Class...*badinc-i2-inl.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+I2_Class i2_class_with_inl_constructor("calling ctor in badinc-i2-inl.h");
+// IWYU: I2_TemplateClass...*badinc-i2.h
+// IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+I2_TemplateClass<int> i2_template_class_with_inl_constructor(4, "inl ctor");
+// We don't need a fwd-decl of I2_TypedefOnly_Class; we get that via badinc.h
+// IWYU: I1_Class needs a declaration
+I2_TypedefOnly_Class<I1_Class>* i1_typedefonly_class_ptr;
+
+// Not an iwyu violation because I explicitly forward-declared this class.
+I3_ForwardDeclareClass* i3_forwarddeclareclass;
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+I3_ForwardDeclareStruct* i3_forwarddeclarestruct;
+// Not an iwyu violation because I explicitly forward-declared this class.
+I3_SimpleForwardDeclareTemplateStruct<int>* i3_simpleforwarddeclaretplstruct;
+// IWYU: I3_ForwardDeclareTemplateStruct needs a declaration
+I3_ForwardDeclareTemplateStruct<int, 4, 'b'>* i3_forwarddeclaretemplatestruct;
+// Not an iwyu violation because I explicitly forward-declared this class.
+i3_ns1::i3_ns2::i3_ns3::I3_ForwardDeclareNamespaceStruct* i3_fdns_struct;
+// IWYU: I3_ForwardDeclareNamespaceTemplateStruct needs a declaration
+i3_ns1::i3_ns2::i3_ns3::I3_ForwardDeclareNamespaceTemplateStruct<H_Enum, 2>*
+ i3_fdtns_struct;
+
+// IWYU: I3_UnnamedNamespaceStruct needs a declaration
+i3_ns1::I3_UnnamedNamespaceStruct* i3_unnamed_namespace_struct;
+
+// This shouldn't cause weird iwyu issues between us and badinc.h.
+H_USE_CLASS(MacroClass);
+// This shouldn't cause badinc.h to need to include us for Cc_Subclass.
+H_CREATE_VAR(Cc_Subclass);
+// We should be credited for use of I1_Class even though it's in the macro.
+// IWYU: I1_Class is...*badinc-i1.h
+int identity_i1_class_a = H_IDENTITY(i1_class).a();
+
+// Violations within a namespace (both named an unnamed)
+namespace cc_ns {
+// IWYU: I1_Typedef is...*badinc-i1.h
+I1_Typedef i1_typedef;
+}
+namespace {
+// IWYU: I1_Union is...*badinc-i1.h
+I1_Union i1_unnamed_union;
+}
+
+// I3_ForwardDeclareClass is not an iwyu violation, because I
+// explicitly forward-declare it above.
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+// IWYU: I1_Class needs a declaration
+float SimpleFunction(I3_ForwardDeclareClass* a, I3_ForwardDeclareStruct* b)
+ throw(I3_ForwardDeclareClass*, I1_Class*);
+
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+// IWYU: I1_Class needs a declaration
+float SimpleFunction(I3_ForwardDeclareClass* a, I3_ForwardDeclareStruct* b)
+ throw(I3_ForwardDeclareClass*, I1_Class*) {
+ return 1.0;
+}
+float simple_function = SimpleFunction(NULL, NULL);
+
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+template<bool Foo> int SimpleConstantTemplateFunction()
+ throw(I3_ForwardDeclareStruct&) {
+ return Foo;
+}
+bool simple_constant_template_function = SimpleConstantTemplateFunction<5<3>();
+
+// Let's test the code that distinguishes pointers (and references), a bit.
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+int SimpleUnusedFunction(const I3_ForwardDeclareStruct& a) {
+ return 1;
+}
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+int SimpleUnusedFunction2(I3_ForwardDeclareStruct* a) {
+ return 2;
+}
+// IWYU: I3_ForwardDeclareStruct needs a declaration
+int SimpleUnusedFunction3(I3_ForwardDeclareStruct& a,
+ // IWYU: I3_ForwardDeclareStruct needs a declaration
+ I3_ForwardDeclareStruct* b,
+ // IWYU: I3_ForwardDeclareStruct needs a declaration
+ I3_ForwardDeclareStruct** c) {
+ return (SimpleUnusedFunction(a) +
+ SimpleUnusedFunction(*b) +
+ SimpleUnusedFunction(**c) +
+ SimpleUnusedFunction2(*c));
+}
+
+// Test that we properly detect we need badinc-d4 for operator<<
+// (even though we only need a forward-declare for D4_ClassForOperator).
+int TestOperator(const D4_ClassForOperator& d4_classop) {
+ return 1 << d4_classop;
+}
+
+// Test we properly find both uses (one ptr-only and one not) when on same line.
+// IWYU: I1_PtrAndUseOnSameLine is...*badinc-i1.h
+// IWYU: I1_PtrAndUseOnSameLine needs a declaration
+int TestSameLine(I1_PtrAndUseOnSameLine* i1_ptruse) { return i1_ptruse->a(); }
+
+// Test casting: try passing in an I1_SubclassesI2Class* here.
+// IWYU: I2_Class needs a declaration
+void FunctionTakesI2_Class(I2_Class* d2c) { }
+
+template class D1_TemplateClass<D1_StructPtr>; // instantiate a few templates
+// IWYU: I1_ClassPtr is...*badinc-i1.h
+template class D1_TemplateClass<I1_ClassPtr>;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+template class I1_TemplateClass<int>;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+// IWYU: I1_ClassPtr is...*badinc-i1.h
+template class I1_TemplateClass<I1_ClassPtr>;
+
+// Test typedefs on various types of instantiations.
+// First, make sure the implicit instantiation instantiates some methods too.
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+int i2_tpl_class_a = i2_template_class_with_inl_constructor.a();
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+// IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+typedef I2_TemplateClass<int> Cc_typedef_implicit_instantiation;
+// Make sure we can do the same typedef multiple times.
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+// IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+typedef I2_TemplateClass<int> Cc_typedef_implicit_instantiation2;
+// IWYU: I1_ClassPtr is...*badinc-i1.h
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+typedef I1_TemplateClass<I1_ClassPtr> Cc_typedef_explicit_instantiation;
+// IWYU: I1_ClassPtr is...*badinc-i1.h
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+typedef I1_TemplateClass<I1_ClassPtr> Cc_typedef_explicit_instantiation2;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+typedef I1_TemplateClass<char> Cc_typedef_no_previous_instantiation;
+// IWYU: I1_TemplateClass is...*badinc-i1.h
+typedef I1_TemplateClass<char> Cc_typedef_no_previous_instantiation2;
+
+class Cc_Class {
+ friend class I2_Class;
+ // IWYU: I1_Class is...*badinc-i1.h
+ friend struct I1_Class::NestedStruct;
+ template<class T> friend class I2_TemplateClass;
+ // IWYU: I2_TemplateClass needs a declaration
+ friend class I2_TemplateClass<int>;
+ // IWYU: I1_Class is...*badinc-i1.h
+ template<class T> friend struct I1_Class::NestedTemplateStruct;
+};
+
+void Cc_ForwardDeclare_Function() {
+ class I2_Class;
+}
+
+// This class template fully uses its type parameter.
+template <typename T> class Cc_TemplateFullyUse {
+ private:
+ T value_;
+};
+
+// This class template doesn't fully use its type parameter.
+template <typename T> class Cc_TemplatePartiallyUse {
+ private:
+ Cc_TemplateFullyUse<T>* ptr_; // shouldn't require T's full type
+};
+
+// IWYU: I1_Class needs a declaration
+Cc_TemplatePartiallyUse<I1_Class> cc_template_class1;
+
+template <typename T>
+class Cc_TemplateDerived
+ : public Cc_TemplateFullyUse<T> { // test traversing the base class
+};
+
+// IWYU: I1_Class needs a declaration
+// IWYU: I1_Class is...*badinc-i1.h
+Cc_TemplateDerived<I1_Class> cc_template_derived1;
+
+// The following three classes test the fix for http://llvm.org/PR8403.
+
+template <class A>
+struct CC_TemplateStruct2 { };
+
+class CC_Class2 {
+ struct CC_TemplateStruct2<int> x;
+};
+
+// We require full type info for default template parameters, even
+// when it's not strictly necessary, just to avoid potential trouble.
+// (Users shouldn't have to worry about instantiating default params.)
+// IWYU: I1_Class is...*badinc-i1.h
+template <class A, class B = I1_Class>
+class CC_TemplateClass {
+ public:
+ struct CC_TemplateStruct2<A> x;
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ typedef I1_TemplateClass<A> i1_typedef;
+
+ // Let's throw in per-class operator new/delete.
+ // IWYU: size_t is...*((<stddef.h>)|(stdio.h)|(string.h)|(time.h)|(wchar.h))
+ void* operator new(size_t size) {
+ B b;
+ (void)b;
+ return ::operator new(4);
+ }
+ void operator delete(void* p) {
+ A a;
+ (void)a;
+ ::operator delete(p);
+ }
+ // Test deleting a dependent type
+ void DeleteAnA() {
+ A a; delete a; // A had better be a pointer type!
+ }
+};
+
+// This should stay untouched by iwyu.
+#include "tests/cxx/badinc2.c"
+
+int main() {
+ // Some of the above as local variables as well
+ Cc_Struct local_cc_struct = {};
+ Cc_string local_cc_string;
+ H_Class local_h_class;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: I21 is...*badinc-i2.h
+ D1_TemplateClass<I2_Enum> local_d1_template_class(I21);
+ // IWYU: I1_Enum is...*badinc-i1.h
+ // IWYU: I11 is...*badinc-i1.h
+ I1_Enum local_i1_enum = I11;
+ // IWYU: I1_UnnamedStruct is...*badinc-i1.h
+ I1_UnnamedStruct local_i1_unnamed_struct = {};
+ D1_Subclass local_d1_subclass;
+ // IWYU: I2_Class needs a declaration
+ I2_Class* local_i2_class_ptr = 0; // ptr-only in this .cc, non-ptr in .h
+ // IWYU: I2_TemplateClass...*badinc-i2.h
+ // IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ I2_TemplateClass<int> local_i2_template_class(1);
+ // IWYU: I1_PtrDereferenceStruct needs a declaration
+ const I1_PtrDereferenceStruct* const local_i1_ptrdereference_struct = 0;
+ // IWYU: I1_PtrDereferenceClass needs a declaration
+ I1_PtrDereferenceClass* local_i1_ptrdereference_class = 0;
+ int x;
+ // IWYU: va_list is...*<stdarg.h>
+ va_list vl; // in gcc, va_list is an internal type, so this tests <built-in>
+ D1_I1_Typedef d1_i1_typedef;
+ // IWYU: i1_int is...*badinc-i1.h
+ int vararray[i1_int];
+ std::fstream fs;
+
+ isascii('a'); // declared in <ctype.h> which is #included by badinc.h
+ (void)(errno); // declared in <errno.h> which is #included by badinc.h
+ // Test we don't give an iwyu warning for the built-in __builtin_expect
+ // IWYU: I11 is...*badinc-i1.h
+ if (__builtin_expect(local_i1_enum == I11, false)) (void)local_i1_enum;
+
+ // IWYU: i1_int_global is...*badinc-i1.h
+ x = i1_ns::i1_int_global;
+ // IWYU: i1_ns::i1_subns::i1_int_globalsub is...*badinc-i1.h
+ x = i1_ns::i1_subns::i1_int_globalsub;
+ // IWYU: i1_ns2::i1_int_global2 is...*badinc-i1.h
+ x = i1_int_global2;
+ // IWYU: i1_ns2::i1_subns::i1_int_global2sub is...*badinc-i1.h
+ x = i1_subns::i1_int_global2sub;
+ // IWYU: i1_ns3::i1_int_global3 is...*badinc-i1.h
+ x = i1_int_global3;
+ // IWYU: i1_ns3::i1_subns::i1_int_global3sub is...*badinc-i1.h
+ x = i1_ns3::i1_subns::i1_int_global3sub;
+ // IWYU: i1_ns4::i1_int_global4 is...*badinc-i1.h
+ x = cc_ns_alias::i1_int_global4;
+ // IWYU: i1_ns4::i1_subns::i1_int_global4sub is...*badinc-i1.h
+ x = cc_ns_alias::i1_subns::i1_int_global4sub;
+
+ // Reference all the local variables, to avoid not-used errors.
+ // IWYU: fprintf is...*<stdio.h>
+ // IWYU: stdout is...*<stdio.h>
+ fprintf(stdout, "%d", local_cc_struct.a); // test a global in stdio.h too
+ // IWYU: printf is...*<stdio.h>
+ printf("%d", local_cc_struct.a);
+ (void)Cc_typedef(4);
+ // Not an iwyu violation, because Cc_typedef is responsible for its members.
+ Cc_typedef::s();
+ Cc_typedef::I1_Class_int Cc_typedef_int = 0;
+ Cc_typedef::NestedStruct Cc_typedef_struct;
+ Cc_typedef::NestedStruct::NestedStructTypedef Cc_typedef_nested_int = 0;
+ local_h_class.a();
+ // a() returns a FOO, which in this case is I2_Enum.
+ // IWYU: I2_Enum is...*badinc-i2.h
+ local_d1_template_class.a();
+ (void)(local_i1_enum);
+ // IWYU: I1_UnnamedStruct is...*badinc-i1.h
+ (void)(local_i1_unnamed_struct.a);
+ local_d1_subclass.a();
+ (void)(local_i2_class_ptr);
+ // IWYU: I1_PtrDereferenceStruct is...*badinc-i1.h
+ (void)(local_i1_ptrdereference_struct->a);
+ // Make the last ref to local_i1_ptrdereference_struct
+ // fwd-declarable. This tests that if we do non-fwd-decl-use
+ // followed by fwd-decl-use, we correctly say it can't be fwd-declared.
+ (void)(local_i1_ptrdereference_struct);
+ // IWYU: I1_PtrDereferenceClass is...*badinc-i1.h
+ local_i1_ptrdereference_class->a();
+
+ // Calling an overloaded function. In the first two cases,
+ // CallOverloadedFunctionSameFile() is responsible for the call,
+ // since it's just a single file. In the second two cases, we
+ // can't know the file required until now (when the templated
+ // function is instantiated).
+ CallOverloadedFunctionSameFile(5);
+ CallOverloadedFunctionSameFile(5.0f);
+ // IWYU: I1_And_I2_OverloadedFunction is...*badinc-i1.h
+ CallOverloadedFunctionDifferentFiles(5);
+ // IWYU: I1_And_I2_OverloadedFunction is...*badinc-i2.h
+ CallOverloadedFunctionDifferentFiles(5.0f);
+ // This should not be an IWYU violation either: the iwyu use is in the fn.
+ CallOverloadWithUsingShadowDecl(5);
+ // IWYU: I1_Class is...*badinc-i1.h
+ CallPlacementNew(i1_class);
+
+ // Calling operator<< when the first argument is a macro. We should
+ // still detect that operator<< is being used here, and not in the
+ // macro-definition file.
+ // IWYU: I1_MACRO_LOGGING_CLASS is...*badinc-i1.h
+ // IWYU: I2_OperatorDefinedInI1Class::operator<< is...*badinc-i1.h
+ I1_MACRO_LOGGING_CLASS << 1;
+
+ // Calling a template method can cause the template arg to be non-fwd-decl.
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ i1_template_method_only_class.a();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ i1_template_method_only_class.b();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ i1_template_method_only_class.c<I2_Class>();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ i1_template_method_only_class.c<I2_Class*>();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ i1_template_method_only_class.d<I2_Class>();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ i1_template_method_only_class.d<I2_Class*>();
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ i1_template_method_only_class.e(local_i2_class_ptr);
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I2_Class needs a declaration
+ std::vector<I2_Class>* i2_class_vector = NULL;
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: std::vector is...*<vector>
+ i1_template_method_only_class.e(i2_class_vector);
+ // Four different ways of making the same function call.
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ i1_template_method_only_class.s(local_i2_class_ptr);
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ i1_template_method_only_class.s<I2_Class*>(local_i2_class_ptr);
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ I1_TemplateMethodOnlyClass<I1_Class>::s(local_i2_class_ptr);
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ I1_TemplateMethodOnlyClass<I1_Class>::s<I2_Class*>(local_i2_class_ptr);
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ I1_TemplateMethodOnlyClass<I2_Class>::t<I1_Class>();
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ I1_TemplateMethodOnlyClass<I2_Class>::tt<I1_TemplateClass>();
+ // Try the static calls again, but this time with a typedef tpl arg.
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ I1_TemplateMethodOnlyClass<Cc_typedef>::s(local_i2_class_ptr);
+ // IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ I1_TemplateMethodOnlyClass<Cc_typedef>::s<I2_Class*>(local_i2_class_ptr);
+
+ // The result of static_cast depends on the relation between the
+ // source and target type, and thus requires the full target type
+ // whenever source and target types aren't the same.
+ // IWYU: I1_Class needs a declaration
+ (void)(static_cast<I1_Class*>(i1_class_ptr)); // same type
+ // IWYU: I1_Class needs a declaration
+ (void)(static_cast<I1_Class**>(&i1_class_ptr)); // same type
+ // IWYU: I1_Base needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(static_cast<I1_Base*>(i1_class_ptr));
+ // IWYU: I1_Base needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(static_cast<I1_Base&>(i1_class_ref));
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Base needs a declaration
+ (void)(static_cast<I1_Base&>(i1_class));
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(static_cast<I1_Class*>(i1_base_ptr));
+ // Full type information isn't needed since 0 isn't a pointer.
+ // IWYU: I1_Class needs a declaration
+ (void)(static_cast<I1_Class*>(0));
+ // IWYU: I1_Class needs a declaration
+ (void)(static_cast<I1_Class**>(0));
+
+ // For implicit cast, we need to know whether the source type is
+ // derived from the target type, and thus need the full type of the
+ // former.
+ // IWYU: I1_Class is...*badinc-i1.h
+ i1_base_ptr = i1_class_ptr;
+ // IWYU: I1_SubclassesI2Class needs a declaration
+ I1_SubclassesI2Class* i1_subclasses_i2_ptr = 0;
+ // IWYU: I1_SubclassesI2Class is...*badinc-i1.h
+ FunctionTakesI2_Class(i1_subclasses_i2_ptr);
+ // We don't need to know full type info if one pointer is a built-in type.
+ void* void_ptr = i1_class_ptr;
+ // Also tests reference-casts.
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Base needs a declaration
+ const I1_Base& i1_base_implicit_cast1 = i1_class_ref;
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Base needs a declaration
+ const I1_Base& i1_base_implicit_cast2 = i1_class;
+
+ // dynamic_cast requires the full type of the source and target.
+ // They may be siblings, which is why we can't say the target
+ // brings in the source, like we can for a normal down-cast.
+ // IWYU: I1_Base is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ i1_class_ptr = dynamic_cast<I1_Class*>(i1_base_ptr);
+ // IWYU: I1_SiblingClass needs a declaration
+ I1_SiblingClass* i1_sibling_class_ptr = 0;
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_SiblingClass needs a declaration
+ // IWYU: I1_SiblingClass is...*badinc-i1.h
+ i1_sibling_class_ptr = dynamic_cast<I1_SiblingClass*>(i1_class_ptr);
+
+ // const_cast doesn't require the full type.
+ // IWYU: I1_Class needs a declaration
+ const I1_Class* const_i1_class_ptr = 0;
+ // IWYU: I1_Class needs a declaration
+ i1_class_ptr = const_cast<I1_Class*>(const_i1_class_ptr);
+
+ // reinterpret_cast doesn't require the full type.
+ // IWYU: I1_Class needs a declaration
+ i1_class_ptr = reinterpret_cast<I1_Class*>(i1_base_ptr);
+
+ // C-style cast doesn't require the full type either, according
+ // to the language, but we ask for full type when it's an up-cast
+ // or a down-cast.
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ i1_class_ptr = (I1_Class*)(i1_base_ptr);
+
+ // Constructor casts require the full to-type (to call its constructor).
+ // IWYU: I2_Struct is...*badinc-i2.h
+ I2_Struct ctor_cast_struct_nonref;
+ // IWYU: I2_Struct needs a declaration
+ I2_Struct& ctor_cast_struct = ctor_cast_struct_nonref;
+ // IWYU: I2_Union is...*badinc-i2.h
+ I2_Union ctor_cast_union_nonref;
+ // IWYU: I2_Union needs a declaration
+ I2_Union& ctor_cast_union = ctor_cast_union_nonref;
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ I2_Class i2_class_from_struct = ctor_cast_struct; // ctor takes a reference
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ I2_Class i2_class_from_union = ctor_cast_union; // ctor takes a value
+
+ // User-defined casts need the full from-type (to call its operator totype()).
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_UnionFunction is...*badinc-i2.h
+ I2_UnionFunction(*local_i2_class_ptr);
+
+ // Even dereferencing doesn't require the full type.
+ (void)(*i1_class_ptr);
+
+ // IWYU: I1_PtrDereferenceStatic is...*badinc-i1.h
+ (void)(I1_PtrDereferenceStatic::a);
+ // IWYU: I1_StaticMethod is...*badinc-i1.h
+ I1_StaticMethod::a();
+
+ // Reference some of the global variables.
+ (void)(__PRETTY_FUNCTION__);
+ (void)(cc_struct.b);
+ d1_class.a();
+ (void)(cc_struct.b);
+ (void)(cc_subclass.a());
+ // IWYU: OperateOn is...*badinc-i1.h
+ h_template_struct.a();
+ // This tests a bug in clang where an implicit template instantiation
+ // of a partial specialization gave the wrong location information.
+ // In this case, OperateOn<I1_TemplateClass<T> > is in badinc-i1.h,
+ // which is what we should report, *not* the OperateOn<T> in badinc.h.
+ // IWYU: OperateOn is...*badinc-i1.h
+ h_template_struct_tplclass_arg.a();
+ h_scoped_ptr.get();
+ // Not an iwyu violation, since we never use the dereferenced type.
+ (void)(*h_scoped_ptr);
+ // IWYU: I1_Class is...*badinc-i1.h ?
+ (*h_scoped_ptr).a();
+ // IWYU: I1_Class is...*badinc-i1.h
+ h_scoped_ptr->a();
+ // IWYU: I12 is...*badinc-i1.h
+ D1Function(I12);
+ // TODO(csilvers): should we be warning about I2_Struct?
+ // IWYU: I1_Union is...*badinc-i1.h
+ // IWYU: I1_Struct is...*badinc-i1.h
+ (void)(i1_union.a->a);
+ // IWYU: I1_Class is...*badinc-i1.h
+ I1_Class::s();
+ // IWYU: I2_Struct is...*badinc-i2.h
+ // IWYU: I2_Function is...*badinc-i2.h
+ (void)(I2_Function(local_i2_class_ptr).b);
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::InlFileFn is...*badinc-i2-inl.h
+ local_i2_class_ptr->InlFileFn();
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::InlFileStaticFn is...*badinc-i2-inl.h
+ local_i2_class_ptr->InlFileStaticFn();
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::InlFileStaticFn is...*badinc-i2-inl.h
+ I2_Class::InlFileStaticFn();
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::InlFileTemplateFn is...*badinc-i2-inl.h
+ local_i2_class_ptr->InlFileTemplateFn<int>();
+ // IWYU: I2_Class is...*badinc-i2.h
+ local_i2_class_ptr->AnotherTranslationUnitFn();
+ // IWYU: I2_Class is...*badinc-i2.h
+ local_i2_class_ptr->CcFileFn();
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ // IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+ local_i2_template_class.InlFileTemplateClassFn();
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ local_i2_template_class.a();
+ // TODO(csilvers): this first error is wrong, due to a bug in
+ // IntendsToProvide. The file defining this template method *should* be
+ // providing badinc-i2-inl.h, but isn't (iwyu will suggest we add it).
+ // So we don't detect that file as responsible for these symbols, and not us.
+ // IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+ // IWYU: I2_TemplateClass is...*badinc-i2.h
+ local_i2_template_class.CcFileFn();
+ // IWYU: InlFileFreeFn is...*badinc-i2-inl.h
+ InlFileFreeFn();
+ // IWYU: InlFileFreeTemplateFn is...*badinc-i2-inl.h
+ InlFileFreeTemplateFn<float>();
+ // IWYU: InlFileFreeTemplateFn is...*badinc-i2-inl.h
+ InlFileFreeTemplateFn<int>(); // a specialization
+ // IWYU: inlfile_var is...*badinc-i2-inl.h
+ (void)(inlfile_var);
+ // TODO(csilvers): IWYU: I1_FunctionPtr is...*badinc-i1.h
+ (**i1_functionptr_ptr)(&i1_class);
+ (void)(x);
+ (void)(i1_class_array);
+ d1_i1_typedef.a();
+ D1_I1_Typedef().a();
+ MACRO_CALLING_I4_FUNCTION;
+ // IWYU: MACRO_CALLING_I6_FUNCTION is...*badinc-i1.h
+ MACRO_CALLING_I6_FUNCTION;
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ (void)(kI1ConstInt);
+
+ Cc_string().length();
+
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ (void)(sizeof(kI1ConstInt));
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(sizeof(I1_Class));
+ // IWYU: I1_Class is...*badinc-i1.h
+ typeof(I1_Class) another_i1_class;
+ (void)(another_i1_class);
+ // IWYU: I1_Class needs a declaration
+ typeof(I1_Class*) another_i1_class_ptr;
+ (void)(another_i1_class_ptr);
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ typeof(kI1ConstInt) another_const_int = 1;
+ (void)(another_const_int);
+ // This is a C standard macro, but is implemented via a gcc extension too.
+ // IWYU: offsetof is...*<stddef.h>
+ // IWYU: I1_Struct is...*badinc-i1.h
+ (void)(offsetof(I1_Struct, c));
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ typeid(kI1ConstInt).name();
+ // IWYU: I1_Class is...*badinc-i1.h
+ typeid(I1_Class).name();
+ // This is an extension for gcc and msvc.
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(__is_enum(I1_Class));
+
+ // Check out template iwyu determinations.
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ I1_const_ptr<I1_Class> local_i1_const_ptr(NULL);
+ // Needs I1_const_ptr because it calls its operator*().
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ (void)(*local_i1_const_ptr);
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ local_i1_const_ptr->a();
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ local_i1_const_ptr.del();
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ local_i1_const_ptr.indirect_del();
+ // This calls *ptr_, but in a free function.
+ // IWYU: operator== is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ (void)(local_i1_const_ptr == i1_class);
+ // IWYU: operator== is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ (void)(i1_class == local_i1_const_ptr);
+ // Also check the default (implicit) operator=
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ I1_const_ptr<I1_Class> local_i1_const_ptr2(NULL);
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ local_i1_const_ptr2 = local_i1_const_ptr;
+
+ // We need the full I1_Class definition for the destructor.
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ (void)I1_const_ptr<I1_Class>(NULL);
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ I1_const_ptr<I1_Class*> local_i1_const_ptrptr(NULL);
+ // TODO(csilvers): IWYU: I1_Class needs a declaration
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ (void)(*local_i1_const_ptrptr);
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ local_i1_const_ptrptr.deref_a();
+ // This calls through to deref_a.
+ // IWYU: I1_const_ptr is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ (void)(~local_i1_const_ptrptr);
+
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I2_Enum is...*badinc-i2.h
+ std::vector<I2_Enum> local_enum_vector;
+ // I2_Enum here is redundant but harmless.
+ // IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I21 is...*badinc-i2.h
+ local_enum_vector.push_back(I21);
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: std::vector<.*>::iterator is...*<vector>
+ for (std::vector<I2_Enum>::iterator it = local_enum_vector.begin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::iterator is...*<vector>
+ it != local_enum_vector.end(); ++it) {
+ // IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: std::vector is...*<vector>
+ std::find(local_enum_vector.begin(), local_enum_vector.end(), *it);
+ }
+ // string also uses __normal_iterator. Let's also verify that
+ // adding two strings doesn't bring in a requirement for <memory>
+ std::string s = std::string("aaa") + "bbb";
+ for (std::string::iterator it = s.begin(); it != s.end(); ++it) {
+ std::find(s.begin(), s.end(), *it);
+ }
+ for (Cc_string::iterator it = local_cc_string.begin();
+ it != local_cc_string.end(); ++it) {
+ std::find(local_cc_string.begin(), local_cc_string.end(), *it);
+ }
+
+ // This should result in an iwyu to #include <list>, not
+ // forward-declare it, as STL types cannot be forward declared.
+ // IWYU: std::list is...*<list>
+ std::list<int>* list_ptr;
+ list_ptr = 0;
+
+ // Make sure we only report an iwyu for <new> because of placement-new.
+ // We also need to check the argument to new.
+ int* newed_int = new int;
+ // IWYU: operator new is...*<new>
+ new(newed_int) int(4);
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I2_Enum is...*badinc-i2.h
+ std::vector<I2_Enum>* newed_vector
+ // IWYU: std::vector is...*<vector>
+ // IWYU: I2_Enum is...*badinc-i2.h
+ = new std::vector<I2_Enum>;
+ // IWYU: i1_i1_classptr is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ // IWYU: operator new is...*<new>
+ new (i1_i1_classptr) I1_Class(kI1ConstInt);
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ I1_Class* newed_i1_class_array = new I1_Class[kI1ConstInt];
+ delete newed_int;
+ delete (((newed_int)));
+ // TODO(csilvers): IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: std::vector is...*<vector>
+ delete newed_vector;
+ // IWYU: I1_Class is...*badinc-i1.h
+ delete[] newed_i1_class_array;
+ // IWYU: I1_Class is...*badinc-i1.h
+ delete[] ((((newed_i1_class_array))));
+ // IWYU: I1_Base needs a declaration
+ // IWYU: I1_Base is...*badinc-i1.h
+ // IWYU: I1_Class is...*badinc-i1.h
+ delete[] static_cast<I1_Base*>(newed_i1_class_array);
+
+ // Make sure constructor is analyzed when we new, and destructor is
+ // analyzed when we delete.
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_Struct needs a declaration
+ I1_TemplateClass<I2_Class, I1_Struct>* newed_i1_template_class
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ = new I1_TemplateClass<I2_Class, I1_Struct>;
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_Struct needs a declaration
+ I1_TemplateClass<I2_Class, I1_Struct>* newed_i1_template_class_array
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ = new I1_TemplateClass<I2_Class, I1_Struct>[kI1ConstInt];
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_Struct needs a declaration
+ I1_TemplateClass<I2_Class, I1_Struct>* newed_i1_template_class_ctor
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ = new I1_TemplateClass<I2_Class, I1_Struct>(i1_union);
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I1_Struct needs a declaration
+ char i1_templateclass_storage[sizeof(I1_TemplateClass<I2_Class, I1_Struct>)];
+ // We need full type info for i1_templateclass because we never
+ // fwd-declare a class with default template parameters.
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I1_Struct needs a declaration
+ I1_TemplateClass<I2_Class, I1_Struct>* placement_newed_i1_template_class
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: operator new is...*<new>
+ = new(i1_templateclass_storage) I1_TemplateClass<I2_Class, I1_Struct>();
+ // IWYU: I1_Class needs a declaration
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: i1_ns::I1_NamespaceClass is...*badinc-i1.h
+ I1_Class* i1_class_tpl_ctor = new I1_Class(&i1_namespace_class, 1);
+
+ // TODO(csilvers): IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ delete newed_i1_template_class;
+ // TODO(csilvers): IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ delete[] newed_i1_template_class_array;
+ // TODO(csilvers): IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ delete newed_i1_template_class_ctor;
+ // Make sure we handle it right when we explicitly call the dtor, as well.
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I1_Struct is...*badinc-i1.h
+ placement_newed_i1_template_class->~I1_TemplateClass();
+ // IWYU: I1_Class is...*badinc-i1.h
+ delete i1_class_tpl_ctor;
+ // Check that we discover constructor/destructor locations as well.
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::I2_Class is...*badinc-i2-inl.h
+ local_i2_class_ptr = new I2_Class("inl.h constructor");
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ delete local_i2_class_ptr;
+ // Make sure we do this check even when it's via a template parameter.
+ // (We need full type info for i1_templateclass because we never
+ // fwd-declare a class with default template parameters.)
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I1_Enum is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ I1_TemplateClass<I1_Enum, I2_Class>* local_i1_template_class_for_inl = NULL;
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class is...*badinc-i2.h
+ local_i1_template_class_for_inl->new_delete_bar();
+ // Test per-class operator new
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I2_Struct needs a declaration
+ CC_TemplateClass<I1_Struct, I2_Struct>* cc_template_class =
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I2_Struct needs a declaration
+ // IWYU: I2_Struct is...*badinc-i2.h
+ new CC_TemplateClass<I1_Struct,I2_Struct>;
+ // IWYU: I1_Struct is...*badinc-i1.h
+ delete cc_template_class;
+
+ // While we're at it, make sure we get the same thing when creating
+ // a local variable and a temporary, as we do when calling new/delete.
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: i1_ns::I1_NamespaceClass is...*badinc-i1.h
+ I1_Class i1_class_tpl_ctor_local(&i1_namespace_class, 1);
+ // We need the full type of I1_NamespaceClass because the ctor is a template.
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: i1_ns::I1_NamespaceClass is...*badinc-i1.h
+ (void)I1_Class(&i1_namespace_class, 1);
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ I1_TemplateClass<I2_Class, I1_Struct> local_i1_templateclass(i1_union);
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I1_Struct needs a declaration
+ // IWYU: I1_Struct is...*badinc-i1.h
+ // IWYU: I1_TemplateClass is...*badinc-i1.h
+ // IWYU: I2_Class needs a declaration
+ // IWYU: I2_Class is...*badinc-i2.h
+ (void)I1_TemplateClass<I2_Class, I1_Struct>(i1_union);
+
+ (void)(*(new int(4)));
+ (void)((new int[10])[0]);
+ // Make sure we don't claim i2_newed and i2_deleted are "ptr only".
+ // IWYU: I2_ThisClassIsOnlyNewed needs a declaration
+ I2_ThisClassIsOnlyNewed* i2_newed = 0;
+ // IWYU: I2_ThisClassIsOnlyDeleted needs a declaration
+ I2_ThisClassIsOnlyDeleted* i2_deleted = 0;
+ // IWYU: I2_ThisClassIsOnlyDeletedPtr needs a declaration
+ I2_ThisClassIsOnlyDeletedPtr** i2_deleted_ptr = 0;
+ // IWYU: I2_ThisClassIsOnlyNewed is...*badinc-i2.h
+ i2_newed = new I2_ThisClassIsOnlyNewed;
+ // IWYU: I2_ThisClassIsOnlyDeleted is...*badinc-i2.h
+ delete i2_deleted;
+ delete i2_deleted_ptr;
+ delete i2_deleted_ptr; // make sure each delete doesn't eat up a star
+
+ // Make sure we don't claim set::iterator is defined in map.
+ // IWYU: std::set is...*<set>
+ std::set<int> localset;
+ // IWYU: std::set is...*<set>
+ // IWYU: std::set<.*>::iterator is...*<set>
+ std::set<int>::iterator it_set = localset.begin();
+
+ // Lots of weird stuff can happen with iterators, especially regarding const.
+ // IWYU: std::vector is...*<vector>
+ std::vector<float> float_vector;
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ std::vector<float>::const_iterator float_it = float_vector.begin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ const std::vector<float>::const_iterator float_constit = float_vector.begin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ (void)(float_it == float_constit);
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ (void)(float_constit == float_it);
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ std::vector<float>::const_iterator float_forit;
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ for (float_forit = float_vector.begin(); ;) ;
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ for (std::vector<float>::const_iterator it = float_vector.begin(); ;) ;
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_iterator is...*<vector>
+ for (const std::vector<float>::const_iterator it = float_vector.begin(); ;) ;
+ // We special-case vector<>::iterator. Make sure it holds for
+ // reverse_iterator too.
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::reverse_iterator is...*<vector>
+ for (std::vector<float>::reverse_iterator
+ // IWYU: std::vector is...*<vector>
+ float_reverse_it = float_vector.rbegin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::reverse_iterator is...*<vector>
+ float_reverse_it != float_vector.rbegin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::reverse_iterator is...*<vector>
+ ++float_reverse_it) ;
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_reverse_iterator is...*<vector>
+ for (std::vector<float>::const_reverse_iterator
+ // We need const_reverse_iterator here because of the
+ // conversion from reverse_iterator (from rbegin()).
+ // IWYU: std::vector<.*>::const_reverse_iterator is...*<vector>
+ // IWYU: std::vector is...*<vector>
+ float_const_reverse_it = float_vector.rbegin();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_reverse_iterator is...*<vector>
+ float_const_reverse_it != float_vector.rend();
+ // IWYU: std::vector is...*<vector>
+ // IWYU: std::vector<.*>::const_reverse_iterator is...*<vector>
+ ++float_const_reverse_it) ;
+
+ // Also test while and if initializers.
+ // IWYU: I1_Class needs a declaration
+ while (I1_Class* i = NULL) {
+ }
+ // IWYU: I1_Class needs a declaration
+ if (I1_Class* i = NULL) i = NULL;
+
+ // Test some macros, including one we shouldn't mark as in-use.
+ // IWYU: MACRO_CALLING_I2_FUNCTION is...*badinc-i2.h
+ MACRO_CALLING_I2_FUNCTION;
+ // Here are some uses of UNUSED_MACRO that we should not find:
+ /*
+ UNUSED_MACRO
+ */
+ (void)("#include \\\"UNUSED_MACRO\"");
+
+ // Test if and while.
+ // IWYU: I1_Function is...*badinc-i1.h
+ if (I1_Function(0)) { // returns an I1Enum
+ // IWYU: I2_Struct is...*badinc-i2.h
+ // IWYU: I2_Function is...*badinc-i2.h
+ while (I2_Function(0)) ; // returns a I2_Struct, converted to a bool
+ }
+
+ // Test calling virtual methods.
+ // IWYU: I2_Subclass needs a declaration
+ I2_Subclass* i2_subclass = 0;
+ // IWYU: I2_Subclass is...*badinc-i2.h
+ i2_subclass->Impl();
+ // IWYU: I2_Subclass is...*badinc-i2.h
+ i2_subclass->Abstract();
+ // IWYU: I2_Subclass is...*badinc-i2.h
+ i2_subclass->BaseOnly();
+ // IWYU: I2_Subclass is...*badinc-i2.h
+ i2_subclass->NonvirtualBaseOnly();
+
+ // Test templatized functions.
+ H_TemplateFunction(1);
+ // IWYU: I11 is...*badinc-i1.h
+ // IWYU: I1_Enum is...*badinc-i1.h
+ H_TemplateFunction(I11);
+ // IWYU: I11 is...*badinc-i1.h
+ H_TemplateFunction<int>(I11);
+ // IWYU: I1_Class needs a declaration
+ H_TemplateFunction<I1_Class*>(&i1_class);
+ H_TemplateFunction(&i1_class);
+ // IWYU: I22 is...*badinc-i2.h
+ h_templateclass2.static_out_of_line(I22);
+ // IWYU: I22 is...*badinc-i2.h
+ h_templateclass2.h_nested_struct.tplnested(I22);
+ // IWYU: I22 is...*badinc-i2.h
+ h_templateclass2.h_nested_struct.static_tplnested(I22);
+ // This should not cause warnings for the i2_class destructor
+ h_templateclass2.uses_i2class();
+ // IWYU: I1_TemplateFunction is...*badinc-i1.h
+ I1_TemplateFunction(i1_class_ptr);
+ // IWYU: I1_TemplateFunction is...*badinc-i1.h
+ // IWYU: I1_Class needs a declaration
+ I1_TemplateFunction<I1_Class*>(i1_class_ptr);
+ // Try again, but with a typedef
+ Cc_typedef cc_typedef;
+ // TODO(csilvers): figure out the template arg here is really a
+ // typedef (tricky because we need to call the I1_Class ctor),
+ // and don't add it to tpl-types-of-interest.
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_TemplateFunction is...*badinc-i1.h
+ I1_TemplateFunction(cc_typedef);
+ // IWYU: I1_TemplateFunction is...*badinc-i1.h
+ I1_TemplateFunction<Cc_typedef>(cc_typedef);
+ // IWYU: I1_TemplateFunction is...*badinc-i1.h
+ I1_TemplateFunction<Cc_typedef>(i1_class);
+
+ // IWYU: I1_Class is...*badinc-i1.h
+ i1_class.I1_ClassTemplateFunction(&i1_struct);
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Struct needs a declaration
+ i1_class_ptr->I1_ClassTemplateFunction<I1_Struct*>(&i1_struct);
+ // IWYU: I1_Class is...*badinc-i1.h
+ I1_Class::I1_StaticClassTemplateFunction(&i1_struct);
+ // IWYU: I1_Class is...*badinc-i1.h
+ // IWYU: I1_Struct needs a declaration
+ I1_Class::I1_StaticClassTemplateFunction<I1_Struct*>(&i1_struct);
+
+ // Test default (compiler-defined) copy constructor/operator=/operator==
+ // IWYU: I11 is...*badinc-i1.h
+ D1_CopyClass local_d1_copy_class(D1CopyClassFn(I11));
+ // IWYU: I12 is...*badinc-i1.h
+ local_d1_copy_class = D1CopyClassFn(I12);
+ local_d1_copy_class.a();
+
+ // Check use of a macro inside an #ifdef.
+ // IWYU: I2_MACRO is...*badinc-i2.h
+#ifdef I2_MACRO
+ // IWYU: kI1ConstInt is...*badinc-i1.h
+ int i2_macro_var = kI1ConstInt;
+#endif
+
+ return 0;
+}
+
+// TODO(csilvers): the delete of <locale> should be line 56, not 35
+// Some notes:
+// * We do not need to #include badinc-i2.h, badinc_i2-inl.h, set,
+// stdio.h, or vector, because badinc.h is adding them for us.
+// * We *do* need to #include ctype.h, even though badinc.h #includes
+// it, because badinc.h is removing that dependency.
+// * We're removing <algorithm> twice because it's in the file 3 times.
+/**** IWYU_SUMMARY
+
+tests/cxx/badinc.cc should add these lines:
+#include <ctype.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <list>
+#include <new>
+#include "tests/cxx/badinc-i1.h"
+class D2_Class;
+class D2_ForwardDeclareClass;
+class D2_Subclass;
+class I1_ForwardDeclareClass;
+namespace d3_namespace { struct D3_Struct; }
+namespace i3_ns1 { namespace i3_ns2 { namespace i3_ns3 { template <typename A, int B> struct I3_ForwardDeclareNamespaceTemplateStruct; } } }
+namespace i3_ns1 { namespace { struct I3_UnnamedNamespaceStruct; } }
+struct I3_ForwardDeclareStruct;
+template <typename A, int B, char C> struct I3_ForwardDeclareTemplateStruct;
+
+tests/cxx/badinc.cc should remove these lines:
+- #include <math.h> // lines XX-XX
+- #include <algorithm> // lines XX-XX
+- #include <algorithm> // lines XX-XX
+- #include <clocale> // lines XX-XX
+- #include <locale> // lines XX-XX
+- #include "tests/cxx/badinc-d2.h" // lines XX-XX
+- class Cc_ForwardDeclare_Function::I2_Class; // lines XX-XX
+- class I3_UnusedClass; // lines XX-XX
+- template <class T = I1_Class, I1_Enum E = I11> class Cc_DeclareOnlyTemplateClass; // lines XX-XX
+
+The full include-list for tests/cxx/badinc.cc:
+#include "tests/cxx/badinc.h"
+#include "tests/cxx/badinc-inl.h"
+#include <ctype.h> // for isascii
+#include <setjmp.h>
+#include <stdarg.h> // for va_list
+#include <stddef.h> // for offsetof
+#include <algorithm> // for find
+#include <fstream> // for fstream
+#include <list> // for list
+#include <new> // for operator new
+#include <string> // for basic_string, basic_string<>::iterator, operator+, string
+#include <typeinfo> // for type_info
+#include "tests/cxx/badinc-d1.h" // for D1CopyClassFn, D1Function, D1_Class, D1_CopyClass, D1_Enum, D1_Enum::D11, D1_I1_Typedef, D1_StructPtr, D1_Subclass, D1_TemplateClass, D1_TemplateStructWithDefaultParam, MACRO_CALLING_I4_FUNCTION
+#include "tests/cxx/badinc-d4.h" // for D4_ClassForOperator, operator<<
+#include "tests/cxx/badinc-i1.h" // for EmptyDestructorClass, H_Class::H_Class_DefinedInI1, I1_And_I2_OverloadedFunction, I1_Base, I1_Class, I1_Class::NestedStruct, I1_ClassPtr, I1_Enum, I1_Enum::I11, I1_Enum::I12, I1_Enum::I13, I1_Function, I1_FunctionPtr, I1_I2_Class_Typedef, I1_MACRO_LOGGING_CLASS, I1_MACRO_SYMBOL_WITHOUT_VALUE, I1_MACRO_SYMBOL_WITH_VALUE, I1_MACRO_SYMBOL_WITH_VALUE0, I1_MACRO_SYMBOL_WITH_VALUE2, I1_ManyPtrStruct (ptr only), I1_MemberPtr, I1_NamespaceClass, I1_NamespaceStruct, I1_NamespaceTemplateFn, I1_OverloadedFunction, I1_PtrAndUseOnSameLine, I1_PtrDereferenceClass, I1_PtrDereferenceStatic, I1_PtrDereferenceStruct, I1_SiblingClass, I1_StaticMethod, I1_Struct, I1_Subclass, I1_SubclassesI2Class, I1_TemplateClass, I1_TemplateClass<>::I1_TemplateClass_int, I1_TemplateClassFwdDeclaredInD2 (ptr only), I1_TemplateFunction, I1_TemplateMethodOnlyClass, I1_TemplateSubclass, I1_Typedef, I1_TypedefOnly_Class, I1_TypedefOnly_Class<>::i, I1_Union, I1_UnnamedStruct, I1_UnusedNamespaceStruct (ptr only), I1_const_ptr, I2_OperatorDefinedInI1Class::operator<<, MACRO_CALLING_I6_FUNCTION, OperateOn, i1_GlobalFunction, i1_i1_classptr, i1_int, i1_int_global, i1_int_global2, i1_int_global2sub, i1_int_global3, i1_int_global3sub, i1_int_global4, i1_int_global4sub, i1_int_globalsub, i1_ns4, kI1ConstInt, operator==
+#include "tests/cxx/badinc2.c"
+class D2_Class;
+class D2_ForwardDeclareClass;
+class D2_Subclass;
+class ForwardDeclareOnlyClass; // lines XX-XX
+class ForwardDeclareOnlyForTypedefClass; // lines XX-XX
+class I1_ForwardDeclareClass;
+class I3_ForwardDeclareClass; // lines XX-XX
+class MacroClass; // lines XX-XX
+namespace d3_namespace { struct D3_Struct; }
+namespace i3_ns1 { namespace i3_ns2 { namespace i3_ns3 { struct I3_ForwardDeclareNamespaceStruct; } } } // lines XX-XX
+namespace i3_ns1 { namespace i3_ns2 { namespace i3_ns3 { template <typename A, int B> struct I3_ForwardDeclareNamespaceTemplateStruct; } } }
+namespace i3_ns1 { namespace { struct I3_UnnamedNamespaceStruct; } }
+struct Cc_C_Struct; // lines XX-XX
+struct I3_ForwardDeclareStruct;
+template <class T> struct Cc_OnlySpecializedStruct; // lines XX-XX
+template <typename A, int B, char C> struct I3_ForwardDeclareTemplateStruct;
+template <typename T> struct I3_SimpleForwardDeclareTemplateStruct; // lines XX-XX+1
+
+***** IWYU_SUMMARY */
+
+// TODO(csilvers): some new tests to add:
+// 29) .h fwd-declares a class and .cc does as well. Do we attribute to .cc?
+// 30) forward-declare a class while inside a namespace.
+// 31) "using foo::bar; Baz* x;" forward declare foo::bar::Baz properly?
+// 32) "namespace b = foo::bar; b::Baz* x; forward declare Baz properly?
+// 34) no mystruct fwd-decl for 'struct mystruct { mystruct* next; } myvar;'
+// 41) template<class T, class V=hash<T> > void fn(), call fn<OperateOn>
+// 43) *foo, where foo is a typedef to a pointer to an iwyu type.
+// 44) typedef Foo Bar[sizeof(Baz)] -- make sure it says we need full type
+// info for Baz.
+// 45) Define a global operator-new in badinc-i1.h and call it from badinc.cc
diff --git a/tests/cxx/badinc.h b/tests/cxx/badinc.h
new file mode 100644
index 0000000..4bf1461
--- /dev/null
+++ b/tests/cxx/badinc.h
@@ -0,0 +1,407 @@
+//===--- badinc.h - test input file for iwyu ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_H_
+
+#include <ctype.h> // used only in badinc.cc
+#include <errno.h> // used both here and in badinc.cc
+#include <math.h>
+#include <queue> // used only in this .h file, not in any other file.
+#include <string>
+#include "tests/cxx/badinc-d2.h"
+#include "tests/cxx/badinc-d3.h"
+
+class H_ForwardDeclareClass;
+
+class Cc_Struct; // test having the wrong 'kind' (Cc_Struct is a struct)
+class Cc_Class;
+enum H_Enum { H1, H2, H3 };
+
+template<typename T> class I2_TypedefOnly_Class;
+typedef I2_TypedefOnly_Class<int> H_I1_Class_Typedef;
+
+// H_ScopedPtr and H_MakeScopedPtr mimic the implementation of
+// scoped_ptr but are much simplified.
+
+template <typename T> class H_ScopedPtr;
+template <typename T> H_ScopedPtr<T> H_MakeScopedPtr(T *);
+
+template <typename T>
+class H_ScopedPtr {
+ public:
+ typedef T element_type;
+ typedef T* element_ptr;
+ typedef std::queue<T> element_queue;
+ T* get() { return ptr_; }
+ T& operator*() { return *ptr_; }
+ T* operator->() { return ptr_; }
+ ~H_ScopedPtr() {
+ enum { type_must_be_complete = sizeof(T) };
+ delete ptr_;
+ }
+
+ private:
+ friend H_ScopedPtr<T> H_MakeScopedPtr<T>(T* p);
+
+ T* ptr_;
+};
+
+template <typename T> H_ScopedPtr<T> H_MakeScopedPtr(T* p) {
+ return H_ScopedPtr<T>(p);
+}
+
+// This is for the implicit constructor and implicit destructor:
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+class H_Pimpl {
+ private:
+ H_ScopedPtr<Cc_Class> cc_impl_;
+ // IWYU: I2_Class needs a declaration
+ H_ScopedPtr<I2_Class> i2_impl_;
+};
+
+// These are for the implicit destructor:
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+// IWYU: I2_Struct is...*badinc-i2.h
+class H_Pimpl_ExplicitCtor {
+ public:
+ H_Pimpl_ExplicitCtor() : i2_impl_explicit_ctor_() { }
+ private:
+ H_ScopedPtr<Cc_Class> cc_impl_;
+ // IWYU: I2_Class needs a declaration
+ H_ScopedPtr<I2_Class> i2_impl_;
+ // IWYU: I2_Struct needs a declaration
+ H_ScopedPtr<I2_Struct> i2_impl_explicit_ctor_;
+};
+
+class H_Pimpl_ExplicitCtorDtor {
+ public:
+ H_Pimpl_ExplicitCtorDtor() : i2_impl_explicit_ctor_() { }
+ ~H_Pimpl_ExplicitCtorDtor();
+ private:
+ H_ScopedPtr<Cc_Class> cc_impl_;
+ // IWYU: I2_Class needs a declaration
+ H_ScopedPtr<I2_Class> i2_impl_;
+ // IWYU: I2_Struct needs a declaration
+ H_ScopedPtr<I2_Struct> i2_impl_explicit_ctor_;
+};
+
+template <typename T> struct H_ScopedPtrHolder {
+ H_ScopedPtr<T> holder;
+};
+
+
+class H_Class {
+ public:
+ class H_Class_Subdecl;
+ class H_Class_UnusedSubdecl; // defined in badinc.cc
+ class H_Class_DefinedInI1; // defined in badinc-i1.h
+ H_Class(int a) { a_ = a; }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ H_Class(I2_Enum i2_enum) { a_ = 1; }
+ // IWYU: I2_MACRO is...*badinc-i2.h
+ H_Class() { a_ = I2_MACRO; } // from badinc-i2.h
+ int a() { return a_; }
+ H_Enum b() const { return static_cast<H_Enum>(a_); }
+ // IWYU: I2_Typedef is...*badinc-i2.h
+ // IWYU: I2_EnumForTypedefs is...*badinc-i2.h
+ I2_Typedef c() const { return static_cast<I2_EnumForTypedefs>(a_); }
+ // IWYU: I2_Struct is...*badinc-i2.h
+ I2_Struct unused_c() const { return I2_Struct(); }
+ // IWYU: I2_Struct is...*badinc-i2.h
+ int unused_c2() const { return I2_Struct().a; }
+ D3_Enum d() const { return static_cast<D3_Enum>(a_); }
+ int e() const {
+ std::string s("a long long string");
+ std::queue<int> q;
+ if (q.empty()) return s.length();
+ // IWYU: I2_Enum is...*badinc-i2.h
+ switch (static_cast<I2_Enum>(a_)) {
+ // IWYU: I21 is...*badinc-i2.h
+ case I21: return 21;
+ // IWYU: I22 is...*badinc-i2.h
+ case I22: return 22;
+ default: return errno;
+ }
+ }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ int f(I2_Enum i2_enum);
+ int g(H_Class_Subdecl *h_class_subdecl) { return 1; }
+ // IWYU: TemplateForHClassTplFn needs a declaration
+ template<typename A> A TplFn(const TemplateForHClassTplFn<A>& a) {
+ return a.value;
+ }
+ // IWYU: TemplateForHClassTplFn needs a declaration
+ int NonTplFn(const TemplateForHClassTplFn<int>& a) {
+ return 0;
+ }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static int static_out_of_line(I2_Enum i2_enum);
+ struct H_NestedStruct {
+ // IWYU: I2_Enum is...*badinc-i2.h
+ I2_Enum nested_i2_enum;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ int nested(I2_Enum i2_enum);
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static int static_nested(I2_Enum i2_enum);
+ };
+ void DefinedInBadincCc();
+ void UsedInBadincH() { DefinedInBadincCc(); }
+ H_NestedStruct h_nested_struct;
+ ~H_Class() {
+ // IWYU: printf is...*<stdio.h>
+ printf("%d/%d/%d/%d/%d\n", b(), c(), d(), e(), ee_);
+ }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static I2_Enum ee_;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static I2_Enum ff_;
+ private:
+ // IWYU: I2_EnumForTypedefs is...*badinc-i2.h
+ typedef I2_EnumForTypedefs H_Class_I2_Typedef;
+ // IWYU: I2_Struct needs a declaration
+ // IWYU: I2_Class needs a declaration
+ friend I2_Struct I2_Function(I2_Class*);
+ friend class I2_Class;
+ template<typename FOO> friend class TemplateForHClassTplFn;
+ int a_;
+ Cc_Struct* ptr_into_cc_file_type_;
+ H_Class(const H_Class&);
+};
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I21 is...*badinc-i2.h
+I2_Enum H_Class::ee_ = I21;
+
+template<typename FOO>
+class H_TemplateClass {
+ public:
+ H_TemplateClass(FOO a) { a_ = a; }
+ FOO a() { return a_; }
+ H_Enum b() const { return static_cast<H_Enum>(a_); }
+ // IWYU: I2_Typedef is...*badinc-i2.h
+ // IWYU: I2_EnumForTypedefs is...*badinc-i2.h
+ I2_Typedef c() const { return static_cast<I2_EnumForTypedefs>(a_); }
+ // IWYU: I2_Struct is...*badinc-i2.h
+ I2_Struct unused_c() const { return I2_Struct(); } // unused tpl fn not iwyu
+ // IWYU: I2_Struct is...*badinc-i2.h
+ int unused_c2() const { return I2_Struct().a; }
+ int unused_c3() const { return this_is_ok_even_though_it_exists_not(FOO()); }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ int f(I2_Enum i2_enum);
+ void uses_i2class() {
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ I2_Class i2_class;
+ (void)i2_class;
+ }
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static FOO static_out_of_line(I2_Enum i2_enum);
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static FOO static_never_defined(I2_Enum i2_enum);
+ struct H_TplNestedStruct {
+ // IWYU: I2_Enum is...*badinc-i2.h
+ I2_Enum tplnested_i2_enum;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ int tplnested(I2_Enum i2_enum);
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static FOO static_tplnested(I2_Enum i2_enum);
+ };
+ H_TplNestedStruct h_nested_struct;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ static I2_Enum h_template_i2_static_;
+ static FOO h_template_foo_static_;
+ private:
+ // IWYU: I2_EnumForTypedefs is...*badinc-i2.h
+ typedef I2_EnumForTypedefs H_TemplateClass_I2_Typedef;
+ // IWYU: I2_Struct needs a declaration
+ // IWYU: I2_Class needs a declaration
+ friend I2_Struct I2_Function(I2_Class*);
+ FOO a_;
+ public:
+ H_TemplateClass(const H_TemplateClass&);
+};
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I21 is...*badinc-i2.h
+template<typename FOO> I2_Enum H_TemplateClass<FOO>::h_template_i2_static_ = I21;
+H_TemplateClass<int>* h_templateclass_var;
+
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+template<template<typename A> class T = I2_TemplateClass>
+// This is from the default destructor destroying t.
+// TODO(csilvers): attribute this use here, not at the caller sites.
+// TODO(csilvers): IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+class H_TemplateTemplateClass {
+ public:
+ // TODO(csilvers): attribute this use here, not at the caller sites.
+ // TODO(csilvers): IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+ // IWYU: I2_Enum is...*badinc-i2.h
+ // IWYU: I2_Enum::I21 is...*badinc-i2.h
+ H_TemplateTemplateClass() : t(T<I2_Enum>(I21)) {}
+ // IWYU: I2_Enum is...*badinc-i2.h
+ T<I2_Enum> t;
+ // IWYU: I2_Enum is...*badinc-i2.h
+ I2_Enum e;
+};
+
+// The generic OperateOn, but each specialization needs to define its own.
+template<class T> class OperateOn { };
+
+// OperateOn isn't checked for IWYU violations until it's instantiated.
+template<class T, class Functor = OperateOn<T> > class H_TemplateStructHelper {
+ public:
+ void a() {
+ Functor f;
+ (void)f;
+ }
+};
+
+// To make this example as much like hash_set<> as possible, the outer
+// class is really just a container around the class that does work.
+template<class T, class Functor = OperateOn<T> > class H_TemplateStruct {
+ private:
+ typedef H_TemplateStructHelper<T, Functor> _TS;
+ _TS ts;
+ public:
+ void a() { return ts.a(); }
+};
+
+// IWYU: I2_EnumForTypedefs is...*badinc-i2.h
+typedef I2_EnumForTypedefs H_Typedef;
+// IWYU: std::set is...*<set>
+// IWYU: I2_Enum is...*badinc-i2.h
+typedef std::set<I2_Enum> H_I2Enum_Set;
+// We need the full definition of I2_Class because as a typedef we are
+// re-exporting the vector<I2_Class> type, so it must be fully defined.
+// TODO(csilvers): IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+// IWYU: std::vector is...*<vector>
+// IWYU: I2_Class needs a declaration
+// IWYU: I2_Class is...*badinc-i2.h
+typedef std::vector<I2_Class> H_I2Class_Vector_Unused;
+// IWYU: I2_TemplateClass is...*badinc-i2.h
+// IWYU: I2_TemplateClass::I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+// IWYU: I2_TemplateClass::InlFileTemplateClassFn is...*badinc-i2-inl.h
+// IWYU: I2_Enum is...*badinc-i2.h
+typedef I2_TemplateClass<I2_Enum> H_TemplateTypedef;
+
+// IWYU: I2_Struct needs a declaration
+typedef I2_Struct* H_StructPtr;
+
+// IWYU: I2_Class needs a declaration
+typedef int (*H_FunctionPtr)(int, I2_Class*);
+
+H_Enum H_Function(H_Class* c) {
+ return H1;
+}
+
+// IWYU: I2_Class needs a declaration
+// IWYU: I2_Enum is...*badinc-i2.h
+I2_Enum H_Function_I(I2_Class*) {
+ // IWYU: I21 is...*badinc-i2.h
+ return I21;
+}
+
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I2_Class needs a declaration
+I2_Enum H_Function_I2(I2_Class* c);
+
+template<typename A> int H_TemplateFunction(A a) {
+ typedef A value_type; // Should not cause an iwyu violation
+ // IWYU: I2_Class is...*badinc-i2.h
+ // IWYU: I2_Class::I2_Class is...*badinc-i2-inl.h
+ // IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+ // IWYU: I2_Class::InlFileFn is...*badinc-i2-inl.h
+ // IWYU: I2_Class::InlFileTemplateFn is...*badinc-i2-inl.h
+ // IWYU: I2_Class::InlFileStaticFn is...*badinc-i2-inl.h
+ typedef I2_Class i2_type;
+ // IWYU: I2_Class needs a declaration
+ I2_Class* i2_class;
+ // IWYU: NULL is...*<stdio.h>
+ i2_class = NULL;
+ return a == A() ? 1 : 0;
+}
+
+// This macro is tricky because myclass_##classname involves a type
+// that's defined in scratch space. Make sure this doesn't result in
+// an IWYU violation. Nor should classname used *not* in a macro
+// concatenation (as the return value of Init).
+#define H_USE_CLASS(classname) \
+ struct H_Use_##classname { \
+ H_Use_##classname() { Init(); } \
+ classname* Init() { return 0; } \
+ }; \
+ static H_Use_##classname myclass_##classname
+
+#define H_CREATE_VAR(typ) typ h_create_var
+
+template<typename T> T& Identity(T& t) { return t; }
+#define H_IDENTITY(x) Identity(x)
+
+
+namespace h_ns {
+// IWYU: I2_Struct is...*badinc-i2.h
+typedef I2_Struct H_NamespaceTypedef;
+}
+
+// The vars. Just a few.
+H_Enum h_h_enum;
+// IWYU: I2_Class is...*badinc-i2.h
+// IWYU: I2_Class::~I2_Class is...*badinc-i2-inl.h
+I2_Class h_i2_class;
+H_TemplateClass<D3_Enum> h_d3_template_class(D31);
+// IWYU: I2_Enum is...*badinc-i2.h
+// IWYU: I22 is...*badinc-i2.h
+H_TemplateClass<I2_Enum> h_i2_template_class(I22);
+// TODO(csilvers): this should be attributed to the .h, since it comes
+// via a default template argument.
+// IWYU: I2_TemplateClass::~I2_TemplateClass<.*> is...*badinc-i2-inl.h
+H_TemplateTemplateClass<> h_templatetemlpate_class;
+H_TemplateTemplateClass<H_TemplateClass> h_i2_templatetemlpate_class;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_BADINC_H_
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/badinc.h should add these lines:
+#include <stdio.h>
+#include <set>
+#include <vector>
+#include "tests/cxx/badinc-i2-inl.h"
+#include "tests/cxx/badinc-i2.h"
+
+tests/cxx/badinc.h should remove these lines:
+- #include <ctype.h> // lines XX-XX
+- #include <math.h> // lines XX-XX
+- #include "tests/cxx/badinc-d2.h" // lines XX-XX
+- class H_ForwardDeclareClass; // lines XX-XX
+- template <typename T> class I2_TypedefOnly_Class; // lines XX-XX
+
+The full include-list for tests/cxx/badinc.h:
+#include <errno.h> // for errno
+#include <stdio.h> // for NULL, printf
+#include <queue> // for queue
+#include <set> // for set
+#include <string> // for string
+#include <vector> // for vector
+#include "tests/cxx/badinc-d3.h" // for D3_Enum, D3_Enum::D31
+#include "tests/cxx/badinc-i2-inl.h" // for I2_Class::I2_Class, I2_Class::InlFileFn, I2_Class::InlFileStaticFn, I2_Class::InlFileTemplateFn, I2_Class::~I2_Class, I2_TemplateClass::I2_TemplateClass<FOO>, I2_TemplateClass::InlFileTemplateClassFn, I2_TemplateClass::~I2_TemplateClass<FOO>
+#include "tests/cxx/badinc-i2.h" // for I2_Class, I2_Enum, I2_Enum::I21, I2_Enum::I22, I2_EnumForTypedefs, I2_MACRO, I2_Struct, I2_TemplateClass, I2_Typedef, I2_TypedefOnly_Class (ptr only), TemplateForHClassTplFn (ptr only)
+class Cc_Class; // lines XX-XX
+// TODO(csilvers): this should change to struct Cc_Struct.
+class Cc_Struct; // lines XX-XX
+class H_Class::H_Class_DefinedInI1; // lines XX-XX
+class H_Class::H_Class_Subdecl; // lines XX-XX
+class H_Class::H_Class_UnusedSubdecl; // lines XX-XX
+template <typename T> class H_ScopedPtr; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/badinc.imp b/tests/cxx/badinc.imp
new file mode 100644
index 0000000..0e4bf22
--- /dev/null
+++ b/tests/cxx/badinc.imp
@@ -0,0 +1,5 @@
+# Header mappings for IWYU tests.
+[
+ { include: ["\"tests/cxx/badinc-private.h\"", "private", "\"tests/cxx/badinc-inl.h\"", "public"] },
+ { include: ["\"tests/cxx/badinc-private2.h\"", "private", "\"tests/cxx/badinc-inl.h\"", "public"] }
+]
diff --git a/tests/cxx/badinc2.c b/tests/cxx/badinc2.c
new file mode 100644
index 0000000..a5c861f
--- /dev/null
+++ b/tests/cxx/badinc2.c
@@ -0,0 +1,12 @@
+//===--- badinc2.c - test input file for iwyu -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is #included from badinc.cc.
+
+extern "C" int C_Function(int x) { return 5; }
diff --git a/tests/cxx/built_ins_new_included.cc b/tests/cxx/built_ins_new_included.cc
new file mode 100644
index 0000000..58e46b0
--- /dev/null
+++ b/tests/cxx/built_ins_new_included.cc
@@ -0,0 +1,31 @@
+//===--- built_ins_new_included.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that iwyu suggests the include for <new> be removed if only
+// built-in functions are used.
+
+#include <new>
+
+void foo() {
+ char* ch = new char;
+ delete ch;
+ int* int_array = new int[10];
+ delete[] int_array;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/built_ins_new_included.cc should add these lines:
+
+tests/cxx/built_ins_new_included.cc should remove these lines:
+- #include <new> // lines XX-XX
+
+The full include-list for tests/cxx/built_ins_new_included.cc:
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/built_ins_no_includes.cc b/tests/cxx/built_ins_no_includes.cc
new file mode 100644
index 0000000..8aaac35
--- /dev/null
+++ b/tests/cxx/built_ins_no_includes.cc
@@ -0,0 +1,24 @@
+//===--- built_ins_no_includes.cc - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that iwyu doesn't recommend anything for built-in functions
+// when <new> is not included.
+
+void foo() {
+ char* ch = new char;
+ delete ch;
+ int* int_array = new int[10];
+ delete[] int_array;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/built_ins_no_includes.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/casts-d1.h b/tests/cxx/casts-d1.h
new file mode 100644
index 0000000..9f04aeb
--- /dev/null
+++ b/tests/cxx/casts-d1.h
@@ -0,0 +1,12 @@
+//===--- casts-d1.h - test input file for iwyu ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we handle correctly handle the various types of cast.
+
+#include "tests/cxx/casts-i1.h"
diff --git a/tests/cxx/casts-i1.h b/tests/cxx/casts-i1.h
new file mode 100644
index 0000000..43d7cd6
--- /dev/null
+++ b/tests/cxx/casts-i1.h
@@ -0,0 +1,14 @@
+//===--- casts-i1.h - test input file for iwyu ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we handle correctly handle the various types of cast.
+
+class CastsClass { };
+
+class CastsSubclass : public CastsClass { };
diff --git a/tests/cxx/casts.cc b/tests/cxx/casts.cc
new file mode 100644
index 0000000..9ae4ef1
--- /dev/null
+++ b/tests/cxx/casts.cc
@@ -0,0 +1,41 @@
+//===--- casts.cc - test input file for iwyu ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we handle correctly handle the various types of cast.
+
+#include "tests/cxx/casts-d1.h"
+
+// Prevent regression of a bug where we were ignoring the template
+// type arg when we should haven't been, when we were casting to it.
+// IWYU: CastsClass needs a declaration
+template<typename T> void TestTemplateCastBug(CastsClass* foo) {
+ (void)static_cast<T*>(foo);
+}
+
+int main() {
+ // IWYU: CastsClass needs a declaration
+ CastsClass* cc = 0;
+ // IWYU: CastsSubclass needs a declaration
+ // IWYU: CastsSubclass is...*casts-i1.h
+ TestTemplateCastBug<CastsSubclass>(cc);
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/casts.cc should add these lines:
+#include "tests/cxx/casts-i1.h"
+
+tests/cxx/casts.cc should remove these lines:
+- #include "tests/cxx/casts-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/casts.cc:
+#include "tests/cxx/casts-i1.h" // for CastsClass (ptr only), CastsSubclass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/catch-byptr.h b/tests/cxx/catch-byptr.h
new file mode 100644
index 0000000..746aaba
--- /dev/null
+++ b/tests/cxx/catch-byptr.h
@@ -0,0 +1,15 @@
+//===--- catch-byptr.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYPTR_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYPTR_H_
+
+class CatchByPtr {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYPTR_H_
diff --git a/tests/cxx/catch-byref.h b/tests/cxx/catch-byref.h
new file mode 100644
index 0000000..0ecb47f
--- /dev/null
+++ b/tests/cxx/catch-byref.h
@@ -0,0 +1,15 @@
+//===--- catch-byref.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYREF_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYREF_H_
+
+class CatchByRef {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYREF_H_
diff --git a/tests/cxx/catch-byvalue.h b/tests/cxx/catch-byvalue.h
new file mode 100644
index 0000000..1b492d6
--- /dev/null
+++ b/tests/cxx/catch-byvalue.h
@@ -0,0 +1,15 @@
+//===--- catch-byvalue.h - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYVALUE_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYVALUE_H_
+
+class CatchByValue {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_BYVALUE_H_
diff --git a/tests/cxx/catch-elab.h b/tests/cxx/catch-elab.h
new file mode 100644
index 0000000..b452eaf
--- /dev/null
+++ b/tests/cxx/catch-elab.h
@@ -0,0 +1,17 @@
+//===--- catch-elab.h - test input file for iwyu --------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_ELAB_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_ELAB_H_
+
+namespace Namespace {
+class CatchElab {};
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_ELAB_H_
diff --git a/tests/cxx/catch-exceptions.h b/tests/cxx/catch-exceptions.h
new file mode 100644
index 0000000..a46af7c
--- /dev/null
+++ b/tests/cxx/catch-exceptions.h
@@ -0,0 +1,25 @@
+//===--- catch-exceptions.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Facade header for exception types. We include this in catch.cc to provoke
+// IWYU warnings and replacements.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_EXCEPTIONS_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_EXCEPTIONS_H_
+
+#include "tests/cxx/catch-byptr.h" // for CatchByPtr
+#include "tests/cxx/catch-byref.h" // for CatchByRef
+#include "tests/cxx/catch-byvalue.h" // for CatchByValye
+#include "tests/cxx/catch-elab.h" // for CatchElab
+#include "tests/cxx/catch-logex.h" // for LogException
+#include "tests/cxx/catch-thrown.h" // for Thrown
+
+#include <stdio.h>
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_EXCEPTIONS_H_
diff --git a/tests/cxx/catch-logex.h b/tests/cxx/catch-logex.h
new file mode 100644
index 0000000..84dc919
--- /dev/null
+++ b/tests/cxx/catch-logex.h
@@ -0,0 +1,18 @@
+//===--- catch-logex.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_LOGEX_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_LOGEX_H_
+
+template<class ExceptionType>
+inline void LogException(const ExceptionType&) {
+ // log exception
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_LOGEX_H_
diff --git a/tests/cxx/catch-thrown.h b/tests/cxx/catch-thrown.h
new file mode 100644
index 0000000..9f8f24d
--- /dev/null
+++ b/tests/cxx/catch-thrown.h
@@ -0,0 +1,15 @@
+//===--- catch-thrown.h - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_THROWN_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_THROWN_H_
+
+class Thrown {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CATCH_THROWN_H_
diff --git a/tests/cxx/catch.cc b/tests/cxx/catch.cc
new file mode 100644
index 0000000..27de510
--- /dev/null
+++ b/tests/cxx/catch.cc
@@ -0,0 +1,78 @@
+//===--- catch.cc - test input file for iwyu ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/catch-exceptions.h"
+
+int main() {
+ try {
+ // IWYU: CatchByValue...*catch-byvalue.h
+ } catch (const CatchByValue cbv) {
+ // IWYU: LogException...*catch-logex.h
+ LogException(cbv);
+ }
+
+ try {
+ // IWYU: CatchByRef needs a declaration...*
+ // IWYU: CatchByRef...*catch-byref.h
+ } catch (const CatchByRef& cbr) {
+ // IWYU: LogException...*catch-logex.h
+ LogException(cbr);
+ }
+
+ try {
+ // IWYU: CatchByPtr needs a declaration...*
+ // IWYU: CatchByPtr...*catch-byptr.h
+ } catch (const CatchByPtr* cpr) {
+ // IWYU: LogException...*catch-logex.h
+ LogException(*cpr);
+ }
+
+ // Make sure we see through elaborated types
+ try {
+ // IWYU: CatchElab needs a declaration...*
+ // IWYU: CatchElab...*catch-elab.h
+ } catch (const Namespace::CatchElab&) {
+ }
+
+ // Make sure we don't crash when there's no type.
+ try {
+ // IWYU: Thrown...*catch-thrown.h
+ throw Thrown();
+ } catch (...) {
+ // IWYU: puts...*stdio.h
+ puts("Unknown exception");
+ }
+
+ return 0;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/catch.cc should add these lines:
+#include <stdio.h>
+#include "tests/cxx/catch-byptr.h"
+#include "tests/cxx/catch-byref.h"
+#include "tests/cxx/catch-byvalue.h"
+#include "tests/cxx/catch-elab.h"
+#include "tests/cxx/catch-logex.h"
+#include "tests/cxx/catch-thrown.h"
+
+tests/cxx/catch.cc should remove these lines:
+- #include "tests/cxx/catch-exceptions.h" // lines XX-XX
+
+The full include-list for tests/cxx/catch.cc:
+#include <stdio.h> // for puts
+#include "tests/cxx/catch-byptr.h" // for CatchByPtr
+#include "tests/cxx/catch-byref.h" // for CatchByRef
+#include "tests/cxx/catch-byvalue.h" // for CatchByValue
+#include "tests/cxx/catch-elab.h" // for CatchElab
+#include "tests/cxx/catch-logex.h" // for LogException
+#include "tests/cxx/catch-thrown.h" // for Thrown
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/check_also-d1.h b/tests/cxx/check_also-d1.h
new file mode 100644
index 0000000..b0e3a36
--- /dev/null
+++ b/tests/cxx/check_also-d1.h
@@ -0,0 +1,33 @@
+//===--- check_also-d1.h - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the '--check_also' flag.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
+
+#include "check_also-i1.h"
+
+// IWYU: NULL is...*<stddef.h>
+int* unused = NULL; // NULL comes from check_also-i1.h
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
+
+/**** IWYU_SUMMARY
+
+tests/cxx/check_also-d1.h should add these lines:
+#include <stddef.h>
+
+tests/cxx/check_also-d1.h should remove these lines:
+- #include "check_also-i1.h" // lines XX-XX
+
+The full include-list for tests/cxx/check_also-d1.h:
+#include <stddef.h> // for NULL
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/check_also-i1.h b/tests/cxx/check_also-i1.h
new file mode 100644
index 0000000..1009c0e
--- /dev/null
+++ b/tests/cxx/check_also-i1.h
@@ -0,0 +1,19 @@
+//===--- check_also-i1.h - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the '--check_also' flag.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_I1_H_
+
+#include <stddef.h> // for NULL
+
+const int kI1 = 1;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_I1_H_
diff --git a/tests/cxx/check_also-n1.h b/tests/cxx/check_also-n1.h
new file mode 100644
index 0000000..cfa1cae
--- /dev/null
+++ b/tests/cxx/check_also-n1.h
@@ -0,0 +1,22 @@
+//===--- check_also-n1.h - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the '--check_also' flag.
+//
+// This file is identical to check_also-d1.h, but has no iwyu summary,
+// since 'n1.h' isn't part of the --see_also glob.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
+
+#include "check_also-i1.h"
+
+int* unused = NULL; // NULL comes from check_also-i1.h
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_CHECK_ALSO_D1_H_
diff --git a/tests/cxx/check_also.cc b/tests/cxx/check_also.cc
new file mode 100644
index 0000000..89b9e92
--- /dev/null
+++ b/tests/cxx/check_also.cc
@@ -0,0 +1,32 @@
+//===--- check_also.cc - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the '--check_also' flag.
+
+#include "check_also-d1.h" // part of the --check-also glob
+#include "check_also-n1.h" // not part of the --check-also glob
+
+int main() {
+ // IWYU: kI1 is...*check_also-i1.h
+ return kI1;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/check_also.cc should add these lines:
+#include "tests/cxx/check_also-i1.h"
+
+tests/cxx/check_also.cc should remove these lines:
+- #include "check_also-d1.h" // lines XX-XX
+- #include "check_also-n1.h" // lines XX-XX
+
+The full include-list for tests/cxx/check_also.cc:
+#include "tests/cxx/check_also-i1.h" // for kI1
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/clmode.cc b/tests/cxx/clmode.cc
new file mode 100644
index 0000000..75fc1db
--- /dev/null
+++ b/tests/cxx/clmode.cc
@@ -0,0 +1,31 @@
+//===--- clmode.cc - test input file for iwyu -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This test will be executed with --driver-mode=cl and some MSVC-shaped
+// flags to ensure we can run IWYU with MSVC-compatible command-line switches.
+
+#include "tests/cxx/direct.h"
+
+// This use isn't really important, we just want to make sure IWYU does
+// something reasonable even in CL driver mode.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass random_use;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/clmode.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/clmode.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/clmode.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/comment_pragmas-d1.h b/tests/cxx/comment_pragmas-d1.h
new file mode 100644
index 0000000..1aa0f34
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d1.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-d1.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D1_H_
+
+#include "tests/cxx/comment_pragmas-i1.h"
+#include "tests/cxx/comment_pragmas-i6.h"
+#include "tests/cxx/comment_pragmas-i7.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D1_H_
diff --git a/tests/cxx/comment_pragmas-d10.h b/tests/cxx/comment_pragmas-d10.h
new file mode 100644
index 0000000..13bb1a5
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d10.h
@@ -0,0 +1,23 @@
+//===--- comment_pragmas-d10.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+/** @file tests/cxx/comment_pragmas-d10.h
+ * This is an internal header file, included by other library headers
+ * Do not attempt to use it directly.
+ * @headername{some_system_header_file, some_other_sytem_header_file}
+ */
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D10_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D10_H_
+
+#include "tests/cxx/comment_pragmas-i9.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D10_H_
diff --git a/tests/cxx/comment_pragmas-d11.h b/tests/cxx/comment_pragmas-d11.h
new file mode 100644
index 0000000..707b506
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d11.h
@@ -0,0 +1,20 @@
+//===--- comment_pragmas-d11.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D11_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D11_H_
+
+// Note: there is no file no_such_file2.h. It isn't needed for this test.
+// IWYU pragma: private, include "tests/cxx/no_such_file2.h"
+// IWYU pragma: friend tests/cxx/comment_pragmas.cc
+class CommentPragmasD11 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D11_H_
diff --git a/tests/cxx/comment_pragmas-d12.h b/tests/cxx/comment_pragmas-d12.h
new file mode 100644
index 0000000..53012bd
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d12.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-d12.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D12_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D12_H_
+
+// IWYU pragma: private
+// IWYU pragma: friend tests/cxx/comment_pragmas.cc
+class CommentPragmasD12 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D12_H_
diff --git a/tests/cxx/comment_pragmas-d13.h b/tests/cxx/comment_pragmas-d13.h
new file mode 100644
index 0000000..84453d4
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d13.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-d13.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D13_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D13_H_
+
+#include "tests/cxx/comment_pragmas-i10.h" // IWYU pragma: export
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D13_H_
diff --git a/tests/cxx/comment_pragmas-d14.h b/tests/cxx/comment_pragmas-d14.h
new file mode 100644
index 0000000..959808a
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d14.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-d14.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasD14.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D14_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D14_H_
+
+// IWYU pragma: private
+// IWYU pragma: friend nobody
+
+class CommentPragmasD14 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D14_H_
diff --git a/tests/cxx/comment_pragmas-d15.h b/tests/cxx/comment_pragmas-d15.h
new file mode 100644
index 0000000..b38781b
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d15.h
@@ -0,0 +1,16 @@
+//===--- comment_pragmas-d15.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasD15.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D15_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D15_H_
+
+class CommentPragmasD15 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D15_H_
diff --git a/tests/cxx/comment_pragmas-d16.h b/tests/cxx/comment_pragmas-d16.h
new file mode 100644
index 0000000..7e9cf49
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d16.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-d16.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D16_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D16_H_
+
+#include "tests/cxx/comment_pragmas-i11.h" /* IWYU pragma: export */
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D16_H_
diff --git a/tests/cxx/comment_pragmas-d17.h b/tests/cxx/comment_pragmas-d17.h
new file mode 100644
index 0000000..85e42b7
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d17.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-d17.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D17_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D17_H_
+
+// Note: there is no file no_such_file_d17.h. It isn't needed for this test.
+// IWYU pragma: private, include "tests/cxx/no_such_file_d17.h"
+class CommentPragmasD17 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D17_H_
diff --git a/tests/cxx/comment_pragmas-d18.h b/tests/cxx/comment_pragmas-d18.h
new file mode 100644
index 0000000..e4dc1dc
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d18.h
@@ -0,0 +1,15 @@
+//===--- comment_pragmas-d18.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D18_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D18_H_
+
+class CommentPragmasD18 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D18_H_
diff --git a/tests/cxx/comment_pragmas-d19.h b/tests/cxx/comment_pragmas-d19.h
new file mode 100644
index 0000000..e2b5af0
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d19.h
@@ -0,0 +1,15 @@
+//===--- comment_pragmas-d19.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D19_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D19_H_
+
+class CommentPragmasD19 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D19_H_
diff --git a/tests/cxx/comment_pragmas-d2.h b/tests/cxx/comment_pragmas-d2.h
new file mode 100644
index 0000000..1fa67d7
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d2.h
@@ -0,0 +1,20 @@
+//===--- comment_pragmas-d2.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D2_H_
+
+// Note: there is no file no_such_file.h. It isn't needed for this test.
+// IWYU pragma: private, include "tests/cxx/no_such_file.h"
+
+class CommentPragmasD2 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D2_H_
diff --git a/tests/cxx/comment_pragmas-d20.h b/tests/cxx/comment_pragmas-d20.h
new file mode 100644
index 0000000..37861bc
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d20.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-d20.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D20_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D20_H_
+
+namespace { class CommentPragmasD20a {}; }
+
+namespace Foo { namespace { class CommentPragmasD20b {}; } }
+
+namespace { class CommentPragmasD20c {}; }
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D20_H_
diff --git a/tests/cxx/comment_pragmas-d21.h b/tests/cxx/comment_pragmas-d21.h
new file mode 100644
index 0000000..872041b
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d21.h
@@ -0,0 +1,15 @@
+//===--- comment_pragmas-d21.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D21_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D21_H_
+
+class CommentPragmasD21 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D21_H_
diff --git a/tests/cxx/comment_pragmas-d22.h b/tests/cxx/comment_pragmas-d22.h
new file mode 100644
index 0000000..975d79f
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d22.h
@@ -0,0 +1,15 @@
+//===--- comment_pragmas-d22.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D22_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D22_H_
+
+class CommentPragmasD22 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D22_H_
diff --git a/tests/cxx/comment_pragmas-d3.h b/tests/cxx/comment_pragmas-d3.h
new file mode 100644
index 0000000..b336d45
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d3.h
@@ -0,0 +1,20 @@
+//===--- comment_pragmas-d3.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D3_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D3_H_
+
+// NOTE: comment_pragmas-i6.h explicitly exports this file.
+// IWYU pragma: private, include "tests/cxx/comment_pragmas-i6.h"
+
+class CommentPragmasD3 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D3_H_
diff --git a/tests/cxx/comment_pragmas-d4.h b/tests/cxx/comment_pragmas-d4.h
new file mode 100644
index 0000000..63d6719
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d4.h
@@ -0,0 +1,20 @@
+//===--- comment_pragmas-d4.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D4_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D4_H_
+
+// NOTE: comment_pragmas-i7.h includes but doesn't export this file.
+// IWYU pragma: private, include "tests/cxx/comment_pragmas-i7.h"
+
+class CommentPragmasD4 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D4_H_
diff --git a/tests/cxx/comment_pragmas-d5.h b/tests/cxx/comment_pragmas-d5.h
new file mode 100644
index 0000000..b70502a
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d5.h
@@ -0,0 +1,16 @@
+//===--- comment_pragmas-d5.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a file needlessly included directly by comment_pragmas.cc
+// with a "keep" pragma.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D5_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D5_H_
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D5_H_
diff --git a/tests/cxx/comment_pragmas-d6.h b/tests/cxx/comment_pragmas-d6.h
new file mode 100644
index 0000000..8cf8f15
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d6.h
@@ -0,0 +1,18 @@
+//===--- comment_pragmas-d6.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a file included directly by comment_pragmas.cc with a
+// "keep" pragma.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D6_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D6_H_
+
+#include "tests/cxx/comment_pragmas-i8.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D6_H_
diff --git a/tests/cxx/comment_pragmas-d7.h b/tests/cxx/comment_pragmas-d7.h
new file mode 100644
index 0000000..df9ebee
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d7.h
@@ -0,0 +1,41 @@
+//===--- comment_pragmas-d7.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file has various faulty pragmas.
+
+/** @file tests/cxx/comment_pragmas-d7.h
+ */
+// IWYU: @headername directive missing a closing brace
+/* @headername{missing_close_brace
+*/
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D7_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D7_H_
+
+// IWYU: end_exports without a begin_exports
+// IWYU pragma: end_exports
+
+// IWYU pragma: begin_exports
+// IWYU: Expected end_exports pragma
+#include "tests/cxx/indirect.h" // IWYU pragma: keep
+// IWYU pragma: end_exports
+
+// IWYU: Unknown or malformed pragma \(foo\)
+// IWYU pragma: foo
+
+// IWYU: Suggested include must be a quoted header
+// IWYU pragma: private, include not-a-quoted-header.h
+
+// IWYU: Inhibited include must be a quoted header
+// IWYU pragma: no_include not-a-quoted-header.h
+
+// IWYU: begin_exports without an end_exports
+// IWYU pragma: begin_exports
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D7_H_
diff --git a/tests/cxx/comment_pragmas-d8.h b/tests/cxx/comment_pragmas-d8.h
new file mode 100644
index 0000000..28197ad
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d8.h
@@ -0,0 +1,22 @@
+//===--- comment_pragmas-d8.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+/** @file tests/cxx/comment_pragmas-d8.h
+ * This is an internal header file, included by other library headers
+ * Do not attempt to use it directly. @headername{some_system_header_file}
+ */
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D8_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D8_H_
+
+class CommentPragmasD8 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D8_H_
diff --git a/tests/cxx/comment_pragmas-d9.h b/tests/cxx/comment_pragmas-d9.h
new file mode 100644
index 0000000..ec1a784
--- /dev/null
+++ b/tests/cxx/comment_pragmas-d9.h
@@ -0,0 +1,23 @@
+//===--- comment_pragmas-d9.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc.
+
+/** @file tests/cxx/comment_pragmas-d9.h
+ * This is an internal header file, included by other library headers
+ * Do not attempt to use it directly.
+ * @headername{some_system_header_file, some_other_system_header_file}
+ */
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D9_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D9_H_
+
+class CommentPragmasD9 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_D9_H_
diff --git a/tests/cxx/comment_pragmas-i1.h b/tests/cxx/comment_pragmas-i1.h
new file mode 100644
index 0000000..6524f68
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i1.h
@@ -0,0 +1,40 @@
+//===--- comment_pragmas-i1.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I1_H_
+
+// Verify that pragma that don't start comments are ignored.
+/*
+// IWYU pragma: private, include "foo" // This should be ignored.
+*/
+// // IWYU pragma: private, include "bar"
+const char kIgnoreThis[] = "// IWYU pragma: private, include \"baz\"";
+
+// And pragmas in uncompiled #ifs.
+#if 0
+// IWYU pragma: private, include "quz"
+#endif
+
+// Include a private file that declares us as the file to include.
+#include "tests/cxx/comment_pragmas-i2.h"
+
+// Re-export some files.
+#include "tests/cxx/comment_pragmas-i3.h" // IWYU pragma: export
+// This comment is here to make sure that clang calls HandleComment
+// once per whole-line comment.
+// IWYU pragma: begin_exports
+#include "tests/cxx/comment_pragmas-i4.h"
+#include "tests/cxx/comment_pragmas-i5.h"
+// IWYU pragma: end_exports
+
+// Include a file after 'end_exports' that we don't re-export.
+#include "tests/cxx/indirect.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I1_H_
diff --git a/tests/cxx/comment_pragmas-i10.h b/tests/cxx/comment_pragmas-i10.h
new file mode 100644
index 0000000..afadfb9
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i10.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-i10.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasI10.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I10_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I10_H_
+
+// IWYU pragma: private
+// IWYU pragma: friend tests/cxx/.*-d13.h
+
+class CommentPragmasI10 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I10_H_
diff --git a/tests/cxx/comment_pragmas-i11.h b/tests/cxx/comment_pragmas-i11.h
new file mode 100644
index 0000000..a1f4e74
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i11.h
@@ -0,0 +1,19 @@
+//===--- comment_pragmas-i11.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasI11.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I11_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I11_H_
+
+/* IWYU pragma: private */
+/* IWYU pragma: friend tests/cxx/.*-d16.h */
+
+class CommentPragmasI11 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I11_H_
diff --git a/tests/cxx/comment_pragmas-i2.h b/tests/cxx/comment_pragmas-i2.h
new file mode 100644
index 0000000..55aa59a
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i2.h
@@ -0,0 +1,18 @@
+//===--- comment_pragmas-i2.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A private header file exporting the symbol CommentPragmasI2.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I2_H_
+
+// IWYU pragma: private, include "tests/cxx/comment_pragmas-i1.h"
+
+class CommentPragmasI2 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I2_H_
diff --git a/tests/cxx/comment_pragmas-i3.h b/tests/cxx/comment_pragmas-i3.h
new file mode 100644
index 0000000..7471abd
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i3.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-i3.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file re-exported by comment_pragmas-i1.h exporting
+// the symbol CommentPragmasI3.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I3_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I3_H_
+
+class CommentPragmasI3 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I3_H_
diff --git a/tests/cxx/comment_pragmas-i4.h b/tests/cxx/comment_pragmas-i4.h
new file mode 100644
index 0000000..b2aa734
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i4.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-i4.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file re-exported by comment_pragmas-i1.h exporting
+// the symbol CommentPragmasI4.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I4_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I4_H_
+
+class CommentPragmasI4 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I4_H_
diff --git a/tests/cxx/comment_pragmas-i5.h b/tests/cxx/comment_pragmas-i5.h
new file mode 100644
index 0000000..07fe40e
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i5.h
@@ -0,0 +1,17 @@
+//===--- comment_pragmas-i5.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file re-exported by comment_pragmas-i1.h exporting
+// the symbol CommentPragmasI5.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I5_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I5_H_
+
+class CommentPragmasI5 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I5_H_
diff --git a/tests/cxx/comment_pragmas-i6.h b/tests/cxx/comment_pragmas-i6.h
new file mode 100644
index 0000000..47416dc
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i6.h
@@ -0,0 +1,20 @@
+//===--- comment_pragmas-i6.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc which
+// exports the private file d3.h.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I6_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I6_H_
+
+// IWYU pragma: begin_exports
+#include "tests/cxx/comment_pragmas-d3.h"
+// IWYU pragma: end_exports
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I6_H_
diff --git a/tests/cxx/comment_pragmas-i7.h b/tests/cxx/comment_pragmas-i7.h
new file mode 100644
index 0000000..6ba7039
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i7.h
@@ -0,0 +1,18 @@
+//===--- comment_pragmas-i7.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a private file included directly by comment_pragmas.cc which
+// includes but doesn't explicity export the private file d4.h.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I7_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I7_H_
+
+#include "tests/cxx/comment_pragmas-d4.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I7_H_
diff --git a/tests/cxx/comment_pragmas-i8.h b/tests/cxx/comment_pragmas-i8.h
new file mode 100644
index 0000000..4b385c9
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i8.h
@@ -0,0 +1,16 @@
+//===--- comment_pragmas-i8.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasI8.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I8_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I8_H_
+
+class CommentPragmasI8 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I8_H_
diff --git a/tests/cxx/comment_pragmas-i9.h b/tests/cxx/comment_pragmas-i9.h
new file mode 100644
index 0000000..c0353dc
--- /dev/null
+++ b/tests/cxx/comment_pragmas-i9.h
@@ -0,0 +1,16 @@
+//===--- comment_pragmas-i9.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A public header file exporting the symbol CommentPragmasI9.
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I9_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I9_H_
+
+class CommentPragmasI9 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_COMMENT_PRAGMAS_I9_H_
diff --git a/tests/cxx/comment_pragmas.cc b/tests/cxx/comment_pragmas.cc
new file mode 100644
index 0000000..98c8bfa
--- /dev/null
+++ b/tests/cxx/comment_pragmas.cc
@@ -0,0 +1,251 @@
+//===--- comment_pragmas.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the pragma-like comment-commands that iwyu recognizes,
+// as described at the top of iwyu_preprocessor.h.
+//
+// Here are the various cases we are testing.
+//
+// 1. symbol in private file => recommendation to include public file not seen.
+// cpd2 in d2.h which wants no_such_file.h.
+// 2. symbol in private file => recommendation to include exporting public file.
+// cpd3 in d3.h, wants (exporting) i6.h.
+// 3. symbol in private file => recommendation to include non-exporting file.
+// cpd4 in d4.h, wants (non-exporting) i7.h.
+// 4. symbol in public file => keep include with "exports" pragma.
+// cpi2 in i2.h, exported by i1.h.
+// 5. symbol in public file => keep include within
+// "begin_exports/end_exports" pragmas.
+// cpi3 in i3.h, exported by i1.h.
+// cpi4 in i4.h, exported by i1.h.
+// 6. symbol in public file => don't keep (non-exporting) includer.
+// ic in indirect.h, included by i2.h.
+// 7. unneeded include protected by a "keep" pragma.
+// d5.h is needlessly included.
+// 8. symbol in public file included by a "keeping" includer =>
+// the public file should be added, but includer kept.
+// cpi8 in i8.h, included by d6.h.
+// 9. begin_exports without end_exports => warning
+// d7.h.
+// 10. end_exports without begin_exports => warning
+// d7.h.
+// 11. pragma inside begin_exports/end_exports => warning
+// d7.h
+// 12. Unknown pragma => warning
+// d7.h
+// 13. @headername{foo} directive (gcc and ?) => include <foo>.
+// cp8 defined in d8.h which has @headername{some_system_header_file}
+// 14. @headername{foo, bar} directive (gcc and ?) => include <foo>.
+// cp9 defined in d9.h which has
+// @headername{some_system_header_file, some_other_header_file}
+// 15. Malformed @headername -> warning
+// d7.h
+// 16. "no_include" pragma: Don't suggest include.
+// cpi9's type is defined in i9.h, included by d10.h.
+// d10.h will be deemed unnecessary, which is ok, and i9.h will
+// not be suggested.
+// TODO(dsturtevant): Tests where both the defining public file and an
+// exporting public file are included, once it's clear what the policy
+// should be.
+// 17. "friend" pragma: cpd11's type is defined in d11.h which is private
+// but declares this file as a friend.
+// 18. "keep" keeps a "private" file: cpd17's type is defined in d17.h
+// which is private but this file declares it "keep". d17.h is still
+// included, and its suggested file is not.
+// TODO(dsturtevant): More tests of "friend": globs, header files,
+// quoted globs, more than one friend pragma in one file, file with more
+// than one file befriending it.
+// 19. "no_forward_declare" pragma: cpd18 is used in a way that can
+// be forward declared, but that forward declare is inhibited.
+// 20. "no_forward_declare" pragma: cpd19 is used in a forward-declarable
+// way, but is forward declared anyway even though inhibited.
+// 21. "no_forward_declare" pragma: Test21a is defined after a typedef,
+// which requires a forward declaration. This case is different because
+// internally IWYU wants a full-use which it downgrades to a forward-decl.
+// 22. "no_forward_declare" pragma: cpd20a and cpd20b are defined inside an
+// anonymous namespace.
+#include "tests/cxx/comment_pragmas-d1.h"
+#include "tests/cxx/comment_pragmas-d10.h"
+#include "tests/cxx/comment_pragmas-d11.h"
+#include "tests/cxx/comment_pragmas-d12.h"
+#include "tests/cxx/comment_pragmas-d13.h"
+#include "tests/cxx/comment_pragmas-d14.h"
+#include "tests/cxx/comment_pragmas-d15.h" /* IWYU pragma: keep */ /* check C-style comments */
+#include "tests/cxx/comment_pragmas-d16.h"
+#include "tests/cxx/comment_pragmas-d17.h" // IWYU pragma: keep
+#include "tests/cxx/comment_pragmas-d18.h"
+#include "tests/cxx/comment_pragmas-d19.h"
+#include "tests/cxx/comment_pragmas-d2.h"
+#include "tests/cxx/comment_pragmas-d20.h"
+#include "tests/cxx/comment_pragmas-d3.h"
+#include "tests/cxx/comment_pragmas-d4.h"
+#include "tests/cxx/comment_pragmas-d5.h" // IWYU pragma: keep
+#include "tests/cxx/comment_pragmas-d6.h" // IWYU pragma: keep // second instance, testing comment at end
+#include "tests/cxx/comment_pragmas-d7.h"
+#include "tests/cxx/comment_pragmas-d8.h"
+#include "tests/cxx/comment_pragmas-d9.h"
+// IWYU pragma: no_include "tests/cxx/comment_pragmas-i9.h" // another test of comments
+// IWYU pragma: no_include "tests/cxx/no_such_file_d17.h"
+// IWYU pragma: no_forward_declare CommentPragmasD18
+// IWYU pragma: no_forward_declare CommentPragmasD19
+// IWYU pragma: no_forward_declare CommentPragmasD20a
+// IWYU pragma: no_forward_declare Foo::CommentPragmasD20b
+// IWYU pragma: no_forward_declare ::CommentPragmasD20c
+// IWYU pragma: no_forward_declare CommentPragmasTest21a
+
+// Keep all includes of any header name marked with pragma keep.
+#include "tests/cxx/comment_pragmas-d21.h"
+#include "tests/cxx/comment_pragmas-d21.h" // IWYU pragma: keep
+
+#include "tests/cxx/comment_pragmas-d22.h" // IWYU pragma: keep
+#include "tests/cxx/comment_pragmas-d22.h"
+
+class CommentPragmasD19; // Needed, but removed due to no_forward_declare.
+class CommentPragmasTest21a; // Needed but removed due to no_forward_declare.
+
+class ForwardDeclaredUnnecessary1; // IWYU pragma: keep
+class ForwardDeclaredUnnecessary2; /* IWYU pragma: keep */
+
+// The following classes are all defined in public files exported by i2.h.
+// IWYU: CommentPragmasI2 is...*comment_pragmas-i1.h
+CommentPragmasI2 cpi2;
+// IWYU: CommentPragmasI3 is...*comment_pragmas-i1.h
+CommentPragmasI3 cpi3;
+// IWYU: CommentPragmasI4 is...*comment_pragmas-i1.h
+CommentPragmasI4 cpi4;
+
+// d2.h is a private file which says to include no_such_file.h.
+// We haven't provided that file, because it's not needed for this test.
+// IWYU: CommentPragmasD2 is...*no_such_file.h
+CommentPragmasD2 cpd2;
+
+// d3.h is a private file which says to include i6.h, which
+// re-exports it.
+// IWYU: CommentPragmasD3 is...*comment_pragmas-i6.h
+CommentPragmasD3 cpd3;
+
+// d4.h is a private file which says to include i7.h, which
+// doesn't explicitly re-export it.
+// IWYU: CommentPragmasD4 is...*comment_pragmas-i7.h
+CommentPragmasD4 cpd4;
+
+// d6.h includes i8.h and d6.h is "kept".
+// IWYU: CommentPragmasI8 is...*comment_pragmas-i8.h
+CommentPragmasI8 cpi8;
+
+// indirect.h is not private and not exported by i2.h.
+// IWYU: IndirectClass is ...*indirect.h
+IndirectClass ic;
+
+// IWYU: CommentPragmasD8 is...*<some_system_header_file>
+CommentPragmasD8 cpd8;
+
+// IWYU: CommentPragmasD9 is...*<some_system_header_file>
+CommentPragmasD9 cpd9;
+
+// Note: IWYU will emit the diagnostic but suppress the include
+// recommendation due to the no_include pragma.
+// IWYU: CommentPragmasI9 is...*comment_pragmas-i9.h
+CommentPragmasI9 cpi9;
+
+// d11.h is a private file which says to include no_such_file2.h, but
+// has a pragma saying it's ok for comment_pragmas.cc to include
+// it.
+CommentPragmasD11 cpd11;
+
+// d11.h is a private file with no preferred includer. It has a
+// pragma saying it's ok for comment_pragmas.cc to include it.
+CommentPragmasD12 cpd12;
+
+// i10.h is included by d13.h. There's a pragma in i10.h declaring
+// .*-d13.h friends.
+CommentPragmasI10 cpi10;
+
+// i11.h is included by d16.h. There's a c-style pragma in i11.h declaring
+// .*-d16.h friends.
+CommentPragmasI11 cpi11;
+
+// d14.h is a private file with friend "nobody" and no suggested includes.
+// IWYU doesn't modify the inclusion.
+CommentPragmasD14 cpd14;
+
+// d17.h is a private file with suggested include "no_such_file_d17.h".
+// IWYU wants to include no_such_file_d17.h, even though it wants to
+// keep d17.h, but is prohibited from doing so by a no_include pragma.
+// IWYU: CommentPragmasD17 is...*no_such_file_d17.h
+CommentPragmasD17 cpd17;
+
+// Use cpd18,cpd19,cpd20a,cpd20b,cpd20c in ways that IWYU would normally want
+// to suggest a forward declaration for. However, there's a
+// no_forward_declare pragma in this file inhibiting the forward
+// declarations.
+CommentPragmasD18* cpd18;
+CommentPragmasD19* cpd19;
+CommentPragmasD20a* cpd20a;
+Foo::CommentPragmasD20b* cpd20b;
+CommentPragmasD20c* cpd20c;
+// This is a case where IWYU wants the full definition of
+// CommentPragmasTest21a due to the typedef, but then downgrades to
+// requiring a forward declaration since the definition appears later
+// in the same file. This forward declaration is inhibited due to a
+// no_forward_declare pragma at the top of this file.
+typedef CommentPragmasTest21a CommentPragmasTest21b;
+class CommentPragmasTest21a {};
+
+/**** IWYU_SUMMARY
+
+tests/cxx/comment_pragmas.cc should add these lines:
+#include <some_system_header_file>
+#include "tests/cxx/comment_pragmas-i1.h"
+#include "tests/cxx/comment_pragmas-i6.h"
+#include "tests/cxx/comment_pragmas-i7.h"
+#include "tests/cxx/comment_pragmas-i8.h"
+#include "tests/cxx/indirect.h"
+#include "tests/cxx/no_such_file.h"
+
+tests/cxx/comment_pragmas.cc should remove these lines:
+- #include "tests/cxx/comment_pragmas-d1.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d10.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d2.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d3.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d4.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d7.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d8.h" // lines XX-XX
+- #include "tests/cxx/comment_pragmas-d9.h" // lines XX-XX
+- class CommentPragmasD19; // lines XX-XX
+- class CommentPragmasTest21a; // lines XX-XX
+
+The full include-list for tests/cxx/comment_pragmas.cc:
+#include <some_system_header_file> // for CommentPragmasD8, CommentPragmasD9
+#include "tests/cxx/comment_pragmas-d11.h" // for CommentPragmasD11
+#include "tests/cxx/comment_pragmas-d12.h" // for CommentPragmasD12
+#include "tests/cxx/comment_pragmas-d13.h" // for CommentPragmasI10
+#include "tests/cxx/comment_pragmas-d14.h" // for CommentPragmasD14
+#include "tests/cxx/comment_pragmas-d15.h"
+#include "tests/cxx/comment_pragmas-d16.h" // for CommentPragmasI11
+#include "tests/cxx/comment_pragmas-d17.h"
+#include "tests/cxx/comment_pragmas-d18.h" // for CommentPragmasD18
+#include "tests/cxx/comment_pragmas-d19.h" // for CommentPragmasD19
+#include "tests/cxx/comment_pragmas-d20.h" // for CommentPragmasD20a, CommentPragmasD20b, CommentPragmasD20c
+#include "tests/cxx/comment_pragmas-d21.h"
+#include "tests/cxx/comment_pragmas-d21.h"
+#include "tests/cxx/comment_pragmas-d22.h"
+#include "tests/cxx/comment_pragmas-d22.h"
+#include "tests/cxx/comment_pragmas-d5.h"
+#include "tests/cxx/comment_pragmas-d6.h"
+#include "tests/cxx/comment_pragmas-i1.h" // for CommentPragmasI2, CommentPragmasI3, CommentPragmasI4
+#include "tests/cxx/comment_pragmas-i6.h" // for CommentPragmasD3
+#include "tests/cxx/comment_pragmas-i7.h" // for CommentPragmasD4
+#include "tests/cxx/comment_pragmas-i8.h" // for CommentPragmasI8
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/no_such_file.h" // for CommentPragmasD2
+class ForwardDeclaredUnnecessary1; // lines XX-XX
+class ForwardDeclaredUnnecessary2; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/computed_include.cc b/tests/cxx/computed_include.cc
new file mode 100644
index 0000000..d904bc6
--- /dev/null
+++ b/tests/cxx/computed_include.cc
@@ -0,0 +1,46 @@
+//===--- computed_include.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests computed #includes, i.e. #includes with macros.
+
+#include "tests/cxx/computed_include.h"
+
+// Test macro defined in another file.
+#include MACRO_INC
+// Test when #include with macro from another file is skipped.
+#include MACRO_INC
+
+// Macros with angle brackets differ from macros with quotation marks: the last
+// include token is '>' and '"foo.h"' respectively.
+#define MACRO_ANGLED_INC <stdio.h>
+#include MACRO_ANGLED_INC
+// And test how such #include is skipped.
+#include MACRO_ANGLED_INC
+
+// Test macro with arguments.
+#define STRINGIZE(x) #x
+#include STRINGIZE(tests/cxx/computed_include.h)
+
+IndirectClass ic;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/computed_include.cc should add these lines:
+
+tests/cxx/computed_include.cc should remove these lines:
+- #include "tests/cxx/computed_include.h" // lines XX-XX
+- #include <stdio.h> // lines XX-XX
+- #include <stdio.h> // lines XX-XX
+- #include "tests/cxx/indirect.h" // lines XX-XX
+
+The full include-list for tests/cxx/computed_include.cc:
+#include "tests/cxx/computed_include.h"
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/computed_include.h b/tests/cxx/computed_include.h
new file mode 100644
index 0000000..c90e0e9
--- /dev/null
+++ b/tests/cxx/computed_include.h
@@ -0,0 +1,16 @@
+//===--- computed_include.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define MACRO_INC "tests/cxx/indirect.h"
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/computed_include.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/conversion_ctor.cc b/tests/cxx/conversion_ctor.cc
new file mode 100644
index 0000000..2e31e80
--- /dev/null
+++ b/tests/cxx/conversion_ctor.cc
@@ -0,0 +1,38 @@
+//===--- conversion_ctor.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The smallest repro case for issue #89:
+// http://code.google.com/p/include-what-you-use/issues/detail?id=89
+
+#include "tests/cxx/direct.h"
+
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass ic; // this triggers generation of implicit move constructor
+
+// IWYU: IndirectClass needs a declaration
+char Foo(IndirectClass); // this checks if IndirectClass has an implicit
+ // conversion constructor, which misfires because
+ // there's an implicit move constructor.
+
+// The patch to issue #89 fixes this by having iwyu_ast_util.cc's
+// HasImplicitConversionCtor not treat implicit move constructors as
+// implicit conversion constructors.
+
+/**** IWYU_SUMMARY
+
+tests/cxx/conversion_ctor.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/conversion_ctor.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/conversion_ctor.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/cvr-base.h b/tests/cxx/cvr-base.h
new file mode 100644
index 0000000..e4f2987
--- /dev/null
+++ b/tests/cxx/cvr-base.h
@@ -0,0 +1,15 @@
+//===--- cvr-base.h - test input file for iwyu ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CVR_BASE_H
+#define CVR_BASE_H
+
+class Base {};
+
+#endif
diff --git a/tests/cxx/cvr-class.h b/tests/cxx/cvr-class.h
new file mode 100644
index 0000000..52dbef7
--- /dev/null
+++ b/tests/cxx/cvr-class.h
@@ -0,0 +1,15 @@
+//===--- cvr-class.h - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CVR_CLASS_H
+#define CVR_CLASS_H
+
+class Class {};
+
+#endif
diff --git a/tests/cxx/cvr-derived.h b/tests/cxx/cvr-derived.h
new file mode 100644
index 0000000..a4e2c40
--- /dev/null
+++ b/tests/cxx/cvr-derived.h
@@ -0,0 +1,17 @@
+//===--- cvr-derived.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CVR_DERIVED_H
+#define CVR_DERIVED_H
+
+#include "tests/cxx/cvr-base.h"
+
+class Derived : public Base {};
+
+#endif
diff --git a/tests/cxx/cvr.cc b/tests/cxx/cvr.cc
new file mode 100644
index 0000000..ebf2e8a
--- /dev/null
+++ b/tests/cxx/cvr.cc
@@ -0,0 +1,49 @@
+//===--- cvr.cc - test input file for iwyu --------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/cvr-derived.h" // for Derived
+#include "tests/cxx/cvr-class.h" // for Class
+
+class Base;
+
+class ReturnsBase {
+ virtual Base* non_covariant() = 0;
+
+ virtual Base* covariant_derived() = 0;
+ virtual const Class* covariant_cv_qual() = 0;
+};
+
+class ReturnsDerived : public ReturnsBase {
+ // Normal case, do not trigger covariant return types.
+ // This should require only a forward declaration of Base.
+ Base* non_covariant() {
+ return 0;
+ }
+
+ // C++ [class.virtual]p7, second bullet
+ // Trigger covariant return types:
+ // Base is an unambiguous and accessible direct or indirect base class of
+ // Derived.
+ Derived* covariant_derived() {
+ return 0;
+ }
+
+ // C++ [class.virtual]p7, third bullet
+ // Trigger covariant return types:
+ // Class* has less cv-qualification than const Class*.
+ Class* covariant_cv_qual() {
+ return 0;
+ }
+};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/cvr.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/default_template_arg_other_file-d1.h b/tests/cxx/default_template_arg_other_file-d1.h
new file mode 100644
index 0000000..ce4c168
--- /dev/null
+++ b/tests/cxx/default_template_arg_other_file-d1.h
@@ -0,0 +1,38 @@
+//===--- default_template_arg_other_file-d1.h - test input file for iwyu --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/default_template_arg_other_file-o1.h"
+
+// We provide one specialization here.
+class IntendsToProvideClass { };
+template<> class OperateOn<IntendsToProvideClass> { };
+
+// And one partial specialization as well.
+template<typename T> class OperateOn<T*> { };
+
+template<typename T> class IntendsToProvideTplClass { };
+template<typename T> class OperateOn<IntendsToProvideTplClass<T> > { };
+
+template<class T, class Functor = OperateOn<T> > class TemplateStructHelper {
+ public:
+ void a() {
+ Functor f;
+ (void)f;
+ }
+};
+
+// To make this example as much like hash_set<> as possible, the outer
+// class is really just a container around the class that does work.
+template<class T, class Functor = OperateOn<T> > class TemplateStruct {
+ private:
+ typedef TemplateStructHelper<T, Functor> _TS;
+ _TS ts;
+ public:
+ void a() { return ts.a(); }
+};
diff --git a/tests/cxx/default_template_arg_other_file-d2.h b/tests/cxx/default_template_arg_other_file-d2.h
new file mode 100644
index 0000000..4120a00
--- /dev/null
+++ b/tests/cxx/default_template_arg_other_file-d2.h
@@ -0,0 +1,10 @@
+//===--- default_template_arg_other_file-d2.h - test input file for iwyu --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/default_template_arg_other_file-i2.h"
diff --git a/tests/cxx/default_template_arg_other_file-i2.h b/tests/cxx/default_template_arg_other_file-i2.h
new file mode 100644
index 0000000..7e4e5b8
--- /dev/null
+++ b/tests/cxx/default_template_arg_other_file-i2.h
@@ -0,0 +1,15 @@
+//===--- default_template_arg_other_file-i2.h - test input file for iwyu --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class MyClass {};
+template<typename T> class TplClass {};
+
+template<class T> class OperateOn; // forward declare
+template<> class OperateOn<MyClass> { }; // explicit specialization
+template<class T> class OperateOn<TplClass<T> > { }; // partial specialization
diff --git a/tests/cxx/default_template_arg_other_file-o1.h b/tests/cxx/default_template_arg_other_file-o1.h
new file mode 100644
index 0000000..38b50a7
--- /dev/null
+++ b/tests/cxx/default_template_arg_other_file-o1.h
@@ -0,0 +1,11 @@
+//===--- default_template_arg_other_file-o1.h - test input file for iwyu --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The generic OperateOn, but each specialization needs to define its own.
+template<class T> class OperateOn { };
diff --git a/tests/cxx/default_template_arg_other_file.cc b/tests/cxx/default_template_arg_other_file.cc
new file mode 100644
index 0000000..4101707
--- /dev/null
+++ b/tests/cxx/default_template_arg_other_file.cc
@@ -0,0 +1,69 @@
+//===--- default_template_arg_other_file.cc - test input file for iwyu ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the equivalent of doing
+// hash_set<MyClass> foo;
+// where hash<MyClass> is defined in some .h file. This should
+// require a needs-to-include dependency on that .h file, to get
+// its specialization of hash<>.
+
+#include "tests/cxx/default_template_arg_other_file-d1.h"
+#include "tests/cxx/default_template_arg_other_file-d2.h"
+
+int main() {
+ // TODO(csilvers): IWYU: OperateOn is...*default_template_arg_other_file-i2.h
+ // IWYU: MyClass needs a declaration
+ TemplateStruct<MyClass> ts;
+ // IWYU: OperateOn is...*default_template_arg_other_file-i2.h
+ ts.a();
+
+ // TODO(csilvers): IWYU: OperateOn is...*default_template_arg_other_file-i2.h
+ // IWYU: TplClass needs a declaration
+ // IWYU: MyClass needs a declaration
+ TemplateStruct<TplClass<MyClass> > ts2;
+ // IWYU: OperateOn is...*default_template_arg_other_file-i2.h
+ ts2.a();
+
+ // Make sure that we don't require OperateOn when we don't have a
+ // type with an explicit or partial specialization.
+ TemplateStruct<int> ts3;
+ ts3.a();
+
+ // We also shouldn't require OperateOn when we have an explicit
+ // specialization in the same file as the main definition.
+ // (Since then the provider of OperateOn "intends to provide"
+ // the specialization.)
+ TemplateStruct<IntendsToProvideClass> ts4;
+ ts4.a();
+ TemplateStruct<IntendsToProvideTplClass<IntendsToProvideClass> > ts5;
+ ts5.a();
+
+ // Same when it's a partial specialization.
+ // IWYU: MyClass needs a declaration
+ TemplateStruct<MyClass*> ts6;
+ ts6.a();
+ // IWYU: MyClass needs a declaration
+ // IWYU: TplClass needs a declaration
+ TemplateStruct<TplClass<MyClass>*> ts7;
+ ts7.a();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/default_template_arg_other_file.cc should add these lines:
+#include "tests/cxx/default_template_arg_other_file-i2.h"
+
+tests/cxx/default_template_arg_other_file.cc should remove these lines:
+- #include "tests/cxx/default_template_arg_other_file-d2.h" // lines XX-XX
+
+The full include-list for tests/cxx/default_template_arg_other_file.cc:
+#include "tests/cxx/default_template_arg_other_file-d1.h" // for IntendsToProvideClass (ptr only), IntendsToProvideTplClass (ptr only), TemplateStruct
+#include "tests/cxx/default_template_arg_other_file-i2.h" // for MyClass (ptr only), OperateOn, TplClass (ptr only)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/deleted_implicit.cc b/tests/cxx/deleted_implicit.cc
new file mode 100644
index 0000000..9becf5a
--- /dev/null
+++ b/tests/cxx/deleted_implicit.cc
@@ -0,0 +1,55 @@
+//===--- deleted_implicit.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we don't crash when instantiating implicit methods, or rather,
+// that we avoid instantiating implicit methods when they are to be considered
+// deleted.
+
+// http://en.cppreference.com/w/cpp/language/default_constructor#Deleted_implicitly-declared_default_constructor
+// says C++11 considers the default constructor deleted if a type has a
+// member of reference type.
+// IWYU: class ...* does not declare any constructor to initialize its non-modifiable members
+class ReferenceMember {
+ int& ref_member;
+};
+
+// http://en.cppreference.com/w/cpp/language/copy_constructor#Deleted_implicitly-declared_copy_constructor
+// says C++11 considers the copy constructor deleted if a type has a member of
+// rvalue reference type.
+// IWYU: class ...* does not declare any constructor to initialize its non-modifiable members
+class RvalueReferenceMember {
+ int&& ref_member;
+};
+
+// http://en.cppreference.com/w/cpp/language/move_constructor#Deleted_implicitly-declared_move_constructor
+// says C++11 considers the move constructor deleted if a type has a non-static
+// data member that cannot be moved (e.g. because its move ctor is deleted.)
+class DeletedMoveCtor {
+ DeletedMoveCtor(DeletedMoveCtor&&) = delete;
+};
+
+class ContainsDeletedMoveCtor {
+ DeletedMoveCtor contained;
+};
+
+// http://en.cppreference.com/w/cpp/language/destructor#Deleted_implicitly-declared_destructor
+// says C++11 considers the destructor deleted if a type has a base class with
+// inaccessible or deleted destructor.
+class PrivateDestructor {
+ ~PrivateDestructor();
+};
+
+class Derived : public PrivateDestructor {
+};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/deleted_implicit.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/depopulated_h_file-i1.h b/tests/cxx/depopulated_h_file-i1.h
new file mode 100644
index 0000000..c359a3e
--- /dev/null
+++ b/tests/cxx/depopulated_h_file-i1.h
@@ -0,0 +1,18 @@
+//===--- depopulated_h_file-i1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_I1_H_
+
+class Foo {
+ public:
+ static void Bar();
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_I1_H_
diff --git a/tests/cxx/depopulated_h_file.cc b/tests/cxx/depopulated_h_file.cc
new file mode 100644
index 0000000..c99b188
--- /dev/null
+++ b/tests/cxx/depopulated_h_file.cc
@@ -0,0 +1,29 @@
+//===--- depopulated_h_file.cc - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The directly-included file contains only an inclusion of the file
+// defining Foo. IWYU should recommend that inclusion be moved to this file.
+#include "tests/cxx/depopulated_h_file.h"
+
+void foo() {
+ Foo::Bar();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/depopulated_h_file.cc should add these lines:
+#include "tests/cxx/depopulated_h_file-i1.h"
+
+tests/cxx/depopulated_h_file.cc should remove these lines:
+
+The full include-list for tests/cxx/depopulated_h_file.cc:
+#include "tests/cxx/depopulated_h_file.h"
+#include "tests/cxx/depopulated_h_file-i1.h" // for Foo
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/depopulated_h_file.h b/tests/cxx/depopulated_h_file.h
new file mode 100644
index 0000000..952fd82
--- /dev/null
+++ b/tests/cxx/depopulated_h_file.h
@@ -0,0 +1,26 @@
+//===--- depopulated_h_file.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_H_
+
+#include "tests/cxx/depopulated_h_file-i1.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_DEPOPULATED_H_FILE_H_
+
+/**** IWYU_SUMMARY
+
+tests/cxx/depopulated_h_file.h should add these lines:
+
+tests/cxx/depopulated_h_file.h should remove these lines:
+- #include "tests/cxx/depopulated_h_file-i1.h" // lines XX-XX
+
+The full include-list for tests/cxx/depopulated_h_file.h:
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/derived_function_tpl_args-d1.h b/tests/cxx/derived_function_tpl_args-d1.h
new file mode 100644
index 0000000..acb5e5b
--- /dev/null
+++ b/tests/cxx/derived_function_tpl_args-d1.h
@@ -0,0 +1,10 @@
+//===--- derived_function_tpl_args-d1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/derived_function_tpl_args-i1.h"
diff --git a/tests/cxx/derived_function_tpl_args-i1.h b/tests/cxx/derived_function_tpl_args-i1.h
new file mode 100644
index 0000000..4e23481
--- /dev/null
+++ b/tests/cxx/derived_function_tpl_args-i1.h
@@ -0,0 +1,16 @@
+//===--- derived_function_tpl_args-i1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class IndirectClass { };
+
+namespace ns {
+class NsClass { };
+}
+
+template<typename T, typename U=ns::NsClass> class IndirectTplClass { };
diff --git a/tests/cxx/derived_function_tpl_args.cc b/tests/cxx/derived_function_tpl_args.cc
new file mode 100644
index 0000000..ddfd5de
--- /dev/null
+++ b/tests/cxx/derived_function_tpl_args.cc
@@ -0,0 +1,141 @@
+//===--- derived_function_tpl_args.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests calls to a templated function, especially ones where the
+// calls do not specify the template args explicitly, but instead
+// have them derived from the function arguments (including return
+// type). clang desugars the template types in this case, and we
+// make some effort to undo this work and get back to what the
+// template args 'logically' are.
+
+#include "tests/cxx/derived_function_tpl_args-d1.h"
+
+template<typename T> void Fn(T t) {
+ T dummy;
+ (void)dummy;
+}
+
+template<typename T> void FnWithPtr(T* t) {
+ T dummy;
+ (void)dummy;
+}
+
+template<typename T> void FnWithReference(const T& t) {
+ T dummy;
+ (void)dummy;
+}
+
+template<typename T> struct TplClass {
+ T t;
+};
+
+int main() {
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ IndirectClass ic;
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* ic_ptr = 0;
+
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ Fn(ic);
+ Fn(ic_ptr);
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ FnWithPtr(ic_ptr);
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ FnWithReference(ic);
+ FnWithReference(ic_ptr);
+
+ // Do it again, to make sure that the template cache is working properly.
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ Fn(ic);
+ Fn(ic_ptr);
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ FnWithPtr(ic_ptr);
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ FnWithReference(ic);
+ FnWithReference(ic_ptr);
+
+ // Now try again, but with a typedef.
+ // IWYU: IndirectClass is...*derived_function_tpl_args-i1.h
+ typedef IndirectClass LocalClass;
+ LocalClass lc;
+ LocalClass* lc_ptr = 0;
+ Fn(lc);
+ Fn(lc_ptr);
+ FnWithPtr(lc_ptr);
+ FnWithReference(lc);
+ FnWithReference(lc_ptr);
+
+ // And try again, but with namespaces. This makes sure we don't
+ // get tripped up by ElaboratedType's.
+ // IWYU: ns::NsClass is...*derived_function_tpl_args-i1.h
+ ns::NsClass ns_ic;
+ // IWYU: ns::NsClass needs a declaration
+ ns::NsClass* ns_ic_ptr = 0;
+
+ // IWYU: ns::NsClass is...*derived_function_tpl_args-i1.h
+ Fn(ns_ic);
+ Fn(ns_ic_ptr);
+ // IWYU: ns::NsClass is...*derived_function_tpl_args-i1.h
+ FnWithPtr(ns_ic_ptr);
+ // IWYU: ns::NsClass is...*derived_function_tpl_args-i1.h
+ FnWithReference(ns_ic);
+ FnWithReference(ns_ic_ptr);
+
+ // Handle the case where the sugaring is due to default template args.
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ // IWYU: IndirectClass needs a declaration
+ IndirectTplClass<IndirectClass> itc;
+ // We need the full type for IndirectTplClass because it has a default arg.
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ // IWYU: IndirectClass needs a declaration
+ IndirectTplClass<IndirectClass>* itc_ptr;
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ Fn(itc);
+ Fn(itc_ptr);
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ FnWithPtr(itc_ptr);
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ FnWithReference(itc);
+ FnWithReference(itc_ptr);
+
+ // If we have the args explicitly, we're responsible for them.
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: ns::NsClass needs a declaration
+ IndirectTplClass<IndirectClass, ns::NsClass> itc2;
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: ns::NsClass needs a declaration
+ IndirectTplClass<IndirectClass, ns::NsClass>* itc2_ptr;
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ Fn(itc2);
+ Fn(itc2_ptr);
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ FnWithPtr(itc2_ptr);
+ // IWYU: IndirectTplClass is...*derived_function_tpl_args-i1.h
+ FnWithReference(itc2);
+ FnWithReference(itc2_ptr);
+
+ // If we specify explicit template args, those should override everything.
+ FnWithPtr<LocalClass>(ic_ptr);
+ FnWithReference<LocalClass>(ic);
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/derived_function_tpl_args.cc should add these lines:
+#include "tests/cxx/derived_function_tpl_args-i1.h"
+
+tests/cxx/derived_function_tpl_args.cc should remove these lines:
+- #include "tests/cxx/derived_function_tpl_args-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/derived_function_tpl_args.cc:
+#include "tests/cxx/derived_function_tpl_args-i1.h" // for IndirectClass, IndirectTplClass, NsClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/direct.h b/tests/cxx/direct.h
new file mode 100644
index 0000000..cca2483
--- /dev/null
+++ b/tests/cxx/direct.h
@@ -0,0 +1,30 @@
+//===--- direct.h - test input file for iwyu ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is meant to be directly #included by a .cc file. All it
+// does is #include another file (which the .cc file is thus
+// #including indirectly).
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_DIRECT_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_DIRECT_H_
+
+#include "tests/cxx/indirect.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_DIRECT_H_
+
+/**** IWYU_SUMMARY
+
+tests/cxx/direct.h should add these lines:
+
+tests/cxx/direct.h should remove these lines:
+- #include "tests/cxx/indirect.h" // lines XX-XX
+
+The full include-list for tests/cxx/direct.h:
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/direct_near.h b/tests/cxx/direct_near.h
new file mode 100644
index 0000000..8e8dd3e
--- /dev/null
+++ b/tests/cxx/direct_near.h
@@ -0,0 +1,18 @@
+//===--- direct_near.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is the same as tests/direct.h, only intended to be used without
+// provided header search path -I .
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_NEAR_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_NEAR_H_
+
+#include "indirect.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_NEAR_H_
diff --git a/tests/cxx/double_include.cc b/tests/cxx/double_include.cc
new file mode 100644
index 0000000..17a190c
--- /dev/null
+++ b/tests/cxx/double_include.cc
@@ -0,0 +1,36 @@
+//===--- double_include.cc - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we include a file twice (that doesn't have a header
+// guard), we don't get confused and ask it to delete a copy of all
+// *its* includes, thinking it specifies each include twice.
+//
+// That is, we're only testing in passing that iwyu tells us to remove
+// one of the double_include.h's below. What we really care about is
+// that iwyu doesn't think that double_include.h is #including
+// indirect.h twice, just because we see that include path twice (due
+// to the double-include here, and the fact double_include.h lacks a
+// header-guard).
+
+#include "tests/cxx/double_include.h"
+#include "tests/cxx/double_include.h"
+
+IndirectClass ic;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/double_include.cc should add these lines:
+
+tests/cxx/double_include.cc should remove these lines:
+- #include "tests/cxx/double_include.h" // lines XX-XX
+
+The full include-list for tests/cxx/double_include.cc:
+#include "tests/cxx/double_include.h"
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/double_include.h b/tests/cxx/double_include.h
new file mode 100644
index 0000000..b3f8dfa
--- /dev/null
+++ b/tests/cxx/double_include.h
@@ -0,0 +1,18 @@
+//===--- double_include.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/indirect.h"
+
+typedef IndirectClass DirectClass;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/double_include.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/elaborated_type.cc b/tests/cxx/elaborated_type.cc
new file mode 100644
index 0000000..ab93fb0
--- /dev/null
+++ b/tests/cxx/elaborated_type.cc
@@ -0,0 +1,86 @@
+//===--- elaborated_type.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that elaborated types are handled correctly.
+//
+// An elaborated type is either a type prefixed by type kind, e.g. 'class Foo',
+// 'struct Bar' or 'enum Baz', or a namespace-qualified type.
+// See C++ [dcl.type.elab].
+//
+// Test cases below have additional details on IWYU policy for these
+// different elaborations.
+
+#include "tests/cxx/elaborated_type_enum1.h" // for ElaborationEnum1
+#include "tests/cxx/elaborated_type_enum2.h" // for ElaborationEnum2
+
+class GlobalClass;
+
+// Make sure both elaborated and bare enums require the full type.
+void bare_enum(ElaborationEnum1 e);
+void elaborated_enum(enum ElaborationEnum2 e);
+
+// For C++ classes, a forward declaration should suffice for
+// bare type names and nothing should be necessary for elaborated ones.
+#include "tests/cxx/elaborated_type_class.h"
+
+void bare_class(ElaborationClass* c);
+void elaborated_class(class UnknownElaborationClass* c);
+
+// Structs should work like classes.
+#include "tests/cxx/elaborated_type_struct.h"
+
+void bare_struct(ElaborationStruct* s);
+void elaborated_struct(struct UnknownElaborationStruct* s);
+
+// And unions.
+#include "tests/cxx/elaborated_type_union.h"
+
+void bare_union(ElaborationUnion* u);
+void elaborated_union(union UnknownElaborationUnion* u);
+
+// Namespace-qualified types must be forward-declared even
+// if they are represented as elaborated types in Clang's AST,
+// and the same goes for ::global-qualified types.
+#include "tests/cxx/elaborated_type_namespace.h"
+
+void namespace_qualified(Elaboration::Class* c);
+void global_qualified(::GlobalClass* c);
+void namespace_qualified_elab(class Elaboration::Class* c);
+void global_qualified_elab(class ::GlobalClass* c);
+
+// We can use elaborated types for templates, too, but
+// they must also be forward-declared.
+Elaboration::Template<int, float>* namespace_qualified_template;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/elaborated_type.cc should add these lines:
+class ElaborationClass;
+namespace Elaboration { class Class; }
+namespace Elaboration { template <typename T, typename U> struct Template; }
+struct ElaborationStruct;
+union ElaborationUnion;
+
+tests/cxx/elaborated_type.cc should remove these lines:
+- #include "tests/cxx/elaborated_type_class.h" // lines XX-XX
+- #include "tests/cxx/elaborated_type_namespace.h" // lines XX-XX
+- #include "tests/cxx/elaborated_type_struct.h" // lines XX-XX
+- #include "tests/cxx/elaborated_type_union.h" // lines XX-XX
+
+The full include-list for tests/cxx/elaborated_type.cc:
+#include "tests/cxx/elaborated_type_enum1.h" // for ElaborationEnum1
+#include "tests/cxx/elaborated_type_enum2.h" // for ElaborationEnum2
+class ElaborationClass;
+class GlobalClass; // lines XX-XX
+namespace Elaboration { class Class; }
+namespace Elaboration { template <typename T, typename U> struct Template; }
+struct ElaborationStruct;
+union ElaborationUnion;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/elaborated_type_class.h b/tests/cxx/elaborated_type_class.h
new file mode 100644
index 0000000..45515e6
--- /dev/null
+++ b/tests/cxx/elaborated_type_class.h
@@ -0,0 +1,10 @@
+//===--- elaborated_type_class.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class ElaborationClass {};
diff --git a/tests/cxx/elaborated_type_enum1.h b/tests/cxx/elaborated_type_enum1.h
new file mode 100644
index 0000000..46427d7
--- /dev/null
+++ b/tests/cxx/elaborated_type_enum1.h
@@ -0,0 +1,13 @@
+//===--- elaborated_type_enum1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+enum ElaborationEnum1 {
+ EE1_First,
+ EE1_Second
+};
diff --git a/tests/cxx/elaborated_type_enum2.h b/tests/cxx/elaborated_type_enum2.h
new file mode 100644
index 0000000..8281007
--- /dev/null
+++ b/tests/cxx/elaborated_type_enum2.h
@@ -0,0 +1,13 @@
+//===--- elaborated_type_enum2.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+enum ElaborationEnum2 {
+ EE2_First,
+ EE2_Second
+};
diff --git a/tests/cxx/elaborated_type_namespace.h b/tests/cxx/elaborated_type_namespace.h
new file mode 100644
index 0000000..956be6a
--- /dev/null
+++ b/tests/cxx/elaborated_type_namespace.h
@@ -0,0 +1,18 @@
+//===--- elaborated_type_namespace.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace Elaboration {
+ class Class {};
+
+ template< typename T, typename U >
+ struct Template {
+ typedef T FirstType;
+ typedef U SecondType;
+ };
+}
diff --git a/tests/cxx/elaborated_type_struct.h b/tests/cxx/elaborated_type_struct.h
new file mode 100644
index 0000000..ea24298
--- /dev/null
+++ b/tests/cxx/elaborated_type_struct.h
@@ -0,0 +1,10 @@
+//===--- elaborated_type_struct.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct ElaborationStruct {};
diff --git a/tests/cxx/elaborated_type_union.h b/tests/cxx/elaborated_type_union.h
new file mode 100644
index 0000000..4379832
--- /dev/null
+++ b/tests/cxx/elaborated_type_union.h
@@ -0,0 +1,10 @@
+//===--- elaborated_type_union.h - test input file for iwyu----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+union ElaborationUnion {};
diff --git a/tests/cxx/external_including_internal.cc b/tests/cxx/external_including_internal.cc
new file mode 100644
index 0000000..012667a
--- /dev/null
+++ b/tests/cxx/external_including_internal.cc
@@ -0,0 +1,25 @@
+//===--- external_including_internal.cc - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when a non-internal file #includes an internal file,
+// that we don't try to map the include back to ourself, and protects
+// against a regression of a bug where we were both including a file
+// in /internal/, and forward-declaring a symbol it provided.
+
+#include "tests/cxx/internal/private.h"
+
+InternalStruct is;
+InternalStruct* isp;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/external_including_internal.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/forward_declare_in_macro.cc b/tests/cxx/forward_declare_in_macro.cc
new file mode 100644
index 0000000..58c0ba8
--- /dev/null
+++ b/tests/cxx/forward_declare_in_macro.cc
@@ -0,0 +1,41 @@
+//===--- forward_declare_in_macro.cc - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we forward-declare in a macro, that the line
+// numbers that iwyu emits about where the forward-declare lives in
+// the code, use the macro-instantiation location, never the
+// macro-spelling location. In this case, the instantiation is here
+// in the .cc file, while the macro-spelling location is in the .h
+// file at line 11.
+
+#include "tests/cxx/forward_declare_in_macro.h"
+
+// Important that this not be on line 11. Note that this macro is
+// carefully constructed so the beginning of it is in
+// forward_declare_in_macro.h, while the end of it is in macro.cc
+// (because the macro begins with 'normal' text and ends with a macro
+// parameter). If iwyu incorrectly uses spelling location, the macro
+// will begin in forward_declare_in_macro.h:11 and end in
+// forward_declare_in_macro.cc:<nextline>, which will show as iwyu
+// thinking this forward-declaration spans many lines. If iwyu
+// correctly uses instantiation location, on the other hand, it will
+// show as iwyu thinking this forward-declaration spans only one line.
+FORWARD_DECLARE_CLASS(MyClass);
+
+/**** IWYU_SUMMARY
+
+tests/cxx/forward_declare_in_macro.cc should add these lines:
+
+tests/cxx/forward_declare_in_macro.cc should remove these lines:
+- class MyClass; // lines XX-XX
+
+The full include-list for tests/cxx/forward_declare_in_macro.cc:
+#include "tests/cxx/forward_declare_in_macro.h"
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/forward_declare_in_macro.h b/tests/cxx/forward_declare_in_macro.h
new file mode 100644
index 0000000..5128162
--- /dev/null
+++ b/tests/cxx/forward_declare_in_macro.h
@@ -0,0 +1,17 @@
+//===--- forward_declare_in_macro.h - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Important that this macro be on line 11 of this file.
+#define FORWARD_DECLARE_CLASS(cls) class cls
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/forward_declare_in_macro.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fullinfo_for_templates-d1.h b/tests/cxx/fullinfo_for_templates-d1.h
new file mode 100644
index 0000000..76a7613
--- /dev/null
+++ b/tests/cxx/fullinfo_for_templates-d1.h
@@ -0,0 +1,16 @@
+//===--- fullinfo_for_templates-d1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D1_H_
+
+// Template definition.
+template <typename T> class TemplateClass {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D1_H_
diff --git a/tests/cxx/fullinfo_for_templates-d2.h b/tests/cxx/fullinfo_for_templates-d2.h
new file mode 100644
index 0000000..825dfd1
--- /dev/null
+++ b/tests/cxx/fullinfo_for_templates-d2.h
@@ -0,0 +1,16 @@
+//===--- fullinfo_for_templates-d2.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D2_H_
+
+// Template forward declaration.
+template <typename T> class TemplateClass;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FULLINFO_FOR_TEMPLATES_D2_H_
diff --git a/tests/cxx/fullinfo_for_templates.cc b/tests/cxx/fullinfo_for_templates.cc
new file mode 100644
index 0000000..79e42c5
--- /dev/null
+++ b/tests/cxx/fullinfo_for_templates.cc
@@ -0,0 +1,30 @@
+//===--- fullinfo_for_templates.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that when a template is typedef'd that the location of the definition, not
+// any forward declaration, is included.
+
+// First include the file containing the definition of TemplateClass.
+#include "tests/cxx/fullinfo_for_templates-d1.h"
+// Then include a file containing a forward declaration of TemplateClass.
+#include "tests/cxx/fullinfo_for_templates-d2.h"
+// IWYU requires full info when typedefing a template.
+typedef TemplateClass<int> tc_int;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fullinfo_for_templates.cc should add these lines:
+
+tests/cxx/fullinfo_for_templates.cc should remove these lines:
+- #include "tests/cxx/fullinfo_for_templates-d2.h" // lines XX-XX
+
+The full include-list for tests/cxx/fullinfo_for_templates.cc:
+#include "tests/cxx/fullinfo_for_templates-d1.h" // for TemplateClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/funcptrs-d1.h b/tests/cxx/funcptrs-d1.h
new file mode 100644
index 0000000..cf8b14c
--- /dev/null
+++ b/tests/cxx/funcptrs-d1.h
@@ -0,0 +1,15 @@
+//===--- funcptrs-d1.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_
+
+#include "tests/cxx/funcptrs-i1.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_
diff --git a/tests/cxx/funcptrs-i1.h b/tests/cxx/funcptrs-i1.h
new file mode 100644
index 0000000..46c6935
--- /dev/null
+++ b/tests/cxx/funcptrs-i1.h
@@ -0,0 +1,70 @@
+//===--- funcptrs-i1.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_
+
+// Supporting types.
+enum Enum { E_one };
+
+class Retval {
+ public:
+ Retval() : value(0) {}
+ Retval(int v) : value(v) {}
+
+ int Value() const { return value; }
+
+ private:
+ int value;
+};
+
+// Functions of various kinds to which function pointers are bound.
+class Class {
+ public:
+ int MemberFunction() const { return 20; }
+
+ template<typename R>
+ int MemberTemplate() const { return R(50).Value(); }
+
+ static int StaticMemberFunction() { return 100; }
+
+ template<typename R>
+ static int StaticMemberTemplate() {
+ return R(100).Value();
+ }
+};
+
+Enum Function(Class*) {
+ return E_one;
+}
+
+template<typename T>
+int FunctionTemplate(Class*) {
+ return T(10).Value();
+}
+
+template<typename T>
+class ClassTemplate {
+ public:
+ int MemberFunction() const { return 20; }
+
+ template<typename R>
+ int MemberTemplate() const { return R(50).Value(); }
+
+ static int StaticMemberFunction() {
+ return 100;
+ }
+
+ template<typename R>
+ static int StaticMemberTemplate() {
+ return R(100).Value();
+ }
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_
diff --git a/tests/cxx/funcptrs.cc b/tests/cxx/funcptrs.cc
new file mode 100644
index 0000000..2958add
--- /dev/null
+++ b/tests/cxx/funcptrs.cc
@@ -0,0 +1,218 @@
+//===--- funcptrs.cc - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that function pointers make the right claims for involved types.
+// Function pointer expressions come in three flavors:
+//
+// 1) Assignments: int (*fptr)(int) = function;
+// 2) Calls: FunctionThatTakesFptr(function);
+// 3) Naked expressions: &function;
+//
+// A 'function' can be a free function, a static member function, a member
+// function, or any template instantiation of the above.
+
+#include "tests/cxx/funcptrs-d1.h"
+
+
+// Functions to drive call-syntax.
+
+// IWYU: Class needs a declaration
+// IWYU: Enum is...*funcptrs-i1.h
+void FunctionThatTakesFptr(Enum (*fptr)(Class*));
+
+// IWYU: Class needs a declaration
+void FunctionThatTakesFptr(int (*fptr)(Class*));
+
+void FunctionThatTakesFptr(int (*fptr)());
+
+// IWYU: Class needs a declaration
+void FunctionThatTakesMptr(int (Class::*mptr)() const);
+
+// IWYU: ClassTemplate needs a declaration
+// IWYU: Class needs a declaration
+void FunctionThatTakesMptr(int (ClassTemplate<Class>::*mptr)() const);
+
+
+// Test cases below.
+// Note that we test primarily the diagnostics from IWYU for the individual
+// constructs, not which header is chosen -- all relevant types are in
+// funcptrs-i1.h anyway.
+//
+// Each test creates function pointers to a plain function and a template
+// instantiation, and for classes similarly for instance member functions.
+
+void FreeFunctions() {
+ // Assignment of function pointer to function and template instantiation.
+ // IWYU: Class needs a declaration
+ // IWYU: Enum is...*funcptrs-i1.h
+ // IWYU: Function is...*funcptrs-i1.h
+ Enum (*fptr)(Class*) = &Function;
+
+ // IWYU: Class needs a declaration
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: FunctionTemplate is...*funcptrs-i1.h
+ int (*template_fptr)(Class*) = &FunctionTemplate<Retval>;
+
+ // Call with function pointer to function and template instantiation.
+ // IWYU: Function is...*funcptrs-i1.h
+ FunctionThatTakesFptr(Function);
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: FunctionTemplate is...*funcptrs-i1.h
+ FunctionThatTakesFptr(FunctionTemplate<Retval>);
+
+ // Naked function pointer expressions
+ // IWYU: Function is...*funcptrs-i1.h
+ &Function;
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: FunctionTemplate is...*funcptrs-i1.h
+ &FunctionTemplate<Retval>;
+}
+
+void ClassMembers() {
+ // IWYU: Class is...*funcptrs-i1.h
+ int (*static_method_ptr)() = &Class::StaticMemberFunction;
+
+ // IWYU: Class is...*funcptrs-i1.h
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ int (*static_template_method_ptr)() = &Class::StaticMemberTemplate<Retval>;
+
+ // IWYU: Class is...*funcptrs-i1.h
+ int (Class::*method_ptr)() const = &Class::MemberFunction;
+
+ // IWYU: Class is...*funcptrs-i1.h
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ int (Class::*template_method_ptr)() const = &Class::MemberTemplate<Retval>;
+
+ // Call with pointers to static member function and template instantiation.
+ // IWYU: Class is...*funcptrs-i1.h
+ FunctionThatTakesFptr(Class::StaticMemberFunction);
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: Class is...*funcptrs-i1.h
+ FunctionThatTakesFptr(Class::StaticMemberTemplate<Retval>);
+
+ // Call with pointers to instance member function and template instantiation.
+ // IWYU: Class is...*funcptrs-i1.h
+ FunctionThatTakesMptr(&Class::MemberFunction);
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: Class is...*funcptrs-i1.h
+ FunctionThatTakesMptr(&Class::MemberTemplate<Retval>);
+
+ // Naked function pointer expressions
+ // IWYU: Class is...*funcptrs-i1.h
+ &Class::StaticMemberFunction;
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: Class is...*funcptrs-i1.h
+ &Class::StaticMemberTemplate<Retval>;
+
+ // IWYU: Class is...*funcptrs-i1.h
+ &Class::MemberFunction;
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: Class is...*funcptrs-i1.h
+ &Class::MemberTemplate<Retval>;
+}
+
+void ClassTemplateMembers() {
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ int (*static_method_ptr)() = &ClassTemplate<Class>::StaticMemberFunction;
+
+ int (*static_template_method_ptr)() =
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ &ClassTemplate<Class>::StaticMemberTemplate<Retval>;
+
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ int (ClassTemplate<Class>::*method_ptr)() const =
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ &ClassTemplate<Class>::MemberFunction;
+
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ int (ClassTemplate<Class>::*template_method_ptr)() const =
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ &ClassTemplate<Class>::MemberTemplate<Retval>;
+
+ // Call with pointers to static member function and template instantiation.
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ FunctionThatTakesFptr(ClassTemplate<Class>::StaticMemberFunction);
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ FunctionThatTakesFptr(ClassTemplate<Class>::StaticMemberTemplate<Retval>);
+
+ // Call with pointers to instance member function and template instantiation.
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ FunctionThatTakesMptr(&ClassTemplate<Class>::MemberFunction);
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ FunctionThatTakesMptr(&ClassTemplate<Class>::MemberTemplate<Retval>);
+
+ // Naked class template member function pointer expressions
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ &ClassTemplate<Class>::StaticMemberFunction;
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ &ClassTemplate<Class>::StaticMemberTemplate<Retval>;
+
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ &ClassTemplate<Class>::MemberFunction;
+
+ // IWYU: Retval needs a declaration
+ // IWYU: Retval is...*funcptrs-i1.h
+ // IWYU: ClassTemplate is...*funcptrs-i1.h
+ // IWYU: Class needs a declaration
+ &ClassTemplate<Class>::MemberTemplate<Retval>;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/funcptrs.cc should add these lines:
+#include "tests/cxx/funcptrs-i1.h"
+
+tests/cxx/funcptrs.cc should remove these lines:
+- #include "tests/cxx/funcptrs-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/funcptrs.cc:
+#include "tests/cxx/funcptrs-i1.h" // for Class, ClassTemplate, Enum, Function, FunctionTemplate, Retval
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_class_template-i1.h b/tests/cxx/fwd_decl_class_template-i1.h
new file mode 100644
index 0000000..2add1c4
--- /dev/null
+++ b/tests/cxx/fwd_decl_class_template-i1.h
@@ -0,0 +1,15 @@
+//===--- fwd_decl_class_template-i1.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_I1_H_
+
+template <typename T> class ClassTemplateI1 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_I1_H_
diff --git a/tests/cxx/fwd_decl_class_template.cc b/tests/cxx/fwd_decl_class_template.cc
new file mode 100644
index 0000000..7807e53
--- /dev/null
+++ b/tests/cxx/fwd_decl_class_template.cc
@@ -0,0 +1,29 @@
+//===--- fwd_decl_class_template.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that a class template is properly forward declared. i1.h has
+// the following definition:
+// template <typename T> class ClassTemplateI1 {};
+// The .h file includes i1.h and uses ClassTemplateI1 in a
+// forward-declarable way.
+#include "tests/cxx/fwd_decl_class_template.h"
+ClassTemplateI1<int>* cti1 = new ClassTemplateI1<int>();
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fwd_decl_class_template.cc should add these lines:
+#include "tests/cxx/fwd_decl_class_template-i1.h"
+
+tests/cxx/fwd_decl_class_template.cc should remove these lines:
+
+The full include-list for tests/cxx/fwd_decl_class_template.cc:
+#include "tests/cxx/fwd_decl_class_template.h"
+#include "tests/cxx/fwd_decl_class_template-i1.h" // for ClassTemplateI1
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_class_template.h b/tests/cxx/fwd_decl_class_template.h
new file mode 100644
index 0000000..d98be49
--- /dev/null
+++ b/tests/cxx/fwd_decl_class_template.h
@@ -0,0 +1,34 @@
+//===--- fwd_decl_class_template.h - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_H_
+
+#include "tests/cxx/fwd_decl_class_template-i1.h"
+
+// TODO(dsturtevant): No iwyu violation is reported here, since there
+// is none (the definition is in included file). However, iwyu
+// recommends the inclusion be replaced by a forward declaration. It
+// seems like some sort of diagnostic to that effect would be useful.
+extern ClassTemplateI1<int>* cti1;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fwd_decl_class_template.h should add these lines:
+template <typename T> class ClassTemplateI1;
+
+tests/cxx/fwd_decl_class_template.h should remove these lines:
+- #include "tests/cxx/fwd_decl_class_template-i1.h" // lines XX-XX
+
+The full include-list for tests/cxx/fwd_decl_class_template.h:
+template <typename T> class ClassTemplateI1;
+
+***** IWYU_SUMMARY */
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FWD_DECL_CLASS_TEMPLATE_H_
diff --git a/tests/cxx/fwd_decl_nested_class.cc b/tests/cxx/fwd_decl_nested_class.cc
new file mode 100644
index 0000000..c93e627
--- /dev/null
+++ b/tests/cxx/fwd_decl_nested_class.cc
@@ -0,0 +1,243 @@
+//===--- fwd_decl_nested_class.cc - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Various tests of the handling of the forward declaration of nested
+// classes. For some uses the forward declaration is needed, for
+// others it isn't.
+
+template<typename T> void TplFn() { T t; (void)t; }
+
+class Foo {
+ class NoUsage; // Unnecessary -- defined inline later in the class.
+ class NoUsageDefinedOutOfLine; // Necessary -- part of the public API.
+ class UsedAsPtrInMethod; // Unnecessary -- all uses see the later dfn.
+ class UsedFullyInMethod; // Unnecessary -- all uses see the later dfn.
+ class UsedFullyInInitializer; // Unnecessary -- same as in a method.
+ class UsedImplicitlyInInitializer; // Unnecessary -- same as explicit use.
+ class UsedInTypedef; // Necessary -- this use doesn't see the later dfn.
+ class UsedAsPtrArg; // Necessary -- this use doesn't see the later dfn.
+ class UsedAsPtrReturn; // Necessary -- this use doesn't see the later dfn.
+ class UsedAsPtrMember; // Necessary -- this use doesn't see the later dfn.
+ class UsedAsFriend; // Necessary -- used as part of a friend declaration
+
+ friend class Foo::UsedAsFriend;
+
+ Foo() : init_(UsedFullyInInitializer()) { }
+ ~Foo() { }
+
+ // If a nested class is used in a body of a method, no preceding
+ // declaration/definition is needed.
+ void Bar1() {
+ UsedAsPtrInMethod* x;
+ }
+ void Bar2() {
+ UsedFullyInMethod x;
+ UsedFullyInMethodNotForwardDeclared y;
+ // Make sure we don't have trouble saying we're inside a method
+ // even when templates get in the way.
+ TplFn<UsedFullyInMethodNotForwardDeclared>();
+ }
+
+ // If a nested class is used in a typedef, a preceding declaration
+ // is needed.
+ typedef UsedInTypedef UsedInTypedefType;
+
+ // If a nested class is used in a method declaration, a preceding
+ // declaration is needed.
+ void Bar3(UsedAsPtrArg* p);
+ UsedAsPtrReturn* Bar4();
+
+ UsedAsPtrMember* x_;
+
+ class NoUsage { };
+ class UsedAsPtrInMethod { };
+ class UsedFullyInMethod { };
+ class UsedFullyInInitializer { };
+ class UsedImplicitlyInInitializer { };
+ class UsedImplicitlyInInitializerNeverDeclared { };
+ class UsedAsPtrArg { };
+ class UsedAsPtrReturn { };
+ class UsedAsPtrMember { };
+ struct UsedFullyInMethodNotForwardDeclared { };
+ class UsedAsFriend { };
+
+ UsedFullyInInitializer init_;
+ UsedImplicitlyInInitializer implicit_;
+ UsedImplicitlyInInitializerNeverDeclared implicit_never_declared_;
+ UsedImplicitlyInInitializerNeverDeclared* implicit_never_declared_ptr_;
+};
+
+class Foo::NoUsageDefinedOutOfLine {};
+
+// Now do the same thing again, but the nested classes are all templated.
+
+class Outer {
+ template<typename T> class NoUsage; // Unnecessary
+ template<typename T> class NoUsageDefinedOutOfLine; // Necessary
+ template<typename T> class NoUsageDefinedOutOfLine; // Unnecessary
+ template<typename T> class UsedAsPtrInMethod; // Unnecessary
+ template<typename T> class UsedFullyInMethod; // Unnecessary
+ template<typename T> class UsedFullyInInitializer; // Unnecessary
+ template<typename T> class UsedImplicitlyInInitializer; // Unnecessary
+ template<typename T> class UsedInTypedef; // Necessary
+ template<typename T> class UsedAsPtrArg; // Necessary
+ template<typename T> class UsedAsPtrReturn; // Necessary
+ template<typename T> class UsedAsPtrMember; // Necessary
+ template<typename T> class UsedAsFriend; // Necessary
+
+ friend class Outer::UsedAsFriend<int>;
+
+ Outer() : init_(UsedFullyInInitializer<int>()) { }
+ ~Outer() { }
+
+ // If a nested class is used in a body of a method, no preceding
+ // declaration/definition is needed.
+ void Bar1() {
+ UsedAsPtrInMethod<int>* x;
+ }
+ void Bar2() {
+ UsedFullyInMethod<int> x;
+ UsedFullyInMethodNotForwardDeclared<int> y;
+ TplFn<UsedFullyInMethodNotForwardDeclared<int> >();
+ }
+
+ // If a nested class is used in a typedef, a preceding declaration
+ // is needed.
+ typedef UsedInTypedef<int> UsedInTypedefType;
+
+ // If a nested class is used in a method declaration, a preceding
+ // declaration is needed.
+ void Bar3(UsedAsPtrArg<int>* p);
+ UsedAsPtrReturn<int>* Bar4();
+
+ UsedAsPtrMember<int>* x_;
+
+ template<typename T> class NoUsage { };
+ template<typename T> class UsedAsPtrInMethod { };
+ template<typename T> class UsedFullyInMethod { };
+ template<typename T> class UsedFullyInInitializer { };
+ template<typename T> class UsedImplicitlyInInitializer { };
+ template<typename T> class UsedImplicitlyInInitializerNeverDeclared { };
+ template<typename T> class UsedAsPtrArg { };
+ template<typename T> class UsedAsPtrReturn { };
+ template<typename T> class UsedAsPtrMember { };
+ template<typename T> class UsedFullyInMethodNotForwardDeclared { };
+ template<typename T> class UsedAsFriend { };
+
+ UsedFullyInInitializer<int> init_;
+ UsedImplicitlyInInitializer<int> implicit_;
+ UsedImplicitlyInInitializerNeverDeclared<int> implicit_never_declared_;
+ UsedImplicitlyInInitializerNeverDeclared<int>* implicit_never_declared_ptr_;
+};
+
+template<typename T> class Outer::NoUsageDefinedOutOfLine {};
+
+
+// Now do the same thing again, but the containing class is templated
+
+template<class T>
+class Container {
+ class NoUsage; // Unnecessary
+ class UsedAsPtrInMethod; // Unnecessary
+ class UsedFullyInMethod; // Unnecessary
+ class UsedFullyInInitializer; // Unnecessary
+ class UsedImplicitlyInInitializer; // Unnecessary
+ class UsedInTypedef; // Necessary
+ class UsedAsPtrArg; // Necessary
+ class UsedAsPtrReturn; // Necessary
+ class UsedAsPtrMember; // Necessary
+ class UsedAsFriend; // Necessary
+
+ friend class Container<T>::UsedAsFriend;
+
+ Container() : init_(UsedFullyInInitializer()) { }
+ ~Container() { }
+
+ // If a nested class is used in a body of a method, no preceding
+ // declaration/definition is needed.
+ void Bar1() {
+ UsedAsPtrInMethod* x;
+ }
+ void Bar2() {
+ UsedFullyInMethod x;
+ UsedFullyInMethodNotForwardDeclared y;
+ TplFn<UsedFullyInMethodNotForwardDeclared>();
+ }
+
+ // If a nested class is used in a typedef, a preceding declaration
+ // is needed.
+ typedef UsedInTypedef UsedInTypedefType;
+
+ // If a nested class is used in a method declaration, a preceding
+ // declaration is needed.
+ void Bar3(UsedAsPtrArg* p);
+ UsedAsPtrReturn* Bar4();
+
+ UsedAsPtrMember* x_;
+
+ class NoUsage { };
+ class UsedAsPtrInMethod { };
+ class UsedFullyInMethod { };
+ class UsedFullyInInitializer { };
+ class UsedImplicitlyInInitializer { };
+ class UsedImplicitlyInInitializerNeverDeclared { };
+ class UsedAsPtrArg { };
+ class UsedAsPtrReturn { };
+ class UsedAsPtrMember { };
+ class UsedFullyInMethodNotForwardDeclared { };
+ class UsedAsFriend { };
+
+ UsedFullyInInitializer init_;
+ UsedImplicitlyInInitializer implicit_;
+ UsedImplicitlyInInitializerNeverDeclared implicit_never_declared_;
+ UsedImplicitlyInInitializerNeverDeclared* implicit_never_declared_ptr_;
+};
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fwd_decl_nested_class.cc should add these lines:
+
+tests/cxx/fwd_decl_nested_class.cc should remove these lines:
+- class Container::NoUsage; // lines XX-XX
+- class Container::UsedAsPtrInMethod; // lines XX-XX
+- class Container::UsedFullyInInitializer; // lines XX-XX
+- class Container::UsedFullyInMethod; // lines XX-XX
+- class Container::UsedImplicitlyInInitializer; // lines XX-XX
+- class Foo::NoUsage; // lines XX-XX
+- class Foo::UsedAsPtrInMethod; // lines XX-XX
+- class Foo::UsedFullyInInitializer; // lines XX-XX
+- class Foo::UsedFullyInMethod; // lines XX-XX
+- class Foo::UsedImplicitlyInInitializer; // lines XX-XX
+- template <typename T> class Outer::NoUsage; // lines XX-XX
+- template <typename T> class Outer::NoUsageDefinedOutOfLine; // lines XX-XX
+- template <typename T> class Outer::UsedAsPtrInMethod; // lines XX-XX
+- template <typename T> class Outer::UsedFullyInInitializer; // lines XX-XX
+- template <typename T> class Outer::UsedFullyInMethod; // lines XX-XX
+- template <typename T> class Outer::UsedImplicitlyInInitializer; // lines XX-XX
+
+The full include-list for tests/cxx/fwd_decl_nested_class.cc:
+class Container::UsedAsFriend; // lines XX-XX
+class Container::UsedAsPtrArg; // lines XX-XX
+class Container::UsedAsPtrMember; // lines XX-XX
+class Container::UsedAsPtrReturn; // lines XX-XX
+class Container::UsedInTypedef; // lines XX-XX
+class Foo::NoUsageDefinedOutOfLine; // lines XX-XX
+class Foo::UsedAsFriend; // lines XX-XX
+class Foo::UsedAsPtrArg; // lines XX-XX
+class Foo::UsedAsPtrMember; // lines XX-XX
+class Foo::UsedAsPtrReturn; // lines XX-XX
+class Foo::UsedInTypedef; // lines XX-XX
+template <typename T> class Outer::NoUsageDefinedOutOfLine; // lines XX-XX
+template <typename T> class Outer::UsedAsFriend; // lines XX-XX
+template <typename T> class Outer::UsedAsPtrArg; // lines XX-XX
+template <typename T> class Outer::UsedAsPtrMember; // lines XX-XX
+template <typename T> class Outer::UsedAsPtrReturn; // lines XX-XX
+template <typename T> class Outer::UsedInTypedef; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_of_nested_class_defined_later.cc b/tests/cxx/fwd_decl_of_nested_class_defined_later.cc
new file mode 100644
index 0000000..dadf140
--- /dev/null
+++ b/tests/cxx/fwd_decl_of_nested_class_defined_later.cc
@@ -0,0 +1,40 @@
+//===--- fwd_decl_of_nested_class_defined_later.cc - test input file for iwyu ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// This tests a particular situation which until recently IWYU did not
+// handle correctly. In certain cases, it would have unnecessarily recommended
+// a forward declaration *outside* of a class definition which really
+// belonged inside the class definition.
+
+#include <utility>
+
+class Foo {
+ private:
+ int Bar() {
+ // The bug was that in the AST tree that IWYU generates, a
+ // CXXMethodDecl node representing the pair destructor declaration
+ // intervened in the chain from the node corresponding to the use
+ // of Baz up to the CXXMethodDecl node for Bar. This caused
+ // IsNodeInsideCXXMethodBody to return false for the node
+ // corresponding to the use of Baz.
+ // The fix was to not stop at the destructor declaration when
+ // walking up the tree, since the context was not the body of the
+ // destructor.
+ return std::make_pair(Baz(), 0).second;
+ }
+
+ struct Baz {
+ int value_;
+ };
+};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/fwd_decl_of_nested_class_defined_later.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_static_member.cc b/tests/cxx/fwd_decl_static_member.cc
new file mode 100644
index 0000000..f3ed89f
--- /dev/null
+++ b/tests/cxx/fwd_decl_static_member.cc
@@ -0,0 +1,31 @@
+//===--- fwd_decl_static_member.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that static data members can be forward declared even if they are not
+// pointers or references.
+
+#include "tests/cxx/indirect.h"
+
+class Outer {
+ private:
+ static IndirectClass forward_declarable;
+};
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fwd_decl_static_member.cc should add these lines:
+class IndirectClass;
+
+tests/cxx/fwd_decl_static_member.cc should remove these lines:
+- #include "tests/cxx/indirect.h" // lines XX-XX
+
+The full include-list for tests/cxx/fwd_decl_static_member.cc:
+class IndirectClass;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_then_dfn.cc b/tests/cxx/fwd_decl_then_dfn.cc
new file mode 100644
index 0000000..f2dbdbf
--- /dev/null
+++ b/tests/cxx/fwd_decl_then_dfn.cc
@@ -0,0 +1,40 @@
+//===--- fwd_decl_then_dfn.cc - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// There are a few situations where the language allows a type to be
+// forward-declared, but iwyu requires the definition: templates and
+// dependent template types, for instance. In those cases, we run the
+// risk that iwyu might not realize a forward-declaration is actually
+// needed, if the definition comes after the relevant use. This tests
+// to make sure iwyu does the right thing in those situations.
+
+template<class T> struct Foo;
+template<class T> struct SubFoo : public Foo<T> { };
+
+template<class T> struct Bar;
+template<class T> struct SubBar : public Foo<typename Bar<T>::type> { };
+
+template<class T> struct Baz;
+typedef Baz<int> BazTypedef;
+
+struct Bang;
+typedef Bang BangTypedef;
+
+// Now come the definitions, way at the end.
+
+template<class T> struct Foo { };
+template<class T> struct Bar { typedef const T type; };
+template<class T> struct Baz { };
+struct Bang { };
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/fwd_decl_then_dfn.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_with_attribute.cc b/tests/cxx/fwd_decl_with_attribute.cc
new file mode 100644
index 0000000..97fd01f
--- /dev/null
+++ b/tests/cxx/fwd_decl_with_attribute.cc
@@ -0,0 +1,31 @@
+//===--- fwd_decl_with_attribute.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests how attributes affect forward declarations.
+
+// Try a type that only needs a forward-declare because of attributes.
+struct __attribute__((aligned (16))) AttrStruct;
+struct AttrStruct* attrstruct_ptr = 0;
+
+// Test that forward-declare with inherited attributes is removed.
+struct __attribute__((aligned (16))) InheritedAttrStruct {};
+struct InheritedAttrStruct;
+struct InheritedAttrStruct* inherited_attrstruct_ptr = 0;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/fwd_decl_with_attribute.cc should add these lines:
+
+tests/cxx/fwd_decl_with_attribute.cc should remove these lines:
+- struct InheritedAttrStruct; // lines XX-XX
+
+The full include-list for tests/cxx/fwd_decl_with_attribute.cc:
+struct AttrStruct; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_with_instantiation-d1.h b/tests/cxx/fwd_decl_with_instantiation-d1.h
new file mode 100644
index 0000000..f469571
--- /dev/null
+++ b/tests/cxx/fwd_decl_with_instantiation-d1.h
@@ -0,0 +1,10 @@
+//===--- fwd_decl_with_instantiation-d1.h - test input file for iwyu ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+template<typename T> class DirectClass { };
diff --git a/tests/cxx/fwd_decl_with_instantiation.cc b/tests/cxx/fwd_decl_with_instantiation.cc
new file mode 100644
index 0000000..c6803a4
--- /dev/null
+++ b/tests/cxx/fwd_decl_with_instantiation.cc
@@ -0,0 +1,26 @@
+//===--- fwd_decl_with_instantiation.cc - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests a situation where iwyu got confused between forward-declarations
+// and definitions. It happened when the .cc file needed a definition of
+// a templated type and the .h only needed a forward-declaration. The
+// .h file would replace the forward-declaration with another one
+// exactly like it.
+
+#include "tests/cxx/fwd_decl_with_instantiation.h"
+#include "tests/cxx/fwd_decl_with_instantiation-d1.h"
+
+DirectClass<int> instantiated_dc;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/fwd_decl_with_instantiation.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_decl_with_instantiation.h b/tests/cxx/fwd_decl_with_instantiation.h
new file mode 100644
index 0000000..4d6b38d
--- /dev/null
+++ b/tests/cxx/fwd_decl_with_instantiation.h
@@ -0,0 +1,18 @@
+//===--- fwd_decl_with_instantiation.h - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+template<typename T> class DirectClass;
+
+DirectClass<int>* dc = 0;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/fwd_decl_with_instantiation.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/fwd_declare_enum.cc b/tests/cxx/fwd_declare_enum.cc
new file mode 100644
index 0000000..5828463
--- /dev/null
+++ b/tests/cxx/fwd_declare_enum.cc
@@ -0,0 +1,30 @@
+//===--- fwd_declare_enum.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that iwyu does not barf when the user re-declares an enum.
+// ("Forward" declare is not quite the right terminology, since you
+// can only re-declare an enum *after* it's been defined, but it
+// matches the terminology used in iwyu to refer to declarations that
+// are not definitions.)
+
+// Unused enum
+enum Foo { FOO };
+enum Foo;
+
+// Used enum
+enum Bar { BAR };
+enum Bar;
+Bar bar;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/fwd_declare_enum.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/header_in_subfolder.cc b/tests/cxx/header_in_subfolder.cc
new file mode 100644
index 0000000..0734ca4
--- /dev/null
+++ b/tests/cxx/header_in_subfolder.cc
@@ -0,0 +1,30 @@
+//===--- header_in_subfolder.cc - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that subfolders are correctly recognized
+
+#include "subfolder/direct_subfolder.h"
+
+void foo() {
+ // IWYU: IndirectSubfolderClass is...*indirect_subfolder.h
+ IndirectSubfolderClass ic;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/header_in_subfolder.cc should add these lines:
+#include "tests/cxx/subfolder/indirect_subfolder.h"
+
+tests/cxx/header_in_subfolder.cc should remove these lines:
+- #include "subfolder/direct_subfolder.h" // lines XX-XX
+
+The full include-list for tests/cxx/header_in_subfolder.cc:
+#include "tests/cxx/subfolder/indirect_subfolder.h" // for IndirectSubfolderClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/header_in_subfolder_nopath.cc b/tests/cxx/header_in_subfolder_nopath.cc
new file mode 100644
index 0000000..43525be
--- /dev/null
+++ b/tests/cxx/header_in_subfolder_nopath.cc
@@ -0,0 +1,30 @@
+//===--- header_in_subfolder_nopath.cc - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that subfolders are correctly recognized. Use without "-I ."
+
+#include "subfolder/direct_subfolder.h"
+
+void foo() {
+ // IWYU: IndirectSubfolderClass is...*indirect_subfolder.h
+ IndirectSubfolderClass ic;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/header_in_subfolder_nopath.cc should add these lines:
+#include "subfolder/indirect_subfolder.h"
+
+tests/cxx/header_in_subfolder_nopath.cc should remove these lines:
+- #include "subfolder/direct_subfolder.h" // lines XX-XX
+
+The full include-list for tests/cxx/header_in_subfolder_nopath.cc:
+#include "subfolder/indirect_subfolder.h" // for IndirectSubfolderClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/header_near.cc b/tests/cxx/header_near.cc
new file mode 100644
index 0000000..3085ff3
--- /dev/null
+++ b/tests/cxx/header_near.cc
@@ -0,0 +1,27 @@
+//===--- header_near.cc - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Not including as "tests/cxx/header_near.h" is done on purpose. We are actually
+// testing that iwyu doesn't offer to #include "tests/cxx/header_near.h" in addition
+// to existing #include "header_near.h"
+//
+// The same for "indirect.h" - need to test both associated and usual includes.
+
+#include "header_near.h"
+#include "indirect.h"
+
+Foo::Foo() {
+ IndirectClass ic;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/header_near.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/header_near.h b/tests/cxx/header_near.h
new file mode 100644
index 0000000..8ad99a3
--- /dev/null
+++ b/tests/cxx/header_near.h
@@ -0,0 +1,22 @@
+//===--- header_near.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests including .h file by path relative to .cc file, not relative to current
+// working directory.
+
+class Foo {
+ public:
+ Foo();
+};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/header_near.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/implicit_ctor-d1.h b/tests/cxx/implicit_ctor-d1.h
new file mode 100644
index 0000000..e627b02
--- /dev/null
+++ b/tests/cxx/implicit_ctor-d1.h
@@ -0,0 +1,35 @@
+//===--- implicit_ctor-d1.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/implicit_ctor-i1.h"
+
+// We do need IndirectWithImplicitCtor even though we just take a
+// reference to it. This is because the class has an implicit
+// constructor.
+
+// IWYU: IndirectWithImplicitCtor needs a declaration
+// IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h.*for autocast
+int ImplicitCtorFn(IndirectWithImplicitCtor);
+
+// IWYU: IndirectWithImplicitCtor needs a declaration
+// IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h.*for autocast
+int ImplicitCtorRefFn(const IndirectWithImplicitCtor&);
+
+/**** IWYU_SUMMARY
+
+tests/cxx/implicit_ctor-d1.h should add these lines:
+#include "tests/cxx/implicit_ctor-i2.h"
+
+tests/cxx/implicit_ctor-d1.h should remove these lines:
+- #include "tests/cxx/implicit_ctor-i1.h" // lines XX-XX
+
+The full include-list for tests/cxx/implicit_ctor-d1.h:
+#include "tests/cxx/implicit_ctor-i2.h" // for IndirectWithImplicitCtor
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/implicit_ctor-i1.h b/tests/cxx/implicit_ctor-i1.h
new file mode 100644
index 0000000..1e27de9
--- /dev/null
+++ b/tests/cxx/implicit_ctor-i1.h
@@ -0,0 +1,10 @@
+//===--- implicit_ctor-i1.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/implicit_ctor-i2.h"
diff --git a/tests/cxx/implicit_ctor-i2.h b/tests/cxx/implicit_ctor-i2.h
new file mode 100644
index 0000000..a978332
--- /dev/null
+++ b/tests/cxx/implicit_ctor-i2.h
@@ -0,0 +1,13 @@
+//===--- implicit_ctor-i2.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct IndirectWithImplicitCtor {
+ // This is the implicit ctor.
+ IndirectWithImplicitCtor(int x) {}
+};
diff --git a/tests/cxx/implicit_ctor.cc b/tests/cxx/implicit_ctor.cc
new file mode 100644
index 0000000..cbaa4d4
--- /dev/null
+++ b/tests/cxx/implicit_ctor.cc
@@ -0,0 +1,52 @@
+//===--- implicit_ctor.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// If you define an API that accepts an argument of class type or
+// const reference to a class type with an implicit constructor, you
+// must provide the definition for the class.
+//
+// If you use an API and that use triggers an implicit constructor
+// call, you are *not* considered to have used that constructor,
+// relying on the previous rule to make the code complete definition
+// available.
+//
+// This tests that logic.
+
+#include "tests/cxx/implicit_ctor-d1.h"
+
+// We don't need IndirectWithImplicitCtor even though we must convert to it.
+int a = ImplicitCtorFn(1);
+int b = ImplicitCtorRefFn(2);
+
+// But we do need it if we do the conversion explicitly.
+// IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h
+int c = ImplicitCtorFn(IndirectWithImplicitCtor(3));
+// IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h
+int d = ImplicitCtorRefFn(IndirectWithImplicitCtor(4));
+
+// Make sure we are responsible for the conversion when it's not for a
+// function call.
+// IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h
+IndirectWithImplicitCtor indirect
+ // IWYU: IndirectWithImplicitCtor is...*implicit_ctor-i2.h
+ = 1;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/implicit_ctor.cc should add these lines:
+#include "tests/cxx/implicit_ctor-i2.h"
+
+tests/cxx/implicit_ctor.cc should remove these lines:
+
+The full include-list for tests/cxx/implicit_ctor.cc:
+#include "tests/cxx/implicit_ctor-d1.h" // for ImplicitCtorFn, ImplicitCtorRefFn
+#include "tests/cxx/implicit_ctor-i2.h" // for IndirectWithImplicitCtor
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/include_cycle.cc b/tests/cxx/include_cycle.cc
new file mode 100644
index 0000000..ff2d562
--- /dev/null
+++ b/tests/cxx/include_cycle.cc
@@ -0,0 +1,22 @@
+//===--- include_cycle.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we properly handle the case of include-cycles (header files
+// including themselves, possibly indirectly). We put all the header files
+// in the /internal/ directory, because those files get automatically mapped.
+
+#include "tests/cxx/internal/include_cycle-d1.h"
+
+IncludeCycleD1 d1;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/include_cycle.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/include_with_using-d1.h b/tests/cxx/include_with_using-d1.h
new file mode 100644
index 0000000..a0e6466
--- /dev/null
+++ b/tests/cxx/include_with_using-d1.h
@@ -0,0 +1,16 @@
+//===--- include_with_using-d1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/include_with_using-i1.h"
+
+namespace ns {
+class PtrInNs {};
+}
+
+using ns::PtrInNs;
diff --git a/tests/cxx/include_with_using-d2.h b/tests/cxx/include_with_using-d2.h
new file mode 100644
index 0000000..c479221
--- /dev/null
+++ b/tests/cxx/include_with_using-d2.h
@@ -0,0 +1,21 @@
+//===--- include_with_using-d2.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This class isn't actually used by the .cc file. The purpose of
+// this code is to make sure that the .cc file doesn't see the need to
+// #include -d2.h just because of the using declaration (the using
+// declaration should actually be needed by the .cc file for that to
+// happen).
+namespace ns2 {
+class PtrInNs2 {};
+}
+
+using ns2::PtrInNs2;
+
+class UsedFromD2 { };
diff --git a/tests/cxx/include_with_using-d3.h b/tests/cxx/include_with_using-d3.h
new file mode 100644
index 0000000..84ddd99
--- /dev/null
+++ b/tests/cxx/include_with_using-d3.h
@@ -0,0 +1,13 @@
+//===--- include_with_using-d3.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns3 {
+class PtrInNs3 {};
+}
+// The using decl for PtrInNs3 is in include_with_using-d3b.h
diff --git a/tests/cxx/include_with_using-d3b.h b/tests/cxx/include_with_using-d3b.h
new file mode 100644
index 0000000..1e03378
--- /dev/null
+++ b/tests/cxx/include_with_using-d3b.h
@@ -0,0 +1,10 @@
+//===--- include_with_using-d3b.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+using ns3::PtrInNs3;
diff --git a/tests/cxx/include_with_using-d4.h b/tests/cxx/include_with_using-d4.h
new file mode 100644
index 0000000..c160d70
--- /dev/null
+++ b/tests/cxx/include_with_using-d4.h
@@ -0,0 +1,16 @@
+//===--- include_with_using-d4.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Also test using a var, not a type;
+
+namespace ns4 {
+int var_in_d4 = 0;
+}
+
+using ns4::var_in_d4;
diff --git a/tests/cxx/include_with_using-d5.h b/tests/cxx/include_with_using-d5.h
new file mode 100644
index 0000000..d36217e
--- /dev/null
+++ b/tests/cxx/include_with_using-d5.h
@@ -0,0 +1,16 @@
+//===--- include_with_using-d5.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns5 {
+class PtrInNs5 {};
+}
+// This using decl won't be used because it's not in the right namespace
+namespace ns_unused {
+using ns5::PtrInNs5;
+}
diff --git a/tests/cxx/include_with_using-d5b.h b/tests/cxx/include_with_using-d5b.h
new file mode 100644
index 0000000..95ed2b7
--- /dev/null
+++ b/tests/cxx/include_with_using-d5b.h
@@ -0,0 +1,13 @@
+//===--- include_with_using-d5b.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This using decl *will* be used because it's in the right namespace
+namespace ns_cc {
+using ns5::PtrInNs5;
+}
diff --git a/tests/cxx/include_with_using-i1.h b/tests/cxx/include_with_using-i1.h
new file mode 100644
index 0000000..9a54977
--- /dev/null
+++ b/tests/cxx/include_with_using-i1.h
@@ -0,0 +1,12 @@
+//===--- include_with_using-i1.h - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace i1 {
+class UsingInCc {};
+}
diff --git a/tests/cxx/include_with_using.cc b/tests/cxx/include_with_using.cc
new file mode 100644
index 0000000..8580ea9
--- /dev/null
+++ b/tests/cxx/include_with_using.cc
@@ -0,0 +1,75 @@
+//===--- include_with_using.cc - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that if we use a symbol from a .h file that the .h file has
+// a 'using' declaration for, we don't consider replacing the use with
+// a forward-declaration. On the other hand, if we don't depend on
+// the using declaration, replacing is fair game.
+
+// TODO(csilvers): also test UsingDirectiveDecl ('using namespace std').
+// TODO(csilvers): also test namespace aliases ('namespace b = std').
+
+#include "tests/cxx/include_with_using-d1.h"
+#include "tests/cxx/include_with_using-d2.h"
+#include "tests/cxx/include_with_using-d3.h"
+#include "tests/cxx/include_with_using-d3b.h"
+#include "tests/cxx/include_with_using-d4.h"
+#include "tests/cxx/include_with_using-d5.h"
+#include "tests/cxx/include_with_using-d5b.h"
+
+PtrInNs* pin = 0;
+
+UsedFromD2* ufd2 = 0;
+
+// Needs the using decl from d3b (but not the type decl from d3!).
+PtrInNs3* pin3 = 0;
+
+namespace ns_cc { // thus, we need the using-decl from d5b.h, not d5.h
+namespace internal {
+PtrInNs5* pin5 = 0;
+}
+}
+
+void TestDeclFromD4() {
+ // Needs the using decl from d4.
+ var_in_d4 = 0;
+}
+
+using i1::UsingInCc;
+
+void TestUsingInCc() {
+ // IWYU: UsingInCc is...*include_with_using-i1.h
+ UsingInCc uicc;
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/include_with_using.cc should add these lines:
+#include "tests/cxx/include_with_using-i1.h"
+class UsedFromD2;
+namespace ns3 { class PtrInNs3; }
+namespace ns5 { class PtrInNs5; }
+
+tests/cxx/include_with_using.cc should remove these lines:
+- #include "tests/cxx/include_with_using-d2.h" // lines XX-XX
+- #include "tests/cxx/include_with_using-d3.h" // lines XX-XX
+- #include "tests/cxx/include_with_using-d5.h" // lines XX-XX
+
+The full include-list for tests/cxx/include_with_using.cc:
+#include "tests/cxx/include_with_using-d1.h" // for PtrInNs
+#include "tests/cxx/include_with_using-d3b.h" // for PtrInNs3
+#include "tests/cxx/include_with_using-d4.h" // for var_in_d4
+#include "tests/cxx/include_with_using-d5b.h" // for PtrInNs5
+#include "tests/cxx/include_with_using-i1.h" // for UsingInCc
+class UsedFromD2;
+namespace ns3 { class PtrInNs3; }
+namespace ns5 { class PtrInNs5; }
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/indirect.h b/tests/cxx/indirect.h
new file mode 100644
index 0000000..ad43d5f
--- /dev/null
+++ b/tests/cxx/indirect.h
@@ -0,0 +1,27 @@
+//===--- indirect.h - test input file for iwyu ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is meant to be #included by "direct.h", which is directly
+// #included by some .cc file. It provides an easy-to-access
+// definition of a symbol that will cause an iwyu violation in a .cc
+// file.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_INDIRECT_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_INDIRECT_H_
+
+class IndirectClass {
+ public:
+ void Method() const { };
+ int a;
+ static void StaticMethod() { };
+ static int statica;
+};
+
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_INDIRECT_H_
diff --git a/tests/cxx/inheriting_ctor-d1.h b/tests/cxx/inheriting_ctor-d1.h
new file mode 100644
index 0000000..ba1b5a8
--- /dev/null
+++ b/tests/cxx/inheriting_ctor-d1.h
@@ -0,0 +1,15 @@
+//===--- inheriting_ctor-d1.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_D1_H_
+
+#include "inheriting_ctor-i1.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_D1_H_
diff --git a/tests/cxx/inheriting_ctor-i1.h b/tests/cxx/inheriting_ctor-i1.h
new file mode 100644
index 0000000..03ecddb
--- /dev/null
+++ b/tests/cxx/inheriting_ctor-i1.h
@@ -0,0 +1,20 @@
+//===--- inheriting_ctor-i1.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_I1_H_
+
+struct Base {
+ Base(int);
+};
+struct Derived : Base {
+ using Base::Base;
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_INHERITING_CTOR_I1_H_
diff --git a/tests/cxx/inheriting_ctor.cc b/tests/cxx/inheriting_ctor.cc
new file mode 100644
index 0000000..b91753b
--- /dev/null
+++ b/tests/cxx/inheriting_ctor.cc
@@ -0,0 +1,26 @@
+//===--- inheriting_ctor.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "inheriting_ctor-d1.h"
+
+// IWYU: Derived is defined in .*-i1.h
+void func() { Derived d(1); }
+
+/**** IWYU_SUMMARY
+
+tests/cxx/inheriting_ctor.cc should add these lines:
+#include "inheriting_ctor-i1.h"
+
+tests/cxx/inheriting_ctor.cc should remove these lines:
+- #include "inheriting_ctor-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/inheriting_ctor.cc:
+#include "inheriting_ctor-i1.h" // for Derived
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/integer_template_arg.cc b/tests/cxx/integer_template_arg.cc
new file mode 100644
index 0000000..831713d
--- /dev/null
+++ b/tests/cxx/integer_template_arg.cc
@@ -0,0 +1,19 @@
+//===--- integer_template_arg.cc - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This is a test to make sure a Clang crashing bug doesn't regress.
+
+template <int Arg> class Base {};
+class Derived : public Base<1> {};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/integer_template_arg.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/internal/associated_h_file_heuristic.h b/tests/cxx/internal/associated_h_file_heuristic.h
new file mode 100644
index 0000000..35306cc
--- /dev/null
+++ b/tests/cxx/internal/associated_h_file_heuristic.h
@@ -0,0 +1,16 @@
+//===--- associated_h_file_heuristic.h - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+const int kUnused = 1;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/internal/associated_h_file_heuristic.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/internal/include_cycle-d1.h b/tests/cxx/internal/include_cycle-d1.h
new file mode 100644
index 0000000..ec225bc
--- /dev/null
+++ b/tests/cxx/internal/include_cycle-d1.h
@@ -0,0 +1,21 @@
+//===--- include_cycle-d1.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_CYCLE_D1_H
+#define INCLUDE_CYCLE_D1_H
+
+// Include itself (cycle length 1)
+#include "tests/cxx/internal/include_cycle-d1.h"
+
+// Include another file that includes itself (cycle length 2)
+#include "tests/cxx/internal/include_cycle-i1.h"
+
+struct IncludeCycleD1 {};
+
+#endif /* #ifndef INCLUDE_CYCLE_D1_H */
diff --git a/tests/cxx/internal/include_cycle-i1.h b/tests/cxx/internal/include_cycle-i1.h
new file mode 100644
index 0000000..93693fd
--- /dev/null
+++ b/tests/cxx/internal/include_cycle-i1.h
@@ -0,0 +1,15 @@
+//===--- include_cycle-i1.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_CYCLE_I1_H
+#define INCLUDE_CYCLE_I1_H
+
+#include "tests/cxx/internal/include_cycle-d1.h"
+
+#endif /* #ifndef INCLUDE_CYCLE_I1_H */
diff --git a/tests/cxx/internal/internal_files.cc b/tests/cxx/internal/internal_files.cc
new file mode 100644
index 0000000..b047f99
--- /dev/null
+++ b/tests/cxx/internal/internal_files.cc
@@ -0,0 +1,23 @@
+//===--- internal_files.cc - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests our handling of header files in /internal/. In particular,
+// if the only includers are outside the internal directory, make sure
+// we don't map the internal include to <built-in>.
+
+#include "tests/cxx/internal/private.h"
+
+InternalStruct is;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/internal/internal_files.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/internal/private.h b/tests/cxx/internal/private.h
new file mode 100644
index 0000000..d4a2668
--- /dev/null
+++ b/tests/cxx/internal/private.h
@@ -0,0 +1,12 @@
+//===--- private.h - test input file for iwyu -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct InternalStruct {
+ int a;
+};
diff --git a/tests/cxx/iterator.cc b/tests/cxx/iterator.cc
new file mode 100644
index 0000000..c659d0e
--- /dev/null
+++ b/tests/cxx/iterator.cc
@@ -0,0 +1,51 @@
+//===--- iterator.cc - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// We have special-case code to deal with foo::iterator, for various
+// STL classes foo. They are complicated because they often map to
+// __normal_iterator<foo> or __wrap_iter<>, and we have to map back.
+// There are also issues with reverse_iterator.
+//
+// Basically, we don't want any of the code below to result in an
+// #include of <iterator>
+
+#include <algorithm>
+#include <vector>
+#include <list>
+
+std::vector<int> vi;
+std::vector<int>::iterator vi_begin = vi.begin();
+std::vector<int>::const_iterator vi_cbegin = vi.begin();
+std::vector<int>::reverse_iterator vi_rbegin = vi.rbegin();
+std::vector<int>::const_reverse_iterator vi_crbegin = vi.rbegin();
+void VectorFns() {
+ // Tricky issue with deduced template args.
+ std::find(vi_begin, vi_begin, 5);
+ // Issues with operator!=, operator bool, etc.
+ for (std::vector<int>::iterator it = vi_begin; it != vi_begin; ++it) ;
+ for (std::vector<int>::reverse_iterator it = vi_rbegin; it != vi_rbegin; ++it)
+ ;
+}
+
+std::list<int> li;
+std::list<int>::iterator li_begin = li.begin();
+std::list<int>::const_iterator li_cbegin = li.begin();
+std::list<int>::reverse_iterator li_rbegin = li.rbegin();
+std::list<int>::const_reverse_iterator li_crbegin = li.rbegin();
+void ListFns() {
+ std::find(li_begin, li_begin, 5);
+ for (std::list<int>::iterator it = li_begin; it != li_begin; ++it) ;
+ for (std::list<int>::reverse_iterator it = li_rbegin; it != li_rbegin; ++it) ;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/iterator.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/iwyu_stricter_than_cpp-autocast.h b/tests/cxx/iwyu_stricter_than_cpp-autocast.h
new file mode 100644
index 0000000..879b8c6
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-autocast.h
@@ -0,0 +1,90 @@
+//===--- iwyu_stricter_than_cpp-autocast.h - test input file for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef IWYU_STRICTER_THAN_CPP_AUTOCAST_H_
+#define IWYU_STRICTER_THAN_CPP_AUTOCAST_H_
+
+// The two rules the author has to follow to disable iwyu's
+// stricter-than-C++ rule and force it to fall back on the c++
+// requirement (forward-declare ok):
+// (1) forward-declare the relevant type
+// (2) do not directly #include the definition of the relevant type.
+
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h"
+
+// --- Autocast types.
+
+struct DirectStruct1;
+struct IndirectStruct2;
+
+void Fn(
+ // Requires the full type because it does not obey rule (1)
+ // IWYU: IndirectStruct1 needs a declaration
+ // IWYU: IndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h.*for autocast
+ const IndirectStruct1& ic1,
+ // This also does not obey rule (1): it's -d1 that does the fwd-declaring.
+ // IWYU: IndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h.*for autocast
+ const struct IndirectStructForwardDeclaredInD1& icfdid1,
+ // Requires the full type because it does not obey rule (2)
+ DirectStruct1 dc1,
+ // Requires the full type because it does not obey rules (1) *or* (2)
+ struct DirectStruct2 dc2,
+ // Does not require full type because it obeys all the rules.
+ IndirectStruct2 ic2);
+
+// --- Now do it all again, with templates!
+
+template <typename T> struct TplDirectStruct1;
+template <typename T> struct TplIndirectStruct2;
+
+void TplFn(
+ // IWYU: TplIndirectStruct1 needs a declaration
+ // IWYU: TplIndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h.*for autocast
+ const TplIndirectStruct1<char>& ic1,
+ // A bit of an asymmetry with the non-tpl case: 'struct
+ // IndirectStructForwardDeclaredInD1' does not need to be
+ // forward-declared because it's elaborated, but template types
+ // need to be forward-declared even when they're elaborated. (Of
+ // course, the fwd-decl requirement will be superceded by the
+ // full-type requirement due to autocast, but we report both.)
+ // IWYU: TplIndirectStructForwardDeclaredInD1 needs a declaration
+ // IWYU: TplIndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h.*for autocast
+ const struct TplIndirectStructForwardDeclaredInD1<char>& icfdid1,
+ TplDirectStruct1<char> dc1,
+ struct TplDirectStruct2<char> dc2,
+ TplIndirectStruct2<char> ic2);
+
+// --- The rules do not apply for friend functions declarations.
+
+struct AutocastStruct {
+ // IWYU: IndirectStruct1 needs a declaration
+ friend void ClassFn1(const IndirectStruct1&);
+ // IWYU: TplIndirectStruct1 needs a declaration
+ friend void ClassFn2(TplIndirectStruct1<char>);
+};
+
+#endif // IWYU_STRICTER_THAN_CPP_AUTOCAST_H_
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/iwyu_stricter_than_cpp-autocast.h should add these lines:
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h"
+
+tests/cxx/iwyu_stricter_than_cpp-autocast.h should remove these lines:
+- struct DirectStruct1; // lines XX-XX
+- template <typename T> struct TplDirectStruct1; // lines XX-XX
+
+The full include-list for tests/cxx/iwyu_stricter_than_cpp-autocast.h:
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h" // for DirectStruct1, DirectStruct2, TplDirectStruct1, TplDirectStruct2
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h" // for IndirectStruct1, IndirectStructForwardDeclaredInD1, TplIndirectStruct1, TplIndirectStructForwardDeclaredInD1
+struct IndirectStruct2; // lines XX-XX
+template <typename T> struct TplIndirectStruct2; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/iwyu_stricter_than_cpp-autocast2.h b/tests/cxx/iwyu_stricter_than_cpp-autocast2.h
new file mode 100644
index 0000000..982c75d
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-autocast2.h
@@ -0,0 +1,16 @@
+//===--- iwyu_stricter_than_cpp-autocast2.h - test input file for iwyu ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h"
+
+// Because we do not forward-declare IndirectStruct2, we need the full
+// definition here. But that fact doesn't matter because the caller
+// of TwiceDeclaredFunction (-d2.h), cannot see this definition.
+void TwiceDeclaredFunction(IndirectStruct2 ic2);
+void TwiceDeclaredRefFunction(const IndirectStruct2& ic2);
diff --git a/tests/cxx/iwyu_stricter_than_cpp-d1.h b/tests/cxx/iwyu_stricter_than_cpp-d1.h
new file mode 100644
index 0000000..8f325c9
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-d1.h
@@ -0,0 +1,26 @@
+//===--- iwyu_stricter_than_cpp-d1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef IWYU_STRICTER_THAN_CPP_D1_H_
+#define IWYU_STRICTER_THAN_CPP_D1_H_
+
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h"
+#include "tests/cxx/iwyu_stricter_than_cpp-i2.h"
+
+// Note all these structs have an 'autocast' constructor.
+
+struct DirectStruct1 { DirectStruct1(int) {} };
+struct DirectStruct2 { DirectStruct2(int) {} };
+struct IndirectStructForwardDeclaredInD1;
+
+template <typename T> struct TplDirectStruct1 { TplDirectStruct1(int) {} };
+template <typename T> struct TplDirectStruct2 { TplDirectStruct2(int) {} };
+template <typename T> struct TplIndirectStructForwardDeclaredInD1;
+
+#endif
diff --git a/tests/cxx/iwyu_stricter_than_cpp-d2.h b/tests/cxx/iwyu_stricter_than_cpp-d2.h
new file mode 100644
index 0000000..f1b101a
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-d2.h
@@ -0,0 +1,41 @@
+//===--- iwyu_stricter_than_cpp-d2.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class IndirectStruct2;
+
+// These functions are also declared in -autocast2.h, but that
+// declaration isn't visible from here.
+void TwiceDeclaredFunction(IndirectStruct2 ic2);
+void TwiceDeclaredRefFunction(const IndirectStruct2& ic2);
+
+void CallTwiceDeclaredFunction() {
+ // We need the full type for IndirectStruct2 because the only
+ // declaration that we can see, does not provide the full type for
+ // us.
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ TwiceDeclaredFunction(1);
+
+ // This *should* be exactly the same, but doesn't seem to be:
+ // clang leaves out the constructor-conversion AST node.
+ // TODO(csilvers): IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ TwiceDeclaredRefFunction(1);
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/iwyu_stricter_than_cpp-d2.h should add these lines:
+#include "tests/cxx/iwyu_stricter_than_cpp-i2.h"
+
+tests/cxx/iwyu_stricter_than_cpp-d2.h should remove these lines:
+- class IndirectStruct2; // lines XX-XX
+
+The full include-list for tests/cxx/iwyu_stricter_than_cpp-d2.h:
+#include "tests/cxx/iwyu_stricter_than_cpp-i2.h" // for IndirectStruct2
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/iwyu_stricter_than_cpp-fnreturn.h b/tests/cxx/iwyu_stricter_than_cpp-fnreturn.h
new file mode 100644
index 0000000..b4eb0b1
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-fnreturn.h
@@ -0,0 +1,93 @@
+//===--- iwyu_stricter_than_cpp-fnreturn.h - test input file for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The two rules the author has to follow to disable iwyu's
+// stricter-than-C++ rule and force it to fall back on the c++
+// requirement (forward-declare ok):
+// (1) forward-declare the relevant type
+// (2) do not directly #include the definition of the relevant type.
+
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h"
+
+// --- Return values of functions.
+
+// Requires the full type because it does not obey rule (1)
+// IWYU: IndirectStruct1 needs a declaration
+// IWYU: IndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h.*for fn return type
+IndirectStruct1 DoesNotForwardDeclareFn();
+
+// This also does not obey rule (1): it's -d1 that does the fwd-declaring.
+// IWYU: IndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h.*for fn return type
+struct IndirectStructForwardDeclaredInD1 DoesNotForwardDeclareProperlyFn();
+
+// Requires the full type because it does not obey rule (2)
+struct DirectStruct1;
+DirectStruct1 IncludesFn();
+
+// Requires the full type because it does not obey rules (1) *or* (2)
+DirectStruct2 DoesNotForwardDeclareAndIncludesFn();
+
+// Does not require full type because it obeys all the rules.
+struct IndirectStruct2;
+IndirectStruct2 DoesEverythingRightFn();
+
+// --- Now do it all again, with templates!
+
+// IWYU: TplIndirectStruct1 needs a declaration
+// IWYU: TplIndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h.*for fn return type
+TplIndirectStruct1<int> TplDoesNotForwardDeclareFn();
+
+// A bit of an asymmetry with the non-tpl case: 'struct
+// IndirectStructForwardDeclaredInD1' does not need to be
+// forward-declared because it's elaborated, but template types need
+// to be forward-declared even when they're elaborated.
+// IWYU: TplIndirectStructForwardDeclaredInD1 needs a declaration
+struct TplIndirectStructForwardDeclaredInD1<int>
+// IWYU: TplIndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h.*for fn return type
+TplDoesNotForwardDeclareProperlyFn();
+
+template <typename T> struct TplDirectStruct1;
+TplDirectStruct1<int> TplIncludesFn();
+
+TplDirectStruct2<int> TplDoesNotForwardDeclareAndIncludesFn();
+
+template <typename T> struct TplIndirectStruct2;
+TplIndirectStruct2<int> TplDoesEverythingRightFn();
+
+// Another way to forward-declare a class template.
+template <> struct TplIndirectStruct2<float>;
+TplIndirectStruct2<float> TplDoesEverythingRightAgainFn();
+
+// --- The rules do not apply for friend functions.
+
+struct FnreturnStruct {
+ // IWYU: IndirectStruct1 needs a declaration
+ friend const IndirectStruct1& ClassFn1();
+ // IWYU: TplIndirectStruct1 needs a declaration
+ friend TplIndirectStruct1<char> ClassFn2();
+};
+
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/iwyu_stricter_than_cpp-fnreturn.h should add these lines:
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h"
+
+tests/cxx/iwyu_stricter_than_cpp-fnreturn.h should remove these lines:
+- struct DirectStruct1; // lines XX-XX
+- template <typename T> struct TplDirectStruct1; // lines XX-XX
+
+The full include-list for tests/cxx/iwyu_stricter_than_cpp-fnreturn.h:
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h" // for DirectStruct1, DirectStruct2, TplDirectStruct1, TplDirectStruct2
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h" // for IndirectStruct1, IndirectStructForwardDeclaredInD1, TplIndirectStruct1, TplIndirectStructForwardDeclaredInD1
+struct IndirectStruct2; // lines XX-XX
+template <typename T> struct TplIndirectStruct2; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/iwyu_stricter_than_cpp-i1.h b/tests/cxx/iwyu_stricter_than_cpp-i1.h
new file mode 100644
index 0000000..b9e3ba9
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-i1.h
@@ -0,0 +1,18 @@
+//===--- iwyu_stricter_than_cpp-i1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct IndirectStruct1 { IndirectStruct1(int) {} };
+struct IndirectStructForwardDeclaredInD1 {
+ IndirectStructForwardDeclaredInD1(int) {}
+};
+
+template <typename T> struct TplIndirectStruct1 { TplIndirectStruct1(int) {} };
+template <typename T> struct TplIndirectStructForwardDeclaredInD1 {
+ TplIndirectStructForwardDeclaredInD1(int) {}
+};
diff --git a/tests/cxx/iwyu_stricter_than_cpp-i2.h b/tests/cxx/iwyu_stricter_than_cpp-i2.h
new file mode 100644
index 0000000..d1bd401
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-i2.h
@@ -0,0 +1,18 @@
+//===--- iwyu_stricter_than_cpp-i2.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct IndirectStruct2 {
+ IndirectStruct2(int) {}
+ int a;
+};
+
+template <typename T> struct TplIndirectStruct2 { TplIndirectStruct2(int) {} };
+
+// We also use a specialization for float.
+template <> struct TplIndirectStruct2<float> { TplIndirectStruct2(float) {} };
diff --git a/tests/cxx/iwyu_stricter_than_cpp-typedefs.h b/tests/cxx/iwyu_stricter_than_cpp-typedefs.h
new file mode 100644
index 0000000..116f8c5
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp-typedefs.h
@@ -0,0 +1,76 @@
+//===--- iwyu_stricter_than_cpp-typedefs.h - test input file for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The two rules the author has to follow to disable iwyu's
+// stricter-than-C++ rule and force it to fall back on the c++
+// requirement (forward-declare ok):
+// (1) forward-declare the relevant type
+// (2) do not directly #include the definition of the relevant type.
+
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h"
+
+// --- Typedefs.
+
+// Requires the full type because it does not obey rule (1)
+// IWYU: IndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h
+typedef IndirectStruct1 DoesNotForwardDeclare;
+
+// This also does not obey rule (1): it's -d1 that does the fwd-declaring.
+// IWYU: IndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h
+typedef IndirectStructForwardDeclaredInD1 DoesNotForwardDeclareProperly;
+
+// Requires the full type because it does not obey rule (2)
+struct DirectStruct1;
+typedef DirectStruct1 Includes;
+
+// Requires the full type because it does not obey rules (1) *or* (2)
+typedef DirectStruct2 DoesNotForwardDeclareAndIncludes;
+
+// Does not require full type because it obeys all the rules.
+struct IndirectStruct2;
+typedef IndirectStruct2 DoesEverythingRight;
+
+// --- Now do it all again, with templates!
+
+// IWYU: IndirectStruct1 is...*iwyu_stricter_than_cpp-i1.h
+typedef TplIndirectStruct1<int> TplDoesNotForwardDeclare;
+
+// IWYU: IndirectStructForwardDeclaredInD1 is...*iwyu_stricter_than_cpp-i1.h
+typedef TplIndirectStructForwardDeclaredInD1<int>
+TplDoesNotForwardDeclareProperly;
+
+template <typename T> struct TplDirectStruct1;
+typedef TplDirectStruct1<int> TplIncludes;
+
+typedef TplDirectStruct2<int> TplDoesNotForwardDeclareAndIncludes;
+
+template <typename T> struct TplIndirectStruct2;
+typedef TplIndirectStruct2<int> TplDoesEverythingRight;
+
+// Another way to forward-declare a class template.
+template <> struct TplIndirectStruct2<float>;
+typedef TplIndirectStruct2<float> TplDoesEverythingRightAgain;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/iwyu_stricter_than_cpp-typedefs.h should add these lines:
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h"
+
+tests/cxx/iwyu_stricter_than_cpp-typedefs.h should remove these lines:
+- struct DirectStruct1; // lines XX-XX
+- template <typename T> struct TplDirectStruct1; // lines XX-XX
+
+The full include-list for tests/cxx/iwyu_stricter_than_cpp-typedefs.h:
+#include "tests/cxx/iwyu_stricter_than_cpp-d1.h" // for DirectStruct1, DirectStruct2, TplDirectStruct1, TplDirectStruct2
+#include "tests/cxx/iwyu_stricter_than_cpp-i1.h" // for IndirectStruct1, IndirectStructForwardDeclaredInD1, TplIndirectStruct1, TplIndirectStructForwardDeclaredInD1
+struct IndirectStruct2; // lines XX-XX
+template <typename T> struct TplIndirectStruct2; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/iwyu_stricter_than_cpp.cc b/tests/cxx/iwyu_stricter_than_cpp.cc
new file mode 100644
index 0000000..0daf11a
--- /dev/null
+++ b/tests/cxx/iwyu_stricter_than_cpp.cc
@@ -0,0 +1,166 @@
+//===--- iwyu_stricter_than_cpp.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// There are a few scenarios where iwyu requires a full type but c++
+// doesn't.
+//
+// One is in a typedef: if you write 'typedef Foo MyTypedef', iwyu
+// says that you are responsible for #including "foo.h", but the
+// language allows a forward-declare.
+//
+// Another is for 'autocast': if your function has a parameter with a
+// conversion (one-arg, not-explicit) constructor, iwyu require the
+// function-author to provide the full type of that parameter, but the
+// language doesn't. (It's ok with all callers providing the full
+// type instead.)
+//
+// In each case, we can disable iwyu's rule, and force it to fall back
+// on the c++ requirement (forward-declare ok), by writing the code in
+// the following way:
+// (1) forward-declare the relevant type
+// (2) do not directly #include the definition of the relevant type.
+//
+// This test tests that the iwyu requirement is correctly suppressed
+// when these two conditions are met, and not otherwise.
+
+#include "tests/cxx/iwyu_stricter_than_cpp-typedefs.h"
+#include "tests/cxx/iwyu_stricter_than_cpp-autocast.h"
+#include "tests/cxx/iwyu_stricter_than_cpp-fnreturn.h"
+// We include this so the second declaration of TwiceDeclaredFunction
+// is visible in the translation unit (but not by -d2.h)
+#include "tests/cxx/iwyu_stricter_than_cpp-autocast2.h"
+#include "tests/cxx/iwyu_stricter_than_cpp-d2.h"
+
+typedef DoesEverythingRight DoubleTypedef;
+
+// If the typedef in -typedefs.h requires the full type, then users of
+// that typedef (here) do not. Otherwise, they do.
+void TestTypedefs() {
+ DoesNotForwardDeclare dnfd(1);
+ DoesNotForwardDeclareProperly dnfdp(2);
+ Includes i(3);
+ DoesNotForwardDeclareAndIncludes dnfdai(4);
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ DoesEverythingRight dor(5);
+ // Because DoubleTypedef resolves to DoesEverythingRight, we need the
+ // same things DoesEverythingRight does.
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ DoubleTypedef dt(6);
+
+ // ...and with templates.
+ TplDoesNotForwardDeclare tdnfd(7);
+ TplDoesNotForwardDeclareProperly tdnfdp(8);
+ TplIncludes ti(9);
+ TplDoesNotForwardDeclareAndIncludes tdnfdai(10);
+ // IWYU: TplIndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ TplDoesEverythingRight tdor(11);
+ // IWYU: TplIndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ TplDoesEverythingRightAgain tdora(12);
+
+ // But if we're in a forward-declare context, we don't require the
+ // underlying type!
+ DoesEverythingRight* dor_ptr = 0;
+ TplDoesEverythingRightAgain* tdora_ptr = 0;
+ // ...at least until we dereference the pointer
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ (void) dor_ptr->a;
+
+ // TODO(csilvers): test template types where we need some (but not
+ // all) of the template args as well.
+}
+
+void TestAutocast() {
+ // We need full type of is2 because the declarer of Fn didn't
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ Fn(1, 2, 3, 4, 5);
+
+ // We need full type of is2 because the declarer of Fn didn't
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ TplFn(6, 7, 8, 9, 10);
+}
+
+void TestFunctionReturn() {
+ // In each of these cases, we bind the return value to a reference,
+ // so we only need a forward-declare unless the function-author has
+ // not taken responsibility for the return type.
+
+ // IWYU: IndirectStruct1 needs a declaration
+ const IndirectStruct1& is1 = DoesNotForwardDeclareFn();
+
+ // IWYU: IndirectStructForwardDeclaredInD1 needs a declaration
+ const IndirectStructForwardDeclaredInD1& isfdid1 =
+ DoesNotForwardDeclareProperlyFn();
+
+ // IWYU: DirectStruct1 needs a declaration
+ const DirectStruct1& ds1 = IncludesFn();
+
+ // IWYU: DirectStruct2 needs a declaration
+ const DirectStruct2& ds2 = DoesNotForwardDeclareAndIncludesFn();
+
+ // IWYU: IndirectStruct2 needs a declaration
+ // IWYU: IndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ const IndirectStruct2& is2 = DoesEverythingRightFn();
+
+ // -- And with templates.
+
+ // IWYU: TplIndirectStruct1 needs a declaration
+ const TplIndirectStruct1<int>& tis1 = TplDoesNotForwardDeclareFn();
+
+ // IWYU: TplIndirectStructForwardDeclaredInD1 needs a declaration
+ const TplIndirectStructForwardDeclaredInD1<int>& tisfdid1 =
+ TplDoesNotForwardDeclareProperlyFn();
+
+ // IWYU: TplDirectStruct1 needs a declaration
+ const TplDirectStruct1<int>& tds1 = TplIncludesFn();
+
+ // IWYU: TplDirectStruct2 needs a declaration
+ const TplDirectStruct2<int>& tds2 = TplDoesNotForwardDeclareAndIncludesFn();
+
+ // IWYU: TplIndirectStruct2 needs a declaration
+ // IWYU: TplIndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ const TplIndirectStruct2<int>& tis2 = TplDoesEverythingRightFn();
+
+ // IWYU: TplIndirectStruct2 needs a declaration
+ // IWYU: TplIndirectStruct2 is...*iwyu_stricter_than_cpp-i2.h
+ const TplIndirectStruct2<float>& tis2b = TplDoesEverythingRightAgainFn();
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/iwyu_stricter_than_cpp.cc should add these lines:
+#include "tests/cxx/iwyu_stricter_than_cpp-i2.h"
+struct DirectStruct1;
+struct DirectStruct2;
+struct IndirectStruct1;
+struct IndirectStructForwardDeclaredInD1;
+template <typename T> struct TplDirectStruct1;
+template <typename T> struct TplDirectStruct2;
+template <typename T> struct TplIndirectStruct1;
+template <typename T> struct TplIndirectStructForwardDeclaredInD1;
+
+tests/cxx/iwyu_stricter_than_cpp.cc should remove these lines:
+- #include "tests/cxx/iwyu_stricter_than_cpp-autocast2.h" // lines XX-XX
+- #include "tests/cxx/iwyu_stricter_than_cpp-d2.h" // lines XX-XX
+
+The full include-list for tests/cxx/iwyu_stricter_than_cpp.cc:
+#include "tests/cxx/iwyu_stricter_than_cpp-autocast.h" // for Fn, TplFn
+#include "tests/cxx/iwyu_stricter_than_cpp-fnreturn.h" // for DoesEverythingRightFn, DoesNotForwardDeclareAndIncludesFn, DoesNotForwardDeclareFn, DoesNotForwardDeclareProperlyFn, IncludesFn, TplDoesEverythingRightAgainFn, TplDoesEverythingRightFn, TplDoesNotForwardDeclareAndIncludesFn, TplDoesNotForwardDeclareFn, TplDoesNotForwardDeclareProperlyFn, TplIncludesFn
+#include "tests/cxx/iwyu_stricter_than_cpp-i2.h" // for IndirectStruct2, TplIndirectStruct2
+#include "tests/cxx/iwyu_stricter_than_cpp-typedefs.h" // for DoesEverythingRight, DoesNotForwardDeclare, DoesNotForwardDeclareAndIncludes, DoesNotForwardDeclareProperly, Includes, TplDoesEverythingRight, TplDoesEverythingRightAgain, TplDoesNotForwardDeclare, TplDoesNotForwardDeclareAndIncludes, TplDoesNotForwardDeclareProperly, TplIncludes
+struct DirectStruct1;
+struct DirectStruct2;
+struct IndirectStruct1;
+struct IndirectStructForwardDeclaredInD1;
+template <typename T> struct TplDirectStruct1;
+template <typename T> struct TplDirectStruct2;
+template <typename T> struct TplIndirectStruct1;
+template <typename T> struct TplIndirectStructForwardDeclaredInD1;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/keep_mapping-pragma1.h b/tests/cxx/keep_mapping-pragma1.h
new file mode 100644
index 0000000..0bf8568
--- /dev/null
+++ b/tests/cxx/keep_mapping-pragma1.h
@@ -0,0 +1,10 @@
+//===--- keep_mapping-pragma1.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This space intentionally left blank.
diff --git a/tests/cxx/keep_mapping-pragma2.h b/tests/cxx/keep_mapping-pragma2.h
new file mode 100644
index 0000000..c99f865
--- /dev/null
+++ b/tests/cxx/keep_mapping-pragma2.h
@@ -0,0 +1,10 @@
+//===--- keep_mapping-pragma2.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This space intentionally left blank.
diff --git a/tests/cxx/keep_mapping-priv.h b/tests/cxx/keep_mapping-priv.h
new file mode 100644
index 0000000..d8a4e37
--- /dev/null
+++ b/tests/cxx/keep_mapping-priv.h
@@ -0,0 +1,10 @@
+//===--- keep_mapping-priv.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This space intentionally left blank.
diff --git a/tests/cxx/keep_mapping-private.h b/tests/cxx/keep_mapping-private.h
new file mode 100644
index 0000000..9f03edf
--- /dev/null
+++ b/tests/cxx/keep_mapping-private.h
@@ -0,0 +1,10 @@
+//===--- keep_mapping-private.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This space intentionally left blank.
diff --git a/tests/cxx/keep_mapping-public.h b/tests/cxx/keep_mapping-public.h
new file mode 100644
index 0000000..1087db4
--- /dev/null
+++ b/tests/cxx/keep_mapping-public.h
@@ -0,0 +1,31 @@
+//===--- keep_mapping-public.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Makes sure that when we #include a file that is part of an explicit
+// mapping in iwyu_include_picker.cc, that iwyu doesn't say to remove
+// that include.
+
+// This is part of a mapping in iwyu_include_picker.cc.
+#include "tests/cxx/keep_mapping-priv.h"
+// This is part of a glob-mapping in iwyu_include_picker.cc
+#include "tests/cxx/keep_mapping-private.h"
+// This has an explicit pragma
+#include "tests/cxx/keep_mapping-pragma1.h" // IWYU pragma: export
+// This is also an explicit pragma
+// IWYU pragma: begin_exports
+#include "tests/cxx/keep_mapping-pragma2.h"
+// IWYU pragma: end_exports
+
+const int kInt = 5;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/keep_mapping-public.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/keep_mapping.cc b/tests/cxx/keep_mapping.cc
new file mode 100644
index 0000000..c494d6c
--- /dev/null
+++ b/tests/cxx/keep_mapping.cc
@@ -0,0 +1,20 @@
+//===--- keep_mapping.cc - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// The real test here is in keep_mapping-public.h.
+
+#include "tests/cxx/keep_mapping-public.h"
+
+const int kCcInt = kInt;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/keep_mapping.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/keep_mapping.imp b/tests/cxx/keep_mapping.imp
new file mode 100644
index 0000000..6fd74b3
--- /dev/null
+++ b/tests/cxx/keep_mapping.imp
@@ -0,0 +1,5 @@
+# Header mappings for IWYU tests.
+[
+ { include: ["@\"tests/cxx/keep_mapping-private.*\"", "private", "\"tests/cxx/keep_mapping-public.h\"", "public"] },
+ { include: ["\"tests/cxx/keep_mapping-priv.h\"", "private", "\"tests/cxx/keep_mapping-public.h\"", "public"] }
+]
diff --git a/tests/cxx/lambda_fwd_decl.cc b/tests/cxx/lambda_fwd_decl.cc
new file mode 100644
index 0000000..074379e
--- /dev/null
+++ b/tests/cxx/lambda_fwd_decl.cc
@@ -0,0 +1,32 @@
+//===--- lambda_fwd_decl.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This test ensures that we do not add forward-declarations for lambdas.
+// The use of the lambda in add() registers as a use of the generated anonymous
+// functor type. Since it's defined in the same file, IWYU thinks a forward-decl
+// at the top would be useful.
+//
+// All this is obviously unnecessary -- lambdas have no name and all
+// lambda declarations are definitions, visible at point of use.
+
+template<class F>
+int eval(F f, int arg) {
+ return f(arg);
+}
+
+int add(int value, int addend) {
+ return eval([&](int v) { return v + addend; },
+ value);
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/lambda_fwd_decl.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/lateparsed_template-notchecked.h b/tests/cxx/lateparsed_template-notchecked.h
new file mode 100644
index 0000000..90a642f
--- /dev/null
+++ b/tests/cxx/lateparsed_template-notchecked.h
@@ -0,0 +1,24 @@
+//===--- lateparsed_template-notchecked.h - test input file for iwyu ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_LATEPARSED_NOTCHECKED_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_LATEPARSED_NOTCHECKED_H_
+
+// A crazy late-parsed function template.
+// IWYU should not attempt to parse it, since it's not in a file signed up for
+// analysis.
+template<class T>
+void unchecked() {
+ this is late parsed, and makes no sense;
+};
+
+// Here's a symbol we reference from the main test file.
+const int kUsableSymbol = 100;
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_LATEPARSED_NOTCHECKED_H_
diff --git a/tests/cxx/lateparsed_template.cc b/tests/cxx/lateparsed_template.cc
new file mode 100644
index 0000000..18c0ff8
--- /dev/null
+++ b/tests/cxx/lateparsed_template.cc
@@ -0,0 +1,60 @@
+//===--- lateparsed_template.cc - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests IWYU handling of function templates when used with the MSVC-compatible
+// -fdelayed-template-parsing flag.
+//
+// IWYU should eagerly parse templates before analysis, to make sure we account
+// for symbols in template bodies.
+//
+// This test is only meaningful when run with the -fdelayed-template-parsing
+// flag.
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/lateparsed_template-notchecked.h"
+
+// With -fdelayed-template-parsing, a function template is only parsed once
+// it's instantiated (and it never is). IWYU has a special pass to force
+// the template parsing necessary to discover the use of IndirectClass.
+template <typename T> void function_template() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+}
+
+// Methods of class templates are also late parsed...
+template <typename T> class ClassTemplate {
+ void method() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+ }
+};
+
+// ... as are member function templates of plain classes.
+class Class {
+ template <typename T> void method_template() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+ }
+};
+
+const int kConstUse = kUsableSymbol;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/lateparsed_template.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/lateparsed_template.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/lateparsed_template.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/lateparsed_template-notchecked.h" // for kUsableSymbol
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/macro_defined_by_includer-d1.h b/tests/cxx/macro_defined_by_includer-d1.h
new file mode 100644
index 0000000..b6f1ba0
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-d1.h
@@ -0,0 +1,12 @@
+//===--- macro_defined_by_includer-d1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Header file to provide extra level of inclusion indirection.
+
+#include "tests/cxx/macro_defined_by_includer-i1.h"
diff --git a/tests/cxx/macro_defined_by_includer-d2.h b/tests/cxx/macro_defined_by_includer-d2.h
new file mode 100644
index 0000000..ca8cb53
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-d2.h
@@ -0,0 +1,15 @@
+//===--- macro_defined_by_includer-d2.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests case when file using macro is included from file defining macro but
+// the macro user is first encountered as include in another file.
+
+#define DIRECT_INCLUDE_GUARD_2
+#include "tests/cxx/macro_defined_by_includer-i2.h"
+#include "tests/cxx/macro_defined_by_includer-g2.h"
diff --git a/tests/cxx/macro_defined_by_includer-d3.h b/tests/cxx/macro_defined_by_includer-d3.h
new file mode 100644
index 0000000..595c0cf
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-d3.h
@@ -0,0 +1,14 @@
+//===--- macro_defined_by_includer-d3.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests nested guarded includes. Covers the case when "public" mapping for
+// some private include can be in fact private.
+
+#define DIRECT_INCLUDE_GUARD_3
+#include "tests/cxx/macro_defined_by_includer-g3.h"
diff --git a/tests/cxx/macro_defined_by_includer-d4.h b/tests/cxx/macro_defined_by_includer-d4.h
new file mode 100644
index 0000000..5eab76a
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-d4.h
@@ -0,0 +1,12 @@
+//===--- macro_defined_by_includer-d4.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Header file to provide extra level of inclusion indirection.
+
+#include "tests/cxx/macro_defined_by_includer-i3.h"
diff --git a/tests/cxx/macro_defined_by_includer-g1.h b/tests/cxx/macro_defined_by_includer-g1.h
new file mode 100644
index 0000000..1e613cf
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-g1.h
@@ -0,0 +1,14 @@
+//===--- macro_defined_by_includer-g1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef DIRECT_INCLUDE_GUARD_1
+ #error Do not include directly
+#else
+ class GuardedInclude1 {};
+#endif
diff --git a/tests/cxx/macro_defined_by_includer-g2.h b/tests/cxx/macro_defined_by_includer-g2.h
new file mode 100644
index 0000000..b0d4c09
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-g2.h
@@ -0,0 +1,19 @@
+//===--- macro_defined_by_includer-g2.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_DEFINED_BY_INCLUDER_G2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_DEFINED_BY_INCLUDER_G2_H_
+
+#ifndef DIRECT_INCLUDE_GUARD_2
+ #error Do not include directly
+#else
+ class GuardedInclude2 {};
+#endif
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_DEFINED_BY_INCLUDER_G2_H_
diff --git a/tests/cxx/macro_defined_by_includer-g3.h b/tests/cxx/macro_defined_by_includer-g3.h
new file mode 100644
index 0000000..64eecbf
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-g3.h
@@ -0,0 +1,17 @@
+//===--- macro_defined_by_includer-g3.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define DIRECT_INCLUDE_GUARD_4
+#include "tests/cxx/macro_defined_by_includer-g4.h"
+
+#ifndef DIRECT_INCLUDE_GUARD_3
+ #error Do not include directly
+#else
+ class GuardedInclude3 {};
+#endif
diff --git a/tests/cxx/macro_defined_by_includer-g4.h b/tests/cxx/macro_defined_by_includer-g4.h
new file mode 100644
index 0000000..b1e8b8d
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-g4.h
@@ -0,0 +1,14 @@
+//===--- macro_defined_by_includer-g4.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef DIRECT_INCLUDE_GUARD_4
+ #error Do not include directly
+#else
+ class GuardedInclude4 {};
+#endif
diff --git a/tests/cxx/macro_defined_by_includer-g5.h b/tests/cxx/macro_defined_by_includer-g5.h
new file mode 100644
index 0000000..742142f
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-g5.h
@@ -0,0 +1,14 @@
+//===--- macro_defined_by_includer-g5.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef DIRECT_INCLUDE_GUARD_5
+ #error Do not include directly
+#else
+ class GuardedInclude5 {};
+#endif
diff --git a/tests/cxx/macro_defined_by_includer-i1.h b/tests/cxx/macro_defined_by_includer-i1.h
new file mode 100644
index 0000000..d359441
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-i1.h
@@ -0,0 +1,11 @@
+//===--- macro_defined_by_includer-i1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define DIRECT_INCLUDE_GUARD_1
+#include "tests/cxx/macro_defined_by_includer-g1.h"
diff --git a/tests/cxx/macro_defined_by_includer-i2.h b/tests/cxx/macro_defined_by_includer-i2.h
new file mode 100644
index 0000000..60b4a2b
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-i2.h
@@ -0,0 +1,10 @@
+//===--- macro_defined_by_includer-i2.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/macro_defined_by_includer-g2.h"
diff --git a/tests/cxx/macro_defined_by_includer-i3.h b/tests/cxx/macro_defined_by_includer-i3.h
new file mode 100644
index 0000000..b7c9b41
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-i3.h
@@ -0,0 +1,14 @@
+//===--- macro_defined_by_includer-i3.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Header file to test including file that uses x-macro.
+
+#define TYPE char
+#include "tests/cxx/macro_defined_by_includer-xmacro.h"
+#undef TYPE
diff --git a/tests/cxx/macro_defined_by_includer-i4.h b/tests/cxx/macro_defined_by_includer-i4.h
new file mode 100644
index 0000000..801ea36
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-i4.h
@@ -0,0 +1,16 @@
+//===--- macro_defined_by_includer-i4.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifdef ENABLE_DEBUG
+void foo() {
+ // Extra code for debugging purposes.
+}
+#else
+void foo() {}
+#endif
diff --git a/tests/cxx/macro_defined_by_includer-prefix.h b/tests/cxx/macro_defined_by_includer-prefix.h
new file mode 100644
index 0000000..922ddc6
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-prefix.h
@@ -0,0 +1,11 @@
+//===--- macro_defined_by_includer-prefix.h - test input file for iwyu ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define ENABLE_DEBUG
+#include "tests/cxx/macro_defined_by_includer-i4.h"
diff --git a/tests/cxx/macro_defined_by_includer-xmacro.h b/tests/cxx/macro_defined_by_includer-xmacro.h
new file mode 100644
index 0000000..e96a8b8
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer-xmacro.h
@@ -0,0 +1,12 @@
+//===--- macro_defined_by_includer-xmacro.h - test input file for iwyu ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// File containing X-macro templates.
+
+void f(TYPE const t) {}
diff --git a/tests/cxx/macro_defined_by_includer.cc b/tests/cxx/macro_defined_by_includer.cc
new file mode 100644
index 0000000..91ac4b9
--- /dev/null
+++ b/tests/cxx/macro_defined_by_includer.cc
@@ -0,0 +1,89 @@
+//===--- macro_defined_by_includer.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests a few macro patterns:
+// * internal headers guarded by macro defined in designated header;
+// * x-macros.
+//
+// Usually you include a file with a macro and use that macro. But in these
+// macro patterns macro is defined by includer and includee doesn't know where
+// the macro comes from.
+
+
+// Test guarded includes.
+#include "tests/cxx/macro_defined_by_includer-d1.h"
+// IWYU: GuardedInclude1 is...*macro_defined_by_includer-i1.h
+GuardedInclude1 g1;
+
+#include "tests/cxx/macro_defined_by_includer-d2.h"
+GuardedInclude2 g2;
+
+#include "tests/cxx/macro_defined_by_includer-d3.h"
+GuardedInclude3 g3;
+GuardedInclude4 g4;
+
+#define DIRECT_INCLUDE_GUARD_5
+#include "tests/cxx/macro_defined_by_includer-g5.h"
+GuardedInclude5 g5;
+
+
+// Test x-macros.
+#include "tests/cxx/macro_defined_by_includer-d4.h"
+
+#define TYPE int
+#include "tests/cxx/macro_defined_by_includer-xmacro.h"
+#undef TYPE
+
+// For x-macros we keep all includes even if its content isn't used.
+#define TYPE double
+#include "tests/cxx/macro_defined_by_includer-xmacro.h"
+#undef TYPE
+
+int main() {
+ // IWYU: f is...*macro_defined_by_includer-i3.h
+ f(3);
+ // IWYU: f is...*macro_defined_by_includer-i3.h
+ f('a');
+}
+
+
+// Test macro defined on command line. Make sure that detecting file defining
+// macro works without actual file on disk.
+COMMAND_LINE_TYPE x;
+
+
+// Clang internal <limits.h> defines LLONG_MIN and #include_next system
+// <limits.h> which on Mac OS X uses LLONG_MIN.
+//
+// Test that we don't create a mapping between those 2 <limits.h> and don't try
+// to mark system <limits.h> as private.
+#include <limits.h>
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/macro_defined_by_includer.cc should add these lines:
+#include "tests/cxx/macro_defined_by_includer-i1.h"
+#include "tests/cxx/macro_defined_by_includer-i3.h"
+
+tests/cxx/macro_defined_by_includer.cc should remove these lines:
+- #include <limits.h> // lines XX-XX
+- #include "tests/cxx/macro_defined_by_includer-d1.h" // lines XX-XX
+- #include "tests/cxx/macro_defined_by_includer-d4.h" // lines XX-XX
+
+The full include-list for tests/cxx/macro_defined_by_includer.cc:
+#include "tests/cxx/macro_defined_by_includer-d2.h" // for GuardedInclude2
+#include "tests/cxx/macro_defined_by_includer-d3.h" // for GuardedInclude3, GuardedInclude4
+#include "tests/cxx/macro_defined_by_includer-g5.h" // for GuardedInclude5
+#include "tests/cxx/macro_defined_by_includer-i1.h" // for GuardedInclude1
+#include "tests/cxx/macro_defined_by_includer-i3.h" // for f
+#include "tests/cxx/macro_defined_by_includer-xmacro.h" // lines XX-XX
+#include "tests/cxx/macro_defined_by_includer-xmacro.h" // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/macro_location-byteswap.h b/tests/cxx/macro_location-byteswap.h
new file mode 100644
index 0000000..921cf28
--- /dev/null
+++ b/tests/cxx/macro_location-byteswap.h
@@ -0,0 +1,2 @@
+#define bswap(x) ({ int __x = (x); bswap2(__x); })
+#define bswap2(x) (x)
diff --git a/tests/cxx/macro_location-d1.h b/tests/cxx/macro_location-d1.h
new file mode 100644
index 0000000..b2e9acf
--- /dev/null
+++ b/tests/cxx/macro_location-d1.h
@@ -0,0 +1,11 @@
+//===--- macro_location-d1.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class NewClass {};
+class OtherClass {};
diff --git a/tests/cxx/macro_location-d2.h b/tests/cxx/macro_location-d2.h
new file mode 100644
index 0000000..5d64cd7
--- /dev/null
+++ b/tests/cxx/macro_location-d2.h
@@ -0,0 +1,44 @@
+//===--- macro_location-d2.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/macro_location-d1.h"
+
+// The forward-declare is a hint that the use should be attributed
+// to users of the DECLARE_INDIRECT macro, not this file.
+class IndirectClass;
+
+#define DECLARE_INDIRECT(name) IndirectClass name;
+
+#define ARRAYSIZE(x) ( sizeof(x) / sizeof(*(x)) )
+
+#define NEW_CLASS(name) \
+ class NewClass_##name : public NewClass { \
+ public: \
+ OtherClass o; \
+ };
+
+// This macro is tricky because myclass_##classname involves a type
+// that's defined in scratch space. Make sure this doesn't result in
+// an IWYU violation. Nor should classname used *not* in a macro
+// concatenation (as the return value of Init).
+#define USE_CLASS(classname) \
+ struct Use_##classname { \
+ Use_##classname() { Init(); } \
+ classname* Init() { return 0; } \
+ }; \
+ static Use_##classname myclass_##classname
+
+#define CREATE_VAR(typ) typ create_var
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/macro_location-d2.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/macro_location-d3.h b/tests/cxx/macro_location-d3.h
new file mode 100644
index 0000000..89a2693
--- /dev/null
+++ b/tests/cxx/macro_location-d3.h
@@ -0,0 +1,11 @@
+//===--- macro_location-d3.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/macro_location-i3.h"
+#include "tests/cxx/macro_location-i4.h"
diff --git a/tests/cxx/macro_location-d4.h b/tests/cxx/macro_location-d4.h
new file mode 100644
index 0000000..b912494
--- /dev/null
+++ b/tests/cxx/macro_location-d4.h
@@ -0,0 +1,40 @@
+//===--- macro_location-d4.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file contains negative cases for the forward-declares used for
+// use-attribution hints when expanding macros.
+
+#include "tests/cxx/macro_location-i5.h" // for UNNAMED_TYPE_IN_MACRO
+
+// A class declared in this file and used via a macro defined in this file
+// should not be seen by IWYU in files expanding the macro.
+class Logger {
+ public:
+ void Log(int level, const char* msg);
+};
+
+// A forward-declaration inside a macro should not count as a use-attribution
+// hint and should not be seen by IWYU in files expanding other macros.
+#define UNRELATED_FORWARD_DECLARE class Logger;
+
+#define LOG_INFO(x) \
+ Logger().Log(0, x);
+
+// A class declared and used in this macro should not be seen by IWYU in files
+// expanding the macro. This is similar to USE_CLASS in macro_location-d2.h, but
+// doesn't involve macro arg concatentation.
+// (And yes, this code is broken in so many ways, it's only to put the test case
+// in a vaguely real-life scenario)
+#define DECLARE_AND_USE_CLASS(y) \
+ class ScopedLogger { \
+ public: \
+ ScopedLogger() { LOG_INFO(y); } \
+ ~ScopedLogger() { LOG_INFO(y); } \
+ }; \
+ ScopedLogger lll;
diff --git a/tests/cxx/macro_location-i3.h b/tests/cxx/macro_location-i3.h
new file mode 100644
index 0000000..6bc3888
--- /dev/null
+++ b/tests/cxx/macro_location-i3.h
@@ -0,0 +1,12 @@
+//===--- macro_location-i3.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define DECLARE_FRIEND(cls) friend class cls
+
+class Foo {};
diff --git a/tests/cxx/macro_location-i4.h b/tests/cxx/macro_location-i4.h
new file mode 100644
index 0000000..f61332e
--- /dev/null
+++ b/tests/cxx/macro_location-i4.h
@@ -0,0 +1,12 @@
+//===--- macro_location-i4.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class ConcatClass {};
+
+class ConcatFwdDeclClass {};
diff --git a/tests/cxx/macro_location-i5.h b/tests/cxx/macro_location-i5.h
new file mode 100644
index 0000000..0bedc59
--- /dev/null
+++ b/tests/cxx/macro_location-i5.h
@@ -0,0 +1,27 @@
+//===--- macro_location-i5.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file contains negative cases for the forward-declares used for
+// use-attribution hints when expanding macros.
+
+// An unnamed type inside a macro should not be seen by IWYU in files expanding
+// the macro.
+//
+// The below test code is absolute nonsense, it's reduced from the definition of
+// READ_ONCE in the Linux kernel:
+// http://lxr.free-electrons.com/source/tools/include/linux/compiler.h#L112
+#define UNNAMED_TYPE_IN_MACRO(value) \
+ char nonsense() { \
+ union { \
+ int v; \
+ char c[1]; \
+ } u; \
+ u.v = value; \
+ return u.c[0]; \
+ }
diff --git a/tests/cxx/macro_location-inet.h b/tests/cxx/macro_location-inet.h
new file mode 100644
index 0000000..f19e3fb
--- /dev/null
+++ b/tests/cxx/macro_location-inet.h
@@ -0,0 +1,12 @@
+//===--- macro_location-inet.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/macro_location-byteswap.h"
+
+#define htons(x) bswap(x)
diff --git a/tests/cxx/macro_location.cc b/tests/cxx/macro_location.cc
new file mode 100644
index 0000000..032ca06
--- /dev/null
+++ b/tests/cxx/macro_location.cc
@@ -0,0 +1,42 @@
+//===--- macro_location.cc - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests a few common types of macro uses to make sure we correctly
+// identify what symbols belong to the macro author, and what symbols
+// belong to the macro user. Also make sure we don't ignore macro
+// expansions when the macro is written in a to-ignore file.
+
+#include "tests/cxx/macro_location.h"
+#include "tests/cxx/macro_location-inet.h"
+
+struct A {
+ // This doesn't require us to forward-declare ToBeDeclared because it's
+ // part of a friendship declaration.
+ friend class ToBeDeclaredLater1;
+ // iwyu should treat this exactly the same, even though DECLARE_FRIEND
+ // is in a far-away file.
+ // IWYU: DECLARE_FRIEND is...*macro_location-i3.h
+ DECLARE_FRIEND(ToBeDeclaredLater2);
+};
+
+class ToBeDeclaredLater1 { };
+class ToBeDeclaredLater2 { };
+
+// This is lifted from a reduced repro case for htons of inet.h.
+// Its nesting provokes something that isn't covered by the rest of the
+// macro_location suite.
+int my_htons(int x) {
+ return htons(x);
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/macro_location.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/macro_location.h b/tests/cxx/macro_location.h
new file mode 100644
index 0000000..9e298af
--- /dev/null
+++ b/tests/cxx/macro_location.h
@@ -0,0 +1,72 @@
+//===--- macro_location.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include "tests/cxx/indirect.h"
+#include "tests/cxx/macro_location-d2.h"
+#include "tests/cxx/macro_location-d3.h"
+#include "tests/cxx/macro_location-d4.h"
+
+class Foo;
+static Foo *foo = 0;
+
+class HClass { };
+
+// IWYU: Foo is...*macro_location-i3.h
+const int s = ARRAYSIZE(foo);
+// Should not need a declaration of NewClass_Bar, or NewClass.
+NEW_CLASS(Bar);
+// This shouldn't cause weird iwyu issues between us and macro_location-d2.h.
+USE_CLASS(HClass);
+// This shouldn't cause macro_location-d1.h to need to include us for HClass.
+CREATE_VAR(HClass);
+// This should force us to #include a definition of IndirectClass, because it's
+// forward-declared by DECLARE_INDIRECT's file.
+DECLARE_INDIRECT(global_indirect);
+
+// Macro-concatenated locations end up in <scratch space>, check that they're
+// properly attributed to expansion.
+#define CONCAT(a, b) a##b
+
+// IWYU: ConcatFwdDeclClass needs a declaration
+CONCAT(Concat, FwdDeclClass) *global_concat_ptr;
+
+// IWYU: ConcatClass is...*macro_location-i4.h
+CONCAT(Concat, Class) global_concat;
+
+// Make sure types defined and used only within a macro definition file
+// aren't attributed to the macro expansion loc.
+
+// IWYU: UNNAMED_TYPE_IN_MACRO is...*macro_location-i5.h
+UNNAMED_TYPE_IN_MACRO(500);
+
+void func() {
+ LOG_INFO("hello");
+ DECLARE_AND_USE_CLASS("hello again");
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/macro_location.h should add these lines:
+#include "tests/cxx/macro_location-i3.h"
+#include "tests/cxx/macro_location-i4.h"
+#include "tests/cxx/macro_location-i5.h"
+
+tests/cxx/macro_location.h should remove these lines:
+- #include "tests/cxx/macro_location-d3.h" // lines XX-XX
+- class Foo; // lines XX-XX
+
+The full include-list for tests/cxx/macro_location.h:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/macro_location-d2.h" // for ARRAYSIZE, CREATE_VAR, DECLARE_INDIRECT, NEW_CLASS, USE_CLASS
+#include "tests/cxx/macro_location-d4.h" // for DECLARE_AND_USE_CLASS, LOG_INFO
+#include "tests/cxx/macro_location-i3.h" // for Foo
+#include "tests/cxx/macro_location-i4.h" // for ConcatClass, ConcatFwdDeclClass (ptr only)
+#include "tests/cxx/macro_location-i5.h" // for UNNAMED_TYPE_IN_MACRO
+
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/macro_use_expanded_decl-class.h b/tests/cxx/macro_use_expanded_decl-class.h
new file mode 100644
index 0000000..df0b325
--- /dev/null
+++ b/tests/cxx/macro_use_expanded_decl-class.h
@@ -0,0 +1,21 @@
+//===--- macro_use_expanded_decl-class.h - test input file for iwyu -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_CLASS_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_CLASS_H_
+
+#include "macro_use_expanded_decl-macro.h"
+
+struct Class {
+ GEN_METHOD();
+};
+
+GEN_CLASS2();
+
+#endif //INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_CLASS_H_
diff --git a/tests/cxx/macro_use_expanded_decl-macro.h b/tests/cxx/macro_use_expanded_decl-macro.h
new file mode 100644
index 0000000..15df144
--- /dev/null
+++ b/tests/cxx/macro_use_expanded_decl-macro.h
@@ -0,0 +1,20 @@
+//===--- macro_use_expanded_decl-macro.h - test input file for iwyu -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_MACRO_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_MACRO_H_
+
+#define GEN_METHOD() void gen_method();
+#define CALL_METHOD(a) a.gen_method();
+#define GEN_CLASS2() \
+ struct Class2 { \
+ GEN_METHOD(); \
+ };
+
+#endif //INCLUDE_WHAT_YOU_USE_TESTS_CXX_MACRO_USE_EXPANDED_DECL_MACRO_H_
diff --git a/tests/cxx/macro_use_expanded_decl.cc b/tests/cxx/macro_use_expanded_decl.cc
new file mode 100644
index 0000000..592420a
--- /dev/null
+++ b/tests/cxx/macro_use_expanded_decl.cc
@@ -0,0 +1,46 @@
+//===--- macro_use_expanded_decl.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "macro_use_expanded_decl-class.h"
+
+void test() {
+ Class c; // Class with a method decl generated by a macro
+ Class2 c2; // Class generated by a macro with a method decl generated by
+ // nested macro
+
+ // Called directly, already including *-class.h
+
+ c.gen_method();
+ c2.gen_method();
+
+ // Called through a macro, need to include *-macro.h
+
+ // IWYU: CALL_METHOD is...*-macro.h
+ CALL_METHOD(c)
+ // IWYU: CALL_METHOD is...*-macro.h
+ CALL_METHOD(c2)
+}
+
+// Note: gen_method() is not reported as a use for either class because
+// of rule B4 (the parent class lives in the same file) This must be true
+// no matter if the decl is spelled directly (Class) or through a macro
+// defined in a different file (Class2)
+
+/**** IWYU_SUMMARY
+
+tests/cxx/macro_use_expanded_decl.cc should add these lines:
+#include "macro_use_expanded_decl-macro.h"
+
+tests/cxx/macro_use_expanded_decl.cc should remove these lines:
+
+The full include-list for tests/cxx/macro_use_expanded_decl.cc:
+#include "macro_use_expanded_decl-class.h" // for Class, Class2
+#include "macro_use_expanded_decl-macro.h" // for CALL_METHOD
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/member_expr-d1.h b/tests/cxx/member_expr-d1.h
new file mode 100644
index 0000000..7a603b7
--- /dev/null
+++ b/tests/cxx/member_expr-d1.h
@@ -0,0 +1,12 @@
+//===--- member_expr-d1.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#define CALL_METHOD Method()
+#define IC ic
+#define IC_CALL_METHOD (ic).Method()
diff --git a/tests/cxx/member_expr.cc b/tests/cxx/member_expr.cc
new file mode 100644
index 0000000..1fa88cc
--- /dev/null
+++ b/tests/cxx/member_expr.cc
@@ -0,0 +1,71 @@
+//===--- member_expr.cc - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we correctly detect iwyu use with member accesses.
+
+#include "tests/cxx/member_expr-d1.h"
+#include "tests/cxx/direct.h"
+
+// IWYU: IndirectClass needs a declaration
+int RefFn(const IndirectClass& ic) {
+ // IWYU: IndirectClass is...*indirect.h
+ ic.Method();
+ // IWYU: IndirectClass is...*indirect.h
+ return ic.a;
+}
+
+// IWYU: IndirectClass needs a declaration
+int PtrFn(const IndirectClass* ic) {
+ // IWYU: IndirectClass is...*indirect.h
+ ic->Method();
+ // IWYU: IndirectClass is...*indirect.h
+ return ic->a;
+}
+
+void StaticFn() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass::StaticMethod();
+}
+
+// IWYU: IndirectClass needs a declaration
+void ViaMacro(const IndirectClass& ic) {
+ // We should figure out we need IndirectClass because of the 'ic.',
+ // even if the member-expr itself is in another file due to the macro.
+ // IWYU: IndirectClass is...*indirect.h
+ ic.CALL_METHOD;
+
+ // Likewise, we 'own' this member expr because we own the dot.
+ // IWYU: IndirectClass is...*indirect.h
+ IC.Method();
+ // IWYU: IndirectClass is...*indirect.h
+ IC.CALL_METHOD;
+
+ IC
+ .
+ // IWYU: IndirectClass is...*indirect.h
+ CALL_METHOD;
+
+ // But this member-expr is entirely in the macro, so we don't own it.
+ IC_CALL_METHOD;
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/member_expr.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/member_expr.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/member_expr.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/member_expr-d1.h" // for CALL_METHOD, IC, IC_CALL_METHOD
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/ms_inline_asm.cc b/tests/cxx/ms_inline_asm.cc
new file mode 100644
index 0000000..c4acfb7
--- /dev/null
+++ b/tests/cxx/ms_inline_asm.cc
@@ -0,0 +1,30 @@
+//===--- ms_inline_asm.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is not strictly an IWYU test, it just checks that the parser
+// doesn't choke on Microsoft inline assembly on any of our target platforms.
+// Requires -fms-extensions.
+
+int main() {
+ int r;
+ __asm {
+ // TODO: Add a use here, e.g. by using IndirectClass::statica
+ // when/if we ever support IWYU analysis inside inline assembly.
+ mov ecx, 0
+ mov r, ecx
+ };
+
+ return r;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/ms_inline_asm.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/multiple_include_paths.cc b/tests/cxx/multiple_include_paths.cc
new file mode 100644
index 0000000..e79567d
--- /dev/null
+++ b/tests/cxx/multiple_include_paths.cc
@@ -0,0 +1,44 @@
+//===--- multiple_include_paths.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when a file is referred to in a non-canonical way, iwyu
+// respects that rather than trying to rewrite it. This matters most
+// when a file can be referred to in two ways because of
+// include-paths: if we #include "a/b/c.h" and compile with "-I. -Ia
+// -Ia/b", then we could say #include "a/b/c.h", #include "b/c.h", or
+// #include "c.h"). clang will, as I understand it, pick one of these
+// three forms arbitrarily for FileEntry::getName. We want to use the
+// name that was actually written in the source. It also matters when
+// there are symlinks in the source-tree.
+//
+// However, those are both pretty tricky to test, so instead we
+// just throw in some ..'s that clang would otherwise normalize.
+
+// For a given file, clang stores the first includename-as-written as
+// its canonical name. The include of direct.h will make sure it's
+// the one without the ..
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/internal/../indirect.h"
+
+IndirectClass ic;
+
+
+/**** IWYU_SUMMARY
+
+
+tests/cxx/multiple_include_paths.cc should add these lines:
+
+tests/cxx/multiple_include_paths.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/multiple_include_paths.cc:
+#include "tests/cxx/internal/../indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/new_header_path_local.cc b/tests/cxx/new_header_path_local.cc
new file mode 100644
index 0000000..9e64463
--- /dev/null
+++ b/tests/cxx/new_header_path_local.cc
@@ -0,0 +1,31 @@
+//===--- new_header_path_local.cc - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that if include search path is not provided, new includes are added
+// without path (just file name). Compare with new_header_path_provided.cc.
+
+#include "direct_near.h"
+
+void foo() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/new_header_path_local.cc should add these lines:
+#include "indirect.h"
+
+tests/cxx/new_header_path_local.cc should remove these lines:
+- #include "direct_near.h" // lines XX-XX
+
+The full include-list for tests/cxx/new_header_path_local.cc:
+#include "indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/new_header_path_provided.cc b/tests/cxx/new_header_path_provided.cc
new file mode 100644
index 0000000..4b5bd4d
--- /dev/null
+++ b/tests/cxx/new_header_path_provided.cc
@@ -0,0 +1,31 @@
+//===--- new_header_path_provided.cc - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that if include search path is provided, new includes are added with
+// corresponding relative path. Compare with new_header_path_local.cc.
+
+#include "tests/cxx/direct.h"
+
+void foo() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/new_header_path_provided.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/new_header_path_provided.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/new_header_path_provided.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_char_traits.cc b/tests/cxx/no_char_traits.cc
new file mode 100644
index 0000000..0b7095b
--- /dev/null
+++ b/tests/cxx/no_char_traits.cc
@@ -0,0 +1,38 @@
+//===--- no_char_traits.cc - test input file for iwyu ---------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A very small test that makes sure we don't suggest char_traits
+// when using ostreams with a char*. That triggers this code in
+// <ostream>:
+// inline basic_ostream<char, _Traits>&
+// operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
+// {
+// if (!__s)
+// __out.setstate(ios_base::badbit);
+// else
+// __ostream_insert(__out, __s,
+// static_cast<streamsize>(_Traits::length(__s)));
+// return __out;
+// }
+// But for char*'s <ostream> should intend-to-provide traits, even
+// though it's a template arg, so the user doesn't have to.
+
+#include <iostream>
+
+int main() {
+ std::cout << "Hello, world.\n";
+ // This is more difficult because the first << returns a basic_ostream.
+ std::cout << "Hello, world." << "\n";
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_char_traits.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_comments.cc b/tests/cxx/no_comments.cc
new file mode 100644
index 0000000..b9de3ac
--- /dev/null
+++ b/tests/cxx/no_comments.cc
@@ -0,0 +1,29 @@
+//===--- no_comments.cc - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test that passing the --no_comments switch to IWYU suppresses both
+// '// lines NN-NN' and '// for symbol' comments.
+
+#include "tests/cxx/direct.h"
+
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass global;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/no_comments.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/no_comments.cc should remove these lines:
+- #include "tests/cxx/direct.h"
+
+The full include-list for tests/cxx/no_comments.cc:
+#include "tests/cxx/indirect.h"
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_definition.cc b/tests/cxx/no_definition.cc
new file mode 100644
index 0000000..83b1f01
--- /dev/null
+++ b/tests/cxx/no_definition.cc
@@ -0,0 +1,29 @@
+//===--- no_definition.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests we keep at least one forward-decl even when there's no definition.
+
+class Foo;
+Foo* foo;
+
+template <typename T> class Bar;
+Bar<int>* bar;
+
+// The tricky case -- because of the default parameter, we want to
+// replace the fwd-decl with a full use, but there *is* no full use.
+template <typename T, typename U = int> class Baz;
+Baz<int>* baz;
+
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_definition.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_deque.cc b/tests/cxx/no_deque.cc
new file mode 100644
index 0000000..c685b8e
--- /dev/null
+++ b/tests/cxx/no_deque.cc
@@ -0,0 +1,24 @@
+//===--- no_deque.cc - test input file for iwyu ---------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A very small test that makes sure we don't suggest deque when using
+// a queue.
+
+#include <queue>
+
+int main() {
+ std::queue<int> q;
+ (void)q;
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_deque.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_fwd_decl_nested_class-d1.h b/tests/cxx/no_fwd_decl_nested_class-d1.h
new file mode 100644
index 0000000..eafa56b
--- /dev/null
+++ b/tests/cxx/no_fwd_decl_nested_class-d1.h
@@ -0,0 +1,12 @@
+//===--- no_fwd_decl_nested_class-d1.h - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct DirectOuterClass {
+ class NestedClass;
+};
diff --git a/tests/cxx/no_fwd_decl_nested_class.cc b/tests/cxx/no_fwd_decl_nested_class.cc
new file mode 100644
index 0000000..a026e8f
--- /dev/null
+++ b/tests/cxx/no_fwd_decl_nested_class.cc
@@ -0,0 +1,24 @@
+//===--- no_fwd_decl_nested_class.cc - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we use a nested class, and we already have an
+// #include for the outer class, we don't try to forward-declare the
+// nested class anyway. Usually we got this right, but sometimes
+// wouldn't when then nested class had no definition.
+
+#include "tests/cxx/no_fwd_decl_nested_class-d1.h"
+
+DirectOuterClass doc;
+void CallDOC(DirectOuterClass::NestedClass*) { }
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_fwd_decl_nested_class.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_fwd_decl_std.cc b/tests/cxx/no_fwd_decl_std.cc
new file mode 100644
index 0000000..34dcb30
--- /dev/null
+++ b/tests/cxx/no_fwd_decl_std.cc
@@ -0,0 +1,43 @@
+//===--- no_fwd_decl_std.cc - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Do not forward-declare anything from the std namespace. (This is a
+// matter of policy, not language correctness.) When testing, we have
+// to make sure to pick something that wouldn't be caught under
+// another rule (such as the 'never forward-declare anything with
+// default template arguments rule).
+
+#include <utility>
+
+std::pair<int, int>* p1 = 0;
+
+// Make sure it the rule works even with a using declaration
+using std::pair;
+
+pair<float, float>* p2 = 0;
+
+// We should remove this fwd-decl, since we're keeping utility
+namespace std {
+template<typename T, typename U> struct pair;
+}
+
+pair<char, char>* p3 = 0;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/no_fwd_decl_std.cc should add these lines:
+
+tests/cxx/no_fwd_decl_std.cc should remove these lines:
+- namespace std { template <typename T, typename U> struct pair; } // lines XX-XX
+
+The full include-list for tests/cxx/no_fwd_decl_std.cc:
+#include <utility> // for pair
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_h_includes_cc-inc.c b/tests/cxx/no_h_includes_cc-inc.c
new file mode 100644
index 0000000..df79c9e
--- /dev/null
+++ b/tests/cxx/no_h_includes_cc-inc.c
@@ -0,0 +1,20 @@
+//===--- no_h_includes_cc-inc.c - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A .cc file that's included by another .cc file.
+
+#define CC_INC_HAS_INT 1
+
+const int kCcIncInt = 100;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_h_includes_cc-inc.c has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_h_includes_cc-inc2.c b/tests/cxx/no_h_includes_cc-inc2.c
new file mode 100644
index 0000000..f9f97a5
--- /dev/null
+++ b/tests/cxx/no_h_includes_cc-inc2.c
@@ -0,0 +1,22 @@
+//===--- no_h_includes_cc-inc2.c - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// A .cc file that's included by another .cc file, and uses symbols
+// defined in that other .cc file. We should not suggest adding any
+// #includes.
+
+#if INCLUDED_FROM_MAIN
+const int inc2 = 2;
+#endif
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_h_includes_cc-inc2.c has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_h_includes_cc.cc b/tests/cxx/no_h_includes_cc.cc
new file mode 100644
index 0000000..849bea1
--- /dev/null
+++ b/tests/cxx/no_h_includes_cc.cc
@@ -0,0 +1,28 @@
+//===--- no_h_includes_cc.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we never suggest that a .h file #include a .cc file,
+// even in cases where one .cc file #includes another one.
+
+#include "tests/cxx/no_h_includes_cc-inc.c"
+#include "tests/cxx/no_h_includes_cc.h"
+
+#ifndef CC_INC_HAS_INT
+const int x = kCcIncInt + 2;
+#endif
+
+#define INCLUDED_FROM_MAIN 1
+#include "tests/cxx/no_h_includes_cc-inc2.c"
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_h_includes_cc.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/no_h_includes_cc.h b/tests/cxx/no_h_includes_cc.h
new file mode 100644
index 0000000..fe2087d
--- /dev/null
+++ b/tests/cxx/no_h_includes_cc.h
@@ -0,0 +1,21 @@
+//===--- no_h_includes_cc.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Uses a macro symbol and a non-macro symbol that are defined in the
+// -inc.cc file.
+
+#ifndef CC_INC_HAS_INT
+const int x = kCcIncInt + 2;
+#endif
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/no_h_includes_cc.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/non_transitive_include-d1.h b/tests/cxx/non_transitive_include-d1.h
new file mode 100644
index 0000000..4326c2d
--- /dev/null
+++ b/tests/cxx/non_transitive_include-d1.h
@@ -0,0 +1,17 @@
+//===--- non_transitive_include-d1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class NonTransitiveIncludeD1 {};
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/non_transitive_include-d1.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/non_transitive_include-d2.h b/tests/cxx/non_transitive_include-d2.h
new file mode 100644
index 0000000..081e355
--- /dev/null
+++ b/tests/cxx/non_transitive_include-d2.h
@@ -0,0 +1,21 @@
+//===--- non_transitive_include-d2.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// NOTE: this uses NonTransitiveIncludeD1, from d1.h, but does not
+// #include d1.h. But iwyu will not complain because we are in
+// --transitive_includes_only mode.
+
+NonTransitiveIncludeD1 nti_d2;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/non_transitive_include-d2.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/non_transitive_include.cc b/tests/cxx/non_transitive_include.cc
new file mode 100644
index 0000000..785c4e3
--- /dev/null
+++ b/tests/cxx/non_transitive_include.cc
@@ -0,0 +1,25 @@
+//===--- non_transitive_include.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we run in --transitive_includes_only mode, we
+// do not suggest that d2.h #include d1.h, even though it needs
+// a symbol from there, because d1.h is not a file that d2.h can
+// see transitively.
+
+#include "tests/cxx/non_transitive_include-d1.h"
+#include "tests/cxx/non_transitive_include-d2.h"
+
+NonTransitiveIncludeD1 nti = nti_d2;
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/non_transitive_include.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/overloaded_class-d1.h b/tests/cxx/overloaded_class-d1.h
new file mode 100644
index 0000000..7b50b44
--- /dev/null
+++ b/tests/cxx/overloaded_class-d1.h
@@ -0,0 +1,15 @@
+//===--- overloaded_class-d1.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_D1_H_
+
+#include "tests/cxx/overloaded_class-i1.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_D1_H_
diff --git a/tests/cxx/overloaded_class-i1.h b/tests/cxx/overloaded_class-i1.h
new file mode 100644
index 0000000..7375846
--- /dev/null
+++ b/tests/cxx/overloaded_class-i1.h
@@ -0,0 +1,30 @@
+//===--- overloaded_class-i1.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_I1_H_
+
+#include <vector>
+
+// This is a template function that instantiates a template type. It
+// should be responsible for the type because all possible
+// instantiations come from the same file.
+
+template<class T> void MyFunc() {
+ std::vector<T> v;
+ v.resize(10);
+}
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_OVERLOADED_CLASS_I1_H_
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/overloaded_class-i1.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/overloaded_class.cc b/tests/cxx/overloaded_class.cc
new file mode 100644
index 0000000..9e737d0
--- /dev/null
+++ b/tests/cxx/overloaded_class.cc
@@ -0,0 +1,33 @@
+//===--- overloaded_class.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the case where a template type is instantiated inside a
+// template function. If all the possible instantiations come
+// from the same place, we want the template function to be
+// responsible for the template type, and not the caller.
+
+#include "tests/cxx/overloaded_class-d1.h"
+
+int main() {
+ // IWYU: MyFunc is...*overloaded_class-i1.h
+ MyFunc<int>();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/overloaded_class.cc should add these lines:
+#include "tests/cxx/overloaded_class-i1.h"
+
+tests/cxx/overloaded_class.cc should remove these lines:
+- #include "tests/cxx/overloaded_class-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/overloaded_class.cc:
+#include "tests/cxx/overloaded_class-i1.h" // for MyFunc
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pch.h b/tests/cxx/pch.h
new file mode 100644
index 0000000..acd52fb
--- /dev/null
+++ b/tests/cxx/pch.h
@@ -0,0 +1,10 @@
+//===--- pch.h - test input file for iwyu -----------------*- C++ -*-------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/indirect.h"
diff --git a/tests/cxx/pch_in_code.cc b/tests/cxx/pch_in_code.cc
new file mode 100644
index 0000000..bb03922
--- /dev/null
+++ b/tests/cxx/pch_in_code.cc
@@ -0,0 +1,50 @@
+//===--- pch_inc_code.cc - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Test IWYU's handling of precompiled headers explicitly included in code.
+// This is a pattern popularized by MSVC and allowed by GCC, where an include
+// directive is used as a marker to signal that a precompiled header should be
+// pulled into the translation unit.
+//
+// Under these compilers' rules, the precompiled header must be included first.
+//
+// A PCH lives under special rules:
+// - should never be removed
+// - all headers included in it are considered prefix headers
+// - always stays the first include, no matter what changes IWYU makes
+//
+// This test assumes being run with --prefix_header_includes=remove and
+// --pch_in_code.
+
+#include "tests/cxx/pch.h" // this is the precompiled header
+// Associated header needs to be in a subdirectory to provoke
+// first-include-with-same-basename heuristic, which is sensitive to the
+// presence of a PCH.
+#include "tests/cxx/public/pch_in_code.h"
+#include <stdlib.h> // unused
+#include <stdint.h> // for int8_t
+#include "tests/cxx/indirect.h"
+
+IndirectClass ic;
+int8_t global_byte;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/pch_in_code.cc should add these lines:
+
+tests/cxx/pch_in_code.cc should remove these lines:
+- #include <stdlib.h> // lines XX-XX
+- #include "tests/cxx/indirect.h" // lines XX-XX
+
+The full include-list for tests/cxx/pch_in_code.cc:
+#include "tests/cxx/pch.h"
+#include "tests/cxx/public/pch_in_code.h"
+#include <stdint.h> // for int8_t
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pointer_arith.cc b/tests/cxx/pointer_arith.cc
new file mode 100644
index 0000000..3d7bc06
--- /dev/null
+++ b/tests/cxx/pointer_arith.cc
@@ -0,0 +1,74 @@
+//===--- pointer_arith.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Pointer arithmetic requires the full type of the pointed-to type, because
+// type size is material to the calculations.
+
+#include "tests/cxx/direct.h"
+
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass ic1, ic2;
+
+void PointerArithmetic() {
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* p1 = &ic1;
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* p2 = &ic2;
+
+ // All the pointer arithmetic below require the full type.
+
+ // Pointer minus pointer (should really use ptrdiff_t, but I don't want to
+ // have to include headers for it)
+ // IWYU: IndirectClass is...*indirect.h
+ long x = p2 - p1;
+
+ // Pointer minus offset
+ // IWYU: IndirectClass is...*indirect.h
+ void* p3 = p1 - 20;
+
+ // Pointer decrement
+ // IWYU: IndirectClass is...*indirect.h
+ p1 -= 10;
+
+ // Pointer plus offset
+ // IWYU: IndirectClass is...*indirect.h
+ p3 = p1 + 100;
+
+ // Pointer increment
+ // IWYU: IndirectClass is...*indirect.h
+ p1 += 100;
+}
+
+// Make sure pointer arithmetic with builtins does not yield IWYU warnings.
+void BuiltinPointerArithmetic() {
+ char c = 0;
+ char* pc = &c;
+ pc -= 10;
+ pc += 100;
+ long x = pc - &c;
+
+ int i = 0;
+ int* pi = &i;
+ pi -= 20;
+ pi += 200;
+ x = pi - &i;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/pointer_arith.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/pointer_arith.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/pointer_arith.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pragma_associated-d1.h b/tests/cxx/pragma_associated-d1.h
new file mode 100644
index 0000000..e50a91d
--- /dev/null
+++ b/tests/cxx/pragma_associated-d1.h
@@ -0,0 +1,19 @@
+//===--- pragma_associated-d1.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file does not provide any symbols, and only exists to be
+// force-associated by `pragma associated`.
+//
+// Since it's associated, it will be analyzed, and needs the IWYU summary.
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/pragma_associated-d1.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pragma_associated-d2.h b/tests/cxx/pragma_associated-d2.h
new file mode 100644
index 0000000..a250b01
--- /dev/null
+++ b/tests/cxx/pragma_associated-d2.h
@@ -0,0 +1,19 @@
+//===--- pragma_associated-d2.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file does not provide any symbols, and only exists to be
+// force-associated by `pragma associated`.
+//
+// Since it's associated, it will be analyzed, and needs the IWYU summary.
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/pragma_associated-d2.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pragma_associated.cc b/tests/cxx/pragma_associated.cc
new file mode 100644
index 0000000..acce12d
--- /dev/null
+++ b/tests/cxx/pragma_associated.cc
@@ -0,0 +1,27 @@
+//===--- pragma_associated.cc - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/pragma_associated-d1.h" // IWYU pragma: associated
+#include "tests/cxx/pragma_associated-d2.h" // IWYU pragma: associated
+#include "tests/cxx/pragma_associated.h" // This still counts as associated.
+#include "tests/cxx/direct.h" // This is unused.
+
+/**** IWYU_SUMMARY
+
+tests/cxx/pragma_associated.cc should add these lines:
+
+tests/cxx/pragma_associated.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/pragma_associated.cc:
+#include "tests/cxx/pragma_associated-d1.h"
+#include "tests/cxx/pragma_associated-d2.h"
+#include "tests/cxx/pragma_associated.h"
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/pragma_associated.h b/tests/cxx/pragma_associated.h
new file mode 100644
index 0000000..bbdbe8f
--- /dev/null
+++ b/tests/cxx/pragma_associated.h
@@ -0,0 +1,19 @@
+//===--- pragma_associated.h - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file does not provide any symbols, and only serves to be auto-detected
+// as an associated include.
+//
+// Since it's associated, it will be analyzed, and needs the IWYU summary.
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/pragma_associated.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/precomputed_tpl_args-d1.h b/tests/cxx/precomputed_tpl_args-d1.h
new file mode 100644
index 0000000..4c1abfd
--- /dev/null
+++ b/tests/cxx/precomputed_tpl_args-d1.h
@@ -0,0 +1,24 @@
+//===--- precomputed_tpl_args-d1.h - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the precomputed template-arg-use list in iwyu_cache.cc.
+
+#include "tests/cxx/precomputed_tpl_args-i1.h"
+
+// Provide another class that we have a std::allocator specialization for.
+class D1SpecializationClass { };
+
+namespace std {
+template<> class less<D1SpecializationClass> {
+ public:
+ bool operator()(const D1SpecializationClass&, const D1SpecializationClass&) {
+ return true;
+ }
+};
+}
diff --git a/tests/cxx/precomputed_tpl_args-i1.h b/tests/cxx/precomputed_tpl_args-i1.h
new file mode 100644
index 0000000..caf3633
--- /dev/null
+++ b/tests/cxx/precomputed_tpl_args-i1.h
@@ -0,0 +1,24 @@
+//===--- precomputed_tpl_args-i1.h - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <functional>
+
+class IndirectClass { };
+
+// Provide another class that we have a std::allocator specialization for.
+class SpecializationClass { };
+
+namespace std {
+template<> class less<SpecializationClass> {
+ public:
+ bool operator()(const SpecializationClass&, const SpecializationClass&) {
+ return true;
+ }
+};
+}
diff --git a/tests/cxx/precomputed_tpl_args.cc b/tests/cxx/precomputed_tpl_args.cc
new file mode 100644
index 0000000..a98a09e
--- /dev/null
+++ b/tests/cxx/precomputed_tpl_args.cc
@@ -0,0 +1,98 @@
+//===--- precomputed_tpl_args.cc - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests the precomputed template-arg-use list in iwyu_cache.cc.
+
+#include <vector>
+#include <set>
+#include <map>
+#include <bitset>
+#include "tests/cxx/precomputed_tpl_args-d1.h"
+
+template <typename T> struct Identity {
+ T t;
+};
+
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*precomputed_tpl_args-i1.h
+std::vector<IndirectClass> ic_vec;
+
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*precomputed_tpl_args-i1.h
+std::vector<Identity<IndirectClass> > i_ic_vec;
+
+// IWYU: IndirectClass needs a declaration
+std::vector<IndirectClass*> icptr_vec;
+
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*precomputed_tpl_args-i1.h
+std::set<IndirectClass> ic_set;
+
+// This class provides a specialization of less that we should see.
+// IWYU: SpecializationClass needs a declaration
+// IWYU: SpecializationClass is...*precomputed_tpl_args-i1.h
+// IWYU: std::less is...*precomputed_tpl_args-i1.h
+std::set<SpecializationClass> sc_set;
+
+// This class provides a specialization of less that we should see,
+// in d1.h. We should be sure not to remove -d1.h as a result!
+std::set<D1SpecializationClass> d1sc_set;
+
+// We were seeing a bug where, inside a typedef, we got an incorrect
+// iwyu violation report for less<>. Make sure that's fixed.
+// (This should be a new type from above so we don't hit the cache.)
+typedef std::set<int> IntSet;
+// Call the constructor to cause it to be instantiated, so iwyu visits it.
+IntSet int_set;
+
+// bitset should not be precomputed, since it has a non-class arg.
+std::bitset<5> bitset;
+
+
+// When considering a precomputed type (like map<>) inside a templated
+// class, make sure that we only consider the precomputed args that
+// are part of the instantiation of the templated class. That is,
+// for map<T, SpecializationClass>, we should only consider T.
+
+template<typename T> class TemplatedClass {
+ // TODO(csilvers): IWYU: SpecializationClass is...*precomputed_tpl_args-i1.h
+ // TODO(csilvers): IWYU: std::less is...*precomputed_tpl_args-i1.h
+ // IWYU: SpecializationClass needs a declaration
+ std::map<SpecializationClass, T> t1;
+ // TODO(csilvers): IWYU: IndirectClass is...*precomputed_tpl_args-i1.h
+ // IWYU: IndirectClass needs a declaration
+ std::map<T, IndirectClass> t3;
+};
+
+// IWYU: IndirectClass needs a declaration
+// IWYU: IndirectClass is...*precomputed_tpl_args-i1.h
+TemplatedClass<IndirectClass> tc_ic;
+
+// TODO(csilvers): IWYU: std::less is...*precomputed_tpl_args-i1.h
+// IWYU: SpecializationClass needs a declaration
+// IWYU: SpecializationClass is...*precomputed_tpl_args-i1.h
+TemplatedClass<SpecializationClass> tc_sc;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/precomputed_tpl_args.cc should add these lines:
+#include "tests/cxx/precomputed_tpl_args-i1.h"
+
+tests/cxx/precomputed_tpl_args.cc should remove these lines:
+
+The full include-list for tests/cxx/precomputed_tpl_args.cc:
+#include <bitset> // for bitset
+#include <map> // for map
+#include <set> // for set
+#include <vector> // for vector
+#include "tests/cxx/precomputed_tpl_args-d1.h" // for D1SpecializationClass, less
+#include "tests/cxx/precomputed_tpl_args-i1.h" // for IndirectClass, SpecializationClass, less
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/prefix_header_attribution-d1.h b/tests/cxx/prefix_header_attribution-d1.h
new file mode 100644
index 0000000..305b4ad
--- /dev/null
+++ b/tests/cxx/prefix_header_attribution-d1.h
@@ -0,0 +1,16 @@
+//===--- prefix_header_attribution-d1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_D1_H_
+
+#include "tests/cxx/prefix_header_attribution-i1.h"
+#include <new>
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_D1_H_
diff --git a/tests/cxx/prefix_header_attribution-i1.h b/tests/cxx/prefix_header_attribution-i1.h
new file mode 100644
index 0000000..2d6b9bb
--- /dev/null
+++ b/tests/cxx/prefix_header_attribution-i1.h
@@ -0,0 +1,15 @@
+//===--- prefix_header_attribution-i1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_I1_H_
+
+#define MACRO_IN_PREFIX_HEADER
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_ATTRIBUTION_I1_H_
diff --git a/tests/cxx/prefix_header_attribution.cc b/tests/cxx/prefix_header_attribution.cc
new file mode 100644
index 0000000..b5376a3
--- /dev/null
+++ b/tests/cxx/prefix_header_attribution.cc
@@ -0,0 +1,35 @@
+//===--- prefix_header_attribution.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when IWYU attributes macros and placement operator new to
+// providing headers, it preserves enough information to detect if providing
+// header is prefix header.
+//
+// Test requirements:
+// - use --prefix_header_includes=remove to force is_prefix_header check for
+// all includes;
+// - don't include providing headers directly. Because otherwise IWYU checks
+// is_prefix_header for existing inclusion directive and ignores all
+// information preserved during symbol-to-file attribution.
+
+// Test macro.
+// IWYU: MACRO_IN_PREFIX_HEADER is...*prefix_header_attribution-i1.h
+MACRO_IN_PREFIX_HEADER;
+
+// Test placement operator new.
+template<typename T> void CallPlacementNew(T *t) {
+ // IWYU: operator new is...*<new>
+ new (t) T();
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/prefix_header_attribution.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/prefix_header_includes-d1.h b/tests/cxx/prefix_header_includes-d1.h
new file mode 100644
index 0000000..45626d6
--- /dev/null
+++ b/tests/cxx/prefix_header_includes-d1.h
@@ -0,0 +1,15 @@
+//===--- prefix_header_includes-d1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D1_H_
+
+class CommandLineIncludeD1 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D1_H_
diff --git a/tests/cxx/prefix_header_includes-d2.h b/tests/cxx/prefix_header_includes-d2.h
new file mode 100644
index 0000000..d5338c4
--- /dev/null
+++ b/tests/cxx/prefix_header_includes-d2.h
@@ -0,0 +1,17 @@
+//===--- prefix_header_includes-d2.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D2_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D2_H_
+
+#include "tests/cxx/prefix_header_includes-i1.h"
+
+class CommandLineIncludeD2 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D2_H_
diff --git a/tests/cxx/prefix_header_includes-d3.h b/tests/cxx/prefix_header_includes-d3.h
new file mode 100644
index 0000000..b200b21
--- /dev/null
+++ b/tests/cxx/prefix_header_includes-d3.h
@@ -0,0 +1,15 @@
+//===--- prefix_header_includes-d3.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D3_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D3_H_
+
+class CommandLineIncludeD3 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D3_H_
diff --git a/tests/cxx/prefix_header_includes-d4.h b/tests/cxx/prefix_header_includes-d4.h
new file mode 100644
index 0000000..8c2bd68
--- /dev/null
+++ b/tests/cxx/prefix_header_includes-d4.h
@@ -0,0 +1,15 @@
+//===--- prefix_header_includes-d4.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D4_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D4_H_
+
+class CommandLineIncludeD4 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_D4_H_
diff --git a/tests/cxx/prefix_header_includes-i1.h b/tests/cxx/prefix_header_includes-i1.h
new file mode 100644
index 0000000..8422341
--- /dev/null
+++ b/tests/cxx/prefix_header_includes-i1.h
@@ -0,0 +1,15 @@
+//===--- prefix_header_includes-i1.h - test input file for iwyu -----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_I1_H_
+
+class CommandLineIncludeI1 {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_PREFIX_HEADER_INCLUDES_I1_H_
diff --git a/tests/cxx/prefix_header_includes_add.cc b/tests/cxx/prefix_header_includes_add.cc
new file mode 100644
index 0000000..88ca92b
--- /dev/null
+++ b/tests/cxx/prefix_header_includes_add.cc
@@ -0,0 +1,56 @@
+//===--- prefix_header_includes_add.cc - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests --prefix_header_includes option. All prefix_header_includes_*.cc files
+// are the same to show the difference between --prefix_header_includes values.
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/prefix_header_includes-d1.h"
+
+// Included in source code and via command line option.
+CommandLineIncludeD1 cli_d1;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD2 is...*prefix_header_includes-d2.h
+CommandLineIncludeD2 cli_d2;
+
+// Forward declared in source code and included via command line option.
+class CommandLineIncludeD3;
+CommandLineIncludeD3* cli_d3_ptr;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD4 needs a declaration
+CommandLineIncludeD4* cli_d4_ptr;
+
+// Test that is_prefix_header property is preserved for indirect includes.
+// IWYU: CommandLineIncludeI1 is...*prefix_header_includes-i1.h
+CommandLineIncludeI1 cli_i1;
+
+// Test not prefix header include.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass ic;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/prefix_header_includes_add.cc should add these lines:
+#include "tests/cxx/indirect.h"
+#include "tests/cxx/prefix_header_includes-d2.h"
+#include "tests/cxx/prefix_header_includes-i1.h"
+class CommandLineIncludeD4;
+
+tests/cxx/prefix_header_includes_add.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/prefix_header_includes_add.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/prefix_header_includes-d1.h" // for CommandLineIncludeD1
+#include "tests/cxx/prefix_header_includes-d2.h" // for CommandLineIncludeD2
+#include "tests/cxx/prefix_header_includes-i1.h" // for CommandLineIncludeI1
+class CommandLineIncludeD3; // lines XX-XX
+class CommandLineIncludeD4;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/prefix_header_includes_keep.cc b/tests/cxx/prefix_header_includes_keep.cc
new file mode 100644
index 0000000..2de0d13
--- /dev/null
+++ b/tests/cxx/prefix_header_includes_keep.cc
@@ -0,0 +1,50 @@
+//===--- prefix_header_includes_keep.cc - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests --prefix_header_includes option. All prefix_header_includes_*.cc files
+// are the same to show the difference between --prefix_header_includes values.
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/prefix_header_includes-d1.h"
+
+// Included in source code and via command line option.
+CommandLineIncludeD1 cli_d1;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD2 is...*prefix_header_includes-d2.h
+CommandLineIncludeD2 cli_d2;
+
+// Forward declared in source code and included via command line option.
+class CommandLineIncludeD3;
+CommandLineIncludeD3* cli_d3_ptr;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD4 needs a declaration
+CommandLineIncludeD4* cli_d4_ptr;
+
+// Test that is_prefix_header property is preserved for indirect includes.
+// IWYU: CommandLineIncludeI1 is...*prefix_header_includes-i1.h
+CommandLineIncludeI1 cli_i1;
+
+// Test not prefix header include.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass ic;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/prefix_header_includes_keep.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/prefix_header_includes_keep.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/prefix_header_includes_keep.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/prefix_header_includes-d1.h" // for CommandLineIncludeD1
+class CommandLineIncludeD3; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/prefix_header_includes_remove.cc b/tests/cxx/prefix_header_includes_remove.cc
new file mode 100644
index 0000000..71fbab7
--- /dev/null
+++ b/tests/cxx/prefix_header_includes_remove.cc
@@ -0,0 +1,50 @@
+//===--- prefix_header_includes_remove.cc - test input file for iwyu ------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests --prefix_header_includes option. All prefix_header_includes_*.cc files
+// are the same to show the difference between --prefix_header_includes values.
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/prefix_header_includes-d1.h"
+
+// Included in source code and via command line option.
+CommandLineIncludeD1 cli_d1;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD2 is...*prefix_header_includes-d2.h
+CommandLineIncludeD2 cli_d2;
+
+// Forward declared in source code and included via command line option.
+class CommandLineIncludeD3;
+CommandLineIncludeD3* cli_d3_ptr;
+// Included via command line option only.
+// IWYU: CommandLineIncludeD4 needs a declaration
+CommandLineIncludeD4* cli_d4_ptr;
+
+// Test that is_prefix_header property is preserved for indirect includes.
+// IWYU: CommandLineIncludeI1 is...*prefix_header_includes-i1.h
+CommandLineIncludeI1 cli_i1;
+
+// Test not prefix header include.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass ic;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/prefix_header_includes_remove.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/prefix_header_includes_remove.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+- #include "tests/cxx/prefix_header_includes-d1.h" // lines XX-XX
+- class CommandLineIncludeD3; // lines XX-XX
+
+The full include-list for tests/cxx/prefix_header_includes_remove.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/prefix_header_operator_new.cc b/tests/cxx/prefix_header_operator_new.cc
new file mode 100644
index 0000000..9dd0c66
--- /dev/null
+++ b/tests/cxx/prefix_header_operator_new.cc
@@ -0,0 +1,30 @@
+//===--- prefix_header_operator_new.cc - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that IWYU can tell if made-up, not encountered header is prefix header.
+// The main difference between the current test and prefix_header_attribution.cc
+// is that in this test <new> is included neither from source nor from command
+// line so that header <new> isn't encountered.
+
+template<typename T> void CallPlacementNew(T *t) {
+ // IWYU: operator new is...*<new>
+ new (t) T();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/prefix_header_operator_new.cc should add these lines:
+#include <new>
+
+tests/cxx/prefix_header_operator_new.cc should remove these lines:
+
+The full include-list for tests/cxx/prefix_header_operator_new.cc:
+#include <new> // for operator new
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/public/pch_in_code.h b/tests/cxx/public/pch_in_code.h
new file mode 100644
index 0000000..89517b1
--- /dev/null
+++ b/tests/cxx/public/pch_in_code.h
@@ -0,0 +1,15 @@
+//===--- pch_in_code.h - test input file for iwyu ---------*- C++ -*-------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/public/pch_in_code.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
+
diff --git a/tests/cxx/re_fwd_decl-d1.h b/tests/cxx/re_fwd_decl-d1.h
new file mode 100644
index 0000000..f639a61
--- /dev/null
+++ b/tests/cxx/re_fwd_decl-d1.h
@@ -0,0 +1,15 @@
+//===--- re_fwd_decl-d1.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/indirect.h"
+
+class Direct {};
+class Indirect;
+
+class FullUse {};
diff --git a/tests/cxx/re_fwd_decl.cc b/tests/cxx/re_fwd_decl.cc
new file mode 100644
index 0000000..1c3fd01
--- /dev/null
+++ b/tests/cxx/re_fwd_decl.cc
@@ -0,0 +1,40 @@
+//===--- re_fwd_decl.cc - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// If we use a class in a way that only requires a forward-declaration,
+// and the class is defined in some file we directly #include, we don't
+// need the forward-decl here. But if it's only *declared* in a file
+// we directly #include, we *do* need the forward-decl.
+
+#include "tests/cxx/re_fwd_decl.h"
+#include "tests/cxx/re_fwd_decl-d1.h"
+
+Direct* d = 0;
+// IWYU: Indirect needs a declaration
+Indirect* i = 0;
+// This is not an iwyu violation because it's declared in the .h file
+DeclaredInH* dih = 0;
+
+// This forces us to #include re_fwd_decl-d1.h. Without this, iwyu would
+// just suggest replacing the #include with 'class Direct'.
+FullUse fu;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/re_fwd_decl.cc should add these lines:
+class Indirect;
+
+tests/cxx/re_fwd_decl.cc should remove these lines:
+
+The full include-list for tests/cxx/re_fwd_decl.cc:
+#include "tests/cxx/re_fwd_decl.h"
+#include "tests/cxx/re_fwd_decl-d1.h" // for Direct (ptr only), FullUse
+class Indirect;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/re_fwd_decl.h b/tests/cxx/re_fwd_decl.h
new file mode 100644
index 0000000..c87e839
--- /dev/null
+++ b/tests/cxx/re_fwd_decl.h
@@ -0,0 +1,18 @@
+//===--- re_fwd_decl.h - test input file for iwyu -------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class DeclaredInH;
+
+DeclaredInH* use = 0;
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/re_fwd_decl.h has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/redecls-d1.h b/tests/cxx/redecls-d1.h
new file mode 100644
index 0000000..55f6dc7
--- /dev/null
+++ b/tests/cxx/redecls-d1.h
@@ -0,0 +1,15 @@
+//===--- redecls-d1.h - test input file for iwyu --------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// These are the redeclarable types, according to
+// http://clang.llvm.org/doxygen/classclang_1_1Redeclarable.html
+
+typedef int MyTypedef;
+void Fn();
+extern float var;
diff --git a/tests/cxx/redecls-d2.h b/tests/cxx/redecls-d2.h
new file mode 100644
index 0000000..a9fd81f
--- /dev/null
+++ b/tests/cxx/redecls-d2.h
@@ -0,0 +1,14 @@
+//===--- redecls-d2.h - test input file for iwyu --------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This looks suspiciously like redecls-d1.h. :-)
+
+typedef int MyTypedef;
+void Fn();
+extern float var;
diff --git a/tests/cxx/redecls.cc b/tests/cxx/redecls.cc
new file mode 100644
index 0000000..05def32
--- /dev/null
+++ b/tests/cxx/redecls.cc
@@ -0,0 +1,33 @@
+//===--- redecls.cc - test input file for iwyu ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// For types that can be declared in many places -- functions,
+// typedefs, variables, and the like -- make sure that we accept
+// any declaration as satisfying a use. In order to minimize
+// chances that we're only looking at one of the redecls but are
+// happening to pick the one in the same file as the use, we
+// put the use-file in the "middle".
+
+
+#include "tests/cxx/redecls-d1.h"
+#include "tests/cxx/redecls.h"
+#include "tests/cxx/redecls-d2.h"
+
+/**** IWYU_SUMMARY
+
+tests/cxx/redecls.cc should add these lines:
+
+tests/cxx/redecls.cc should remove these lines:
+- #include "tests/cxx/redecls-d1.h" // lines XX-XX
+- #include "tests/cxx/redecls-d2.h" // lines XX-XX
+
+The full include-list for tests/cxx/redecls.cc:
+#include "tests/cxx/redecls.h"
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/redecls.h b/tests/cxx/redecls.h
new file mode 100644
index 0000000..2730d53
--- /dev/null
+++ b/tests/cxx/redecls.h
@@ -0,0 +1,39 @@
+//===--- redecls.h - test input file for iwyu -----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/redecls-d1.h"
+
+// This looks suspiciously like redecls-d1.h and redecls-d2.h. But with
+// uses, of course.
+
+typedef int MyTypedef;
+void Fn();
+extern float var;
+
+// Put this after our decls to encourage clang to associate the uses
+// below with the declarations in -d2.h, rather than this file.
+#include "tests/cxx/redecls-d2.h"
+
+void Uses() {
+ MyTypedef mt;
+ Fn();
+ (void)var;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/redecls.h should add these lines:
+
+tests/cxx/redecls.h should remove these lines:
+- #include "tests/cxx/redecls-d1.h" // lines XX-XX
+- #include "tests/cxx/redecls-d2.h" // lines XX-XX
+
+The full include-list for tests/cxx/redecls.h:
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/remove_fwd_decl_when_including.cc b/tests/cxx/remove_fwd_decl_when_including.cc
new file mode 100644
index 0000000..fb8db2e
--- /dev/null
+++ b/tests/cxx/remove_fwd_decl_when_including.cc
@@ -0,0 +1,41 @@
+//===--- remove_fwd_decl_when_including.cc - test input file for iwyu -----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This tests the following behavior: when we need to #include a
+// file to get the full type of Foo (here, Foo == IndirectClass),
+// but a forward-declare will also suffice for another use of Foo,
+// *and* we forward-declare foo, make sure we get rid of the
+// forward-declare, which is superseded by the #include.
+//
+// In other words, we should never have the case where we both
+// #include a class, and forward-declare the same class, in a file.
+
+#include "tests/cxx/direct.h"
+
+class IndirectClass;
+
+int main() {
+ IndirectClass* p;
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass i;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/remove_fwd_decl_when_including.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/remove_fwd_decl_when_including.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+- class IndirectClass; // lines XX-XX
+
+The full include-list for tests/cxx/remove_fwd_decl_when_including.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/self_include.cc b/tests/cxx/self_include.cc
new file mode 100644
index 0000000..883883a
--- /dev/null
+++ b/tests/cxx/self_include.cc
@@ -0,0 +1,24 @@
+//===--- self_include.cc - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we don't crash when a file includes itself.
+
+#ifndef SEEN
+#define SEEN
+
+#include "tests/cxx/self_include.cc"
+
+#endif
+
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/self_include.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/sizeof_reference.cc b/tests/cxx/sizeof_reference.cc
new file mode 100644
index 0000000..3cb3f65
--- /dev/null
+++ b/tests/cxx/sizeof_reference.cc
@@ -0,0 +1,106 @@
+//===--- sizeof_reference.cc - test input file for iwyu -------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that sizeof(reference) is treated the same as
+// sizeof(underlying_object), like it's supposed to be.
+
+#include <stddef.h>
+#include "tests/cxx/direct.h"
+
+template <typename T> struct IndirectTemplateStruct {
+ T value; // require full type information for t;
+};
+
+template <typename T> struct SizeofTakingStruct {
+ char value[sizeof(T)];
+};
+
+template <typename T> struct SizeofTakingStructRef {
+ char value[sizeof(T&)];
+};
+
+template <typename T> struct SizeofTakingStructTpl {
+ char value[sizeof(IndirectTemplateStruct<T>)];
+};
+
+template <typename T> struct SizeofTakingStructTplRef {
+ char value[sizeof(IndirectTemplateStruct<T&>)];
+};
+
+template <typename T> struct SizeofTakingStructTplRef2 {
+ char value5[sizeof(IndirectTemplateStruct<T>&)];
+};
+
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+size_t s = sizeof(IndirectClass&);
+
+// This needs the full type of IndirectTemplateStruct, but also
+// IndirectClass, which is used in the IndirectTemplateStruct
+// instantiation.
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+size_t s2 = sizeof(IndirectTemplateStruct<IndirectClass>&);
+
+// This does not need the full type information for IndirectClass.
+// IWYU: IndirectClass needs a declaration
+size_t s3 = sizeof(IndirectTemplateStruct<IndirectClass&>);
+
+// This needs the full type information of IndirectClass because the
+// subclass takes the sizeof().
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+size_t s4 = sizeof(SizeofTakingStruct<IndirectClass&>);
+
+// Also check when sizeof is on a variable, not a type.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass dummy;
+// IWYU: IndirectClass needs a declaration
+IndirectClass& ref = dummy;
+// IWYU: IndirectClass is...*indirect.h
+size_t s5 = sizeof(dummy);
+
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStruct<IndirectClass&> sizeof_taking_struct1;
+
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStructRef<IndirectClass> sizeof_taking_struct2;
+
+// Not sure why, but C++ doesn't require full type of IndirectClass here.
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStructTpl<IndirectClass&> sizeof_taking_struct3;
+
+// Not sure why, but C++ doesn't require full type of IndirectClass here.
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStructTplRef<IndirectClass> sizeof_taking_struct4;
+
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStructTplRef2<IndirectClass> sizeof_taking_struct5;
+
+// Not sure why, but C++ doesn't require full type of IndirectClass here.
+// IWYU: IndirectClass needs a declaration
+SizeofTakingStructTplRef2<IndirectClass&> sizeof_taking_struct6;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/sizeof_reference.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/sizeof_reference.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/sizeof_reference.cc:
+#include <stddef.h> // for size_t
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/specialization_needs_decl-d1.h b/tests/cxx/specialization_needs_decl-d1.h
new file mode 100644
index 0000000..2b0151d
--- /dev/null
+++ b/tests/cxx/specialization_needs_decl-d1.h
@@ -0,0 +1,12 @@
+//===--- specialization_needs_decl-d1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+template <typename T> struct TplStruct { };
+
+template <> struct TplStruct<float> { };
diff --git a/tests/cxx/specialization_needs_decl.cc b/tests/cxx/specialization_needs_decl.cc
new file mode 100644
index 0000000..91b3e61
--- /dev/null
+++ b/tests/cxx/specialization_needs_decl.cc
@@ -0,0 +1,33 @@
+//===--- specialization_needs_decl.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we specialize a template class, we require a declaration
+// of that class. However, forward-declaring a specialization doesn't
+// require a definition.
+
+#include "tests/cxx/specialization_needs_decl-d1.h"
+
+template<> struct TplStruct<int> { };
+
+// Forward-declaring a specialization is the same: we don't require
+// the definition.
+template<> struct TplStruct<float>;
+
+/**** IWYU_SUMMARY
+
+tests/cxx/specialization_needs_decl.cc should add these lines:
+template <typename T> struct TplStruct;
+
+tests/cxx/specialization_needs_decl.cc should remove these lines:
+- #include "tests/cxx/specialization_needs_decl-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/specialization_needs_decl.cc:
+template <typename T> struct TplStruct;
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/stl_container_provides_allocator.cc b/tests/cxx/stl_container_provides_allocator.cc
new file mode 100644
index 0000000..aadc1ec
--- /dev/null
+++ b/tests/cxx/stl_container_provides_allocator.cc
@@ -0,0 +1,44 @@
+//===--- stl_container_provides_allocator.cc - test input file for iwyu ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that STL containers provide from <memory> only std::allocator as
+// default template argument and nothing else. For example, when you use
+// std::vector<int>, it has default allocator and you don't need to
+// include <memory>, because it is already included [transitively] by <vector>.
+// But if you use something from <memory> explicitly, you need to include it
+// yourself, <vector> doesn't reexport everything from <memory>.
+//
+// Related test: precomputed_tpl_args.cc.
+
+#include <memory>
+#include <vector>
+// Unnecessary include, so that symbols for each include are printed in full
+// include-list.
+#include <stdio.h>
+
+void foo() {
+ int buffer[4];
+ std::uninitialized_fill(buffer, buffer + 4, 0);
+
+ std::vector<int> v;
+ (void)v.begin();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/stl_container_provides_allocator.cc should add these lines:
+
+tests/cxx/stl_container_provides_allocator.cc should remove these lines:
+- #include <stdio.h> // lines XX-XX
+
+The full include-list for tests/cxx/stl_container_provides_allocator.cc:
+#include <memory> // for uninitialized_fill
+#include <vector> // for vector
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/subfolder/direct_subfolder.h b/tests/cxx/subfolder/direct_subfolder.h
new file mode 100644
index 0000000..9c1d10a
--- /dev/null
+++ b/tests/cxx/subfolder/direct_subfolder.h
@@ -0,0 +1,17 @@
+//===--- direct_subfolder.h - test input file for iwyu --------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file includes only another file in the subfolder
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_SUBFOLDER_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_SUBFOLDER_H_
+
+#include "indirect_subfolder.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_DIRECT_SUBFOLDER_H_
diff --git a/tests/cxx/subfolder/indirect_subfolder.h b/tests/cxx/subfolder/indirect_subfolder.h
new file mode 100644
index 0000000..5bf5cd6
--- /dev/null
+++ b/tests/cxx/subfolder/indirect_subfolder.h
@@ -0,0 +1,16 @@
+//===--- indirect_subfolder.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_INDIRECT_SUBFOLDER_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_INDIRECT_SUBFOLDER_H_
+
+class IndirectSubfolderClass {};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_INDIRECT_SUBFOLDER_H_
diff --git a/tests/cxx/system_namespaces-d1.h b/tests/cxx/system_namespaces-d1.h
new file mode 100644
index 0000000..9fd0863
--- /dev/null
+++ b/tests/cxx/system_namespaces-d1.h
@@ -0,0 +1,14 @@
+//===--- system_namespaces-d1.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// We're not supposed to define anything in std, but we do anyway for this test.
+
+namespace std {
+class StdClass { };
+}
diff --git a/tests/cxx/system_namespaces-d2.h b/tests/cxx/system_namespaces-d2.h
new file mode 100644
index 0000000..2a5b033
--- /dev/null
+++ b/tests/cxx/system_namespaces-d2.h
@@ -0,0 +1,14 @@
+//===--- system_namespaces-d2.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// We're not supposed to define anything in std, but we do anyway for this test.
+
+namespace __gnu_cxx {
+class SystemClass { };
+}
diff --git a/tests/cxx/system_namespaces-d3.h b/tests/cxx/system_namespaces-d3.h
new file mode 100644
index 0000000..bdc1d83
--- /dev/null
+++ b/tests/cxx/system_namespaces-d3.h
@@ -0,0 +1,14 @@
+//===--- system_namespaces-d3.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// We're not supposed to define anything in std, but we do anyway for this test.
+
+namespace notsys_ns {
+template <typename T> class TplClass { };
+}
diff --git a/tests/cxx/system_namespaces.cc b/tests/cxx/system_namespaces.cc
new file mode 100644
index 0000000..f5a1f0c
--- /dev/null
+++ b/tests/cxx/system_namespaces.cc
@@ -0,0 +1,42 @@
+//===--- system_namespaces.cc - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we correctly replace forward declares with #includes for
+// items in a system namespace: std or __gnu_cxx or the like.
+
+#include "tests/cxx/system_namespaces-d1.h"
+#include "tests/cxx/system_namespaces-d2.h"
+#include "tests/cxx/system_namespaces-d3.h"
+
+std::StdClass* foo = 0;
+
+__gnu_cxx::SystemClass* bar = 0;
+
+typedef int __system_type;
+notsys_ns::TplClass<__system_type>* baz = 0;
+
+
+// The summary is where all the action is on this test. Only TplClass
+// should be replaceable by a forward-declare, because only it is
+// exposing a symbol in a non-system namespace.
+
+/**** IWYU_SUMMARY
+
+tests/cxx/system_namespaces.cc should add these lines:
+namespace notsys_ns { template <typename T> class TplClass; }
+
+tests/cxx/system_namespaces.cc should remove these lines:
+- #include "tests/cxx/system_namespaces-d3.h" // lines XX-XX
+
+The full include-list for tests/cxx/system_namespaces.cc:
+#include "tests/cxx/system_namespaces-d1.h" // for StdClass
+#include "tests/cxx/system_namespaces-d2.h" // for SystemClass
+namespace notsys_ns { template <typename T> class TplClass; }
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/template_args.cc b/tests/cxx/template_args.cc
new file mode 100644
index 0000000..2f7bfe4
--- /dev/null
+++ b/tests/cxx/template_args.cc
@@ -0,0 +1,163 @@
+//===--- template_args.cc - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests unusual and complex use of template arguments, such as
+// function-proto template arguments, for both classes and functions.
+
+#include "tests/cxx/direct.h"
+
+// ---------------------------------------------------------------
+
+// IWYU: IndirectClass needs a declaration
+char Foo(IndirectClass ic);
+
+template <typename F> struct FunctionStruct;
+template <typename R, typename A1> struct FunctionStruct<R(A1)> {
+ R result;
+ char Argument1[sizeof(A1)];
+};
+
+void FunctionProtoClassArguments() {
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ FunctionStruct<char(IndirectClass&)> f1;
+ (void)f1;
+
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ FunctionStruct<IndirectClass(char)> f2;
+ (void)f2;
+}
+
+// ---------------------------------------------------------------
+
+template <typename T> struct PointerStruct { // T should be an IndirectClass*
+ static int a(T t) { return t->a; }
+};
+
+template <typename T> struct DoublePointerStruct {
+ static int a(T t) { return (*t)->a; }
+};
+
+template <typename T> struct PointerStruct2 {
+ static int a(T* t) { return t->a; }
+};
+
+template <typename T> struct DoublePointerStruct2 {
+ static int a(T** t) { return (*t)->a; }
+};
+
+void PointerClassArguments() {
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* ic = 0;
+
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ PointerStruct<IndirectClass*>::a(ic);
+
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ DoublePointerStruct<IndirectClass**>::a(&ic);
+
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ PointerStruct2<IndirectClass>::a(ic);
+
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ DoublePointerStruct2<IndirectClass>::a(&ic);
+}
+
+// ---------------------------------------------------------------
+
+template<typename T> struct Outer { T t; };
+template<typename T> struct Inner { T t; };
+
+void NestedTemplateArguments() {
+ // IWYU: IndirectClass needs a declaration
+ // IWYU: IndirectClass is...*indirect.h
+ Outer<Inner<IndirectClass> > oi;
+ (void)oi;
+
+ // IWYU: IndirectClass needs a declaration
+ Outer<Inner<IndirectClass>* > oip;
+ (void)oip;
+
+ // IWYU: IndirectClass needs a declaration
+ Outer<Inner<IndirectClass> >* opi;
+ (void)opi;
+}
+
+// ---------------------------------------------------------------
+
+template<typename T> struct CreateTemporary {
+ static T a() { return T(); }
+ template<typename U> static U b() { return U(); }
+ static T statica() { return T(); }
+ template<typename U> static U staticb() { return U(); }
+};
+
+void TestCreateTemporary() {
+ // IWYU: IndirectClass needs a declaration
+ CreateTemporary<IndirectClass> ct;
+
+ // IWYU: IndirectClass is...*indirect.h
+ ct.a();
+
+ // IWYU: IndirectClass is...*indirect.h
+ // IWYU: IndirectClass needs a declaration
+ ct.b<IndirectClass>();
+
+ // IWYU: IndirectClass is...*indirect.h
+ // IWYU: IndirectClass needs a declaration
+ CreateTemporary<IndirectClass>::statica();
+
+ // IWYU: IndirectClass is...*indirect.h
+ // IWYU: IndirectClass needs a declaration
+ CreateTemporary<int>::staticb<IndirectClass>();
+}
+
+// ---------------------------------------------------------------
+
+// IWYU: IndirectClass is...*indirect.h
+typedef IndirectClass LocalClass;
+
+void TestResugaringOfTypedefs() {
+ FunctionStruct<char(LocalClass&)> f1;
+ (void)f1;
+
+ LocalClass* lc = 0;
+ PointerStruct<LocalClass*>::a(lc);
+ DoublePointerStruct<LocalClass**>::a(&lc);
+ PointerStruct2<LocalClass>::a(lc);
+ DoublePointerStruct2<LocalClass>::a(&lc);
+
+ Outer<Inner<LocalClass> > oi;
+ (void)oi;
+
+ CreateTemporary<LocalClass>::a();
+ CreateTemporary<int>::b<LocalClass>();
+}
+
+// ---------------------------------------------------------------
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/template_args.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/template_args.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/template_args.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+template <typename F> struct FunctionStruct; // lines XX-XX
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/template_specialization-d1.h b/tests/cxx/template_specialization-d1.h
new file mode 100644
index 0000000..0ba36fa
--- /dev/null
+++ b/tests/cxx/template_specialization-d1.h
@@ -0,0 +1,11 @@
+//===--- template_specialization-d1.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/template_specialization-i1.h"
+#include "tests/cxx/template_specialization-i2.h"
diff --git a/tests/cxx/template_specialization-i1.h b/tests/cxx/template_specialization-i1.h
new file mode 100644
index 0000000..e86d4f5
--- /dev/null
+++ b/tests/cxx/template_specialization-i1.h
@@ -0,0 +1,10 @@
+//===--- template_specialization-i1.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+template<class T> class Foo { };
diff --git a/tests/cxx/template_specialization-i2.h b/tests/cxx/template_specialization-i2.h
new file mode 100644
index 0000000..0e262bb
--- /dev/null
+++ b/tests/cxx/template_specialization-i2.h
@@ -0,0 +1,10 @@
+//===--- template_specialization-i2.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+template<> class Foo<int> { };
diff --git a/tests/cxx/template_specialization.cc b/tests/cxx/template_specialization.cc
new file mode 100644
index 0000000..0e37fa9
--- /dev/null
+++ b/tests/cxx/template_specialization.cc
@@ -0,0 +1,55 @@
+//===--- template_specialization.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we instantiate a specialized template, we attribute
+// it to the right location.
+
+#include "tests/cxx/template_specialization-d1.h"
+
+template<typename T> class Foo;
+
+// IWYU: Foo is...*template_specialization-i2.h
+Foo<int> foo;
+// Even though Foo<int> has a specialization, it doesn't matter
+// because forward-declaring is ok.
+Foo<int>* foo_ptr;
+
+// Check we do the right thing when we're a template template arg, too.
+// IWYU: Foo is...*template_specialization-i1.h
+template <template<typename U> class T = Foo> struct TplTplStruct {
+ // TODO(csilvers): it's probably correct to say we need
+ // template_specialization-i1.h here, because if someone doesn't
+ // specify any tpl args when instantiating us, we'll create a
+ // Foo<int>, so as tpl authors we're responsible for the definition
+ // of Foo<int>. This is pretty unlikely to happen in practice.
+ T<int> u;
+};
+
+TplTplStruct<> tts;
+// TODO(csilvers): This should find the -i2.h location (for Foo<int>),
+// not -i1.h (for Foo<T>).
+// IWYU: Foo is...*template_specialization-i1.h
+TplTplStruct<Foo> tts2;
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/template_specialization.cc should add these lines:
+#include "tests/cxx/template_specialization-i1.h"
+#include "tests/cxx/template_specialization-i2.h"
+
+tests/cxx/template_specialization.cc should remove these lines:
+- #include "tests/cxx/template_specialization-d1.h" // lines XX-XX
+- template <typename T> class Foo; // lines XX-XX
+
+The full include-list for tests/cxx/template_specialization.cc:
+#include "tests/cxx/template_specialization-i1.h" // for Foo
+#include "tests/cxx/template_specialization-i2.h" // for Foo
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/templated_constructor.cc b/tests/cxx/templated_constructor.cc
new file mode 100644
index 0000000..2fd33aa
--- /dev/null
+++ b/tests/cxx/templated_constructor.cc
@@ -0,0 +1,44 @@
+//===--- templated_constructor.cc - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that we handle correctly the case of templated constructors.
+
+#include "tests/cxx/direct.h"
+
+struct TemplatedConstructor {
+ template<typename T> TemplatedConstructor(const T* obj, int dummy) {
+ a_ = obj->a;
+ }
+ int a_;
+};
+
+int main() {
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* ic = 0;
+
+ // IWYU: IndirectClass is...*indirect.h
+ TemplatedConstructor tc(ic, 1);
+
+ // IWYU: IndirectClass is...*indirect.h
+ TemplatedConstructor* tcp = new TemplatedConstructor(ic, 1);
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/templated_constructor.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/templated_constructor.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/templated_constructor.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/typedef_chain_class.h b/tests/cxx/typedef_chain_class.h
new file mode 100644
index 0000000..ec65fdc
--- /dev/null
+++ b/tests/cxx/typedef_chain_class.h
@@ -0,0 +1,21 @@
+//===--- typedef_chain_class.h - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Simple class to use in typedef chains. Similar to IndirectClass but without
+// concerns if it is a direct include or indirect.
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_CHAIN_CLASS_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_CHAIN_CLASS_H_
+
+class TypedefChainClass {
+ public:
+ void Method() const { };
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_CHAIN_CLASS_H_
diff --git a/tests/cxx/typedef_chain_in_template-d1.h b/tests/cxx/typedef_chain_in_template-d1.h
new file mode 100644
index 0000000..3fee53c
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template-d1.h
@@ -0,0 +1,22 @@
+//===--- typedef_chain_in_template-d1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This header mimics std::vector in libstdc++.
+
+#include "tests/cxx/typedef_chain_in_template-i1.h"
+
+template<typename T>
+class ContainerAsLibstdcpp {
+ public:
+ typedef T value_type;
+ typedef typename TypedefWrapper<T>::reference reference;
+ reference GetContent() { return content_; }
+ private:
+ value_type content_;
+};
diff --git a/tests/cxx/typedef_chain_in_template-d2.h b/tests/cxx/typedef_chain_in_template-d2.h
new file mode 100644
index 0000000..bf165f3
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template-d2.h
@@ -0,0 +1,20 @@
+//===--- typedef_chain_in_template-d2.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This header mimics std::vector in libc++.
+
+template<typename T>
+class ContainerAsLibcpp {
+ public:
+ typedef T value_type;
+ typedef value_type& reference;
+ reference GetContent() { return content_; }
+ private:
+ value_type content_;
+};
diff --git a/tests/cxx/typedef_chain_in_template-d3.h b/tests/cxx/typedef_chain_in_template-d3.h
new file mode 100644
index 0000000..3bbc518
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template-d3.h
@@ -0,0 +1,21 @@
+//===--- typedef_chain_in_template-d3.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Container that tests typedef chains shorter than in libc++.
+
+template<typename T>
+class ContainerShortTypedefChain {
+ private:
+ T content_;
+ public:
+ T& GetContent1() { return content_; }
+
+ typedef T& reference;
+ reference GetContent2() { return content_; }
+};
diff --git a/tests/cxx/typedef_chain_in_template-d4.h b/tests/cxx/typedef_chain_in_template-d4.h
new file mode 100644
index 0000000..5b1f629
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template-d4.h
@@ -0,0 +1,25 @@
+//===--- typedef_chain_in_template-d4.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Container that tests typedef chains longer than in libc++.
+
+template<typename T>
+class ContainerLongTypedefChain {
+ public:
+ typedef T value_type;
+ typedef value_type& reference;
+ typedef reference& reference_reference;
+ reference_reference GetContent1() { return content_; }
+
+ typedef reference reference2;
+ typedef reference2 reference3;
+ reference3 GetContent2() { return content_; }
+ private:
+ value_type content_;
+};
diff --git a/tests/cxx/typedef_chain_in_template-i1.h b/tests/cxx/typedef_chain_in_template-i1.h
new file mode 100644
index 0000000..55f3383
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template-i1.h
@@ -0,0 +1,16 @@
+//===--- typedef_chain_in_template-i1.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This header mimics ext/alloc_traits.h in libstdc++.
+
+template<typename T>
+struct TypedefWrapper {
+ typedef T value_type;
+ typedef value_type& reference;
+};
diff --git a/tests/cxx/typedef_chain_in_template.cc b/tests/cxx/typedef_chain_in_template.cc
new file mode 100644
index 0000000..0fa8fae
--- /dev/null
+++ b/tests/cxx/typedef_chain_in_template.cc
@@ -0,0 +1,61 @@
+//===--- typedef_chain_in_template.cc - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that if template declares a typedef depending on template argument,
+// IWYU follows the typedef chain and uses underlying type that is not a
+// typedef depending on template argument. Usually such typedefs are template
+// implementation details and template clients should not use these typedefs
+// directly.
+
+#include "tests/cxx/typedef_chain_in_template-d1.h"
+#include "tests/cxx/typedef_chain_in_template-d2.h"
+#include "tests/cxx/typedef_chain_in_template-d3.h"
+#include "tests/cxx/typedef_chain_in_template-d4.h"
+#include "tests/cxx/typedef_chain_class.h"
+// Unused include to trigger IWYU summary telling what symbols are used from
+// every file.
+#include "tests/cxx/direct.h"
+
+void UsageAsWithLibstdcpp() {
+ ContainerAsLibstdcpp<TypedefChainClass> c;
+ c.GetContent().Method();
+}
+
+void UsageAsWithLibcpp() {
+ ContainerAsLibcpp<TypedefChainClass> c;
+ c.GetContent().Method();
+}
+
+void UsageWithShorterTypedefChain() {
+ ContainerShortTypedefChain<TypedefChainClass> c;
+ c.GetContent1().Method();
+ c.GetContent2().Method();
+}
+
+void UsageWithLongerTypedefChain() {
+ ContainerLongTypedefChain<TypedefChainClass> c;
+ c.GetContent1().Method();
+ c.GetContent2().Method();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/typedef_chain_in_template.cc should add these lines:
+
+tests/cxx/typedef_chain_in_template.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/typedef_chain_in_template.cc:
+#include "tests/cxx/typedef_chain_class.h" // for TypedefChainClass
+#include "tests/cxx/typedef_chain_in_template-d1.h" // for ContainerAsLibstdcpp
+#include "tests/cxx/typedef_chain_in_template-d2.h" // for ContainerAsLibcpp
+#include "tests/cxx/typedef_chain_in_template-d3.h" // for ContainerShortTypedefChain
+#include "tests/cxx/typedef_chain_in_template-d4.h" // for ContainerLongTypedefChain
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/typedef_chain_no_follow-d1.h b/tests/cxx/typedef_chain_no_follow-d1.h
new file mode 100644
index 0000000..48db677
--- /dev/null
+++ b/tests/cxx/typedef_chain_no_follow-d1.h
@@ -0,0 +1,12 @@
+//===--- typedef_chain_no_follow-d1.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/typedef_chain_class.h"
+
+typedef TypedefChainClass TypedefChainTypedef;
diff --git a/tests/cxx/typedef_chain_no_follow-d2.h b/tests/cxx/typedef_chain_no_follow-d2.h
new file mode 100644
index 0000000..d0e3f46
--- /dev/null
+++ b/tests/cxx/typedef_chain_no_follow-d2.h
@@ -0,0 +1,21 @@
+//===--- typedef_chain_no_follow-d2.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Declares typedef inside a class.
+
+#include "tests/cxx/typedef_chain_class.h"
+
+class NonContainer1 {
+ public:
+ typedef TypedefChainClass value_type;
+ typedef value_type& reference;
+
+ value_type tcc_;
+ reference GetTypedefChainClass() { return tcc_; }
+};
diff --git a/tests/cxx/typedef_chain_no_follow-d3.h b/tests/cxx/typedef_chain_no_follow-d3.h
new file mode 100644
index 0000000..1b8f67d
--- /dev/null
+++ b/tests/cxx/typedef_chain_no_follow-d3.h
@@ -0,0 +1,23 @@
+//===--- typedef_chain_no_follow-d3.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Declares typedef inside a template, typedef does not depend on template
+// argument.
+
+#include "tests/cxx/typedef_chain_class.h"
+
+template<typename T>
+class NonContainer2 {
+ public:
+ typedef TypedefChainClass value_type;
+ typedef value_type& reference;
+
+ value_type tcc_;
+ reference GetTypedefChainClass() { return tcc_; }
+};
diff --git a/tests/cxx/typedef_chain_no_follow.cc b/tests/cxx/typedef_chain_no_follow.cc
new file mode 100644
index 0000000..963f2e1
--- /dev/null
+++ b/tests/cxx/typedef_chain_no_follow.cc
@@ -0,0 +1,52 @@
+//===--- typedef_chain_no_follow.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests cases when IWYU should not follow typedef chain and should not suggest
+// to include a file for underlying typedef type.
+
+#include "tests/cxx/typedef_chain_no_follow-d1.h"
+#include "tests/cxx/typedef_chain_no_follow-d2.h"
+#include "tests/cxx/typedef_chain_no_follow-d3.h"
+// Unused include to trigger IWYU summary telling what symbols are used from
+// every file.
+#include "tests/cxx/direct.h"
+
+void TypedefDeclaredInGlobalNamespace() {
+ TypedefChainTypedef tct;
+ tct.Method();
+}
+
+// Tests how we handle a typedef declared in a class. Main purpose is to make
+// sure we handle typedefs in templates the same way as typedefs in classes
+// when typedef does not depend on template argument.
+void TypedefDeclaredInClass() {
+ NonContainer1 nc;
+ nc.GetTypedefChainClass().Method();
+}
+
+// Tests that we don't follow typedef chain and don't suggest to use
+// TypedefChainClass directly.
+void TypedefDeclaredInTemplate() {
+ NonContainer2<int> nc;
+ nc.GetTypedefChainClass().Method();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/typedef_chain_no_follow.cc should add these lines:
+
+tests/cxx/typedef_chain_no_follow.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/typedef_chain_no_follow.cc:
+#include "tests/cxx/typedef_chain_no_follow-d1.h" // for TypedefChainTypedef
+#include "tests/cxx/typedef_chain_no_follow-d2.h" // for NonContainer1, NonContainer1::value_type
+#include "tests/cxx/typedef_chain_no_follow-d3.h" // for NonContainer2, NonContainer2::value_type
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/typedef_in_template-d1.h b/tests/cxx/typedef_in_template-d1.h
new file mode 100644
index 0000000..5877b7f
--- /dev/null
+++ b/tests/cxx/typedef_in_template-d1.h
@@ -0,0 +1,15 @@
+//===--- typedef_in_template-d1.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_D1_H_
+
+#include "tests/cxx/typedef_in_template-i1.h"
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_D1_H_
diff --git a/tests/cxx/typedef_in_template-i1.h b/tests/cxx/typedef_in_template-i1.h
new file mode 100644
index 0000000..62dd2d2
--- /dev/null
+++ b/tests/cxx/typedef_in_template-i1.h
@@ -0,0 +1,22 @@
+//===--- typedef_in_template-i1.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_I1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_I1_H_
+
+class Class {};
+
+template<class T, class U>
+struct Pair {
+ T first;
+ U second;
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_TYPEDEF_IN_TEMPLATE_I1_H_
diff --git a/tests/cxx/typedef_in_template.cc b/tests/cxx/typedef_in_template.cc
new file mode 100644
index 0000000..48721d7
--- /dev/null
+++ b/tests/cxx/typedef_in_template.cc
@@ -0,0 +1,57 @@
+//===--- typedef_in_template.cc - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/typedef_in_template-d1.h"
+
+template<class T>
+class Container {
+ public:
+ // Should not be an iwyu violation for T
+ typedef T value_type;
+
+ // C++11 alias declaration, should not be an iwyu violation for T
+ using alias_type = T;
+
+ // IWYU: Pair is...*typedef_in_template-i1.h
+ typedef Pair<T,T> pair_type;
+};
+
+
+void Declarations() {
+ // These do not need the full type for Class because they're template params.
+
+ // TODO: This is almost certainly wrong, see bug #431
+ // We should not require the full definition of Class for passing it as a
+ // template argument, but we must require it when the typedef it's aliasing
+ // is full-used.
+ // The bug has instructions for how to provoke the error more obviously.
+
+ // IWYU: Class needs a declaration
+ Container<Class>::value_type vt;
+
+ // IWYU: Class needs a declaration
+ Container<Class>::pair_type pt;
+
+ // IWYU: Class needs a declaration
+ Container<Class>::alias_type at;
+}
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/typedef_in_template.cc should add these lines:
+#include "tests/cxx/typedef_in_template-i1.h"
+
+tests/cxx/typedef_in_template.cc should remove these lines:
+- #include "tests/cxx/typedef_in_template-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/typedef_in_template.cc:
+#include "tests/cxx/typedef_in_template-i1.h" // for Class (ptr only), Pair
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/typedefs_and_resugaring-d1.h b/tests/cxx/typedefs_and_resugaring-d1.h
new file mode 100644
index 0000000..750c7e4
--- /dev/null
+++ b/tests/cxx/typedefs_and_resugaring-d1.h
@@ -0,0 +1,12 @@
+//===--- typedefs_and_resugaring-d1.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class IndirectClass;
+
+typedef IndirectClass MyTypedef;
diff --git a/tests/cxx/typedefs_and_resugaring.cc b/tests/cxx/typedefs_and_resugaring.cc
new file mode 100644
index 0000000..b310347
--- /dev/null
+++ b/tests/cxx/typedefs_and_resugaring.cc
@@ -0,0 +1,57 @@
+//===--- typedefs_and_resugaring.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we have a typedef where the author disclaims
+// responsibility (so the user has to #include the underlying type),
+// we don't run into problems in a template context where the
+// underlying type gets resugared back to the original type.
+//
+// In other words, this protects against regressions involving the
+// following bug we had in iwyu:
+//
+// ReportTypeUse was reporting on the use of a typedef type, then on
+// the use of the underlying type (since it decided the typedef-user
+// was responsible for the underlying type). The typedef type was a
+// template parameter, though, so for the underlying type, iwyu was
+// doing type-resugaring and getting back to the same original type
+// that we were trying to recurse on! That is, TypedefType -> recurse
+// on UnderlyingType -> resugared to TypedefType -> recurse on
+// UnderlyingType -> infinite loop.
+
+#include "tests/cxx/direct.h"
+#include "tests/cxx/typedefs_and_resugaring-d1.h"
+
+template <typename T> void TplFn() {
+ T t;
+ (void)t;
+}
+
+int main() {
+ // TplFn uses MyTypedef. We are also responsible for IndirectClass
+ // since the MyTypedef author decided not to be. This tests we
+ // don't get into an infinite loop where we go to mark the need for
+ // IndirectClass, but it gets resugared back to MyTypedef (which is
+ // the template arg).
+ // IWYU: IndirectClass is...*indirect.h
+ TplFn<MyTypedef>();
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/typedefs_and_resugaring.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/typedefs_and_resugaring.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/typedefs_and_resugaring.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+#include "tests/cxx/typedefs_and_resugaring-d1.h" // for MyTypedef
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/unused_class_template_ctor-d1.h b/tests/cxx/unused_class_template_ctor-d1.h
new file mode 100644
index 0000000..8e660f6
--- /dev/null
+++ b/tests/cxx/unused_class_template_ctor-d1.h
@@ -0,0 +1,28 @@
+//===--- unused_class_template_ctor-d1.h - test input file for iwyu -------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_UNUSED_CLASS_TEMPLATE_CTOR_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_UNUSED_CLASS_TEMPLATE_CTOR_D1_H_
+
+template <class T1, class T2>
+class pair {
+ private:
+ T1 first_;
+ T2 second_;
+ public:
+ // If T2 is a reference type, 2-argument constructor is valid but 1-argument
+ // constructor cannot be used. Instantiating 1-argument constructor causes
+ //
+ // error: constructor for 'pair<int &, int &>' must explicitly initialize
+ // the reference member 'second_'
+ explicit pair(T1 t1) : first_(t1) {}
+ pair(T1 t1, T2 t2) : first_(t1), second_(t2) {}
+};
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_UNUSED_CLASS_TEMPLATE_CTOR_D1_H_
diff --git a/tests/cxx/unused_class_template_ctor.cc b/tests/cxx/unused_class_template_ctor.cc
new file mode 100644
index 0000000..31689b9
--- /dev/null
+++ b/tests/cxx/unused_class_template_ctor.cc
@@ -0,0 +1,25 @@
+//===--- unused_class_template_ctor.cc - test input file for iwyu ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that IWYU doesn't instantiate unused class template constructor
+// because for certain template arguments some constructors can trigger Clang
+// errors.
+
+#include "tests/cxx/unused_class_template_ctor-d1.h"
+
+void foo() {
+ int i = 10, j = 20;
+ pair<int&, int&> p(i, j);
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/unused_class_template_ctor.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/uses_printf-d1.h b/tests/cxx/uses_printf-d1.h
new file mode 100644
index 0000000..e80eb80
--- /dev/null
+++ b/tests/cxx/uses_printf-d1.h
@@ -0,0 +1,15 @@
+//===--- uses_printf-d1.h - test input file for iwyu ----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_USES_PRINTF_D1_H_
+#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_USES_PRINTF_D1_H_
+
+#include <cstdio>
+
+#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_USES_PRINTF_D1_H_
diff --git a/tests/cxx/uses_printf.cc b/tests/cxx/uses_printf.cc
new file mode 100644
index 0000000..c91e2fa
--- /dev/null
+++ b/tests/cxx/uses_printf.cc
@@ -0,0 +1,28 @@
+//===--- uses_printf.cc - test input file for iwyu ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/uses_printf-d1.h"
+
+void hello() {
+ // IWYU: printf is...*<stdio.h>
+ printf("Hello, world!\n");
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/uses_printf.cc should add these lines:
+#include <stdio.h>
+
+tests/cxx/uses_printf.cc should remove these lines:
+- #include "tests/cxx/uses_printf-d1.h" // lines XX-XX
+
+The full include-list for tests/cxx/uses_printf.cc:
+#include <stdio.h> // for printf
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/using_aliased_symbol-alias.h b/tests/cxx/using_aliased_symbol-alias.h
new file mode 100644
index 0000000..341b98a
--- /dev/null
+++ b/tests/cxx/using_aliased_symbol-alias.h
@@ -0,0 +1,15 @@
+//===--- using_aliased_symbol-alias.h - test input file for iwyu ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "tests/cxx/using_aliased_symbol-declare.h"
+
+namespace ns2 {
+using ns::symbol;
+}
+
diff --git a/tests/cxx/using_aliased_symbol-declare.h b/tests/cxx/using_aliased_symbol-declare.h
new file mode 100644
index 0000000..1cabe9a
--- /dev/null
+++ b/tests/cxx/using_aliased_symbol-declare.h
@@ -0,0 +1,13 @@
+//===--- using_aliased_symbol-declare.h - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns {
+ void symbol();
+}
+
diff --git a/tests/cxx/using_aliased_symbol.cc b/tests/cxx/using_aliased_symbol.cc
new file mode 100644
index 0000000..b9ceaaf
--- /dev/null
+++ b/tests/cxx/using_aliased_symbol.cc
@@ -0,0 +1,33 @@
+//===--- using_aliased_symbol.cc - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we include a file that exports a symbol via a using decl
+// that we are required to include both the file with the original symbol and
+// the file with the using decl.
+
+#include "using_aliased_symbol-alias.h"
+
+void use_symbol() {
+ // IWYU: ns::symbol is defined in ...*using_aliased_symbol-declare.h", which isn't directly #included.
+ ns2::symbol();
+}
+
+/**** IWYU_SUMMARY
+
+
+tests/cxx/using_aliased_symbol.cc should add these lines:
+#include "tests/cxx/using_aliased_symbol-declare.h"
+
+tests/cxx/using_aliased_symbol.cc should remove these lines:
+
+The full include-list for tests/cxx/using_aliased_symbol.cc:
+#include "tests/cxx/using_aliased_symbol-declare.h" // for symbol
+#include "using_aliased_symbol-alias.h" // for symbol
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/using_aliased_symbol_unused.cc b/tests/cxx/using_aliased_symbol_unused.cc
new file mode 100644
index 0000000..d508548
--- /dev/null
+++ b/tests/cxx/using_aliased_symbol_unused.cc
@@ -0,0 +1,28 @@
+//===--- using_aliased_symbol_unused.cc - test input file for iwyu --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we include a file that contains a using decl, that we are not
+// forced to include that file if the decl is not used.
+
+#include "using_aliased_symbol-alias.h"
+
+void not_use_symbol() {
+
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/using_aliased_symbol_unused.cc should add these lines:
+
+tests/cxx/using_aliased_symbol_unused.cc should remove these lines:
+- #include "using_aliased_symbol-alias.h" // lines XX-XX
+
+The full include-list for tests/cxx/using_aliased_symbol_unused.cc:
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/using_overload-float.h b/tests/cxx/using_overload-float.h
new file mode 100644
index 0000000..49c83da
--- /dev/null
+++ b/tests/cxx/using_overload-float.h
@@ -0,0 +1,13 @@
+//===--- using_overload-float.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns {
+ float add(float, float);
+}
+
diff --git a/tests/cxx/using_overload-int.h b/tests/cxx/using_overload-int.h
new file mode 100644
index 0000000..857e4c5
--- /dev/null
+++ b/tests/cxx/using_overload-int.h
@@ -0,0 +1,13 @@
+//===--- using_overload-int.h - test input file for iwyu ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns {
+ int add(int, int);
+}
+
diff --git a/tests/cxx/using_overload_multiple.cc b/tests/cxx/using_overload_multiple.cc
new file mode 100644
index 0000000..3c5f996
--- /dev/null
+++ b/tests/cxx/using_overload_multiple.cc
@@ -0,0 +1,31 @@
+//===--- using_overload_multiple.cc - test input file for iwyu ------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we use multiple function overloads through a using decl,
+// that we correctly include all of the necessary files for the overload and
+// don't accidentally remove files greedily.
+
+#include "using_overload-float.h"
+#include "using_overload-int.h"
+
+void use_overload() {
+ int a = 1;
+ int b = 2;
+ float c = 1.f;
+ float d = 2.f;
+ using ns::add;
+ add(a, b);
+ add(c, d);
+}
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/using_overload_multiple.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/using_overload_single.cc b/tests/cxx/using_overload_single.cc
new file mode 100644
index 0000000..ccd5ab7
--- /dev/null
+++ b/tests/cxx/using_overload_single.cc
@@ -0,0 +1,35 @@
+//===--- using_overload_single.cc - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we use a function overload through a using decl, that we
+// are only required to include the files that represent the overloads we've
+// actually used and not the entire overload set the the using decl
+// represents.
+
+#include "using_overload-float.h"
+#include "using_overload-int.h"
+
+void use_overload() {
+ int a = 1;
+ int b = 2;
+ using ns::add;
+ add(a, b);
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/using_overload_single.cc should add these lines:
+
+tests/cxx/using_overload_single.cc should remove these lines:
+- #include "using_overload-float.h" // lines XX-XX
+
+The full include-list for tests/cxx/using_overload_single.cc:
+#include "using_overload-int.h" // for add
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/using_specialization.cc b/tests/cxx/using_specialization.cc
new file mode 100644
index 0000000..a2dbb61
--- /dev/null
+++ b/tests/cxx/using_specialization.cc
@@ -0,0 +1,36 @@
+//===--- using_specialization.cc - test input file for iwyu ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we use an object through a using decl, that we are only
+// required to include the files that represent the specializations we've
+// actually used and not the entire overload set the the using decl
+// represents.
+
+namespace ns {
+ #include "template_specialization-i1.h"
+ #include "template_specialization-i2.h"
+}
+
+void use_non_specialization() {
+ using ns::Foo;
+ Foo<float> f;
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/using_specialization.cc should add these lines:
+
+tests/cxx/using_specialization.cc should remove these lines:
+- #include "template_specialization-i2.h" // lines XX-XX
+
+The full include-list for tests/cxx/using_specialization.cc:
+#include "template_specialization-i1.h" // for Foo
+
+***** IWYU_SUMMARY */
+
diff --git a/tests/cxx/using_unused-baseclass.h b/tests/cxx/using_unused-baseclass.h
new file mode 100644
index 0000000..88c7266
--- /dev/null
+++ b/tests/cxx/using_unused-baseclass.h
@@ -0,0 +1,13 @@
+//===--- using_unused-baseclass.h - test input file for iwyu --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class Base {
+ public:
+ void Method();
+};
diff --git a/tests/cxx/using_unused-declare.h b/tests/cxx/using_unused-declare.h
new file mode 100644
index 0000000..d1c8b3c
--- /dev/null
+++ b/tests/cxx/using_unused-declare.h
@@ -0,0 +1,13 @@
+//===--- using_unused-declare.h - test input file for iwyu ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace ns {
+ void symbol();
+}
+
diff --git a/tests/cxx/using_unused.cc b/tests/cxx/using_unused.cc
new file mode 100644
index 0000000..c72f419
--- /dev/null
+++ b/tests/cxx/using_unused.cc
@@ -0,0 +1,32 @@
+//===--- using_unused.cc - test input file for iwyu -----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests that when we import a name via a using statement, IWYU tells us we
+// need to include the original thing we're referencing, despite the fact that
+// it's not actually used.
+
+#include "using_unused-declare.h"
+#include "using_unused-baseclass.h"
+
+using ns::symbol;
+
+class Hiding : public Base {
+ // Introduce a using shadow decl which is subsequently discarded when this
+ // class hides the using-decl with its own declaration.
+ // This used to trigger an assertion failure.
+ using Base::Method;
+
+ void Method();
+};
+
+/**** IWYU_SUMMARY
+
+(tests/cxx/using_unused.cc has correct #includes/fwd-decls)
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/varargs_and_references.cc b/tests/cxx/varargs_and_references.cc
new file mode 100644
index 0000000..7f4b7cb
--- /dev/null
+++ b/tests/cxx/varargs_and_references.cc
@@ -0,0 +1,51 @@
+//===--- varargs_and_references.cc - test input file for iwyu -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// When passing a class to a function that takes vararg arguments,
+// compilers seem to require the full type information for the class
+// (though the behavior is technically undefined). Test that IWYU
+// notices this. (It only matters for references, of course.)
+//
+// TODO(csilvers): Clarify what the intended behavior here is; see discussion on
+// OCL 23543695.
+
+#include "tests/cxx/direct.h"
+
+// Just to make things more complicated, put a default argument before
+// the varargs.
+int Function(int x, int y = 5, ...) { return 0; }
+
+// To make things even *more* complicated, try a function pointer.
+int (*function_p)(int, int, ...) = &Function;
+
+int main() {
+ // IWYU: IndirectClass is...*indirect.h
+ IndirectClass ic;
+ // IWYU: IndirectClass needs a declaration
+ const IndirectClass& ref = ic;
+ // IWYU: IndirectClass is...*indirect.h
+ (void)sizeof(Function(1, 2, ref));
+ // IWYU: IndirectClass is...*indirect.h
+ (void)sizeof((*function_p)(1, 2, ref));
+ // IWYU: IndirectClass is...*indirect.h
+ (void)sizeof((*function_p)(1, 2, 3, 4, 5, ref));
+}
+
+/**** IWYU_SUMMARY
+
+tests/cxx/varargs_and_references.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/varargs_and_references.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/varargs_and_references.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/tests/cxx/virtual_tpl_method.cc b/tests/cxx/virtual_tpl_method.cc
new file mode 100644
index 0000000..52e0a88
--- /dev/null
+++ b/tests/cxx/virtual_tpl_method.cc
@@ -0,0 +1,95 @@
+//===--- virtual_tpl_method.cc - test input file for iwyu -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Normally, C++ only instantiates methods on template classes when
+// the methods are called. But for virtual methods, they're
+// instantiated when the key method for the template class is
+// instantiated. Since template classes rarely have key methods, that
+// means they're instantiated when the class is instantiated. We test
+// that iwyu correctly handles that situation.
+
+#include "tests/cxx/direct.h"
+
+// TODO(csilvers): can take this out when TODOs below are removed.
+// It's in here only to make the IWYU_SUMMARY look like it should.
+// IWYU: IndirectClass is...*indirect.h
+IndirectClass unused;
+
+template <typename T> struct Deleter {
+ Deleter(T* t) : t_(t) {}
+ virtual void Delete() { delete t_; }
+ static int NothingToDoWithDelete() { return 1; };
+ T* t_;
+};
+
+// Note we require the full type even though we don't call Delete.
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+Deleter<IndirectClass> d(0);
+
+// IWYU: IndirectClass needs a declaration
+Deleter<IndirectClass>* pd
+// Another way to instantiate a template, also requirs the full type.
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+ = new Deleter<IndirectClass>(0);
+
+// This also instantiates the template, and thus requires the deleted-type.
+// IWYU: IndirectClass is...*indirect.h
+// IWYU: IndirectClass needs a declaration
+int id = Deleter<IndirectClass>::NothingToDoWithDelete();
+
+
+template <typename T> struct NonvirtualDeleter {
+ NonvirtualDeleter(T* t) : t_(t) {}
+ void Delete() { delete t_; }
+ static int NothingToDoWithDelete() { return 1; };
+ T* t_;
+};
+
+// None of these should require the full type.
+// IWYU: IndirectClass needs a declaration
+NonvirtualDeleter<IndirectClass> nd(0);
+
+// IWYU: IndirectClass needs a declaration
+NonvirtualDeleter<IndirectClass>* pnd
+// IWYU: IndirectClass needs a declaration
+ = new NonvirtualDeleter<IndirectClass>(0);
+
+// IWYU: IndirectClass needs a declaration
+int ind = NonvirtualDeleter<IndirectClass>::NothingToDoWithDelete();
+
+
+template <typename T> struct NonTplArgDeleter {
+ virtual void Delete() {
+ // IWYU: IndirectClass needs a declaration
+ IndirectClass* ic = 0;
+ // IWYU: IndirectClass is...*indirect.h
+ delete ic;
+ }
+};
+
+// These should not require the full type, for the normal reason that
+// they're not a template arg.
+NonTplArgDeleter<int> ntad;
+
+
+
+/**** IWYU_SUMMARY
+
+tests/cxx/virtual_tpl_method.cc should add these lines:
+#include "tests/cxx/indirect.h"
+
+tests/cxx/virtual_tpl_method.cc should remove these lines:
+- #include "tests/cxx/direct.h" // lines XX-XX
+
+The full include-list for tests/cxx/virtual_tpl_method.cc:
+#include "tests/cxx/indirect.h" // for IndirectClass
+
+***** IWYU_SUMMARY */
diff --git a/third_party.imp b/third_party.imp
new file mode 100644
index 0000000..c5fc0bd
--- /dev/null
+++ b/third_party.imp
@@ -0,0 +1,25 @@
+# It's very common for third-party libraries to just expose one
+# header file. So this map takes advantage of regex functionality.
+#
+# Please keep this in sync with _deprecated_headers in cpplint.py.
+[
+ { include: ["@\"third_party/dynamic_annotations/.*\"", private, "\"base/dynamic_annotations.h\"", public] },
+ { include: ["@\"third_party/gmock/include/gmock/.*\"", private, "\"testing/base/public/gmock.h\"", public] },
+ # Old location for Python. TODO(csilvers): remove when
+ # third_party/python2_4_3 is gone.
+ { include: ["@\"third_party/python2_4_3/.*\"", private, "<Python.h>", public] },
+ # New location for Python.
+ { include: ["@\"third_party/python_runtime/.*\"", private, "<Python.h>", public] },
+ { include: ["\"third_party/icu/include/unicode/umachine.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/uversion.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/uconfig.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/udraft.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/udeprctd.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/uobslete.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/uintrnal.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/usystem.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/urename.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/platform.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/ptypes.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+ { include: ["\"third_party/icu/include/unicode/uvernum.h\"", private, "\"third_party/icu/include/unicode/utypes.h\"", public] },
+]