[memprof] Upgrade a unit test to MemProf Version 3 (#117063)
[llvm-project.git] / clang / docs / WarningSuppressionMappings.rst
blobd96341ac6e563bcf2508e9dd5dff3353917ac10e
1 ============================
2 Warning suppression mappings
3 ============================
5 .. contents::
6    :local:
8 Introduction
9 ============
11 Warning suppression mappings enable users to suppress Clang's diagnostics at a
12 per-file granularity. This allows enforcing diagnostics in specific parts of the
13 project even if there are violations in some headers.
15 Goal and usage
16 ==============
18 Clang allows diagnostics to be configured at a translation-unit granularity.
19 If a ``foo.cpp`` is compiled with ``-Wfoo``, all transitively included headers
20 also need to be clean. Hence, turning on new warnings in large codebases
21 requires cleaning up all the existing warnings. This might not be possible when
22 some dependencies aren't in the project owner's control or because new
23 violations are creeping up quicker than the clean up.
25 Warning suppression mappings aim to alleviate some of these concerns by making
26 diagnostic configuration granularity finer, at a source file level.
28 To achieve this, user can create a file that lists which :doc:`diagnostic
29 groups <DiagnosticsReference>` to suppress in which files or paths, and pass it
30 as a command line argument to Clang with the ``--warning-suppression-mappings``
31 flag.
33 Note that this mechanism won't enable any diagnostics on its own. Users should
34 still turn on warnings in their compilations with explicit ``-Wfoo`` flags.
35 `Controlling diagnostics pragmas
36 <https://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas>`_
37 take precedence over suppression mappings. Ensuring code author's explicit
38 intent is always preserved.
40 Example
41 =======
43 .. code-block:: bash
45   $ cat my/user/code.cpp
46   #include <foo/bar.h>
47   namespace { void unused_func1(); }
49   $ cat foo/bar.h
50   namespace { void unused_func2(); }
52   $ cat suppression_mappings.txt
53   # Suppress -Wunused warnings in all files, apart from the ones under `foo/`.
54   [unused]
55   src:*
56   src:*foo/*=emit
57   $ clang -Wunused --warning-suppression-mappings=suppression_mappings.txt my/user/code.cpp
58   # prints warning: unused function 'unused_func2', but no warnings for `unused_func1`.
60 Format
61 ======
63 Warning suppression mappings uses the same format as
64 :doc:`SanitizerSpecialCaseList`.
66 Sections describe which diagnostic group's behaviour to change, e.g.
67 ``[unused]``. When a diagnostic is matched by multiple sections, the latest
68 section takes precedence.
70 Afterwards in each section, users can have multiple entities that match source
71 files based on the globs. These entities look like ``src:*/my/dir/*``.
72 Users can also use the ``emit`` category to exclude a subdirectory from
73 suppression.
74 Source files are matched against these globs either:
76 - as paths relative to the current working directory
77 - as absolute paths.
79 When a source file matches multiple globs in a section, the longest one takes
80 precedence.
82 .. code-block:: bash
84     # Lines starting with # are ignored.
85     # Configure suppression globs for `-Wunused` warnings
86     [unused]
87     # Suppress on all files by default.
88     src:*
89     # But enforce for all the sources under foo/.
90     src:*foo/*=emit
92     # unused-function warnings are a subgroup of `-Wunused`. So this section
93     # takes precedence over the previous one for unused-function warnings, but
94     # not for unused-variable warnings.
95     [unused-function]
96     # Only suppress for sources under bar/.
97     src:*bar/*