carlosgalvezp updated this revision to Diff 491728.
carlosgalvezp added a comment.
Add HeaderFileExtensions and ImplementationFileExtensions
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141144/new/
https://reviews.llvm.org/D141144
Files:
clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
clang-tools-extra/docs/clang-tidy/index.rst
Index: clang-tools-extra/docs/clang-tidy/index.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/index.rst
+++ clang-tools-extra/docs/clang-tidy/index.rst
@@ -110,6 +110,7 @@
.. code-block:: console
$ clang-tidy --help
+
USAGE: clang-tidy [options] <source0> [... <sourceN>]
OPTIONS:
@@ -122,170 +123,171 @@
clang-tidy options:
- --checks=<string> -
- Comma-separated list of globs with optional '-'
- prefix. Globs are processed in order of
- appearance in the list. Globs without '-'
- prefix add checks with matching names to the
- set, globs with the '-' prefix remove checks
- with matching names from the set of enabled
- checks. This option's value is appended to the
- value of the 'Checks' option in .clang-tidy
- file, if any.
- --config=<string> -
- Specifies a configuration in YAML/JSON format:
- -config="{Checks: '*',
- CheckOptions: {x, y}}"
- When the value is empty, clang-tidy will
- attempt to find a file named .clang-tidy for
- each source file in its parent directories.
- --config-file=<string> -
- Specify the path of .clang-tidy or custom config file:
+ --checks=<string> - Comma-separated list of globs with optional '-'
+ prefix. Globs are processed in order of
+ appearance in the list. Globs without '-'
+ prefix add checks with matching names to the
+ set, globs with the '-' prefix remove checks
+ with matching names from the set of enabled
+ checks. This option's value is appended to the
+ value of the 'Checks' option in .clang-tidy
+ file, if any.
+ --config=<string> - Specifies a configuration in YAML/JSON format:
+ -config="{Checks: '*',
+ CheckOptions: {x: y}}"
+ When the value is empty, clang-tidy will
+ attempt to find a file named .clang-tidy for
+ each source file in its parent directories.
+ --config-file=<string> - Specify the path of .clang-tidy or custom config file:
e.g. --config-file=/some/path/myTidyConfigFile
This option internally works exactly the same way as
--config option after reading specified config file.
Use either --config-file or --config, not both.
- --dump-config -
- Dumps configuration in the YAML format to
- stdout. This option can be used along with a
- file name (and '--' if the file is outside of a
- project with configured compilation database).
- The configuration used for this file will be
- printed.
- Use along with -checks=* to include
- configuration of all checks.
- --enable-check-profile -
- Enable per-check timing profiles, and print a
- report to stderr.
- --explain-config -
- For each enabled check explains, where it is
- enabled, i.e. in clang-tidy binary, command
- line or a specific configuration file.
- --export-fixes=<filename> -
- YAML file to store suggested fixes in. The
- stored fixes can be applied to the input source
- code with clang-apply-replacements.
- --extra-arg=<string> - Additional argument to append to the compiler command line.
- Can be used several times.
- --extra-arg-before=<string> - Additional argument to prepend to the compiler command line.
- Can be used several times.
- --fix -
- Apply suggested fixes. Without -fix-errors
- clang-tidy will bail out if any compilation
- errors were found.
- --fix-errors -
- Apply suggested fixes even if compilation
- errors were found. If compiler errors have
- attached fix-its, clang-tidy will apply them as
- well.
- --fix-notes -
- If a warning has no fix, but a single fix can
- be found through an associated diagnostic note,
- apply the fix.
- Specifying this flag will implicitly enable the
- '--fix' flag.
- --format-style=<string> -
- Style for formatting code around applied fixes:
- - 'none' (default) turns off formatting
- - 'file' (literally 'file', not a placeholder)
- uses .clang-format file in the closest parent
- directory
- - '{ <json> }' specifies options inline, e.g.
- -format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
- - 'llvm', 'google', 'webkit', 'mozilla'
- See clang-format documentation for the up-to-date
- information about formatting styles and options.
- This option overrides the 'FormatStyle` option in
- .clang-tidy file, if any.
- --header-filter=<string> -
- Regular expression matching the names of the
- headers to output diagnostics from. Diagnostics
- from the main file of each translation unit are
- always displayed.
- Can be used together with -line-filter.
- This option overrides the 'HeaderFilterRegex'
- option in .clang-tidy file, if any.
- --line-filter=<string> -
- List of files with line ranges to filter the
- warnings. Can be used together with
- -header-filter. The format of the list is a
- JSON array of objects:
- [
- {"name":"file1.cpp","lines":[[1,3],[5,7]]},
- {"name":"file2.h"}
- ]
- --list-checks -
- List all enabled checks and exit. Use with
- -checks=* to list all available checks.
- -load=<plugin> -
- Load the dynamic object ``plugin``. This
- object should register new static analyzer
- or clang-tidy passes. Once loaded, the
- object will add new command line options
- to run various analyses. To see the new
- complete list of passes, use the
- :option:`--list-checks` and
- :option:`-load` options together.
+ --dump-config - Dumps configuration in the YAML format to
+ stdout. This option can be used along with a
+ file name (and '--' if the file is outside of a
+ project with configured compilation database).
+ The configuration used for this file will be
+ printed.
+ Use along with -checks=* to include
+ configuration of all checks.
+ --enable-check-profile - Enable per-check timing profiles, and print a
+ report to stderr.
+ --explain-config - For each enabled check explains, where it is
+ enabled, i.e. in clang-tidy binary, command
+ line or a specific configuration file.
+ --export-fixes=<filename> - YAML file to store suggested fixes in. The
+ stored fixes can be applied to the input source
+ code with clang-apply-replacements.
+ --extra-arg=<string> - Additional argument to append to the compiler command line
+ --extra-arg-before=<string> - Additional argument to prepend to the compiler command line
+ --fix - Apply suggested fixes. Without -fix-errors
+ clang-tidy will bail out if any compilation
+ errors were found.
+ --fix-errors - Apply suggested fixes even if compilation
+ errors were found. If compiler errors have
+ attached fix-its, clang-tidy will apply them as
+ well.
+ --fix-notes - If a warning has no fix, but a single fix can
+ be found through an associated diagnostic note,
+ apply the fix.
+ Specifying this flag will implicitly enable the
+ '--fix' flag.
+ --format-style=<string> - Style for formatting code around applied fixes:
+ - 'none' (default) turns off formatting
+ - 'file' (literally 'file', not a placeholder)
+ uses .clang-format file in the closest parent
+ directory
+ - '{ <json> }' specifies options inline, e.g.
+ -format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
+ - 'llvm', 'google', 'webkit', 'mozilla'
+ See clang-format documentation for the up-to-date
+ information about formatting styles and options.
+ This option overrides the 'FormatStyle` option in
+ .clang-tidy file, if any.
+ --header-filter=<string> - Regular expression matching the names of the
+ headers to output diagnostics from. Diagnostics
+ from the main file of each translation unit are
+ always displayed.
+ Can be used together with -line-filter.
+ This option overrides the 'HeaderFilterRegex'
+ option in .clang-tidy file, if any.
+ --line-filter=<string> - List of files with line ranges to filter the
+ warnings. Can be used together with
+ -header-filter. The format of the list is a
+ JSON array of objects:
+ [
+ {"name":"file1.cpp","lines":[[1,3],[5,7]]},
+ {"name":"file2.h"}
+ ]
+ --list-checks - List all enabled checks and exit. Use with
+ -checks=* to list all available checks.
+ --load=<pluginfilename> - Load the specified plugin
-p <string> - Build path
- --quiet -
- Run clang-tidy in quiet mode. This suppresses
- printing statistics about ignored warnings and
- warnings treated as errors if the respective
- options are specified.
- --store-check-profile=<prefix> -
- By default reports are printed in tabulated
- format to stderr. When this option is passed,
- these per-TU profiles are instead stored as JSON.
+ --quiet - Run clang-tidy in quiet mode. This suppresses
+ printing statistics about ignored warnings and
+ warnings treated as errors if the respective
+ options are specified.
+ --store-check-profile=<prefix> - By default reports are printed in tabulated
+ format to stderr. When this option is passed,
+ these per-TU profiles are instead stored as JSON.
--system-headers - Display the errors from system headers.
- --use-color -
- Use colors in diagnostics. If not set, colors
+ --use-color - Use colors in diagnostics. If not set, colors
will be used if the terminal connected to
standard output supports colors.
This option overrides the 'UseColor' option in
.clang-tidy file, if any.
- --verify-config -
- Check the config files to ensure each check and
- option is recognized.
- --vfsoverlay=<filename> -
- Overlay the virtual filesystem described by file
- over the real file system.
- --warnings-as-errors=<string> -
- Upgrades warnings to errors. Same format as
- '-checks'.
- This option's value is appended to the value of
- the 'WarningsAsErrors' option in .clang-tidy
- file, if any.
+ --verify-config - Check the config files to ensure each check and
+ option is recognized.
+ --vfsoverlay=<filename> - Overlay the virtual filesystem described by file
+ over the real file system.
+ --warnings-as-errors=<string> - Upgrades warnings to errors. Same format as
+ '-checks'.
+ This option's value is appended to the value of
+ the 'WarningsAsErrors' option in .clang-tidy
+ file, if any.
-p <build-path> is used to read a compile command database.
- For example, it can be a CMake build directory in which a file named
- compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
- CMake option to get this output). When no build path is specified,
- a search for compile_commands.json will be attempted through all
- parent paths of the first input file . See:
- https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an
- example of setting up Clang Tooling on a source tree.
+ For example, it can be a CMake build directory in which a file named
+ compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+ CMake option to get this output). When no build path is specified,
+ a search for compile_commands.json will be attempted through all
+ parent paths of the first input file . See:
+ https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an
+ example of setting up Clang Tooling on a source tree.
<source0> ... specify the paths of source files. These paths are
- looked up in the compile command database. If the path of a file is
- absolute, it needs to point into CMake's source tree. If the path is
- relative, the current working directory needs to be in the CMake
- source tree and the file must be in a subdirectory of the current
- working directory. "./" prefixes in the relative files will be
- automatically removed, but the rest of a relative path must be a
- suffix of a path in the compile command database.
+ looked up in the compile command database. If the path of a file is
+ absolute, it needs to point into CMake's source tree. If the path is
+ relative, the current working directory needs to be in the CMake
+ source tree and the file must be in a subdirectory of the current
+ working directory. "./" prefixes in the relative files will be
+ automatically removed, but the rest of a relative path must be a
+ suffix of a path in the compile command database.
Configuration files:
clang-tidy attempts to read configuration for each source file from a
.clang-tidy file located in the closest parent directory of the source
- file. If InheritParentConfig is true in a config file, the configuration file
- in the parent directory (if any exists) will be taken and current config file
- will be applied on top of the parent one. If any configuration options have
- a corresponding command-line option, command-line option takes precedence.
- The effective configuration can be inspected using -dump-config:
-
- $ clang-tidy -dump-config
+ file. The .clang-tidy file is specified in YAML format. If any configuration
+ options have a corresponding command-line option, command-line option takes
+ precedence.
+
+ The following configuration options may be used in a .clang-tidy file:
+
+ CheckOptions - List of key-value pairs defining check-specific
+ options. Example:
+ CheckOptions:
+ some-check.SomeOption: 'some value'
+ Checks - Same as '--checks'.
+ ExtraArgs - Same as '--extra-args'.
+ ExtraArgsBefore - Same as '--extra-args-before'.
+ FormatStyle - Same as '--format-style'.
+ HeaderFileExtensions - File extensions to consider to determine if a
+ given diagnostic is located in a header file.
+ Default: ['','h','hh','hpp','hxx']
+ HeaderFilterRegex - Same as '--header-filter-regex'.
+ ImplementationFileExtensions - File extensions to consider to determine if a
+ given diagnostic is located in an
+ implementation file.
+ Default: ['c','cc','cpp','cxx']
+ InheritParentConfig - If this option is true in a config file, the
+ configuration file in the parent directory
+ (if any exists) will be taken and the current
+ config file will be applied on top of the
+ parent one.
+ SystemHeaders - Same as '--system-headers'.
+ UseColor - Same as '--use-color'.
+ User - Specifies the name or e-mail of the user
+ running clang-tidy. This option is used, for
+ example, to place the correct user name in
+ TODO() comments in the relevant check.
+ WarningsAsErrors - Same as '--warnings-as-errors'.
+
+ The effective configuration can be inspected using --dump-config:
+
+ $ clang-tidy --dump-config
---
Checks: '-*,some-check'
WarningsAsErrors: ''
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===================================================================
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -31,6 +31,8 @@
using namespace clang::tooling;
using namespace llvm;
+static StringRef TrimFirstChar(StringRef x) { return x.substr(1); }
+
static cl::OptionCategory ClangTidyCategory("clang-tidy options");
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
@@ -38,13 +40,44 @@
Configuration files:
clang-tidy attempts to read configuration for each source file from a
.clang-tidy file located in the closest parent directory of the source
- file. If InheritParentConfig is true in a config file, the configuration file
- in the parent directory (if any exists) will be taken and current config file
- will be applied on top of the parent one. If any configuration options have
- a corresponding command-line option, command-line option takes precedence.
- The effective configuration can be inspected using -dump-config:
-
- $ clang-tidy -dump-config
+ file. The .clang-tidy file is specified in YAML format. If any configuration
+ options have a corresponding command-line option, command-line option takes
+ precedence.
+
+ The following configuration options may be used in a .clang-tidy file:
+
+ CheckOptions - List of key-value pairs defining check-specific
+ options. Example:
+ CheckOptions:
+ some-check.SomeOption: 'some value'
+ Checks - Same as '--checks'.
+ ExtraArgs - Same as '--extra-args'.
+ ExtraArgsBefore - Same as '--extra-args-before'.
+ FormatStyle - Same as '--format-style'.
+ HeaderFileExtensions - File extensions to consider to determine if a
+ given diagnostic is located in a header file.
+ Default: ['','h','hh','hpp','hxx']
+ HeaderFilterRegex - Same as '--header-filter-regex'.
+ ImplementationFileExtensions - File extensions to consider to determine if a
+ given diagnostic is located in an
+ implementation file.
+ Default: ['c','cc','cpp','cxx']
+ InheritParentConfig - If this option is true in a config file, the
+ configuration file in the parent directory
+ (if any exists) will be taken and the current
+ config file will be applied on top of the
+ parent one.
+ SystemHeaders - Same as '--system-headers'.
+ UseColor - Same as '--use-color'.
+ User - Specifies the name or e-mail of the user
+ running clang-tidy. This option is used, for
+ example, to place the correct user name in
+ TODO() comments in the relevant check.
+ WarningsAsErrors - Same as '--warnings-as-errors'.
+
+ The effective configuration can be inspected using --dump-config:
+
+ $ clang-tidy --dump-config
---
Checks: '-*,some-check'
WarningsAsErrors: ''
@@ -64,7 +97,7 @@
"clang-diagnostic-*," // * compiler diagnostics
"clang-analyzer-*"; // * Static Analyzer checks
-static cl::opt<std::string> Checks("checks", cl::desc(R"(
+static cl::opt<std::string> Checks("checks", cl::desc(TrimFirstChar(R"(
Comma-separated list of globs with optional '-'
prefix. Globs are processed in order of
appearance in the list. Globs without '-'
@@ -74,20 +107,22 @@
checks. This option's value is appended to the
value of the 'Checks' option in .clang-tidy
file, if any.
-)"),
+)")),
cl::init(""), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> WarningsAsErrors("warnings-as-errors", cl::desc(R"(
+static cl::opt<std::string> WarningsAsErrors("warnings-as-errors",
+ cl::desc(TrimFirstChar(R"(
Upgrades warnings to errors. Same format as
'-checks'.
This option's value is appended to the value of
the 'WarningsAsErrors' option in .clang-tidy
file, if any.
-)"),
+)")),
cl::init(""),
cl::cat(ClangTidyCategory));
-static cl::opt<std::string> HeaderFilter("header-filter", cl::desc(R"(
+static cl::opt<std::string> HeaderFilter("header-filter",
+ cl::desc(TrimFirstChar(R"(
Regular expression matching the names of the
headers to output diagnostics from. Diagnostics
from the main file of each translation unit are
@@ -95,7 +130,7 @@
Can be used together with -line-filter.
This option overrides the 'HeaderFilterRegex'
option in .clang-tidy file, if any.
-)"),
+)")),
cl::init(""),
cl::cat(ClangTidyCategory));
@@ -103,7 +138,7 @@
SystemHeaders("system-headers",
cl::desc("Display the errors from system headers."),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> LineFilter("line-filter", cl::desc(R"(
+static cl::opt<std::string> LineFilter("line-filter", cl::desc(TrimFirstChar(R"(
List of files with line ranges to filter the
warnings. Can be used together with
-header-filter. The format of the list is a
@@ -112,35 +147,36 @@
{"name":"file1.cpp","lines":[[1,3],[5,7]]},
{"name":"file2.h"}
]
-)"),
+)")),
cl::init(""),
cl::cat(ClangTidyCategory));
-static cl::opt<bool> Fix("fix", cl::desc(R"(
+static cl::opt<bool> Fix("fix", cl::desc(TrimFirstChar(R"(
Apply suggested fixes. Without -fix-errors
clang-tidy will bail out if any compilation
errors were found.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<bool> FixErrors("fix-errors", cl::desc(R"(
+static cl::opt<bool> FixErrors("fix-errors", cl::desc(TrimFirstChar(R"(
Apply suggested fixes even if compilation
errors were found. If compiler errors have
attached fix-its, clang-tidy will apply them as
well.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<bool> FixNotes("fix-notes", cl::desc(R"(
+static cl::opt<bool> FixNotes("fix-notes", cl::desc(TrimFirstChar(R"(
If a warning has no fix, but a single fix can
be found through an associated diagnostic note,
apply the fix.
Specifying this flag will implicitly enable the
'--fix' flag.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> FormatStyle("format-style", cl::desc(R"(
+static cl::opt<std::string> FormatStyle("format-style",
+ cl::desc(TrimFirstChar(R"(
Style for formatting code around applied fixes:
- 'none' (default) turns off formatting
- 'file' (literally 'file', not a placeholder)
@@ -153,44 +189,44 @@
information about formatting styles and options.
This option overrides the 'FormatStyle` option in
.clang-tidy file, if any.
-)"),
- cl::init("none"),
- cl::cat(ClangTidyCategory));
+)")),
+ cl::init("none"),
+ cl::cat(ClangTidyCategory));
-static cl::opt<bool> ListChecks("list-checks", cl::desc(R"(
+static cl::opt<bool> ListChecks("list-checks", cl::desc(TrimFirstChar(R"(
List all enabled checks and exit. Use with
-checks=* to list all available checks.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<bool> ExplainConfig("explain-config", cl::desc(R"(
+static cl::opt<bool> ExplainConfig("explain-config", cl::desc(TrimFirstChar(R"(
For each enabled check explains, where it is
enabled, i.e. in clang-tidy binary, command
line or a specific configuration file.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> Config("config", cl::desc(R"(
+static cl::opt<std::string> Config("config", cl::desc(TrimFirstChar(R"(
Specifies a configuration in YAML/JSON format:
-config="{Checks: '*',
CheckOptions: {x: y}}"
When the value is empty, clang-tidy will
attempt to find a file named .clang-tidy for
each source file in its parent directories.
-)"),
+)")),
cl::init(""), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> ConfigFile("config-file", cl::desc(R"(
+static cl::opt<std::string> ConfigFile("config-file", cl::desc(TrimFirstChar(R"(
Specify the path of .clang-tidy or custom config file:
e.g. --config-file=/some/path/myTidyConfigFile
This option internally works exactly the same way as
--config option after reading specified config file.
Use either --config-file or --config, not both.
-)"),
+)")),
cl::init(""),
cl::cat(ClangTidyCategory));
-static cl::opt<bool> DumpConfig("dump-config", cl::desc(R"(
+static cl::opt<bool> DumpConfig("dump-config", cl::desc(TrimFirstChar(R"(
Dumps configuration in the YAML format to
stdout. This option can be used along with a
file name (and '--' if the file is outside of a
@@ -199,22 +235,23 @@
printed.
Use along with -checks=* to include
configuration of all checks.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<bool> EnableCheckProfile("enable-check-profile", cl::desc(R"(
+static cl::opt<bool> EnableCheckProfile("enable-check-profile",
+ cl::desc(TrimFirstChar(R"(
Enable per-check timing profiles, and print a
report to stderr.
-)"),
+)")),
cl::init(false),
cl::cat(ClangTidyCategory));
static cl::opt<std::string> StoreCheckProfile("store-check-profile",
- cl::desc(R"(
+ cl::desc(TrimFirstChar(R"(
By default reports are printed in tabulated
format to stderr. When this option is passed,
these per-TU profiles are instead stored as JSON.
-)"),
+)")),
cl::value_desc("prefix"),
cl::cat(ClangTidyCategory));
@@ -226,43 +263,43 @@
cl::init(false), cl::Hidden,
cl::cat(ClangTidyCategory));
-static cl::opt<std::string> ExportFixes("export-fixes", cl::desc(R"(
+static cl::opt<std::string> ExportFixes("export-fixes",
+ cl::desc(TrimFirstChar(R"(
YAML file to store suggested fixes in. The
stored fixes can be applied to the input source
code with clang-apply-replacements.
-)"),
+)")),
cl::value_desc("filename"),
cl::cat(ClangTidyCategory));
-static cl::opt<bool> Quiet("quiet", cl::desc(R"(
+static cl::opt<bool> Quiet("quiet", cl::desc(TrimFirstChar(R"(
Run clang-tidy in quiet mode. This suppresses
printing statistics about ignored warnings and
warnings treated as errors if the respective
options are specified.
-)"),
- cl::init(false),
- cl::cat(ClangTidyCategory));
+)")),
+ cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<std::string> VfsOverlay("vfsoverlay", cl::desc(R"(
+static cl::opt<std::string> VfsOverlay("vfsoverlay", cl::desc(TrimFirstChar(R"(
Overlay the virtual filesystem described by file
over the real file system.
-)"),
+)")),
cl::value_desc("filename"),
cl::cat(ClangTidyCategory));
-static cl::opt<bool> UseColor("use-color", cl::desc(R"(
+static cl::opt<bool> UseColor("use-color", cl::desc(TrimFirstChar(R"(
Use colors in diagnostics. If not set, colors
will be used if the terminal connected to
standard output supports colors.
This option overrides the 'UseColor' option in
.clang-tidy file, if any.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
-static cl::opt<bool> VerifyConfig("verify-config", cl::desc(R"(
+static cl::opt<bool> VerifyConfig("verify-config", cl::desc(TrimFirstChar(R"(
Check the config files to ensure each check and
option is recognized.
-)"),
+)")),
cl::init(false), cl::cat(ClangTidyCategory));
namespace clang::tidy {
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits