home | help
EXTRACLANGTOOLS(1)		Extra Clang Tools	      EXTRACLANGTOOLS(1)

NAME
     extraclangtools - Extra Clang Tools Documentation

     Welcome  to  the clang-tools-extra project which contains extra tools built
     using Clang's tooling APIs.

EXTRA CLANG TOOLS 12.0.0 (IN-PROGRESS) RELEASE NOTES
     * Introduction

     * What's New in Extra Clang Tools 12.0.0?

       * Major New Features

       * Improvements to clangd

	 * Performance

	 * Parsing and selection

	 * Code completion

	 * Go to definition

	 * Find references

	 * New navigation features

	 * Refactoring

	 * Hover

	 * Semantic highlighting

	 * Remote index (alpha)

	 * Configuration

	 * System integration

	 * Miscellaneous

       * Improvements to clang-doc

       * Improvements to clang-query

       * Improvements to clang-rename

       * Improvements to clang-tidy

	 * New modules

	 * New checks

	 * Changes in existing checks

	 * Deprecated checks

       * Improvements to include-fixer

       * Improvements to clang-include-fixer

       * Improvements to modularize

       * Improvements to pp-trace

       * Clang-tidy visual studio plugin

     Written by the LLVM Team

     WARNING:
	These are in-progress notes for the upcoming Extra Clang  Tools  12  re-
	lease.	Release notes for previous releases can be found on the Download
	Page.

   Introduction
     This document contains the release notes for the Extra Clang Tools, part of
     the  Clang  release  12.0.0. Here we describe the status of the Extra Clang
     Tools in some detail, including major improvements from  the  previous  re-
     lease  and new feature work. All LLVM releases may be downloaded from the -
     LLVM releases web site.

     For more information about Clang or LLVM, including information  about  the
     latest release, please see the Clang Web Site or the LLVM Web Site.

     Note  that  if  you  are  reading this file from a Git checkout or the main
     Clang web page, this document applies to the next release, not the  current
     one.  To  see  the  release  notes for a specific release, please see the -
     releases page.

   What's New in Extra Clang Tools 12.0.0?
     Some of the major new features and improvements to Extra  Clang  Tools  are
     listed here. Generic improvements to Extra Clang Tools as a whole or to its
     underlying  infrastructure  are  described first, followed by tool-specific
     sections.

   Major New Features
     ...

   Improvements to clangd
   Performance
     * clangd's memory usage is significantly reduced on most Linux systems.  In
       particular, memory usage should not increase dramatically over time.

       The standard allocator on most systems is glibc's ptmalloc2, and it  cre-
       ates  disproportionately  large	heaps  when handling clangd's allocation
       patterns.  By default, clangd will now periodically call  malloc_trim  to
       release free pages on glibc systems.

       Users of other allocators (such as jemalloc or tcmalloc) on glibc systems
       can  disable  this  using --malloc_trim=0 or the CMake flag -DCLANGD_MAL-
       LOC_TRIM=0.

     * Added the $/memoryUsage request:  an  LSP  extension.   This  provides  a
       breakdown of the memory clangd thinks it is using (excluding malloc over-
       head  etc). The clangd VSCode extension supports showing the memory usage
       tree.

   Parsing and selection
     * Improved navigation of broken code in C using  Recovery	AST.  (This  has
       been enabled for C++ since clangd 11).

     * Types  are  understood  more often in broken code. (This is the first re-
       lease where Recovery AST preserves speculated types).

     * Heuristic resolution for dependent names in templates.

   Code completion
     * Higher priority for symbols that were already used in this file, and sym-
       bols from namespaces mentioned in this file. (Estimated 3%  accuracy  im-
       provement)

     * Introduced a ranking algorithm trained on snippets from a large C++ code-
       base.   Use  the  flag --ranking-model=decision_forest to try this (Esti-
       mated 6% accuracy improvement). This mode is likely to become the default
       in future.

       Note: this is a generic model, not specialized for your code. clangd does
       not collect any data from your code to train code completion.

     * Signature help works with  functions  with  template-dependent  parameter
       types.

   Go to definition
     * Selecting an auto or decltype keyword will attempt to navigate to a defi-
       nition of the deduced type.

     * Improved  handling of aliases: navigate to the underlying entity more of-
       ten.

     * Better understanding of declaration vs definition for Objective-C classes
       and protocols.

     * Selecting a pure-virtual method shows its overrides.

   Find references
     * Indexes are smarter about not returning stale  references  when	code  is
       deleted.

     * References  in implementation files are always indexed, so results should
       be more complete.

     * Find-references on a virtual method shows references to overridden  meth-
       ods.

   New navigation features
     * Call  hierarchy (textDocument/callHierarchy) is supported.  Only incoming
       calls are available.

     * Go to implementation (textDocument/implementation) is  supported  on  ab-
       stract classes, and on virtual methods.

     * Symbol  search  (workspace/symbol)  queries  may  be partially qualified.
       That is, typing b::Foo will match the symbol a::b::c::Foo.

   Refactoring
     * New refactoring: populate switch statement with cases.  (This acts  as  a
       fix for the -Wswitch-enum warning).

     * Renaming templates is supported, and many other complex cases were fixed.

     * Attempting to rename to an invalid or conflicting name can produce an er-
       ror message rather than broken code. (Not all cases are detected!)

     * The accuracy of many code actions has been improved.

   Hover
     * Hovers  for  auto  and  decltype show the type in the same style as other
       hovers. this is also now supported.

     * Displayed type names are more consistent and idiomatic.

   Semantic highlighting
     * Inactive preprocessor regions (#ifdef) are highlighted as comments.

     * clangd 12 is the last release with support for the non-standard textDocu-
       ment/semanticHighlights	notification.  Clients	sholud	migrate  to  the
       textDocument/semanticTokens request added in LSP 3.16.

   Remote index (alpha)
     * clangd  can  now  connect  to a remote index server instead of building a
       project index locally. This saves resources in large codebases  that  are
       slow to index.

     * The  server  program  is clangd-index-server, and it consumes index files
       produced by clangd-indexer.

     * This feature requires clangd to be built with the CMake flag -DCLANGD_EN-
       ABLE_REMOTE=On, which requires GRPC libraries and is not enabled  by  de-
       fault.  Unofficial releases of the remote-index-enabled client and server
       tools are at https://github.com/clangd/clangd/releases

     * Large projects can deploy a shared server, and check in a .clangd file to
       enable it (in the Index.External section). We  hope  to	provide  such  a
       server for llvm-project itself in the near future.

   Configuration
     * Static  and  remote  indexes can be configured in the Index.External sec-
       tion.  Different static indexes can now	be  used  for  different  files.
       (Obsoletes the flag --index-file).

     * Diagnostics can be filtered or suppressed in the Diagnostics section.

     * Clang-tidy  checks  can	be enabled/disabled in the Diagnostics.ClangTidy
       section. (Obsoletes the flag --clang-tidy-checks).

     * The compilation database directory can be configured in the  CompileFlags
       section. Different compilation databases can now be specified for differ-
       ent files. (Obsoletes the flag --compile-commands-dir).

     * Errors  in  loaded  configuration files are published as LSP diagnostics,
       and so should be shown in your editor.

     Full reference of configuration options

   System integration
     * Changes to compile_commands.json and compile_flags.txt will  take  effect
       the next time a file is parsed, without restarting clangd.

     * clangd  --check=<filename>  can	be  run  on the command-line to simulate
       opening a file without actually using an editor. This can  be  useful  to
       reproduce crashes or aother problems.

     * Various	fixes  to handle filenames correctly (and case-insensitively) on
       windows.

     * If incoming LSP messages are malformed, the logs now contain details.

   Miscellaneous
     * "Show AST" request (textDocument/ast) added as  an  LSP	extension.  This
       displays a simplified view of the clang AST for selected code. The clangd
       VSCode extension supports this.

     * clangd should no longer crash while loading old or corrupt index files.

     * The flags --index, --recovery-ast and -suggest-missing-includes have been
       retired. These features are now always enabled.

     * Too many stability and correctness fixes to mention.

   Improvements to clang-doc
     The improvements are...

   Improvements to clang-query
     * The IgnoreImplicitCastsAndParentheses traversal mode has been removed.

   Improvements to clang-rename
     The improvements are...

   Improvements to clang-tidy
     * Checks  that  allow  configuring  names of headers to include now support
       wrapping the include in angle brackets to create a  system  include.  For
       example, cppcoreguidelines-init-variables and modernize-make-unique.

     * CheckOptions that take boolean values now support all spellings supported
       in the YAML format.

   New modules
     * New altera module.

       Includes  checks  related  to OpenCL for FPGA coding guidelines, based on
       the Altera SDK for OpenCL: Best Practices Guide.

     * New concurrency module.

       Includes checks related to concurrent programming (e.g. threads,  fibers,
       coroutines, etc.).

   New checks
     * New altera-kernel-name-restriction check.

       Finds  kernel  files  and include directives whose filename is kernel.cl,
       Verilog.cl, or VHDL.cl.

     * New altera-single-work-item-barrier check.

       Finds OpenCL kernel functions that call a barrier  function  but  do  not
       call an ID function.

     * New altera-struct-pack-align check.

       Finds  structs  that  are inefficiently packed or aligned, and recommends
       packing and/or aligning of said structs as needed.

     * New bugprone-misplaced-pointer-arithmetic-in-alloc check.

     * New bugprone-redundant-branch-condition check.

       Finds condition variables in nested if statements that were also  checked
       in the outer if statement and were not changed.

     * New concurrency-mt-unsafe check.

       Finds  thread-unsafe  functions	usage.	Currently  knows about POSIX and
       Glibc function sets.

     * New bugprone-signal-handler check.

       Finds functions registered as signal handlers  that  call  non  asynchro-
       nous-safe functions.

     * New cert-sig30-c check.

       Alias to the bugprone-signal-handler check.

     * New performance-no-int-to-ptr check.

       Diagnoses every integer to pointer cast.

     * New readability-function-cognitive-complexity check.

       Flags functions with Cognitive Complexity metric exceeding the configured
       limit.

   Changes in existing checks
     * Improved modernize-loop-convert check.

       Now able to transform iterator loops using rbegin and rend methods.

     * Improved readability-identifier-naming check.

       Added  an  option  GetConfigPerFile  to support including files which use
       different naming styles.

       Now renames overridden virtual methods if the method they override has  a
       style violation.

       Added  support  for specifying the style of scoped enum constants. If un-
       specified, will fall back to the style for regular enum constants.

       Added an option IgnoredRegexp per identifier type to suppress  identifier
       naming checks for names matching a regular expression.

     * Removed	google-runtime-references  check because the rule it checks does
       not exist in the Google Style Guide anymore.

     * Improved readability-redundant-string-init check.

       Added std::basic_string_view to default list of string-like types.

   Deprecated checks
     * The readability-deleted-default check has been deprecated.

       The clang warning Wdefaulted-function-deleted will diagnose the same  is-
       sues and is enabled by default.

   Improvements to include-fixer
     The improvements are...

   Improvements to clang-include-fixer
     The improvements are...

   Improvements to modularize
     The improvements are...

   Improvements to pp-trace
     The improvements are...

   Clang-tidy visual studio plugin
CLANG-TIDY
   Contents
     * Clang-Tidy

       * Using clang-tidy

       * Suppressing Undesired Diagnostics

     See also:

   Clang-Tidy Checks
   abseil-duration-addition
     Check  for  cases	where addition should be performed in the absl::Time do-
     main.  When adding two values, and one is known to be an absl::Time, we can
     infer that the other should be interpreted as an absl::Duration of a  simi-
     lar scale, and make that inference explicit.

     Examples:

	// Original - Addition in the integer domain
	int x;
	absl::Time t;
	int result = absl::ToUnixSeconds(t) + x;

	// Suggestion - Addition in the absl::Time domain
	int result = absl::ToUnixSeconds(t + absl::Seconds(x));

   abseil-duration-comparison
     Checks for comparisons which should be in the absl::Duration domain instead
     of the floating point or integer domains.

     N.B.:  In cases where a Duration was being converted to an integer and then
     compared against a floating-point value,  truncation  during  the	Duration
     conversion  might	yield a different result. In practice this is very rare,
     and still indicates a bug which should be fixed.

     Examples:

	// Original - Comparison in the floating point domain
	double x;
	absl::Duration d;
	if (x < absl::ToDoubleSeconds(d)) ...

	// Suggested - Compare in the absl::Duration domain instead
	if (absl::Seconds(x) < d) ...

	// Original - Comparison in the integer domain
	int x;
	absl::Duration d;
	if (x < absl::ToInt64Microseconds(d)) ...

	// Suggested - Compare in the absl::Duration domain instead
	if (absl::Microseconds(x) < d) ...

   abseil-duration-conversion-cast
     Checks for casts of absl::Duration conversion functions, and recommends the
     right conversion function instead.

     Examples:

	// Original - Cast from a double to an integer
	absl::Duration d;
	int i = static_cast<int>(absl::ToDoubleSeconds(d));

	// Suggested - Use the integer conversion function directly.
	int i = absl::ToInt64Seconds(d);

	// Original - Cast from a double to an integer
	absl::Duration d;
	double x = static_cast<double>(absl::ToInt64Seconds(d));

	// Suggested - Use the integer conversion function directly.
	double x = absl::ToDoubleSeconds(d);

     Note: In the second example, the suggested fix could yield a different  re-
     sult,  as	the  conversion to integer could truncate.  In practice, this is
     very rare, and you should use absl::Trunc to perform this operation explic-
     itly instead.

   abseil-duration-division
     absl::Duration arithmetic works like it does with integers. That means that
     division of two absl::Duration objects returns an int64 with any fractional
     component truncated toward 0. See this link for more information on  arith-
     metic with absl::Duration.

     For example:

	absl::Duration d = absl::Seconds(3.5);
	int64 sec1 = d / absl::Seconds(1);     // Truncates toward 0.
	int64 sec2 = absl::ToInt64Seconds(d);  // Equivalent to division.
	assert(sec1 == 3 && sec2 == 3);

	double dsec = d / absl::Seconds(1);  // WRONG: Still truncates toward 0.
	assert(dsec == 3.0);

     If  you want floating-point division, you should use either the absl::FDiv-
     Duration() function, or one  of  the  unit  conversion  functions	such  as
     absl::ToDoubleSeconds(). For example:

	absl::Duration d = absl::Seconds(3.5);
	double dsec1 = absl::FDivDuration(d, absl::Seconds(1));  // GOOD: No truncation.
	double dsec2 = absl::ToDoubleSeconds(d);		 // GOOD: No truncation.
	assert(dsec1 == 3.5 && dsec2 == 3.5);

     This  check  looks  for  uses  of absl::Duration division that is done in a
     floating-point context, and recommends the use of a function that returns a
     floating-point value.

   abseil-duration-factory-float
     Checks for cases where the floating-point overloads of various  absl::Dura-
     tion  factory functions are called when the more-efficient integer versions
     could be used instead.

     This check will not suggest fixes for  literals  which  contain  fractional
     floating point values or non-literals. It will suggest removing superfluous
     casts.

     Examples:

	// Original - Providing a floating-point literal.
	absl::Duration d = absl::Seconds(10.0);

	// Suggested - Use an integer instead.
	absl::Duration d = absl::Seconds(10);

	// Original - Explicitly casting to a floating-point type.
	absl::Duration d = absl::Seconds(static_cast<double>(10));

	// Suggested - Remove the explicit cast
	absl::Duration d = absl::Seconds(10);

   abseil-duration-factory-scale
     Checks  for  cases  where arguments to absl::Duration factory functions are
     scaled internally and could be changed to	a  different  factory  function.
     This  check  also	looks for arguments with a zero value and suggests using
     absl::ZeroDuration() instead.

     Examples:

	// Original - Internal multiplication.
	int x;
	absl::Duration d = absl::Seconds(60 * x);

	// Suggested - Use absl::Minutes instead.
	absl::Duration d = absl::Minutes(x);

	// Original - Internal division.
	int y;
	absl::Duration d = absl::Milliseconds(y / 1000.);

	// Suggested - Use absl:::Seconds instead.
	absl::Duration d = absl::Seconds(y);

	// Original - Zero-value argument.
	absl::Duration d = absl::Hours(0);

	// Suggested = Use absl::ZeroDuration instead
	absl::Duration d = absl::ZeroDuration();

   abseil-duration-subtraction
     Checks for cases where subtraction should be performed in	the  absl::Dura-
     tion  domain. When subtracting two values, and the first one is known to be
     a conversion from absl::Duration, we can infer that the second should  also
     be interpreted as an absl::Duration, and make that inference explicit.

     Examples:

	// Original - Subtraction in the double domain
	double x;
	absl::Duration d;
	double result = absl::ToDoubleSeconds(d) - x;

	// Suggestion - Subtraction in the absl::Duration domain instead
	double result = absl::ToDoubleSeconds(d - absl::Seconds(x));

	// Original - Subtraction of two Durations in the double domain
	absl::Duration d1, d2;
	double result = absl::ToDoubleSeconds(d1) - absl::ToDoubleSeconds(d2);

	// Suggestion - Subtraction in the absl::Duration domain instead
	double result = absl::ToDoubleSeconds(d1 - d2);

     Note:  As	with other clang-tidy checks, it is possible that multiple fixes
     may overlap (as in the case of nested expressions), so not all  occurrences
     can  be  transformed  in  one run. In particular, this may occur for nested
     subtraction expressions. Running clang-tidy multiple times  will  find  and
     fix these overlaps.

   abseil-duration-unnecessary-conversion
     Finds  and  fixes	cases where absl::Duration values are being converted to
     numeric types and back again.

     Floating-point examples:

	// Original - Conversion to double and back again
	absl::Duration d1;
	absl::Duration d2 = absl::Seconds(absl::ToDoubleSeconds(d1));

	// Suggestion - Remove unnecessary conversions
	absl::Duration d2 = d1;

	// Original - Division to convert to double and back again
	absl::Duration d2 = absl::Seconds(absl::FDivDuration(d1, absl::Seconds(1)));

	// Suggestion - Remove division and conversion
	absl::Duration d2 = d1;

     Integer examples:

	// Original - Conversion to integer and back again
	absl::Duration d1;
	absl::Duration d2 = absl::Hours(absl::ToInt64Hours(d1));

	// Suggestion - Remove unnecessary conversions
	absl::Duration d2 = d1;

	// Original - Integer division followed by conversion
	absl::Duration d2 = absl::Seconds(d1 / absl::Seconds(1));

	// Suggestion - Remove division and conversion
	absl::Duration d2 = d1;

     Unwrapping scalar operations:

	// Original - Multiplication by a scalar
	absl::Duration d1;
	absl::Duration d2 = absl::Seconds(absl::ToInt64Seconds(d1) * 2);

	// Suggestion - Remove unnecessary conversion
	absl::Duration d2 = d1 * 2;

     Note: Converting to an integer and back to an  absl::Duration  might  be  a
     truncating  operation  if	the value is not aligned to the scale of conver-
     sion.  In the rare case where this is the intended result,  callers  should
     use absl::Trunc to truncate explicitly.

   abseil-faster-strsplit-delimiter
     Finds  instances  of absl::StrSplit() or absl::MaxSplits() where the delim-
     iter is a single character string literal and replaces  with  a  character.
     The check will offer a suggestion to change the string literal into a char-
     acter.   It  will also catch code using absl::ByAnyChar() for just a single
     character and will transform that into a single character as well.

     These changes will give the same result, but using characters  rather  than
     single character string literals is more efficient and readable.

     Examples:

	// Original - the argument is a string literal.
	for (auto piece : absl::StrSplit(str, "B")) {

	// Suggested - the argument is a character, which causes the more efficient
	// overload of absl::StrSplit() to be used.
	for (auto piece : absl::StrSplit(str, 'B')) {

	// Original - the argument is a string literal inside absl::ByAnyChar call.
	for (auto piece : absl::StrSplit(str, absl::ByAnyChar("B"))) {

	// Suggested - the argument is a character, which causes the more efficient
	// overload of absl::StrSplit() to be used and we do not need absl::ByAnyChar
	// anymore.
	for (auto piece : absl::StrSplit(str, 'B')) {

	// Original - the argument is a string literal inside absl::MaxSplits call.
	for (auto piece : absl::StrSplit(str, absl::MaxSplits("B", 1))) {

	// Suggested - the argument is a character, which causes the more efficient
	// overload of absl::StrSplit() to be used.
	for (auto piece : absl::StrSplit(str, absl::MaxSplits('B', 1))) {
     subl.. title:: clang-tidy - abseil-no-internal-dependencies

   abseil-no-internal-dependencies
     Warns  if code using Abseil depends on internal details. If something is in
     a namespace that includes the word ainternala, code is not allowed  to  de-
     pend  upon it beaucse itas an implementation detail. They cannot friend it,
     include it, you mention it or refer to it in any way. Doing so violates Ab-
     seil's  compatibility  guidelines	and  may  result  in  breakage.  See   -
     https://abseil.io/about/compatibility for more information.

     The following cases will result in warnings:

	absl::strings_internal::foo();
	// warning triggered on this line
	class foo {
	  friend struct absl::container_internal::faa;
	  // warning triggered on this line
	};
	absl::memory_internal::MakeUniqueResult();
	// warning triggered on this line

   abseil-no-namespace
     Ensures code does not open namespace absl as that violates Abseil's compat-
     ibility  guidelines.  Code should not open namespace absl as that conflicts
     with Abseil's compatibility guidelines and may result in breakage.

     Any code that uses:

	namespace absl {
	 ...
	}

     will be prompted with a warning.

     See the full Abseil compatibility guidelines for more information.

   abseil-redundant-strcat-calls
     Suggests removal of unnecessary calls to absl::StrCat when  the  result  is
     being passed to another call to absl::StrCat or absl::StrAppend.

     The  extra calls cause unnecessary temporary strings to be constructed. Re-
     moving them makes the code smaller and faster.

     Examples:

	std::string s = absl::StrCat("A", absl::StrCat("B", absl::StrCat("C", "D")));
	//before

	std::string s = absl::StrCat("A", "B", "C", "D");
	//after

	absl::StrAppend(&s, absl::StrCat("E", "F", "G"));
	//before

	absl::StrAppend(&s, "E", "F", "G");
	//after

   abseil-str-cat-append
     Flags  uses  of  absl::StrCat()  to  append  to  a  std::string.	Suggests
     absl::StrAppend() should be used instead.

     The  extra calls cause unnecessary temporary strings to be constructed. Re-
     moving them makes the code smaller and faster.

	a = absl::StrCat(a, b); // Use absl::StrAppend(&a, b) instead.

     Does not diagnose cases where absl::StrCat() is used as a template argument
     for a functor.

   abseil-string-find-startswith
     Checks whether a std::string::find() result is compared with  0,  and  sug-
     gests  replacing  with  absl::StartsWith().  This is both a readability and
     performance issue.

	string s = "...";
	if (s.find("Hello World") == 0) { /* do something */ }

     becomes

	string s = "...";
	if (absl::StartsWith(s, "Hello World")) { /* do something */ }

   Options
     StringLikeClasses
	    Semicolon-separated list of names of string-like classes. By default
	    only std::basic_string is considered. The list of methods to consid-
	    ered is fixed.

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     AbseilStringsMatchHeader
	    The   location   of   Abseil's    strings/match.h.	  Defaults    to
	    absl/strings/match.h.

   abseil-string-find-str-contains
     Finds  s.find(...)  ==  string::npos  comparisons	(for various string-like
     types) and suggests replacing with absl::StrContains().

     This improves readability and reduces the likelihood of accidentally mixing
     find() and npos from different string-like types.

     By default, "string-like types"  includes	::std::basic_string,  ::std::ba-
     sic_string_view, and ::absl::string_view.	See the StringLikeClasses option
     to change this.

	std::string s = "...";
	if (s.find("Hello World") == std::string::npos) { /* do something */ }

	absl::string_view a = "...";
	if (absl::string_view::npos != a.find("Hello World")) { /* do something */ }

     becomes

	std::string s = "...";
	if (!absl::StrContains(s, "Hello World")) { /* do something */ }

	absl::string_view a = "...";
	if (absl::StrContains(a, "Hello World")) { /* do something */ }

   Options
     StringLikeClasses
	    Semicolon-separated list of names of string-like classes. By default
	    includes	::std::basic_string,	::std::basic_string_view,    and
	    ::absl::string_view.

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     AbseilStringsMatchHeader
	    The   location   of   Abseil's    strings/match.h.	  Defaults    to
	    absl/strings/match.h.

   abseil-time-comparison
     Prefer comparisons in the absl::Time domain instead of the integer domain.

     N.B.: In cases where an absl::Time is being converted to an integer, align-
     ment may occur. If the comparison depends on this alignment, doing the com-
     parison  in the absl::Time domain may yield a different result. In practice
     this is very rare, and still indicates a bug which should be fixed.

     Examples:

	// Original - Comparison in the integer domain
	int x;
	absl::Time t;
	if (x < absl::ToUnixSeconds(t)) ...

	// Suggested - Compare in the absl::Time domain instead
	if (absl::FromUnixSeconds(x) < t) ...

   abseil-time-subtraction
     Finds and fixes absl::Time subtraction expressions to do subtraction in the
     Time domain instead of the numeric domain.

     There are two cases of Time subtraction in which deduce additional type in-
     formation:

     * When the result is  an  absl::Duration  and  the  first	argument  is  an
       absl::Time.

     * When the second argument is a absl::Time.

     In  the first case, we must know the result of the operation, since without
     that the second operand could be either an absl::Time or an absl::Duration.
     In the second case, the first operand must be an absl::Time,  because  sub-
     tracting an absl::Time from an absl::Duration is not defined.

     Examples:

	int x;
	absl::Time t;

	// Original - absl::Duration result and first operand is a absl::Time.
	absl::Duration d = absl::Seconds(absl::ToUnixSeconds(t) - x);

	// Suggestion - Perform subtraction in the Time domain instead.
	absl::Duration d = t - absl::FromUnixSeconds(x);

	// Original - Second operand is an absl::Time.
	int i = x - absl::ToUnixSeconds(t);

	// Suggestion - Perform subtraction in the Time domain instead.
	int i = absl::ToInt64Seconds(absl::FromUnixSeconds(x) - t);

   abseil-upgrade-duration-conversions
     Finds  calls to absl::Duration arithmetic operators and factories whose ar-
     gument needs an explicit cast to  continue  compiling  after  upcoming  API
     changes.

     The operators *=, /=, *, and / for absl::Duration currently accept an argu-
     ment  of  class type that is convertible to an arithmetic type. Such a call
     currently converts the value  to  an  int64_t,  even  in  a  case	such  as
     std::atomic<float> that would result in lossy conversion.

     Additionally, the absl::Duration factory functions (absl::Hours, absl::Min-
     utes, etc) currently accept an int64_t or a floating-point type. Similar to
     the arithmetic operators, calls with an argument of class type that is con-
     vertible to an arithmetic type go through the int64_t path.

     These  operators  and  factories  will be changed to only accept arithmetic
     types to prevent unintended behavior. After  these  changes  are  released,
     passing  an argument of class type will no longer compile, even if the type
     is implicitly convertible to an arithmetic type.

     Here are example fixes created by this check:

	std::atomic<int> a;
	absl::Duration d = absl::Milliseconds(a);
	d *= a;

     becomes

	std::atomic<int> a;
	absl::Duration d = absl::Milliseconds(static_cast<int64_t>(a));
	d *= static_cast<int64_t>(a);

     Note that this check always adds a cast to int64_t in order to preserve the
     current behavior of user code. It is possible that this uncovers unintended
     behavior due to types implicitly convertible to a floating-point type.

   altera-kernel-name-restriction
     Finds kernel files and include directives whose filename is kernel.cl, Ver-
     ilog.cl, or VHDL.cl. The check is case insensitive.

     Such kernel file names cause the offline compiler to generate  intermediate
     design  files  that  have	the  same names as certain internal files, which
     leads to a compilation error.

     Based on the Guidelines for Naming the Kernel section in the Intel FPGA SDK
     for OpenCL Pro Edition: Programming Guide.

   altera-single-work-item-barrier
     Finds OpenCL kernel functions that call a barrier function but do not  call
     an ID function (get_local_id, get_local_id, get_group_id, or get_local_lin-
     ear_id).

     These kernels may be viable single work-item kernels, but will be forced to
     execute  as  NDRange kernels if using a newer version of the Altera Offline
     Compiler (>= v17.01).

     If using an older version of the  Altera  Offline	Compiler,  these  kernel
     functions will be treated as single work-item kernels, which could be inef-
     ficient or lead to errors if NDRange semantics were intended.

     Based on the Altera SDK for OpenCL: Best Practices Guide.

     Examples:

	// error: function calls barrier but does not call an ID function.
	void __kernel barrier_no_id(__global int * foo, int size) {
	  for (int i = 0; i < 100; i++) {
	    foo[i] += 5;
	  }
	  barrier(CLK_GLOBAL_MEM_FENCE);
	}

	// ok: function calls barrier and an ID function.
	void __kernel barrier_with_id(__global int * foo, int size) {
	  for (int i = 0; i < 100; i++) {
	    int tid = get_global_id(0);
	    foo[tid] += 5;
	  }
	  barrier(CLK_GLOBAL_MEM_FENCE);
	}

	// ok with AOC Version 17.01: the reqd_work_group_size turns this into
	// an NDRange.
	__attribute__((reqd_work_group_size(2,2,2)))
	void __kernel barrier_with_id(__global int * foo, int size) {
	  for (int i = 0; i < 100; i++) {
	    foo[tid] += 5;
	  }
	  barrier(CLK_GLOBAL_MEM_FENCE);
	}

   Options
     AOCVersion
	    Defines the version of the Altera Offline Compiler. Defaults to 1600
	    (corresponding to version 16.00).

   altera-struct-pack-align
     Finds  structs  that  are	inefficiently  packed or aligned, and recommends
     packing and/or aligning of said structs as needed.

     Structs that are not packed take up more space than they  should,	and  ac-
     cessing structs that are not well aligned is inefficient.

     Fix-its are provided to fix both of these issues by inserting and/or amend-
     ing relevant struct attributes.

     Based on the Altera SDK for OpenCL: Best Practices Guide.

	// The following struct is originally aligned to 4 bytes, and thus takes up
	// 12 bytes of memory instead of 10. Packing the struct will make it use
	// only 10 bytes of memory, and aligning it to 16 bytes will make it
	// efficient to access.
	struct example {
	  char a;    // 1 byte
	  double b;  // 8 bytes
	  char c;    // 1 byte
	};

	// The following struct is arranged in such a way that packing is not needed.
	// However, it is aligned to 4 bytes instead of 8, and thus needs to be
	// explicitly aligned.
	struct implicitly_packed_example {
	  char a;  // 1 byte
	  char b;  // 1 byte
	  char c;  // 1 byte
	  char d;  // 1 byte
	  int e;   // 4 bytes
	};

	// The following struct is explicitly aligned and packed.
	struct good_example {
	  char a;    // 1 byte
	  double b;  // 8 bytes
	  char c;    // 1 byte
	} __attribute__((packed)) __attribute__((aligned(16));

	// Explicitly aligning a struct to the wrong value will result in a warning.
	// The following example should be aligned to 16 bytes, not 32.
	struct badly_aligned_example {
	  char a;    // 1 byte
	  double b;  // 8 bytes
	  char c;    // 1 byte
	} __attribute__((packed)) __attribute__((aligned(32)));

   android-cloexec-accept
     The  usage  of  accept()  is not recommended, it's better to use accept4().
     Without this flag, an opened sensitive file descriptor  would  remain  open
     across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	accept(sockfd, addr, addrlen);

	// becomes

	accept4(sockfd, addr, addrlen, SOCK_CLOEXEC);

   android-cloexec-accept4
     accept4()	should	include  SOCK_CLOEXEC  in its type argument to avoid the
     file descriptor leakage. Without this flag, an opened sensitive file  would
     remain open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	accept4(sockfd, addr, addrlen, SOCK_NONBLOCK);

	// becomes

	accept4(sockfd, addr, addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC);

   android-cloexec-creat
     The usage of creat() is not recommended, it's better to use open().

     Examples:

	int fd = creat(path, mode);

	// becomes

	int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, mode);

   android-cloexec-dup
     The  usage  of  dup() is not recommended, it's better to use fcntl(), which
     can set the close-on-exec flag. Otherwise, an opened sensitive  file  would
     remain open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	int fd = dup(oldfd);

	// becomes

	int fd = fcntl(oldfd, F_DUPFD_CLOEXEC);

   android-cloexec-epoll-create
     The  usage  of  epoll_create()  is  not  recommended,  it's  better  to use
     epoll_create1(), which allows close-on-exec.

     Examples:

	epoll_create(size);

	// becomes

	epoll_create1(EPOLL_CLOEXEC);

   android-cloexec-epoll-create1
     epoll_create1() should include EPOLL_CLOEXEC in its type argument to  avoid
     the  file	descriptor  leakage. Without this flag, an opened sensitive file
     would remain open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	epoll_create1(0);

	// becomes

	epoll_create1(EPOLL_CLOEXEC);

   android-cloexec-fopen
     fopen() should include e in their mode string; so re would be  valid.  This
     is equivalent to having set FD_CLOEXEC on that descriptor.

     Examples:

	fopen("fn", "r");

	// becomes

	fopen("fn", "re");

   android-cloexec-inotify-init
     The  usage  of  inotify_init()  is not recommended, it's better to use ino-
     tify_init1().

     Examples:

	inotify_init();

	// becomes

	inotify_init1(IN_CLOEXEC);

   android-cloexec-inotify-init1
     inotify_init1() should include IN_CLOEXEC in its type argument to avoid the
     file descriptor leakage. Without this flag, an opened sensitive file  would
     remain open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	inotify_init1(IN_NONBLOCK);

	// becomes

	inotify_init1(IN_NONBLOCK | IN_CLOEXEC);

   android-cloexec-memfd-create
     memfd_create() should include MFD_CLOEXEC in its type argument to avoid the
     file  descriptor leakage. Without this flag, an opened sensitive file would
     remain open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	memfd_create(name, MFD_ALLOW_SEALING);

	// becomes

	memfd_create(name, MFD_ALLOW_SEALING | MFD_CLOEXEC);

   android-cloexec-open
     A common source of security bugs is code that opens a  file  without  using
     the  O_CLOEXEC flag.  Without that flag, an opened sensitive file would re-
     main open across a fork+exec to a lower-privileged SELinux domain,  leaking
     that  sensitive  data.  Open-like functions including open(), openat(), and
     open64() should include O_CLOEXEC in their flags argument.

     Examples:

	open("filename", O_RDWR);
	open64("filename", O_RDWR);
	openat(0, "filename", O_RDWR);

	// becomes

	open("filename", O_RDWR | O_CLOEXEC);
	open64("filename", O_RDWR | O_CLOEXEC);
	openat(0, "filename", O_RDWR | O_CLOEXEC);

   android-cloexec-pipe
     This check detects usage  of  pipe().  Using  pipe()  is  not  recommended,
     pipe2()  is  the  suggested  replacement. The check also adds the O_CLOEXEC
     flag that marks the file descriptor to be closed in child processes.  With-
     out this flag a sensitive file descriptor can be leaked to a child process,
     potentially into a lower-privileged SELinux domain.

     Examples:

	pipe(pipefd);

     Suggested replacement:

	pipe2(pipefd, O_CLOEXEC);

   android-cloexec-pipe2
     This  checks  ensures  that  pipe2() is called with the O_CLOEXEC flag. The
     check also adds the O_CLOEXEC flag that marks the	file  descriptor  to  be
     closed  in  child processes.  Without this flag a sensitive file descriptor
     can be leaked to a  child	process,  potentially  into  a	lower-privileged
     SELinux domain.

     Examples:

	pipe2(pipefd, O_NONBLOCK);

     Suggested replacement:

	pipe2(pipefd, O_NONBLOCK | O_CLOEXEC);

   android-cloexec-socket
     socket() should include SOCK_CLOEXEC in its type argument to avoid the file
     descriptor  leakage.  Without this flag, an opened sensitive file would re-
     main open across a fork+exec to a lower-privileged SELinux domain.

     Examples:

	socket(domain, type, SOCK_STREAM);

	// becomes

	socket(domain, type, SOCK_STREAM | SOCK_CLOEXEC);

   android-comparison-in-temp-failure-retry
     Diagnoses comparisons that appear to be incorrectly placed in the	argument
     to the TEMP_FAILURE_RETRY macro. Having such a use is incorrect in the vast
     majority  of  cases,  and	will  often  silently  defeat the purpose of the
     TEMP_FAILURE_RETRY macro.

     For context, TEMP_FAILURE_RETRY is a convenience  macro  provided	by  both
     glibc  and  Bionic. Its purpose is to repeatedly run a syscall until it ei-
     ther succeeds, or fails for reasons other than being interrupted.

     Example buggy usage looks like:

	char cs[1];
	while (TEMP_FAILURE_RETRY(read(STDIN_FILENO, cs, sizeof(cs)) != 0)) {
	  // Do something with cs.
	}

     Because TEMP_FAILURE_RETRY will check for whether the result of the compar-
     ison is -1, and retry if so.

     If you encounter this, the fix is simple: lift the comparison  out  of  the
     TEMP_FAILURE_RETRY argument, like so:

	char cs[1];
	while (TEMP_FAILURE_RETRY(read(STDIN_FILENO, cs, sizeof(cs))) != 0) {
	  // Do something with cs.
	}

   Options
     RetryMacros
	    A comma-separated list of the names of retry macros to be checked.

   boost-use-to-string
     This  check  finds  conversion from integer type like int to std::string or
     std::wstring using  boost::lexical_cast,  and  replace  it  with  calls  to
     std::to_string and std::to_wstring.

     It  doesn't  replace  conversion from floating points despite the to_string
     overloads, because it would change the behaviour.

	auto str = boost::lexical_cast<std::string>(42);
	auto wstr = boost::lexical_cast<std::wstring>(2137LL);

	// Will be changed to
	auto str = std::to_string(42);
	auto wstr = std::to_wstring(2137LL);

   bugprone-argument-comment
     Checks that argument comments match parameter names.

     The check understands argument comments  in  the  form  /*parameter_name=*/
     that are placed right before the argument.

	void f(bool foo);

	...

	f(/*bar=*/true);
	// warning: argument name 'bar' in comment does not match parameter name 'foo'

     The check tries to detect typos and suggest automated fixes for them.

   Options
     StrictMode
	    When false (default value), the check will ignore leading and trail-
	    ing  underscores and case when comparing names -- otherwise they are
	    taken into account.

     IgnoreSingleArgument
	    When true, the check will ignore the single argument.

     CommentBoolLiterals
	    When true, the check will add argument comments in the format  /*Pa-
	    rameterName=*/ right before the boolean literal argument.

     Before:

	void foo(bool TurnKey, bool PressButton);

	foo(true, false);

     After:

	void foo(bool TurnKey, bool PressButton);

	foo(/*TurnKey=*/true, /*PressButton=*/false);

     CommentIntegerLiterals
	    When  true, the check will add argument comments in the format /*Pa-
	    rameterName=*/ right before the integer literal argument.

     Before:

	void foo(int MeaningOfLife);

	foo(42);

     After:

	void foo(int MeaningOfLife);

	foo(/*MeaningOfLife=*/42);

     CommentFloatLiterals
	    When true, the check will add argument comments in the format  /*Pa-
	    rameterName=*/ right before the float/double literal argument.

     Before:

	void foo(float Pi);

	foo(3.14159);

     After:

	void foo(float Pi);

	foo(/*Pi=*/3.14159);

     CommentStringLiterals
	    When  true, the check will add argument comments in the format /*Pa-
	    rameterName=*/ right before the string literal argument.

     Before:

	void foo(const char *String);
	void foo(const wchar_t *WideString);

	foo("Hello World");
	foo(L"Hello World");

     After:

	void foo(const char *String);
	void foo(const wchar_t *WideString);

	foo(/*String=*/"Hello World");
	foo(/*WideString=*/L"Hello World");

     CommentCharacterLiterals
	    When true, the check will add argument comments in the format  /*Pa-
	    rameterName=*/ right before the character literal argument.

     Before:

	void foo(char *Character);

	foo('A');

     After:

	void foo(char *Character);

	foo(/*Character=*/'A');

     CommentUserDefinedLiterals
	    When  true, the check will add argument comments in the format /*Pa-
	    rameterName=*/ right before the user defined literal argument.

     Before:

	void foo(double Distance);

	double operator"" _km(long double);

	foo(402.0_km);

     After:

	void foo(double Distance);

	double operator"" _km(long double);

	foo(/*Distance=*/402.0_km);

     CommentNullPtrs
	    When true, the check will add argument comments in the format  /*Pa-
	    rameterName=*/ right before the nullptr literal argument.

     Before:

	void foo(A* Value);

	foo(nullptr);

     After:

	void foo(A* Value);

	foo(/*Value=*/nullptr);

   bugprone-assert-side-effect
     Finds assert() with side effect.

     The  condition of assert() is evaluated only in debug builds so a condition
     with side effect can cause different behavior in debug / release builds.

   Options
     AssertMacros
	    A comma-separated list of the names of assert macros to be checked.

     CheckFunctionCalls
	    Whether to treat non-const member and non-member functions	as  they
	    produce  side  effects.  Disabled by default because it can increase
	    the number of false positive warnings.

   bugprone-bad-signal-to-kill-thread
     Finds pthread_kill function calls when a thread is  terminated  by  raising
     SIGTERM  signal and the signal kills the entire process, not just the indi-
     vidual thread. Use any signal except SIGTERM.

     This check corresponds to the CERT C Coding Standard rule POS44-C.  Do  not
     use signals to terminate threads.

   bugprone-bool-pointer-implicit-conversion
     Checks  for  conditions based on implicit conversion from a bool pointer to
     bool.

     Example:

	bool *p;
	if (p) {
	  // Never used in a pointer-specific way.
	}

   bugprone-branch-clone
     Checks for repeated branches in if/else  if/else  chains,	consecutive  re-
     peated  branches in switch statements and identical true and false branches
     in conditional operators.

	if (test_value(x)) {
	  y++;
	  do_something(x, y);
	} else {
	  y++;
	  do_something(x, y);
	}

     In this simple example (which could arise e.g. as a copy-paste  error)  the
     then and else branches are identical and the code is equivalent the follow-
     ing shorter and cleaner code:

	test_value(x); // can be omitted unless it has side effects
	y++;
	do_something(x, y);

     If  this  is the intended behavior, then there is no reason to use a condi-
     tional statement; otherwise the issue can be solved by  fixing  the  branch
     that is handled incorrectly.

     The  check  also detects repeated branches in longer if/else if/else chains
     where it would be even harder to notice the problem.

     In switch statements the check only reports repeated branches when they are
     consecutive, because it is relatively common that	the  case:  labels  have
     some  natural  ordering and rearranging them would decrease the readability
     of the code. For example:

	switch (ch) {
	case 'a':
	  return 10;
	case 'A':
	  return 10;
	case 'b':
	  return 11;
	case 'B':
	  return 11;
	default:
	  return 10;
	}

     Here the check reports that the 'a' and 'A'  branches  are  identical  (and
     that the 'b' and 'B' branches are also identical), but does not report that
     the  default:  branch is also identical to the first two branches.  If this
     is indeed the correct behavior, then it could be implemented as:

	switch (ch) {
	case 'a':
	case 'A':
	  return 10;
	case 'b':
	case 'B':
	  return 11;
	default:
	  return 10;
	}

     Here the check does not warn for the repeated return 10;, which is good  if
     we want to preserve that 'a' is before 'b' and default: is the last branch.

     Finally,  the  check  also  examines conditional operators and reports code
     like:

	return test_value(x) ? x : x;

     Unlike if statements, the check does not detect chains of conditional oper-
     ators.

     Note: This check also reports situations where  branches  become  identical
     only after preprocession.

   bugprone-copy-constructor-init
     Finds  copy  constructors	where the constructor doesn't call the copy con-
     structor of the base class.

	class Copyable {
	public:
	  Copyable() = default;
	  Copyable(const Copyable &) = default;
	};
	class X2 : public Copyable {
	  X2(const X2 &other) {} // Copyable(other) is missing
	};

     Also finds copy constructors where the constructor of the base class  don't
     have parameter.

	class X4 : public Copyable {
	  X4(const X4 &other) : Copyable() {} // other is missing
	};

     The check also suggests a fix-its in some cases.

   bugprone-dangling-handle
     Detect   dangling	 references   in   value  handles  like  std::experimen-
     tal::string_view.	These dangling references can be a result of  construct-
     ing  handles  from  temporary values, where the temporary is destroyed soon
     after the handle is created.

     Examples:

	string_view View = string();  // View will dangle.
	string A;
	View = A + "A";  // still dangle.

	vector<string_view> V;
	V.push_back(string());	// V[0] is dangling.
	V.resize(3, string());	// V[1] and V[2] will also dangle.

	string_view f() {
	  // All these return values will dangle.
	  return string();
	  string S;
	  return S;
	  char Array[10]{};
	  return Array;
	}

   Options
     HandleClasses
	    A semicolon-separated list of class names that should be treated  as
	    handles.   By  default  only std::experimental::basic_string_view is
	    considered.

   bugprone-dynamic-static-initializers
     Finds instances of static variables that  are  dynamically  initialized  in
     header files.

     This can pose problems in certain multithreaded contexts. For example, when
     disabling	compiler generated synchronization instructions for static vari-
     ables initialized at runtime (e.g. by -fno-threadsafe-statics), even  if  a
     particular  project  takes the necessary precautions to prevent race condi-
     tions during initialization by providing their own synchronization,  header
     files  included  from  other  projects  may not. Therefore, such a check is
     helpful for ensuring that disabling compiler generated synchronization  for
     static variable initialization will not cause problems.

     Consider the following code:

	int foo() {
	  static int k = bar();
	  return k;
	}

     When  synchronization  of static initialization is disabled, if two threads
     both call foo for the first time, there is the possibility that k	will  be
     double initialized, creating a race condition.

   bugprone-exception-escape
     Finds  functions  which  may throw an exception directly or indirectly, but
     they should not. The functions which should not throw  exceptions	are  the
     following:

     * Destructors

     * Move constructors

     * Move assignment operators

     * The main() functions

     * swap() functions

     * Functions marked with throw() or noexcept

     * Other functions given as option

     A	destructor  throwing  an exception may result in undefined behavior, re-
     source leaks or unexpected termination of the program. Throwing  move  con-
     structor  or  move  assignment also may result in undefined behavior or re-
     source leak. The swap() operations expected to be non throwing most of  the
     cases  and they are always possible to implement in a non throwing way. Non
     throwing swap() operations are also  used	to  create  move  operations.  A
     throwing main() function also results in unexpected termination.

     WARNING! This check may be expensive on large source files.

   Options
     FunctionsThatShouldNotThrow
	    Comma  separated  list  containing	function  names which should not
	    throw. An example value for this parameter can be WinMain which adds
	    function WinMain() in the Windows API to the list of  the  functions
	    which should not throw. Default value is an empty string.

     IgnoredExceptions
	    Comma  separated list containing type names which are not counted as
	    thrown exceptions in the check. Default value is an empty string.

   bugprone-fold-init-type
     The check flags type mismatches in folds like  std::accumulate  that  might
     result  in loss of precision.  std::accumulate folds an input range into an
     initial value using the type of the latter, with operator+ by default. This
     can cause loss of precision through:

     * Truncation: The following code uses a floating point  range  and  an  int
       initial value, so trucation will happen at every application of operator+
       and the result will be 0, which might not be what the user expected.

	auto a = {0.5f, 0.5f, 0.5f, 0.5f};
	return std::accumulate(std::begin(a), std::end(a), 0);

     * Overflow: The following code also returns 0.

	auto a = {65536LL * 65536 * 65536};
	return std::accumulate(std::begin(a), std::end(a), 0);

   bugprone-forward-declaration-namespace
     Checks if an unused forward declaration is in a wrong namespace.

     The  check  inspects all unused forward declarations and checks if there is
     any declaration/definition with the same name existing, which  could  indi-
     cate that the forward declaration is in a potentially wrong namespace.

	namespace na { struct A; }
	namespace nb { struct A {}; }
	nb::A a;
	// warning : no definition found for 'A', but a definition with the same name
	// 'A' found in another namespace 'nb::'

     This  check  can only generate warnings, but it can't suggest a fix at this
     point.

   bugprone-forwarding-reference-overload
     The check looks for perfect forwarding constructors that can hide	copy  or
     move  constructors.  If  a non const lvalue reference is passed to the con-
     structor, the forwarding reference parameter will be a  better  match  than
     the  const reference parameter of the copy constructor, so the perfect for-
     warding constructor will be called, which can be confusing.   For	detailed
     description of this issue see: Scott Meyers, Effective Modern C++, Item 26.

     Consider the following example:

	class Person {
	public:
	  // C1: perfect forwarding ctor
	  template<typename T>
	  explicit Person(T&& n) {}

	  // C2: perfect forwarding ctor with parameter default value
	  template<typename T>
	  explicit Person(T&& n, int x = 1) {}

	  // C3: perfect forwarding ctor guarded with enable_if
	  template<typename T, typename X = enable_if_t<is_special<T>,void>>
	  explicit Person(T&& n) {}

	  // (possibly compiler generated) copy ctor
	  Person(const Person& rhs);
	};

     The check warns for constructors C1 and C2, because those can hide copy and
     move  constructors. We suppress warnings if the copy and the move construc-
     tors are both disabled (deleted or private), because there is  nothing  the
     perfect  forwarding  constructor  could hide in this case. We also suppress
     warnings for constructors like C3 that are guarded with an  enable_if,  as-
     suming the programmer was aware of the possible hiding.

   Background
     For  deciding  whether a constructor is guarded with enable_if, we consider
     the default values of the type parameters and the types of the  constructor
     parameters.  If  any  part  of  these  types  is std::enable_if or std::en-
     able_if_t, we assume the constructor is guarded.

   bugprone-inaccurate-erase
     Checks for inaccurate use of the erase() method.

     Algorithms like remove() do not actually remove any element from  the  con-
     tainer  but return an iterator to the first redundant element at the end of
     the container. These redundant elements must be removed using  the  erase()
     method.  This  check warns when not all of the elements will be removed due
     to using an inappropriate overload.

     For example, the following code erases only one element:

	std::vector<int> xs;
	...
	xs.erase(std::remove(xs.begin(), xs.end(), 10));

     Call the two-argument overload of erase() to remove the subrange:

	std::vector<int> xs;
	...
	xs.erase(std::remove(xs.begin(), xs.end(), 10), xs.end());

   bugprone-incorrect-roundings
     Checks the usage of patterns known to produce incorrect rounding.	Program-
     mers often use:

	(int)(double_expression + 0.5)

     to round the double expression to an integer. The problem with this:

     1. It is unnecessarily slow.

     2. It is incorrect. The number 0.499999975  (smallest  representable  float
	number	below  0.5) rounds to 1.0. Even worse behavior for negative num-
	bers where both -0.5f and -1.4f both round to 0.0.

   bugprone-infinite-loop
     Finds obvious infinite loops (loops where the  condition  variable  is  not
     changed at all).

     Finding  infinite	loops  is well-known to be impossible (halting problem).
     However, it is possible to detect some obvious infinite loops, for example,
     if the loop condition is not changed. This check detects such loops. A loop
     is considered infinite if it does not have any loop exit statement  (break,
     continue,	goto,  return,	throw  or a call to a function called as [[nore-
     turn]]) and all of the following conditions hold for every variable in  the
     condition:

     * It is a local variable.

     * It has no reference or pointer aliases.

     * It is not a structure or class member.

     Furthermore, the condition must not contain a function call to consider the
     loop  infinite  since  functions  may return different values for different
     calls.

     For example, the following loop is considered infinite i is not changed  in
     the body:

	int i = 0, j = 0;
	while (i < 10) {
	  ++j;
	}

   bugprone-integer-division
     Finds cases where integer division in a floating point context is likely to
     cause unintended loss of precision.

     No reports are made if divisions are part of the following expressions:

     * operands of operators expecting integral or bool types,

     * call expressions of integral or bool types, and

     * explicit cast expressions to integral or bool types,

     as these are interpreted as signs of deliberateness from the programmer.

     Examples:

	float floatFunc(float);
	int intFunc(int);
	double d;
	int i = 42;

	// Warn, floating-point values expected.
	d = 32 * 8 / (2 + i);
	d = 8 * floatFunc(1 + 7 / 2);
	d = i / (1 << 4);

	// OK, no integer division.
	d = 32 * 8.0 / (2 + i);
	d = 8 * floatFunc(1 + 7.0 / 2);
	d = (double)i / (1 << 4);

	// OK, there are signs of deliberateness.
	d = 1 << (i / 2);
	d = 9 + intFunc(6 * i / 32);
	d = (int)(i / 32) - 8;

   bugprone-lambda-function-name
     Checks  for attempts to get the name of a function from within a lambda ex-
     pression. The name of a lambda is always something like  operator(),  which
     is almost never what was intended.

     Example:

	void FancyFunction() {
	  [] { printf("Called from %s\n", __func__); }();
	  [] { printf("Now called from %s\n", __FUNCTION__); }();
	}

     Output:

	Called from operator()
	Now called from operator()

     Likely intended output:

	Called from FancyFunction
	Now called from FancyFunction

   bugprone-macro-parentheses
     Finds macros that can have unexpected behaviour due to missing parentheses.

     Macros  are  expanded  by the preprocessor as-is. As a result, there can be
     unexpected behaviour; operators may be evaluated in  unexpected  order  and
     unary operators may become binary operators, etc.

     When  the replacement list has an expression, it is recommended to surround
     it with parentheses. This ensures that the macro result is  evaluated  com-
     pletely before it is used.

     It  is also recommended to surround macro arguments in the replacement list
     with parentheses. This ensures that the argument value is calculated  prop-
     erly.

   bugprone-macro-repeated-side-effects
     Checks for repeated argument with side effects in macros.

   bugprone-misplaced-operator-in-strlen-in-alloc
     Finds  cases  where  1  is added to the string in the argument to strlen(),
     strnlen(), strnlen_s(), wcslen(), wcsnlen(), and wcsnlen_s() instead of the
     result and the value is used as an argument to a memory allocation function
     (malloc(), calloc(), realloc(), alloca()) or the new[] operator in C++. The
     check detects error cases even if one of these functions (except the  new[]
     operator) is called by a constant function pointer.  Cases where 1 is added
     both  to the parameter and the result of the strlen()-like function are ig-
     nored, as are cases where the whole addition is surrounded by extra  paren-
     theses.

     C example code:

	void bad_malloc(char *str) {
	  char *c = (char*) malloc(strlen(str + 1));
	}

     The  suggested  fix  is to add 1 to the return value of strlen() and not to
     its argument. In the example above the fix would be

	char *c = (char*) malloc(strlen(str) + 1);

     C++ example code:

	void bad_new(char *str) {
	  char *c = new char[strlen(str + 1)];
	}

     As in the C code with the malloc() function, the suggested fix is to add  1
     to  the  return  value  of strlen() and not to its argument. In the example
     above the fix would be

	char *c = new char[strlen(str) + 1];

     Example for silencing the diagnostic:

	void bad_malloc(char *str) {
	  char *c = (char*) malloc(strlen((str + 1)));
	}

   bugprone-misplaced-pointer-arithmetic-in-alloc
     Finds cases where an integer expression is added to or subtracted from  the
     result  of a memory allocation function (malloc(), calloc(), realloc(), al-
     loca()) instead of its argument. The check detects error cases even if  one
     of these functions is called by a constant function pointer.

     Example code:

	void bad_malloc(int n) {
	  char *p = (char*) malloc(n) + 10;
	}

     The  suggested fix is to add the integer expression to the argument of mal-
     loc and not to its result. In the example above the fix would be

	char *p = (char*) malloc(n + 10);

   bugprone-misplaced-widening-cast
     This check will warn when there is a cast of a calculation result to a big-
     ger type. If the intention of the cast is to avoid loss of  precision  then
     the  cast	is  misplaced, and there can be loss of precision. Otherwise the
     cast is ineffective.

     Example code:

	long f(int x) {
	    return (long)(x * 1000);
	}

     The result x * 1000 is first calculated using int precision. If the  result
     exceeds int precision there is loss of precision. Then the result is casted
     to long.

     If  there	is  no loss of precision then the cast can be removed or you can
     explicitly cast to int instead.

     If you want to avoid loss of precision then put the cast in a proper  loca-
     tion, for instance:

	long f(int x) {
	    return (long)x * 1000;
	}

   Implicit casts
     Forgetting  to  place the cast at all is at least as dangerous and at least
     as common as misplacing it. If CheckImplicitCasts is enabled the check also
     detects these cases, for instance:

	long f(int x) {
	    return x * 1000;
	}

   Floating point
     Currently warnings are only written for integer conversion. No  warning  is
     written for this code:

	double f(float x) {
	    return (double)(x * 10.0f);
	}

   Options
     CheckImplicitCasts
	    If true, enables detection of implicit casts. Default is true.

   bugprone-move-forwarding-reference
     Warns if std::move is called on a forwarding reference, for example:

	template <typename T>
	void foo(T&& t) {
	  bar(std::move(t));
	}

     Forwarding references should typically be passed to std::forward instead of
     std::move, and this is the fix that will be suggested.

     (A  forwarding reference is an rvalue reference of a type that is a deduced
     function template argument.)

     In this example, the suggested fix would be

	bar(std::forward<T>(t));

   Background
     Code like the example above is sometimes written with the expectation  that
     T&&  will	always	end up being an rvalue reference, no matter what type is
     deduced for T, and that it is therefore not possible to pass an  lvalue  to
     foo(). However, this is not true. Consider this example:

	std::string s = "Hello, world";
	foo(s);

     This code compiles and, after the call to foo(), s is left in an indetermi-
     nate  state  because  it has been moved from. This may be surprising to the
     caller of foo() because no std::move was used when calling foo().

     The reason for this behavior lies in the special rule for template argument
     deduction on function templates like foo() -- i.e.  on  function  templates
     that take an rvalue reference argument of a type that is a deduced function
     template  argument.  (See	section  [temp.deduct.call]/3 in the C++11 stan-
     dard.)

     If foo() is called on an lvalue (as in the example above), then  T  is  de-
     duced  to	be  an	lvalue	reference.  In	the  example, T is deduced to be
     std::string &. The type of the argument t	therefore  becomes  std::string&
     &&; by the reference collapsing rules, this collapses to std::string&.

     This  means that the foo(s) call passes s as an lvalue reference, and foo()
     ends up moving s and thereby placing it into an indeterminate state.

   bugprone-multiple-statement-macro
     Detect multiple statement macros that are used  in  unbraced  conditionals.
     Only  the	first  statement of the macro will be inside the conditional and
     the other ones will be executed unconditionally.

     Example:

	#define INCREMENT_TWO(x, y) (x)++; (y)++
	if (do_increment)
	  INCREMENT_TWO(a, b);	// (b)++ will be executed unconditionally.

   bugprone-no-escape
     Finds pointers with the noescape attribute that are captured  by  an  asyn-
     chronously-executed block. The block arguments in dispatch_async() and dis-
     patch_after() are guaranteed to escape, so it is an error if a pointer with
     the noescape attribute is captured by one of these blocks.

     The following is an example of an invalid use of the noescape attribute.

	    void foo(__attribute__((noescape)) int *p) {
	      dispatch_async(queue, ^{
		*p = 123;
	      });
	    });

   bugprone-not-null-terminated-result
     Finds  function  calls  where it is possible to cause a not null-terminated
     result.  Usually the proper length of a string is strlen(src) + 1 or  equal
     length  of  this  expression,  because  the  null terminator needs an extra
     space. Without the null terminator it can	result	in  undefined  behaviour
     when the string is read.

     The following and their respective wchar_t based functions are checked:

     memcpy, memcpy_s, memchr, memmove, memmove_s, strerror_s, strncmp, strxfrm

     The  following  is  a real-world example where the programmer forgot to in-
     crease the passed third argument, which is size_t length. That is	why  the
     length of the allocated memory is not enough to hold the null terminator.

	static char *stringCpy(const std::string &str) {
	  char *result = reinterpret_cast<char *>(malloc(str.size()));
	  memcpy(result, str.data(), str.size());
	  return result;
	}

     In addition to issuing warnings, fix-it rewrites all the necessary code. It
     also tries to adjust the capacity of the destination array:

	static char *stringCpy(const std::string &str) {
	  char *result = reinterpret_cast<char *>(malloc(str.size() + 1));
	  strcpy(result, str.data());
	  return result;
	}

     Note: It cannot guarantee to rewrite every of the path-sensitive memory al-
     locations.

   Transformation rules of 'memcpy()'
     It  is possible to rewrite the memcpy() and memcpy_s() calls as the follow-
     ing four functions:  strcpy(), strncpy(),	strcpy_s(),  strncpy_s(),  where
     the  latter  two are the safer versions of the former two.  It rewrites the
     wchar_t based memory handler functions respectively.

   Rewrite based on the destination array
     * If copy to the destination array cannot overflow  [1]  the  new	function
       should  be  the older copy function (ending with cpy), because it is more
       efficient than the safe version.

     * If   copy   to	the   destination   array   can   overflow    [1]    and
       WantToUseSafeFunctions  is  set	to true and it is possible to obtain the
       capacity of the destination array then the new function could be the safe
       version (ending with cpy_s).

     * If the new function is could be safe version and C++ files  are	analysed
       and  the  destination  array is plain char/wchar_t without un/signed then
       the length of the destination array can be omitted.

     * If the new function is could be safe version and the destination array is
       un/signed it needs to be casted to plain char */wchar_t *.

     [1] It is possible to overflow:

	    * If the capacity of the destination array is unknown.

	    * If the given length is equal to the destination array's capacity.

   Rewrite based on the length of the source string
     * If the given length is strlen(source) or equal length of this  expression
       then  the  new  function  should  be the older copy function (ending with
       cpy), as it is more efficient than the safe version (ending with cpy_s).

     * Otherwise we assume that the programmer wanted to copy 'N' characters, so
       the new function is ncpy-like which copies 'N' characters.

   Transformations with 'strlen()' or equal length of this expression
     It transforms the wchar_t based memory and string handler functions respec-
     tively (where only strerror_s does not have wchar_t based alias).

   Memory handler functions
     memcpy Please visit the Transformation rules of 'memcpy()' section.

     memchr Usually there is a C-style cast and it is needed to be removed,  be-
     cause the new function strchr's return type is correct. The given length is
     going to be removed.

     memmove  If  safe	functions  are	available the new function is memmove_s,
     which has a new second argument which is the length of the destination  ar-
     ray,  it is adjusted, and the length of the source string is incremented by
     one.  If safe functions are not available the given length  is  incremented
     by one.

     memmove_s The given length is incremented by one.

   String handler functions
     strerror_s The given length is incremented by one.

     strncmp  If the third argument is the first or the second argument's length
     + 1 it has to be truncated without the + 1 operation.

     strxfrm The given length is incremented by one.

   Options
     WantToUseSafeFunctions
	    The value true specifies that the target environment  is  considered
	    to implement '_s' suffixed memory and string handler functions which
	    are safer than older versions (e.g. 'memcpy_s()'). The default value
	    is true.

   bugprone-parent-virtual-call
     Detects and fixes calls to grand-...parent virtual methods instead of calls
     to overridden parent's virtual methods.

	struct A {
	  int virtual foo() {...}
	};

	struct B: public A {
	  int foo() override {...}
	};

	struct C: public B {
	  int foo() override { A::foo(); }
	//		       ^^^^^^^^
	// warning: qualified name A::foo refers to a member overridden in subclass; did you mean 'B'?	[bugprone-parent-virtual-call]
	};

   bugprone-posix-return
     Checks if any calls to pthread_* or posix_* functions (except posix_openpt)
     expect  negative  return values. These functions return either 0 on success
     or an errno on failure, which is positive only.

     Example buggy usage looks like:

	if (posix_fadvise(...) < 0) {

     This will never happen as the return value is always non-negative. A simple
     fix could be:

	if (posix_fadvise(...) > 0) {

   bugprone-redundant-branch-condition
     Finds condition variables in nested if statements that were also checked in
     the outer if statement and were not changed.

     Simple example:

	bool onFire = isBurning();
	if (onFire) {
	  if (onFire)
	    scream();
	}

     Here onFire is checked both in the outer if  and  the  inner  if  statement
     without  a possible change between the two checks. The check warns for this
     code and suggests removal of the second checking of variable onFire.

     The checker also detects redundant condition checks if the condition  vari-
     able is an operand of a logical "and" (&&) or a logical "or" (||) operator:

	bool onFire = isBurning();
	if (onFire) {
	  if (onFire && peopleInTheBuilding > 0)
	    scream();
	}

	bool onFire = isBurning();
	if (onFire) {
	  if (onFire || isCollapsing())
	    scream();
	}

     In the first case (logical "and") the suggested fix is to remove the redun-
     dant  condition  variable	and keep the other side of the &&. In the second
     case (logical "or") the whole if is removed similarily to the  simple  case
     on the top.

     The  condition  of  the outer if statement may also be a logical "and" (&&)
     expression:

	bool onFire = isBurning();
	if (onFire && fireFighters < 10) {
	  if (someOtherCondition()) {
	    if (onFire)
	      scream();
	  }
	}

     The error is also detected if both the outer statement is a  logical  "and"
     (&&) and the inner statement is a logical "and" (&&) or "or" (||).  The in-
     ner if statement does not have to be a direct descendant of the outer one.

     No  error	is  detected if the condition variable may have been changed be-
     tween the two checks:

	bool onFire = isBurning();
	if (onFire) {
	  tryToExtinguish(onFire);
	  if (onFire && peopleInTheBuilding > 0)
	    scream();
	}

     Every possible change is considered, thus if the condition variable is  not
     a	local  variable  of  the  function,  it is a volatile or it has an alias
     (pointer or reference) then no warning is issued.

   Known limitations
     The else branch is not checked currently for negated condition variable:

	bool onFire = isBurning();
	if (onFire) {
	  scream();
	} else {
	  if (!onFire) {
	    continueWork();
	  }
	}

     The checker currently only detects redundant checking of  single  condition
     variables. More complex expressions are not checked:

	if (peopleInTheBuilding == 1) {
	  if (peopleInTheBuilding == 1) {
	    doSomething();
	  }
	}

   bugprone-reserved-identifier
     cert-dcl37-c and cert-dcl51-cpp redirect here as an alias for this check.

     Checks for usages of identifiers reserved for use by the implementation.

     The C and C++ standards both reserve the following names for such use:

     * identifiers  that  begin with an underscore followed by an uppercase let-
       ter;

     * identifiers in the global namespace that begin with an underscore.

     The C standard additionally reserves names beginning with a  double  under-
     score, while the C++ standard strengthens this to reserve names with a dou-
     ble underscore occurring anywhere.

     Violating the naming rules above results in undefined behavior.

	namespace NS {
	  void __f(); // name is not allowed in user code
	  using _Int = int; // same with this
	  #define cool__macro // also this
	}
	int _g(); // disallowed in global namespace only

     The check can also be inverted, i.e. it can be configured to flag any iden-
     tifier  that  is  _not_ a reserved identifier. This mode is for use by e.g.
     standard library implementors, to ensure they don't infringe  on  the  user
     namespace.

     This  check does not (yet) check for other reserved names, e.g. macro names
     identical to language keywords, and names specifically reserved by language
     standards, e.g. C++ 'zombie names' and C future library directions.

     This check corresponds to CERT C Coding Standard rule DCL37-C. Do	not  de-
     clare  or	define	a  reserved identifier as well as its C++ counterpart, -
     DCL51-CPP. Do not declare or define a reserved identifier.

   Options
     Invert
	    If true, inverts the check, i.e. flags names that are not  reserved.
	    Default is false.

     AllowedIdentifiers
	    Semicolon-separated list of names that the check ignores. Default is
	    an empty list.

   bugprone-signal-handler
     Finds  functions  registered  as  signal  handlers  that call non asynchro-
     nous-safe functions. Any function that cannot be determined to be an  asyn-
     chronous-safe  function  call is assumed to be non-asynchronous-safe by the
     checker, including user functions for which only the declaration  is  visi-
     ble.   User function calls with visible definition are checked recursively.
     The check handles only C code.

     The  minimal  list  of  asynchronous-safe	system	functions  is:	abort(),
     _Exit(),  quick_exit() and signal() (for signal there are additional condi-
     tions that are not checked).  The check accepts only these calls  as  asyn-
     chronous-safe.

     This  check  corresponds  to  the CERT C Coding Standard rule SIG30-C. Call
     only asynchronous-safe functions within signal handlers.

   bugprone-signed-char-misuse
     cert-str34-c redirects here as an alias for this check. For the CERT alias,
     the DiagnoseSignedUnsignedCharComparisons option is set to false.

     Finds those signed char -> integer conversions which might indicate a  pro-
     gramming error. The basic problem with the signed char, that it might store
     the non-ASCII characters as negative values. This behavior can cause a mis-
     understanding  of	the  written  code both when an explicit and when an im-
     plicit conversion happens.

     When the code contains an explicit signed char -> integer	conversion,  the
     human programmer probably expects that the converted value matches with the
     character	code  (a  value  from [0..255]), however, the actual value is in
     [-128..127] interval. To avoid this kind of misinterpretation, the  desired
     way  of  converting from a signed char to an integer value is converting to
     unsigned char first, which  stores  all  the  characters  in  the	positive
     [0..255] interval which matches the known character codes.

     In  case of implicit conversion, the programmer might not actually be aware
     that a conversion happened and char value is used as an integer. There  are
     some use cases when this unawareness might lead to a functionally imperfect
     code.   For example, checking the equality of a signed char and an unsigned
     char variable is something we should avoid in C++ code. During this compar-
     ison, the two variables are converted  to	integers  which  have  different
     value  ranges.   For  signed char, the non-ASCII characters are stored as a
     value in [-128..-1] interval, while the same characters are stored  in  the
     [128..255] interval for an unsigned char.

     It  depends  on the actual platform whether plain char is handled as signed
     char by default and so it is caught by this check or not. To change the de-
     fault behavior you can use -funsigned-char  and  -fsigned-char  compilation
     options.

     Currently,  this  check  warns in the following cases: - signed char is as-
     signed to an integer variable - signed char and unsigned char are	compared
     with  equality/inequality operator - signed char is converted to an integer
     in the array subscript

     See also: STR34-C. Cast characters to unsigned char  before  converting  to
     larger integer sizes

     A	good  example  from the CERT description when a char variable is used to
     read from a file that might contain non-ASCII characters. The problem comes
     up when the code uses the -1 integer value as EOF, while the 255  character
     code  is  also  stored  as -1 in two's complement form of char type.  See a
     simple example of this bellow. This code stops not only when it reaches the
     end of the file, but also when it gets a character with the 255 code.

	#define EOF (-1)

	int read(void) {
	  char CChar;
	  int IChar = EOF;

	  if (readChar(CChar)) {
	    IChar = CChar;
	  }
	  return IChar;
	}

     A proper way to fix the code above is converting the char	variable  to  an
     unsigned char value first.

	#define EOF (-1)

	int read(void) {
	  char CChar;
	  int IChar = EOF;

	  if (readChar(CChar)) {
	    IChar = static_cast<unsigned char>(CChar);
	  }
	  return IChar;
	}

     Another  use  case is checking the equality of two char variables with dif-
     ferent signedness. Inside the non-ASCII value range this comparison between
     a signed char and an unsigned char always returns false.

	bool compare(signed char SChar, unsigned char USChar) {
	  if (SChar == USChar)
	    return true;
	  return false;
	}

     The easiest way to fix this kind of comparison is casting one of the  argu-
     ments, so both arguments will have the same type.

	bool compare(signed char SChar, unsigned char USChar) {
	  if (static_cast<unsigned char>(SChar) == USChar)
	    return true;
	  return false;
	}

     CharTypdefsToIgnore
	    A  semicolon-separated  list  of typedef names. In this list, we can
	    list typedefs for char or signed char, which will be ignored by  the
	    check.  This  is  useful  when a typedef introduces an integer alias
	    like sal_Int8 or int8_t. In this case,  human  misinterpretation  is
	    not an issue.

     DiagnoseSignedUnsignedCharComparisons
	    When  true, the check will warn on signed char/unsigned char compar-
	    isons, otherwise these comparisons are ignored. By default, this op-
	    tion is set to true.

   bugprone-sizeof-container
     The check finds usages of sizeof on expressions  of  STL  container  types.
     Most likely the user wanted to use .size() instead.

     All  class/struct	types  declared in namespace std:: having a const size()
     method are considered containers, with the  exception  of	std::bitset  and
     std::array.

     Examples:

	std::string s;
	int a = 47 + sizeof(s); // warning: sizeof() doesn't return the size of the container. Did you mean .size()?

	int b = sizeof(std::string); // no warning, probably intended.

	std::string array_of_strings[10];
	int c = sizeof(array_of_strings) / sizeof(array_of_strings[0]); // no warning, definitely intended.

	std::array<int, 3> std_array;
	int d = sizeof(std_array); // no warning, probably intended.

   bugprone-sizeof-expression
     The check finds usages of sizeof expressions which are most likely errors.

     The sizeof operator yields the size (in bytes) of its operand, which may be
     an  expression or the parenthesized name of a type. Misuse of this operator
     may be leading to errors and possible software vulnerabilities.

   Suspicious usage of 'sizeof(K)'
     A common mistake is to query the sizeof of  an  integer  literal.	This  is
     equivalent  to query the size of its type (probably int). The intent of the
     programmer was probably to simply get the integer and not its size.

	#define BUFLEN 42
	char buf[BUFLEN];
	memset(buf, 0, sizeof(BUFLEN));  // sizeof(42) ==> sizeof(int)

   Suspicious usage of 'sizeof(expr)'
     In cases, where there is an enum or integer to represent a type,  a  common
     mistake  is  to query the sizeof on the integer or enum that represents the
     type that should be used by sizeof. This results in the size of the integer
     and not of the type the integer represents:

	enum data_type {
	  FLOAT_TYPE,
	  DOUBLE_TYPE
	};

	struct data {
	  data_type type;
	  void* buffer;
	  data_type get_type() {
	    return type;
	  }
	};

	void f(data d, int numElements) {
	  // should be sizeof(float) or sizeof(double), depending on d.get_type()
	  int numBytes = numElements * sizeof(d.get_type());
	  ...
	}

   Suspicious usage of 'sizeof(this)'
     The this keyword is evaluated to a pointer to an object of  a  given  type.
     The  expression  sizeof(this)  is returning the size of a pointer. The pro-
     grammer most likely wanted the size of the object and not the size  of  the
     pointer.

	class Point {
	  [...]
	  size_t size() { return sizeof(this); }  // should probably be sizeof(*this)
	  [...]
	};

   Suspicious usage of 'sizeof(char*)'
     There  is a subtle difference between declaring a string literal with char*
     A = "" and char A[] = "". The first case has the type char* instead of  the
     aggregate	type  char[]. Using sizeof on an object declared with char* type
     is returning the size of a pointer instead  of  the  number  of  characters
     (bytes) in the string literal.

	const char* kMessage = "Hello World!";	    // const char kMessage[] = "...";
	void getMessage(char* buf) {
	  memcpy(buf, kMessage, sizeof(kMessage));  // sizeof(char*)
	}

   Suspicious usage of 'sizeof(A*)'
     A	common	mistake  is  to  compute  the  size  of a pointer instead of its
     pointee.  These cases may occur because of explicit cast or  implicit  con-
     version.

	int A[10];
	memset(A, 0, sizeof(A + 0));

	struct Point point;
	memset(point, 0, sizeof(&point));

   Suspicious usage of 'sizeof(...)/sizeof(...)'
     Dividing sizeof expressions is typically used to retrieve the number of el-
     ements  of  an  aggregate.  This  check warns on incompatible or suspicious
     cases.

     In the following example, the entity has 10-bytes and is incompatible  with
     the type int which has 4 bytes.

	char buf[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };	// sizeof(buf) => 10
	void getMessage(char* dst) {
	  memcpy(dst, buf, sizeof(buf) / sizeof(int));	// sizeof(int) => 4  [incompatible sizes]
	}

     In  the  following  example, the expression sizeof(Values) is returning the
     size of char*. One can easily be fooled by its declaration, but in  parame-
     ter  declaration  the  size '10' is ignored and the function is receiving a
     char*.

	char OrderedValues[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	return CompareArray(char Values[10]) {
	  return memcmp(OrderedValues, Values, sizeof(Values)) == 0;  // sizeof(Values) ==> sizeof(char*) [implicit cast to char*]
	}

   Suspicious 'sizeof' by 'sizeof' expression
     Multiplying sizeof expressions typically makes no sense and is  probably  a
     logic error. In the following example, the programmer used * instead of /.

	const char kMessage[] = "Hello World!";
	void getMessage(char* buf) {
	  memcpy(buf, kMessage, sizeof(kMessage) * sizeof(char));  //  sizeof(kMessage) / sizeof(char)
	}

     This  check  may  trigger	on code using the arraysize macro. The following
     code is working correctly but should be simplified by using only the sizeof
     operator.

	extern Object objects[100];
	void InitializeObjects() {
	  memset(objects, 0, arraysize(objects) * sizeof(Object));  // sizeof(objects)
	}

   Suspicious usage of 'sizeof(sizeof(...))'
     Getting the sizeof of a sizeof makes no sense and	is  typically  an  error
     hidden through macros.

	#define INT_SZ sizeof(int)
	int buf[] = { 42 };
	void getInt(int* dst) {
	  memcpy(dst, buf, sizeof(INT_SZ));  // sizeof(sizeof(int)) is suspicious.
	}

   Options
     WarnOnSizeOfConstant
	    When  true,  the  check  will warn on an expression like sizeof(CON-
	    STANT). Default is true.

     WarnOnSizeOfIntegerExpression
	    When true, the check will warn on an  expression  like  sizeof(expr)
	    where the expression results in an integer. Default is false.

     WarnOnSizeOfThis
	    When  true,  the check will warn on an expression like sizeof(this).
	    Default is true.

     WarnOnSizeOfCompareToConstant
	    When true, the check will warn on an expression like sizeof(epxr) <=
	    k for a suspicious constant k while k is 0 or greater  than  0x8000.
	    Default is true.

   bugprone-spuriously-wake-up-functions
     Finds cnd_wait, cnd_timedwait, wait, wait_for, or wait_until function calls
     when  the	function is not invoked from a loop that checks whether a condi-
     tion predicate holds or the function has a condition parameter.

     This check corresponds to the CERT C++ Coding Standard rule CON54-CPP. Wrap
     functions that can spuriously wake up in a loop.  and CERT C  Coding  Stan-
     dard rule CON36-C. Wrap functions that can spuriously wake up in a loop.

   bugprone-string-constructor
     Finds string constructors that are suspicious and probably errors.

     A common mistake is to swap parameters to the 'fill' string-constructor.

     Examples:

	std::string str('x', 50); // should be str(50, 'x')

     Calling  the  string-literal constructor with a length bigger than the lit-
     eral is suspicious and adds extra random characters to the string.

     Examples:

	std::string("test", 200);   // Will include random characters after "test".
	std::string_view("test", 200);

     Creating an empty string from constructors with  parameters  is  considered
     suspicious. The programmer should use the empty constructor instead.

     Examples:

	std::string("test", 0);   // Creation of an empty string.
	std::string_view("test", 0);

   Options
     WarnOnLargeLength
	    When  true,  the  check  will warn on a string with a length greater
	    than LargeLengthThreshold. Default is true.

     LargeLengthThreshold
	    An	integer  specifying  the  large  length  threshold.  Default  is
	    0x800000.

     StringNames
	    Default is ::std::basic_string;::std::basic_string_view.

	    Semicolon-delimited  list of class names to apply this check to.  By
	    default ::std::basic_string applies to std::string and std::wstring.
	    Set to e.g. ::std::basic_string;llvm::StringRef;QString  to  perform
	    this check on custom classes.

   bugprone-string-integer-assignment
     The  check  finds	assignments  of  an  integer to std::basic_string<CharT>
     (std::string, std::wstring, etc.). The source of the problem is the follow-
     ing assignment operator of std::basic_string<CharT>:

	basic_string& operator=( CharT ch );

     Numeric types can be implicitly casted to character types.

	std::string s;
	int x = 5965;
	s = 6;
	s = x;

     Use the appropriate conversion functions or character literals.

	std::string s;
	int x = 5965;
	s = '6';
	s = std::to_string(x);

     In order to suppress false positives, use an explicit cast.

	std::string s;
	s = static_cast<char>(6);

   bugprone-string-literal-with-embedded-nul
     Finds occurrences of string literal with embedded NUL character  and  vali-
     dates their usage.

   Invalid escaping
     Special  characters  can  be escaped within a string literal by using their
     hexadecimal encoding like \x42. A common mistake is  to  escape  them  like
     this \0x42 where the \0 stands for the NUL character.

	const char* Example[] = "Invalid character: \0x12 should be \x12";
	const char* Bytes[] = "\x03\0x02\0x01\0x00\0xFF\0xFF\0xFF";

   Truncated literal
     String-like  classes  can	manipulate strings with embedded NUL as they are
     keeping track of the bytes and the length. This is not the case for a char*
     (NUL-terminated) string.

     A common mistake is to pass a string-literal with embedded NUL to a  string
     constructor  expecting  a	NUL-terminated string. The bytes after the first
     NUL character are truncated.

	std::string str("abc\0def");  // "def" is truncated
	str += "\0";		      // This statement is doing nothing
	if (str == "\0abc") return;   // This expression is always true

   bugprone-suspicious-enum-usage
     The checker detects various cases when an enum is probably  misused  (as  a
     bitmask ).

     1. When "ADD" or "bitwise OR" is used between two enum which come from dif-
	ferent types and these types value ranges are not disjoint.

     The  following  cases will be investigated only using StrictMode. We regard
     the enum as a (suspicious) bitmask if the three conditions below  are  true
     at the same time:

     * at  most  half  of the elements of the enum are non pow-of-2 numbers (be-
       cause of short enumerations)

     * there is another non pow-of-2 number than the enum constant  representing
       all choices (the result "bitwise OR" operation of all enum elements)

     * enum type variable/enumconstant is used as an argument of a + or "bitwise
       OR " operator

     So  whenever the non pow-of-2 element is used as a bitmask element we diag-
     nose a misuse and give a warning.

     2. Investigating the right hand side of += and |= operator.

     3. Check only the enum value side of a | and + operator if one of	them  is
	not enum val.

     4. Check  both  side  of | or + operator where the enum values are from the
	same enum type.

     Examples:

	enum { A, B, C };
	enum { D, E, F = 5 };
	enum { G = 10, H = 11, I = 12 };

	unsigned flag;
	flag =
	    A |
	    H; // OK, disjoint value intervals in the enum types ->probably good use.
	flag = B | F; // Warning, have common values so they are probably misused.

	// Case 2:
	enum Bitmask {
	  A = 0,
	  B = 1,
	  C = 2,
	  D = 4,
	  E = 8,
	  F = 16,
	  G = 31 // OK, real bitmask.
	};

	enum Almostbitmask {
	  AA = 0,
	  BB = 1,
	  CC = 2,
	  DD = 4,
	  EE = 8,
	  FF = 16,
	  GG // Problem, forgot to initialize.
	};

	unsigned flag = 0;
	flag |= E; // OK.
	flag |=
	    EE; // Warning at the decl, and note that it was used here as a bitmask.

   Options
     StrictMode
	    Default value: 0.  When non-null the suspicious bitmask  usage  will
	    be investigated additionally to the different enum usage check.

   bugprone-suspicious-include
     The  check  detects various cases when an include refers to what appears to
     be an implementation file, which often leads to hard-to-track-down ODR vio-
     lations.

     Examples:

	#include "Dinosaur.hpp"     // OK, .hpp files tend not to have definitions.
	#include "Pterodactyl.h"    // OK, .h files tend not to have definitions.
	#include "Velociraptor.cpp" // Warning, filename is suspicious.
	#include_next <stdio.c>     // Warning, filename is suspicious.

   Options
     HeaderFileExtensions
	    Default value: ";h;hh;hpp;hxx" A semicolon-separated list  of  file-
	    name  extensions of header files (the filename extensions should not
	    contain a "." prefix). For extension-less header files, use an empty
	    string or leave an empty string between ";" if there are other file-
	    name extensions.

     ImplementationFileExtensions
	    Default value: "c;cc;cpp;cxx" Likewise, a  semicolon-separated  list
	    of filename extensions of implementation files.

   bugprone-suspicious-memset-usage
     This check finds memset() calls with potential mistakes in their arguments.
     Considering the function as void* memset(void* destination, int fill_value,
     size_t byte_count), the following cases are covered:

     Case 1: Fill value is a character ``'0'``

     Filling  up  a  memory area with ASCII code 48 characters is not customary,
     possibly integer zeroes were intended instead.  The check offers a replace-
     ment of '0' with 0. Memsetting character pointers with '0' is allowed.

     Case 2: Fill value is truncated

     Memset converts fill_value to unsigned char before using it. If  fill_value
     is  out  of unsigned character range, it gets truncated and memory will not
     contain the desired pattern.

     Case 3: Byte count is zero

     Calling memset with a literal zero in its byte_count argument is likely  to
     be  unintended  and swapped with fill_value. The check offers to swap these
     two arguments.

     Corresponding cpplint.py check name: runtime/memset.

     Examples:

	void foo() {
	  int i[5] = {1, 2, 3, 4, 5};
	  int *ip = i;
	  char c = '1';
	  char *cp = &c;
	  int v = 0;

	  // Case 1
	  memset(ip, '0', 1); // suspicious
	  memset(cp, '0', 1); // OK

	  // Case 2
	  memset(ip, 0xabcd, 1); // fill value gets truncated
	  memset(ip, 0x00, 1);	 // OK

	  // Case 3
	  memset(ip, sizeof(int), v); // zero length, potentially swapped
	  memset(ip, 0, 1);	      // OK
	}

   bugprone-suspicious-missing-comma
     String literals placed side-by-side are concatenated at translation phase 6
     (after the preprocessor). This feature is used  to  represent  long  string
     literal on multiple lines.

     For instance, the following declarations are equivalent:

	const char* A[] = "This is a test";
	const char* B[] = "This" " is a "    "test";

     A	common	mistake  done  by  programmers	is to forget a comma between two
     string literals in an array initializer list.

	const char* Test[] = {
	  "line 1",
	  "line 2"     // Missing comma!
	  "line 3",
	  "line 4",
	  "line 5"
	};

     The array contains the string "line 2line3" at  offset  1	(i.e.  Test[1]).
     Clang won't generate warnings at compile time.

     This check may warn incorrectly on cases like:

	const char* SupportedFormat[] = {
	  "Error %s",
	  "Code " PRIu64,   // May warn here.
	  "Warning %s",
	};

   Options
     SizeThreshold
	    An	unsigned integer specifying the minimum size of a string literal
	    to be considered by the check. Default is 5U.

     RatioThreshold
	    A string specifying the maximum threshold ratio [0, 1.0]  of  suspi-
	    cious string literals to be considered. Default is ".2".

     MaxConcatenatedTokens
	    An	unsigned  integer  specifying the maximum number of concatenated
	    tokens.  Default is 5U.

   bugprone-suspicious-semicolon
     Finds most instances of stray semicolons that unexpectedly alter the  mean-
     ing  of  the  code.  More	specifically,  it  looks  for if, while, for and
     for-range statements whose body is a single semicolon,  and  then	analyzes
     the  context  of  the  code  (e.g.  indentation) in an attempt to determine
     whether that is intentional.

	if (x < y);
	{
	  x++;
	}

     Here the body of the if statement consists of only the semicolon at the end
     of the first line, and x will be incremented regardless of the condition.

	while ((line = readLine(file)) != NULL);
	  processLine(line);

     As a result of this code, processLine() will only be called once, when  the
     while  loop with the empty body exits with line == NULL. The indentation of
     the code indicates the intention of the programmer.

	if (x >= y);
	x -= y;

     While the indentation does not imply any nesting, there is simply no  valid
     reason  to  have  an if statement with an empty body (but it can make sense
     for a loop). So this check issues a warning for the code above.

     To solve the issue remove the stray semicolon or in case the empty body  is
     intentional,  reflect this using code indentation or put the semicolon in a
     new line. For example:

	while (readWhitespace());
	  Token t = readNextToken();

     Here the second line is indented in a way that suggests that it is meant to
     be the body of the while loop - whose body is in fact empty, because of the
     semicolon at the end of the first line.

     Either remove the indentation from the second line:

	while (readWhitespace());
	Token t = readNextToken();

     ... or move the semicolon from the end of the first line to a new line:

	while (readWhitespace())
	  ;

	  Token t = readNextToken();

     In this case the check will assume that you know what you	are  doing,  and
     will not raise a warning.

   bugprone-suspicious-string-compare
     Find  suspicious  usage of runtime string comparison functions.  This check
     is valid in C and C++.

     Checks for calls with implicit comparator and proposed  to  explicitly  add
     it.

	if (strcmp(...))       // Implicitly compare to zero
	if (!strcmp(...))      // Won't warn
	if (strcmp(...) != 0)  // Won't warn

     Checks  that  compare  function results (i,e, strcmp) are compared to valid
     constant. The resulting value is

	<  0	when lower than,
	>  0	when greater than,
	== 0	when equals.

     A common mistake is to compare the result to 1 or -1.

	if (strcmp(...) == -1)	// Incorrect usage of the returned value.

     Additionally, the check warns if the results value is implicitly cast to  a
     suspicious non-integer type. It's happening when the returned value is used
     in a wrong context.

	if (strcmp(...) < 0.)  // Incorrect usage of the returned value.

   Options
     WarnOnImplicitComparison
	    When  true,  the check will warn on implicit comparison. true by de-
	    fault.

     WarnOnLogicalNotComparison
	    When true, the check will warn on logical not comparison.  false  by
	    default.

     StringCompareLikeFunctions
	    A  string  specifying  the comma-separated names of the extra string
	    comparison functions. Default is an empty string.	The  check  will
	    detect  the following string comparison functions: __builtin_memcmp,
	    __builtin_strcasecmp,    __builtin_strcmp,	  __builtin_strncasecmp,
	    __builtin_strncmp,	_mbscmp,  _mbscmp_l,  _mbsicmp, _mbsicmp_l, _mb-
	    snbcmp, _mbsnbcmp_l, _mbsnbicmp, _mbsnbicmp_l, _mbsncmp, _mbsncmp_l,
	    _mbsnicmp, _mbsnicmp_l, _memicmp, _memicmp_l, _stricmp,  _stricmp_l,
	    _strnicmp,	 _strnicmp_l,	_wcsicmp,  _wcsicmp_l,	_wcsnicmp,  _wc-
	    snicmp_l, lstrcmp, lstrcmpi, memcmp,  memicmp,  strcasecmp,  strcmp,
	    strcmpi,  stricmp,	strncasecmp,  strncmp, strnicmp, wcscasecmp, wc-
	    scmp, wcsicmp, wcsncmp, wcsnicmp, wmemcmp.

   bugprone-swapped-arguments
     Finds potentially swapped arguments by looking at implicit conversions.

   bugprone-terminating-continue
     Detects do while loops with a condition always  evaluating  to  false  that
     have  a  continue	statement,  as	this continue terminates the loop effec-
     tively.

	void f() {
	do {
	  // some code
	  continue; // terminating continue
	  // some other code
	} while(false);

   bugprone-throw-keyword-missing
     Warns about a potentially missing throw keyword. If a temporary  object  is
     created,  but  the  object's  type derives from (or is the same as) a class
     that has 'EXCEPTION', 'Exception' or 'exception' in its name, we can assume
     that the programmer's intention was to throw that object.

     Example:

	void f(int i) {
	  if (i < 0) {
	    // Exception is created but is not thrown.
	    std::runtime_error("Unexpected argument");
	  }
	}

   bugprone-too-small-loop-variable
     Detects those for loops that have a loop variable with a "too  small"  type
     which  means this type can't represent all values which are part of the it-
     eration range.

	int main() {
	  long size = 294967296l;
	  for (short i = 0; i < size; ++i) {}
	}

     This for loop is an infinite loop because the short  type	can't  represent
     all values in the [0..size] interval.

     In  a real use case size means a container's size which depends on the user
     input.

	int doSomething(const std::vector& items) {
	  for (short i = 0; i < items.size(); ++i) {}
	}

     This algorithm works for small amount of objects, but will lead  to  freeze
     for a a larger user input.

     MagnitudeBitsUpperLimit
	    Upper limit for the magnitude bits of the loop variable. If it's set
	    the  check	filters  out  those catches in which the loop variable's
	    type has more magnitude bits as the specified upper limit.	The  de-
	    fault  value is 16.  For example, if the user sets this option to 31
	    (bits), then a 32-bit unsigend int is ignored by the check,  however
	    a 32-bit int is not (A 32-bit signed int has 31 magnitude bits).

	int main() {
	  long size = 294967296l;
	  for (unsigned i = 0; i < size; ++i) {} // no warning with MagnitudeBitsUpperLimit = 31 on a system where unsigned is 32-bit
	  for (int i = 0; i < size; ++i) {} // warning with MagnitudeBitsUpperLimit = 31 on a system where int is 32-bit
	}

   bugprone-undefined-memory-manipulation
     Finds  calls  of  memory manipulation functions memset(), memcpy() and mem-
     move() on not TriviallyCopyable objects resulting in undefined behavior.

   bugprone-undelegated-constructor
     Finds creation of temporary objects in constructors that look like a  func-
     tion call to another constructor of the same class.

     The  user	most  likely meant to use a delegating constructor or base class
     initializer.

   bugprone-unhandled-self-assignment
     cert-oop54-cpp redirects here as an alias for  this  check.  For  the  CERT
     alias, the WarnOnlyIfThisHasSuspiciousField option is set to false.

     Finds  user-defined copy assignment operators which do not protect the code
     against self-assignment either by checking  self-assignment  explicitly  or
     using the copy-and-swap or the copy-and-move method.

     By  default,  this check searches only those classes which have any pointer
     or C array field to avoid false positives. In case of a pointer or a C  ar-
     ray,  it's  likely  that self-copy assignment breaks the object if the copy
     assignment operator was not written with care.

     See also: OOP54-CPP. Gracefully handle self-copy assignment

     A copy assignment operator must prevent that self-copy assignment ruins the
     object state. A typical use case is when the class has a pointer field  and
     the  copy	assignment  operator  first releases the pointed object and then
     tries to assign it:

	class T {
	int* p;

	public:
	  T(const T &rhs) : p(rhs.p ? new int(*rhs.p) : nullptr) {}
	  ~T() { delete p; }

	  // ...

	  T& operator=(const T &rhs) {
	    delete p;
	    p = new int(*rhs.p);
	    return *this;
	  }
	};

     There are two common C++ patterns to avoid this problem. The first  is  the
     self-assignment check:

	class T {
	int* p;

	public:
	  T(const T &rhs) : p(rhs.p ? new int(*rhs.p) : nullptr) {}
	  ~T() { delete p; }

	  // ...

	  T& operator=(const T &rhs) {
	    if(this == &rhs)
	      return *this;

	    delete p;
	    p = new int(*rhs.p);
	    return *this;
	  }
	};

     The  second one is the copy-and-swap method when we create a temporary copy
     (using the copy constructor) and then swap this temporary object with this:

	class T {
	int* p;

	public:
	  T(const T &rhs) : p(rhs.p ? new int(*rhs.p) : nullptr) {}
	  ~T() { delete p; }

	  // ...

	  void swap(T &rhs) {
	    using std::swap;
	    swap(p, rhs.p);
	  }

	  T& operator=(const T &rhs) {
	    T(rhs).swap(*this);
	    return *this;
	  }
	};

     There is  a  third  pattern  which  is  less  common.  Let's  call  it  the
     copy-and-move  method  when we create a temporary copy (using the copy con-
     structor) and then move this temporary object into this (needs a  move  as-
     signment operator):

	class T {
	int* p;

	public:
	  T(const T &rhs) : p(rhs.p ? new int(*rhs.p) : nullptr) {}
	  ~T() { delete p; }

	  // ...

	  T& operator=(const T &rhs) {
	    T t = rhs;
	    *this = std::move(t);
	    return *this;
	  }

	  T& operator=(T &&rhs) {
	    p = rhs.p;
	    rhs.p = nullptr;
	    return *this;
	  }
	};

     WarnOnlyIfThisHasSuspiciousField
	    When  true,  the  check will warn only if the container class of the
	    copy assignment operator has any suspicious fields (pointer or C ar-
	    ray). This option is set to true by default.

   bugprone-unused-raii
     Finds temporaries that look like RAII objects.

     The canonical example for this is a scoped lock.

	{
	  scoped_lock(&global_mutex);
	  critical_section();
	}

     The destructor of the scoped_lock is called before the critical_section  is
     entered, leaving it unprotected.

     We  apply a number of heuristics to reduce the false positive count of this
     check:

     * Ignore code expanded from macros. Testing frameworks make  heavy  use  of
       this.

     * Ignore  types with trivial destructors. They are very unlikely to be RAII
       objects and there's no difference when they are deleted.

     * Ignore objects at the end of a compound statement (doesn't change  behav-
       ior).

     * Ignore objects returned from a call.

   bugprone-unused-return-value
     Warns  on	unused function return values. The checked functions can be con-
     figured.

   Options
     CheckedFunctions
	    Semicolon-separated  list  of  functions  to  check.   Defaults   to
	    ::std::async;::std::launder;::std::remove;::std::re-
	    move_if;::std::unique;::std::unique_ptr::release;::std::ba-
	    sic_string::empty;::std::vector::empty.   This  means that the calls
	    to following functions are checked by default:

	    * std::async(). Not using the return value makes the  call	synchro-
	      nous.

	    * std::launder().  Not using the return value usually means that the
	      function interface was misunderstood by the programmer.  Only  the
	      returned pointer is "laundered", not the argument.

	    * std::remove(),  std::remove_if()	and  std::unique(). The returned
	      iterator indicates the boundary between elements to keep and  ele-
	      ments to be removed. Not using the return value means that the in-
	      formation about which elements to remove is lost.

	    * std::unique_ptr::release(). Not using the return value can lead to
	      resource leaks if the same pointer isn't stored anywhere else. Of-
	      ten,  ignoring  the release() return value indicates that the pro-
	      grammer confused the function with reset().

	    * std::basic_string::empty() and std::vector::empty(). Not using the
	      return value often indicates  that  the  programmer  confused  the
	      function with clear().

   bugprone-use-after-move
     Warns if an object is used after it has been moved, for example:

	std::string str = "Hello, world!\n";
	std::vector<std::string> messages;
	messages.emplace_back(std::move(str));
	std::cout << str;

     The  last	line  will  trigger a warning that str is used after it has been
     moved.

     The check does not trigger a warning if the object is  reinitialized  after
     the  move	and  before  the use. For example, no warning will be output for
     this code:

	messages.emplace_back(std::move(str));
	str = "Greetings, stranger!\n";
	std::cout << str;

     The check takes control flow into account. A warning is only emitted if the
     use can be reached from the move. This means that the following  code  does
     not produce a warning:

	if (condition) {
	  messages.emplace_back(std::move(str));
	} else {
	  std::cout << str;
	}

     On the other hand, the following code does produce a warning:

	for (int i = 0; i < 10; ++i) {
	  std::cout << str;
	  messages.emplace_back(std::move(str));
	}

     (The use-after-move happens on the second iteration of the loop.)

     In  some  cases,  the check may not be able to detect that two branches are
     mutually exclusive. For example (assuming that i is an int):

	if (i == 1) {
	  messages.emplace_back(std::move(str));
	}
	if (i == 2) {
	  std::cout << str;
	}

     In this case, the check will erroneously produce a warning, even though  it
     is not possible for both the move and the use to be executed.

     An erroneous warning can be silenced by reinitializing the object after the
     move:

	if (i == 1) {
	  messages.emplace_back(std::move(str));
	  str = "";
	}
	if (i == 2) {
	  std::cout << str;
	}

     Subsections  below  explain more precisely what exactly the check considers
     to be a move, use, and reinitialization.

   Unsequenced moves, uses, and reinitializations
     In many cases, C++ does not make any guarantees about the	order  in  which
     sub-expressions  of a statement are evaluated. This means that in code like
     the following, it is not guaranteed whether the use will happen  before  or
     after the move:

	void f(int i, std::vector<int> v);
	std::vector<int> v = { 1, 2, 3 };
	f(v[1], std::move(v));

     In  this  kind  of situation, the check will note that the use and move are
     unsequenced.

     The check will also take sequencing rules into account  when  reinitializa-
     tions  occur  in the same statement as moves or uses. A reinitialization is
     only considered to reinitialize a variable if it is guaranteed to be evalu-
     ated after the move and before the use.

   Move
     The check currently only considers calls of std::move on local variables or
     function parameters. It does not check moves of member variables or  global
     variables.

     Any  call	of std::move on a variable is considered to cause a move of that
     variable, even if the result of std::move is not passed to an rvalue refer-
     ence parameter.

     This means that the check will flag a use-after-move even on  a  type  that
     does not define a move constructor or move assignment operator. This is in-
     tentional.   Developers may use std::move on such a type in the expectation
     that the type will add move semantics in the future. If  such  a  std::move
     has  the potential to cause a use-after-move, we want to warn about it even
     if the type does not implement move semantics yet.

     Furthermore, if the result of std::move is passed to  an  rvalue  reference
     parameter,  this  will  always  be  considered to cause a move, even if the
     function that consumes this parameter does not move from it, or if it  does
     so  only  conditionally. For example, in the following situation, the check
     will assume that a move always takes place:

	std::vector<std::string> messages;
	void f(std::string &&str) {
	  // Only remember the message if it isn't empty.
	  if (!str.empty()) {
	    messages.emplace_back(std::move(str));
	  }
	}
	std::string str = "";
	f(std::move(str));

     The check will assume that the last line causes a	move,  even  though,  in
     this particular case, it does not. Again, this is intentional.

     When  analyzing the order in which moves, uses and reinitializations happen
     (see section Unsequenced moves, uses, and reinitializations), the	move  is
     assumed  to  occur  in  whichever	function  the result of the std::move is
     passed to.

   Use
     Any occurrence of the moved variable that is not  a  reinitialization  (see
     below) is considered to be a use.

     An  exception  to this are objects of type std::unique_ptr, std::shared_ptr
     and std::weak_ptr, which have  defined  move  behavior  (objects  of  these
     classes are guaranteed to be empty after they have been moved from). There-
     fore,  an	object of these classes will only be considered to be used if it
     is dereferenced, i.e. if operator*, operator-> or operator[] (in  the  case
     of std::unique_ptr<T []>) is called on it.

     If multiple uses occur after a move, only the first of these is flagged.

   Reinitialization
     The check considers a variable to be reinitialized in the following cases:

	* The variable occurs on the left-hand side of an assignment.

	* The  variable  is  passed  to  a  function  as  a non-const pointer or
	  non-const lvalue reference. (It is assumed that the variable may be an
	  out-parameter for the function.)

	* clear() or assign() is called on the variable and the variable  is  of
	  one  of the standard container types basic_string, vector, deque, for-
	  ward_list, list, set,  map,  multiset,  multimap,  unordered_set,  un-
	  ordered_map, unordered_multiset, unordered_multimap.

	* reset()  is  called  on  the	variable  and  the  variable  is of type
	  std::unique_ptr, std::shared_ptr or std::weak_ptr.

	* A member function marked with the  [[clang::reinitializes]]  attribute
	  is called on the variable.

     If  the  variable in question is a struct and an individual member variable
     of that struct is written to, the check does not  consider  this  to  be  a
     reinitialization -- even if, eventually, all member variables of the struct
     are written to. For example:

	struct S {
	  std::string str;
	  int i;
	};
	S s = { "Hello, world!\n", 42 };
	S s_other = std::move(s);
	s.str = "Lorem ipsum";
	s.i = 99;

     The  check will not consider s to be reinitialized after the last line; in-
     stead, the line that assigns to s.str will be flagged as a  use-after-move.
     This  is  intentional  as	this  pattern  of reinitializing a struct is er-
     ror-prone.  For example, if an additional member variable is added to S, it
     is easy to forget to add the reinitialization for this  additional  member.
     Instead,  it  is  safer  to assign to the entire struct in one go, and this
     will also avoid the use-after-move warning.

   bugprone-virtual-near-miss
     Warn if a function is a near miss (ie. the name is  very  similar	and  the
     function signature is the same) to a virtual function from a base class.

     Example:

	struct Base {
	  virtual void func();
	};

	struct Derived : Base {
	  virtual funk();
	  // warning: 'Derived::funk' has a similar name and the same signature as virtual method 'Base::func'; did you mean to override it?
	};

   cert-con36-c
     The      cert-con36-c     check	 is	an     alias,	  please     see
     bugprone-spuriously-wake-up-functions for more information.

   cert-con54-cpp
     The    cert-con54-cpp     check	 is	an     alias,	  please     see
     bugprone-spuriously-wake-up-functions for more information.

   cert-dcl03-c
     The  cert-dcl03-c check is an alias, please see misc-static-assert for more
     information.

   cert-dcl16-c
     The     cert-dcl16-c     check	is     an     alias,	 please      see
     readability-uppercase-literal-suffix for more information.

   cert-dcl21-cpp
     This  check flags postfix operator++ and operator-- declarations if the re-
     turn type is not a const object. This also warns if the return  type  is  a
     reference type.

     The  object  returned  by a postfix increment or decrement operator is sup-
     posed to be a snapshot of the object's value prior  to  modification.  With
     such an implementation, any modifications made to the resulting object from
     calling  operator++(int)  would be modifying a temporary object. Thus, such
     an implementation of a postfix increment or decrement operator  should  in-
     stead return a const object, prohibiting accidental mutation of a temporary
     object.   Similarly,  it is unexpected for the postfix operator to return a
     reference to its previous state, and any subsequent modifications would  be
     operating on a stale object.

     This  check  corresponds  to  the	CERT  C++ Coding Standard recommendation
     DCL21-CPP. Overloaded postfix increment and decrement operators should  re-
     turn a const object. However, all of the CERT recommendations have been re-
     moved from public view, and so their justification for the behavior of this
     check requires an account on their wiki to view.

   cert-dcl37-c
     The cert-dcl37-c check is an alias, please see bugprone-reserved-identifier
     for more information.

   cert-dcl50-cpp
     This check flags all function definitions (but not declarations) of C-style
     variadic functions.

     This  check  corresponds to the CERT C++ Coding Standard rule DCL50-CPP. Do
     not define a C-style variadic function.

   cert-dcl51-cpp
     The    cert-dcl51-cpp     check	 is	an     alias,	  please     see
     bugprone-reserved-identifier for more information.

   cert-dcl54-cpp
     The  cert-dcl54-cpp check is an alias, please see misc-new-delete-overloads
     for more information.

   cert-dcl58-cpp
     Modification of the std or posix namespace can result in  undefined  behav-
     ior.  This check warns for such modifications.

     Examples:

	namespace std {
	  int x; // May cause undefined behavior.
	}

     This  check  corresponds to the CERT C++ Coding Standard rule DCL58-CPP. Do
     not modify the standard namespaces.

   cert-dcl59-cpp
     The cert-dcl59-cpp check is an alias,  please  see  google-build-namespaces
     for more information.

   cert-env33-c
     This  check flags calls to system(), popen(), and _popen(), which execute a
     command processor. It does not flag calls to system() with a  null  pointer
     argument, as such a call checks for the presence of a command processor but
     does not actually attempt to execute a command.

     This  check  corresponds to the CERT C Coding Standard rule ENV33-C. Do not
     call system().

   cert-err09-cpp
     The    cert-err09-cpp     check	 is	an     alias,	  please     see
     misc-throw-by-value-catch-by-reference for more information.

     This  check  corresponds  to  the	CERT  C++ Coding Standard recommendation
     ERR09-CPP. Throw anonymous temporaries. However, all of the CERT  recommen-
     dations  have been removed from public view, and so their justification for
     the behavior of this check requires an account on their wiki to view.

   cert-err34-c
     This check flags calls to string-to-number conversion functions that do not
     verify the validity of the conversion, such as atoi() or scanf().	It  does
     not  flag calls to strtol(), or other, related conversion functions that do
     perform better error checking.

	#include <stdlib.h>

	void func(const char *buff) {
	  int si;

	  if (buff) {
	    si = atoi(buff); /* 'atoi' used to convert a string to an integer, but function will
				 not report conversion errors; consider using 'strtol' instead. */
	  } else {
	    /* Handle error */
	  }
	}

     This check corresponds to the CERT C Coding Standard rule	ERR34-C.  Detect
     errors when converting a string to a number.

   cert-err52-cpp
     This check flags all call expressions involving setjmp() and longjmp().

     This  check  corresponds to the CERT C++ Coding Standard rule ERR52-CPP. Do
     not use setjmp() or longjmp().

   cert-err58-cpp
     This check flags all static or thread_local variable declarations where the
     initializer for the object may throw an exception.

     This check corresponds to the CERT C++ Coding Standard rule ERR58-CPP. Han-
     dle all exceptions thrown before main() begins executing.

   cert-err60-cpp
     This check flags all throw expressions where the exception  object  is  not
     nothrow copy constructible.

     This  check corresponds to the CERT C++ Coding Standard rule ERR60-CPP. Ex-
     ception objects must be nothrow copy constructible.

   cert-err61-cpp
     The    cert-err61-cpp     check	 is	an     alias,	  please     see
     misc-throw-by-value-catch-by-reference for more information.

   cert-fio38-c
     The  cert-fio38-c	check  is an alias, please see misc-non-copyable-objects
     for more information.

   cert-flp30-c
     This check flags for loops where the  induction  expression  has  a  float-
     ing-point type.

     This  check  corresponds to the CERT C Coding Standard rule FLP30-C. Do not
     use floating-point variables as loop counters.

   cert-mem57-cpp
     This check flags uses of default operator new where the type  has	extended
     alignment	(an  alignment greater than the fundamental alignment). (The de-
     fault operator new is guaranteed to provide the correct  alignment  if  the
     requested	alignment  is less or equal to the fundamental alignment).  Only
     cases are detected (by design) where the operator new is  not  user-defined
     and  is  not  a  placement new (the reason is that in these cases we assume
     that the user provided the correct memory allocation).

     This check corresponds to the CERT  C++  Coding  Standard	rule  MEM57-CPP.
     Avoid using default operator new for over-aligned types.

   cert-msc30-c
     The  cert-msc30-c check is an alias, please see cert-msc50-cpp for more in-
     formation.

   cert-msc32-c
     The cert-msc32-c check is an alias, please see cert-msc51-cpp for more  in-
     formation.

   cert-msc50-cpp
     Pseudorandom number generators use mathematical algorithms to produce a se-
     quence  of  numbers  with good statistical properties, but the numbers pro-
     duced are not genuinely random. The std::rand() function takes a seed (num-
     ber), runs a mathematical operation on it and returns the result. By manip-
     ulating the seed the result can be predictable. This check  warns	for  the
     usage of std::rand().

   cert-msc51-cpp
     This check flags all pseudo-random number engines, engine adaptor instanti-
     ations  and  srand() when initialized or seeded with default argument, con-
     stant expression or any user-configurable type.  Pseudo-random  number  en-
     gines seeded with a predictable value may cause vulnerabilities e.g. in se-
     curity protocols.	This is a CERT security rule, see MSC51-CPP. Ensure your
     random  number  generator	is  properly  seeded  and MSC32-C. Properly seed
     pseudorandom number generators.

     Examples:

	void foo() {
	  std::mt19937 engine1; // Diagnose, always generate the same sequence
	  std::mt19937 engine2(1); // Diagnose
	  engine1.seed(); // Diagnose
	  engine2.seed(1); // Diagnose

	  std::time_t t;
	  engine1.seed(std::time(&t)); // Diagnose, system time might be controlled by user

	  int x = atoi(argv[1]);
	  std::mt19937 engine3(x);  // Will not warn
	}

   Options
     DisallowedSeedTypes
	    A comma-separated list of the type names which are disallowed.   De-
	    fault values are time_t, std::time_t.

   cert-oop11-cpp
     The     cert-oop11-cpp	check	  is	 an	alias,	   please    see
     performance-move-constructor-init for more information.

     This check corresponds to	the  CERT  C++	Coding	Standard  recommendation
     OOP11-CPP.  Do not copy-initialize members or base classes from a move con-
     structor. However, all of the CERT recommendations have been  removed  from
     public  view, and so their justification for the behavior of this check re-
     quires an account on their wiki to view.

   cert-oop54-cpp
     The    cert-oop54-cpp     check	 is	an     alias,	  please     see
     bugprone-unhandled-self-assignment for more information.

   cert-oop57-cpp
	Flags  use of the C standard library functions memset, memcpy and memcmp
	and similar derivatives on non-trivial types.

   Options
     MemSetNames
	    Specify extra functions to	flag  that  act  similarily  to  memset.
	    Specify  names  in	a semicolon delimited list.  Default is an empty
	    string.  The check will  detect  the  following  functions:  memset,
	    std::memset.

     MemCpyNames
	    Specify  extra  functions  to  flag  that  act similarily to memcpy.
	    Specify names in a semicolon delimited list.  Default  is  an  empty
	    string.  The check will detect the following functions: std::memcpy,
	    memcpy,  std::memmove,  memmove,  std::strcpy, strcpy, memccpy, stp-
	    ncpy, strncpy.

     MemCmpNames
	    Specify extra functions to	flag  that  act  similarily  to  memcmp.
	    Specify  names  in	a semicolon delimited list.  Default is an empty
	    string.  The check will detect the following functions: std::memcmp,
	    memcmp, std::strcmp, strcmp, strncmp.

     This check corresponds to the CERT C++ Coding Standard rule OOP57-CPP. Pre-
     fer special member functions and overloaded operators to C Standard Library
     functions.

   cert-oop58-cpp
     Finds assignments to the copied object and its direct or  indirect  members
     in copy constructors and copy assignment operators.

     This  check  corresponds to the CERT C Coding Standard rule OOP58-CPP. Copy
     operations must not mutate the source object.

   cert-pos44-c
     The     cert-pos44-c     check	is     an     alias,	 please      see
     bugprone-bad-signal-to-kill-thread for more information.

   cert-sig30-c
     The  cert-sig30-c check is an alias, please see bugprone-signal-handler for
     more information.

   cert-str34-c
     The cert-str34-c check is an alias, please see  bugprone-signed-char-misuse
     for more information.

   clang-analyzer-core.CallAndMessage
     The  clang-analyzer-core.CallAndMessage check is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-core.DivideZero
     The clang-analyzer-core.DivideZero check is an alias, please see Clang Sta-
     tic Analyzer Available Checkers for more information.

   clang-analyzer-core.DynamicTypePropagation
     Generate dynamic type information

   clang-analyzer-core.NonNullParamChecker
     The clang-analyzer-core.NonNullParamChecker check is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.NullDereference
     The clang-analyzer-core.NullDereference check is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-core.StackAddressEscape
     The clang-analyzer-core.StackAddressEscape check is an alias, please see  -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.UndefinedBinaryOperatorResult
     The  clang-analyzer-core.UndefinedBinaryOperatorResult  check  is an alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.VLASize
     The clang-analyzer-core.VLASize check is an alias, please see Clang  Static
     Analyzer Available Checkers for more information.

   clang-analyzer-core.uninitialized.ArraySubscript
     The  clang-analyzer-core.uninitialized.ArraySubscript  check  is  an alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.uninitialized.Assign
     The clang-analyzer-core.uninitialized.Assign check is an alias, please  see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.uninitialized.Branch
     The  clang-analyzer-core.uninitialized.Branch check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-core.uninitialized.CapturedBlockVariable
     Check for blocks that capture uninitialized values

   clang-analyzer-core.uninitialized.UndefReturn
     The clang-analyzer-core.uninitialized.UndefReturn check is an alias, please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-cplusplus.InnerPointer
     Check for inner pointers of C++ containers used after re/deallocation

   clang-analyzer-cplusplus.Move
     The clang-analyzer-cplusplus.Move check is an alias, please see Clang  Sta-
     tic Analyzer Available Checkers for more information.

   clang-analyzer-cplusplus.NewDelete
     The  clang-analyzer-cplusplus.NewDelete check is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-cplusplus.NewDeleteLeaks
     The clang-analyzer-cplusplus.NewDeleteLeaks check is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-deadcode.DeadStores
     The clang-analyzer-deadcode.DeadStores check is an alias, please see  Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-nullability.NullPassedToNonnull
     The   clang-analyzer-nullability.NullPassedToNonnull  check  is  an  alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-nullability.NullReturnedFromNonnull
     The clang-analyzer-nullability.NullReturnedFromNonnull check is  an  alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-nullability.NullableDereferenced
     The  clang-analyzer-nullability.NullableDereferenced  check  is  an  alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-nullability.NullablePassedToNonnull
     The clang-analyzer-nullability.NullablePassedToNonnull check is  an  alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-nullability.NullableReturnedFromNonnull
     Warns when a nullable pointer is returned from a function that has _Nonnull
     return type.

   clang-analyzer-optin.cplusplus.UninitializedObject
     The  clang-analyzer-optin.cplusplus.UninitializedObject  check is an alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-optin.cplusplus.VirtualCall
     The clang-analyzer-optin.cplusplus.VirtualCall check is  an  alias,  please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-optin.mpi.MPI-Checker
     The  clang-analyzer-optin.mpi.MPI-Checker	check  is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-optin.osx.OSObjectCStyleCast
     Checker for C-style casts of OSObjects

   clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker

     The     clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationCon-
     textChecker  check  is an alias, please see Clang Static Analyzer Available
     Checkers for more information.

   clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker
     The clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker
     check is an alias, please see Clang Static Analyzer Available Checkers  for
     more information.

   clang-analyzer-optin.performance.GCDAntipattern
     Check for performance anti-patterns when using Grand Central Dispatch

   clang-analyzer-optin.performance.Padding
     Check for excessively padded structs.

   clang-analyzer-optin.portability.UnixAPI
     Finds implementation-defined behavior in UNIX/Posix functions

   clang-analyzer-osx.API
     The  clang-analyzer-osx.API check is an alias, please see Clang Static Ana-
     lyzer Available Checkers for more information.

   clang-analyzer-osx.MIG
     Find violations of the Mach Interface Generator calling convention

   clang-analyzer-osx.NumberObjectConversion
     Check for erroneous conversions of objects representing numbers  into  num-
     bers

   clang-analyzer-osx.OSObjectRetainCount
     Check for leaks and improper reference count management for OSObject

   clang-analyzer-osx.ObjCProperty
     Check for proper uses of Objective-C properties

   clang-analyzer-osx.SecKeychainAPI
     The  clang-analyzer-osx.SecKeychainAPI  check is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.AtSync
     The clang-analyzer-osx.cocoa.AtSync check is an  alias,  please  see  Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.AutoreleaseWrite
     Warn  about  potentially crashing writes to autoreleasing objects from dif-
     ferent autoreleasing pools in Objective-C

   clang-analyzer-osx.cocoa.ClassRelease
     The clang-analyzer-osx.cocoa.ClassRelease check is an alias, please  see  -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.Dealloc
     The  clang-analyzer-osx.cocoa.Dealloc  check  is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.IncompatibleMethodTypes
     The clang-analyzer-osx.cocoa.IncompatibleMethodTypes  check  is  an  alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.Loops
     Improved modeling of loops using Cocoa collection types

   clang-analyzer-osx.cocoa.MissingSuperCall
     Warn about Objective-C methods that lack a necessary call to super

   clang-analyzer-osx.cocoa.NSAutoreleasePool
     The  clang-analyzer-osx.cocoa.NSAutoreleasePool  check  is an alias, please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.NSError
     The clang-analyzer-osx.cocoa.NSError check is an alias,  please  see  Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.NilArg
     The  clang-analyzer-osx.cocoa.NilArg  check  is  an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.NonNilReturnValue
     Model the APIs that are guaranteed to return a non-nil value

   clang-analyzer-osx.cocoa.ObjCGenerics
     The clang-analyzer-osx.cocoa.ObjCGenerics check is an alias, please  see  -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.RetainCount
     The  clang-analyzer-osx.cocoa.RetainCount	check  is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak
     Check for leaked memory in autorelease pools that will never be drained

   clang-analyzer-osx.cocoa.SelfInit
     The clang-analyzer-osx.cocoa.SelfInit check is an alias, please  see  Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.SuperDealloc
     The  clang-analyzer-osx.cocoa.SuperDealloc  check is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.UnusedIvars
     The clang-analyzer-osx.cocoa.UnusedIvars check is an alias,  please  see  -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.cocoa.VariadicMethodTypes
     The  clang-analyzer-osx.cocoa.VariadicMethodTypes check is an alias, please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.coreFoundation.CFError
     The clang-analyzer-osx.coreFoundation.CFError check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.coreFoundation.CFNumber
     The clang-analyzer-osx.coreFoundation.CFNumber check is  an  alias,  please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.coreFoundation.CFRetainRelease
     The  clang-analyzer-osx.coreFoundation.CFRetainRelease  check  is an alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-osx.coreFoundation.containers.OutOfBounds
     The clang-analyzer-osx.coreFoundation.containers.OutOfBounds  check  is  an
     alias,  please see Clang Static Analyzer Available Checkers for more infor-
     mation.

   clang-analyzer-osx.coreFoundation.containers.PointerSizedValues
     The  clang-analyzer-osx.coreFoundation.containers.PointerSizedValues  check
     is  an  alias, please see Clang Static Analyzer Available Checkers for more
     information.

   clang-analyzer-security.FloatLoopCounter
     The clang-analyzer-security.FloatLoopCounter check is an alias, please  see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling
     The    clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling
     check is an alias, please see Clang Static Analyzer Available Checkers  for
     more information.

   clang-analyzer-security.insecureAPI.UncheckedReturn
     The  clang-analyzer-security.insecureAPI.UncheckedReturn check is an alias,
     please see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.bcmp
     The clang-analyzer-security.insecureAPI.bcmp check is an alias, please  see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.bcopy
     The clang-analyzer-security.insecureAPI.bcopy check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.bzero
     The clang-analyzer-security.insecureAPI.bzero check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.getpw
     The clang-analyzer-security.insecureAPI.getpw check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.gets
     The  clang-analyzer-security.insecureAPI.gets check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.mkstemp
     The clang-analyzer-security.insecureAPI.mkstemp check is an  alias,  please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.mktemp
     The  clang-analyzer-security.insecureAPI.mktemp  check  is an alias, please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.rand
     The clang-analyzer-security.insecureAPI.rand check is an alias, please  see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.strcpy
     The  clang-analyzer-security.insecureAPI.strcpy  check  is an alias, please
     see Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-security.insecureAPI.vfork
     The clang-analyzer-security.insecureAPI.vfork check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-unix.API
     The clang-analyzer-unix.API check is an alias, please see Clang Static Ana-
     lyzer Available Checkers for more information.

   clang-analyzer-unix.Malloc
     The clang-analyzer-unix.Malloc check is an alias, please see  Clang  Static
     Analyzer Available Checkers for more information.

   clang-analyzer-unix.MallocSizeof
     The  clang-analyzer-unix.MallocSizeof  check  is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-unix.MismatchedDeallocator
     The clang-analyzer-unix.MismatchedDeallocator check is an alias, please see
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-unix.Vfork
     The clang-analyzer-unix.Vfork check is an alias, please  see  Clang  Static
     Analyzer Available Checkers for more information.

   clang-analyzer-unix.cstring.BadSizeArg
     The  clang-analyzer-unix.cstring.BadSizeArg check is an alias, please see -
     Clang Static Analyzer Available Checkers for more information.

   clang-analyzer-unix.cstring.NullArg
     The clang-analyzer-unix.cstring.NullArg check is an alias, please see Clang
     Static Analyzer Available Checkers for more information.

   clang-analyzer-valist.CopyToSelf
     Check for va_lists which are copied onto itself.

   clang-analyzer-valist.Uninitialized
     Check for usages of uninitialized (or already released) va_lists.

   clang-analyzer-valist.Unterminated
     Check for va_lists which are not released by a va_end call.

   concurrency-mt-unsafe
     Checks  for  some	thread-unsafe  functions  against  a   black   list   of
     known-to-be-unsafe  functions. Usually they access static variables without
     synchronization (e.g. gmtime(3)) or utilize signals in a racy way.  The set
     of functions to check is specified with the FunctionSet option.

     Note that using some thread-unsafe functions may be still valid in  concur-
     rent programming if only a single thread is used (e.g. setenv(3)), however,
     some  functions  may track a state in global variables which would be clob-
     bered by subsequent (non-parallel, but concurrent) calls to a related func-
     tion. E.g. the following code suffers from unprotected accesses to a global
     state:

	// getnetent(3) maintains global state with DB connection, etc.
	// If a concurrent green thread calls getnetent(3), the global state is corrupted.
	netent = getnetent();
	yield();
	netent = getnetent();

     Examples:

	tm = gmtime(timep); // uses a global buffer

	sleep(1); // implementation may use SIGALRM

     FunctionSet
	    Specifies which functions in libc should be considered  thread-safe,
	    possible values are posix, glibc, or any.

	    posix  means  POSIX defined thread-unsafe functions. POSIX.1-2001 in
	    "2.9.1 Thread-Safety" defines that all functions  specified  in  the
	    standard  are  thread-safe except a predefined list of thread-unsafe
	    functions.

	    Glibc defines some of them as  thread-safe	(e.g.  dirname(3)),  but
	    adds  non-POSIX  thread-unsafe  ones  (e.g. getopt_long(3)). Glibc's
	    list is compiled from  GNU	web  documentation  with  a  search  for
	    MT-Safe			       tag:			       -
	    https://www.gnu.org/software/libc/manual/html_node/POSIX-Safety-Con-
	    cepts.html

	    If you want to identify thread-unsafe API for at least one	libc  or
	    unsure which libc will be used, use any (default).

   cppcoreguidelines-avoid-c-arrays
     The   cppcoreguidelines-avoid-c-arrays   check  is  an  alias,  please  see
     modernize-avoid-c-arrays for more information.

   cppcoreguidelines-avoid-goto
     The usage of goto for control flow is error prone and  should  be	replaced
     with looping constructs. Only forward jumps in nested loops are accepted.

     This  check implements ES.76 from the CppCoreGuidelines and 6.3.1 from High
     Integrity C++.

     For more information on why to avoid programming with goto you can read the
     famous paper A Case against the GO TO Statement..

     The check diagnoses goto for backward jumps in every language  mode.  These
     should be replaced with C/C++ looping constructs.

	// Bad, handwritten for loop.
	int i = 0;
	// Jump label for the loop
	loop_start:
	do_some_operation();

	if (i < 100) {
	  ++i;
	  goto loop_start;
	}

	// Better
	for(int i = 0; i < 100; ++i)
	  do_some_operation();

     Modern C++ needs goto only to jump out of nested loops.

	for(int i = 0; i < 100; ++i) {
	  for(int j = 0; j < 100; ++j) {
	    if (i * j > 500)
	      goto early_exit;
	  }
	}

	early_exit:
	some_operation();

     All other uses of goto are diagnosed in C++.

   cppcoreguidelines-avoid-magic-numbers
     The  cppcoreguidelines-avoid-magic-numbers  check	is  an alias, please see
     readability-magic-numbers for more information.

   cppcoreguidelines-avoid-non-const-global-variables
     Finds non-const global variables as described in I.2 of C++ Core Guidelines
     .	As R.6 of C++ Core Guidelines is a duplicate of rule I.2 it also  covers
     that rule.

	char a;  // Warns!
	const char b =	0;

	namespace some_namespace
	{
	    char c;  // Warns!
	    const char d = 0;
	}

	char * c_ptr1 = &some_namespace::c;  // Warns!
	char *const c_const_ptr = &some_namespace::c;  // Warns!
	char & c_reference = some_namespace::c;  // Warns!

	class Foo  // No Warnings inside Foo, only namespace scope is covered
	{
	public:
	    char e = 0;
	    const char f = 0;
	protected:
	    char g = 0;
	private:
	    char h = 0;
	};

     Variables: a, c, c_ptr1, c_ptr2, c_const_ptr and c_reference, will all gen-
     erate  warnings  since  they are either: a globally accessible variable and
     non-const, a pointer or reference providing global access to non-const data
     or both.

   cppcoreguidelines-c-copy-assignment-signature
     The cppcoreguidelines-c-copy-assignment-signature check is an alias, please
     see misc-unconventional-assign-operator for more information.

   cppcoreguidelines-explicit-virtual-functions
     The cppcoreguidelines-explicit-virtual-functions check is an alias,  please
     see modernize-use-override for more information.

   cppcoreguidelines-init-variables
     Checks  whether there are local variables that are declared without an ini-
     tial value. These may lead to unexpected behaviour if there is a code  path
     that reads the variable before assigning to it.

     Only  integers, booleans, floats, doubles and pointers are checked. The fix
     option initializes all detected values with the value of zero. An exception
     is float and double types, which are initialized to NaN.

     As an example a function that looks like this:

	void function() {
	  int x;
	  char *txt;
	  double d;

	  // Rest of the function.
	}

     Would be rewritten to look like this:

	#include <math.h>

	void function() {
	  int x = 0;
	  char *txt = nullptr;
	  double d = NAN;

	  // Rest of the function.
	}

   Options
     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     MathHeader
	    A string specifying the header to include to get the  definition  of
	    NAN.  Default is <math.h>.

   cppcoreguidelines-interfaces-global-init
     This  check  flags  initializers of globals that access extern objects, and
     therefore can lead to order-of-initialization problems.

     This rule is part of the "Interfaces" profile of the C++  Core  Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Ri-global-init

     Note that currently this does not flag calls  to  non-constexpr  functions,
     and therefore globals could still be accessed from functions themselves.

   cppcoreguidelines-macro-usage
     Finds  macro  usage  that is considered problematic because better language
     constructs exist for the task.

     The relevant sections in the C++ Core Guidelines are Enum.1,  ES.30,  ES.31
     and ES.33.

   Options
     AllowedRegexp
	    A  regular	expression  to	filter	allowed  macros. For example DE-
	    BUG*|LIBTORRENT*|TORRENT*|UNI* could be applied  to  filter  libtor-
	    rent.  Default value is ^DEBUG_*.

     CheckCapsOnly
	    Boolean  flag  to  warn  on  all  macros except those with CAPS_ONLY
	    names.  This option is intended to ease introduction of  this  check
	    into older code bases. Default value is false.

     IgnoreCommandLineMacros
	    Boolean  flag  to  toggle ignoring command-line-defined macros.  De-
	    fault value is true.

   cppcoreguidelines-narrowing-conversions
     Checks for silent narrowing conversions, e.g: int i = 0; i +=  0.1;.  While
     the issue is obvious in this former example, it might not be so in the fol-
     lowing: void MyClass::f(double d) { int_member_ += d; }.

     This  rule  is  part of the "Expressions and statements" profile of the C++
     Core Guidelines, corresponding to rule ES.46. See

     -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#es46-avoid-lossy-narrowing-truncating-arithmetic-conversions.

     We enforce only part of the guideline, more specifically, we flag narrowing
     conversions from:

	    * an integer to a narrower integer (e.g. char to unsigned char),

	    * an integer to a narrower floating-point (e.g. uint64_t to float),

	    * a floating-point to an integer (e.g. double to int),

	    * a floating-point to a  narrower  floating-point  (e.g.  double  to
	      float) if WarnOnFloatingPointNarrowingConversion Option is set.

     This check will flag:

	    * All  narrowing conversions that are not marked by an explicit cast
	      (c-style or static_cast). For example: int i = 0; i += 0.1;,  void
	      f(int); f(0.1);,

	    * All applications of binary operators with a narrowing conversions.
	      For example: int i; i+= 0.1;.

   Options
     WarnOnFloatingPointNarrowingConversion
	    When  true,  the check will warn on narrowing floating point conver-
	    sion (e.g. double to float). true by default.

     PedanticMode
	    When true, the check will warn on assigning a  floating  point  con-
	    stant  to  an  integer value even if the floating point value is ex-
	    actly representable in the destination type (e.g.  int  i  =  1.0;).
	    false by default.

   FAQ
	* What does "narrowing conversion from 'int' to 'float'" mean?

     An  IEEE754  Floating  Point number can represent all integer values in the
     range [-2^PrecisionBits, 2^PrecisionBits] where PrecisionBits is the number
     of bits in the mantissa.

     For float this would be [-2^23, 2^23], where int can  represent  values  in
     the range [-2^31, 2^31-1].

	* What does "implementation-defined" mean?

     You may have encountered messages like "narrowing conversion from 'unsigned
     int'  to  signed type 'int' is implementation-defined".  The C/C++ standard
     does not mandate twoas complement for signed integers, and so the	compiler
     is free to define what the semantics are for converting an unsigned integer
     to signed integer. Clang's implementation uses the twoas complement format.

   cppcoreguidelines-no-malloc
     This  check  handles  C-Style  memory management using malloc(), realloc(),
     calloc() and free(). It warns about its use and tries to suggest the use of
     an appropriate RAII object.  Furthermore, it can  be  configured  to  check
     against a user-specified list of functions that are used for memory manage-
     ment (e.g. posix_memalign()).  See C++ Core Guidelines.

     There  is	no  attempt  made to provide fix-it hints, since manual resource
     management isn't easily transformed automatically into RAII.

	// Warns each of the following lines.
	// Containers like std::vector or std::string should be used.
	char* some_string = (char*) malloc(sizeof(char) * 20);
	char* some_string = (char*) realloc(sizeof(char) * 30);
	free(some_string);

	int* int_array = (int*) calloc(30, sizeof(int));

	// Rather use a smartpointer or stack variable.
	struct some_struct* s = (struct some_struct*) malloc(sizeof(struct some_struct));

   Options
     Allocations
	    Semicolon-separated list of fully qualified names of memory  alloca-
	    tion functions.  Defaults to ::malloc;::calloc.

     Deallocations
	    Semicolon-separated  list of fully qualified names of memory alloca-
	    tion functions.  Defaults to ::free.

     Reallocations
	    Semicolon-separated list of fully qualified names of memory  alloca-
	    tion functions.  Defaults to ::realloc.

   cppcoreguidelines-non-private-member-variables-in-classes
     The  cppcoreguidelines-non-private-member-variables-in-classes  check is an
     alias, please see misc-non-private-member-variables-in-classes for more in-
     formation.

   cppcoreguidelines-owning-memory
     This check implements the type-based semantics of gsl::owner<T*>, which al-
     lows static analysis on code, that uses raw pointers  to  handle  resources
     like dynamic memory, but won't introduce RAII concepts.

     The  relevant  sections  in the C++ Core Guidelines are I.11, C.33, R.3 and
     GSL.Views The definition of a gsl::owner<T*> is straight forward

	namespace gsl { template <typename T> owner = T; }

     It is therefore simple to introduce the owner even without using an  imple-
     mentation of the Guideline Support Library.

     All checks are purely type based and not (yet) flow sensitive.

     The  following examples will demonstrate the correct and incorrect initial-
     izations of owners, assignment is handled the same way. Note that both  new
     and malloc()-like resource functions are considered to produce resources.

	// Creating an owner with factory functions is checked.
	gsl::owner<int*> function_that_returns_owner() { return gsl::owner<int*>(new int(42)); }

	// Dynamic memory must be assigned to an owner
	int* Something = new int(42); // BAD, will be caught
	gsl::owner<int*> Owner = new int(42); // Good
	gsl::owner<int*> Owner = new int[42]; // Good as well

	// Returned owner must be assigned to an owner
	int* Something = function_that_returns_owner(); // Bad, factory function
	gsl::owner<int*> Owner = function_that_returns_owner(); // Good, result lands in owner

	// Something not a resource or owner should not be assigned to owners
	int Stack = 42;
	gsl::owner<int*> Owned = &Stack; // Bad, not a resource assigned

     In  the  case  of dynamic memory as resource, only gsl::owner<T*> variables
     are allowed to be deleted.

	// Example Bad, non-owner as resource handle, will be caught.
	int* NonOwner = new int(42); // First warning here, since new must land in an owner
	delete NonOwner; // Second warning here, since only owners are allowed to be deleted

	// Example Good, Ownership correctly stated
	gsl::owner<int*> Owner = new int(42); // Good
	delete Owner; // Good as well, statically enforced, that only owners get deleted

     The  check  will  furthermore  ensure,  that  functions,  that   expect   a
     gsl::owner<T*>  as  argument  get	called with either a gsl::owner<T*> or a
     newly created resource.

	void expects_owner(gsl::owner<int*> o) { delete o; }

	// Bad Code
	int NonOwner = 42;
	expects_owner(&NonOwner); // Bad, will get caught

	// Good Code
	gsl::owner<int*> Owner = new int(42);
	expects_owner(Owner); // Good
	expects_owner(new int(42)); // Good as well, recognized created resource

	// Port legacy code for better resource-safety
	gsl::owner<FILE*> File = fopen("my_file.txt", "rw+");
	FILE* BadFile = fopen("another_file.txt", "w"); // Bad, warned

	// ... use the file

	fclose(File); // Ok, File is annotated as 'owner<>'
	fclose(BadFile); // BadFile is not an 'owner<>', will be warned

   Options
     LegacyResourceProducers
	    Semicolon-separated list of fully qualified names  of  legacy  func-
	    tions  that create resources but cannot introduce gsl::owner<>.  De-
	    faults to ::malloc;::aligned_alloc;::realloc;::calloc;::fopen;::fre-
	    open;::tmpfile.

     LegacyResourceConsumers
	    Semicolon-separated list of fully qualified names  of  legacy  func-
	    tions  expecting resource owners as pointer arguments but cannot in-
	    troduce   gsl::owner<>.    Defaults    to	 ::free;::realloc;::fre-
	    open;::fclose.

   Limitations
     Using gsl::owner<T*> in a typedef or alias is not handled correctly.

	using heap_int = gsl::owner<int*>;
	heap_int allocated = new int(42); // False positive!

     The  gsl::owner<T*>  is  declared	as  a templated type alias.  In template
     functions and classes, like in the example below, the  information  of  the
     type aliases gets lost. Therefore using gsl::owner<T*> in a heavy templated
     code base might lead to false positives.

     Known code constructs that do not get diagnosed correctly are:

     * std::exchange

     * std::vector<gsl::owner<T*>>

	// This template function works as expected. Type information doesn't get lost.
	template <typename T>
	void delete_owner(gsl::owner<T*> owned_object) {
	  delete owned_object; // Everything alright
	}

	gsl::owner<int*> function_that_returns_owner() { return gsl::owner<int*>(new int(42)); }

	// Type deduction does not work for auto variables.
	// This is caught by the check and will be noted accordingly.
	auto OwnedObject = function_that_returns_owner(); // Type of OwnedObject will be int*

	// Problematic function template that looses the typeinformation on owner
	template <typename T>
	void bad_template_function(T some_object) {
	  // This line will trigger the warning, that a non-owner is assigned to an owner
	  gsl::owner<T*> new_owner = some_object;
	}

	// Calling the function with an owner still yields a false positive.
	bad_template_function(gsl::owner<int*>(new int(42)));

	// The same issue occurs with templated classes like the following.
	template <typename T>
	class OwnedValue {
	public:
	  const T getValue() const { return _val; }
	private:
	  T _val;
	};

	// Code, that yields a false positive.
	OwnedValue<gsl::owner<int*>> Owner(new int(42)); // Type deduction yield T -> int *
	// False positive, getValue returns int* and not gsl::owner<int*>
	gsl::owner<int*> OwnedInt = Owner.getValue();

     Another  limitation  of  the  current implementation is only the type based
     checking.	Suppose you have code like the following:

	// Two owners with assigned resources
	gsl::owner<int*> Owner1 = new int(42);
	gsl::owner<int*> Owner2 = new int(42);

	Owner2 = Owner1; // Conceptual Leak of initial resource of Owner2!
	Owner1 = nullptr;

     The semantic of a	gsl::owner<T*>	is  mostly  like  a  std::unique_ptr<T>,
     therefore	assignment of two gsl::owner<T*> is considered a move, which re-
     quires that the resource Owner2 must have been released before the  assign-
     ment.  This kind of condition could be caught in later improvements of this
     check  with  flowsensitive  analysis.  Currently, the Clang Static Analyzer
     catches this bug for dynamic memory, but  not  for  general  types  of  re-
     sources.

   cppcoreguidelines-pro-bounds-array-to-pointer-decay
     This check flags all array to pointer decays.

     Pointers  should  not  be used as arrays. span<T> is a bounds-checked, safe
     alternative to using pointers to access arrays.

     This rule is part of the "Bounds safety" profile of  the  C++  Core  Guide-
     lines,				    see 			       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-bounds-decay.

   cppcoreguidelines-pro-bounds-constant-array-index
     This check flags all array  subscript  expressions  on  static  arrays  and
     std::arrays  that either do not have a constant integer expression index or
     are out of bounds (for std::array). For out-of-bounds  checking  of  static
     arrays, see the -Warray-bounds Clang diagnostic.

     This  rule  is  part  of the "Bounds safety" profile of the C++ Core Guide-
     lines,				   see				       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-bounds-arrayindex.

   Options
     GslHeader
	    The  check	can generate fixes after this option has been set to the
	    name of the include file that contains gsl::at(), e.g. "gsl/gsl.h".

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

   cppcoreguidelines-pro-bounds-pointer-arithmetic
     This check flags all usage of pointer arithmetic, because it could lead  to
     an  invalid  pointer.  Subtraction  of  two pointers is not flagged by this
     check.

     Pointers should only refer to single objects,  and  pointer  arithmetic  is
     fragile  and  easy to get wrong. span<T> is a bounds-checked, safe type for
     accessing arrays of data.

     This rule is part of the "Bounds safety" profile of  the  C++  Core  Guide-
     lines,				    see 			       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-bounds-arithmetic.

   cppcoreguidelines-pro-type-const-cast
     This check flags all uses of const_cast in C++ code.

     Modifying a variable that was declared const is  undefined  behavior,  even
     with const_cast.

     This  rule is part of the "Type safety" profile of the C++ Core Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-constcast.

   cppcoreguidelines-pro-type-cstyle-cast
     This  check flags all use of C-style casts that perform a static_cast down-
     cast, const_cast, or reinterpret_cast.

     Use of these casts can violate type safety and cause the program to  access
     a	variable  that	is actually of type X to be accessed as if it were of an
     unrelated type Z. Note that a C-style (T)expression cast means  to  perform
     the first of the following that is possible: a const_cast, a static_cast, a
     static_cast  followed  by	a  const_cast, a reinterpret_cast, or a reinter-
     pret_cast followed by a const_cast. This rule bans (T)expression only  when
     used to perform an unsafe cast.

     This  rule is part of the "Type safety" profile of the C++ Core Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-cstylecast.

   cppcoreguidelines-pro-type-member-init
     The check flags user-defined constructor definitions that do not initialize
     all  fields  that	would be left in an undefined state by default construc-
     tion, e.g. builtins, pointers and record types  without  user-provided  de-
     fault  constructors  containing  at  least  one  such type. If these fields
     aren't initialized, the constructor will leave some of the memory in an un-
     defined state.

     For C++11 it suggests fixes to add in-class field initializers.  For  older
     versions it inserts the field initializers into the constructor initializer
     list.  It	will also initialize any direct base classes that need to be ze-
     roed in the constructor initializer list.

     The check takes assignment of fields in the constructor body  into  account
     but  generates false positives for fields initialized in methods invoked in
     the constructor body.

     The check also flags variables with automatic storage  duration  that  have
     record  types  without a user-provided constructor and are not initialized.
     The suggested fix is to zero initialize the variable via {} for  C++11  and
     beyond or = {} for older language versions.

   Options
     IgnoreArrays
	    If set to true, the check will not warn about array members that are
	    not  zero-initialized  during construction. For performance critical
	    code, it may be important to not initialize  fixed-size  array  mem-
	    bers. Default is false.

     UseAssignment
	    If set to true, the check will provide fix-its with literal initial-
	    izers ( int i = 0; ) instead of curly braces ( int i{}; ).

     This  rule is part of the "Type safety" profile of the C++ Core Guidelines,
     corresponding	   to	      rule	   Type.6.	   See	       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-memberinit.

   cppcoreguidelines-pro-type-reinterpret-cast
     This check flags all uses of reinterpret_cast in C++ code.

     Use  of these casts can violate type safety and cause the program to access
     a variable that is actually of type X to be accessed as if it  were  of  an
     unrelated type Z.

     This  rule is part of the "Type safety" profile of the C++ Core Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-reinterpretcast.

   cppcoreguidelines-pro-type-static-cast-downcast
     This check flags all usages of static_cast, where a base class is casted to
     a	derived  class. In those cases, a fix-it is provided to convert the cast
     to a dynamic_cast.

     Use of these casts can violate type safety and cause the program to  access
     a	variable  that	is actually of type X to be accessed as if it were of an
     unrelated type Z.

     This rule is part of the "Type safety" profile of the C++ Core  Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-downcast.

   cppcoreguidelines-pro-type-union-access
     This check flags all access to members of unions. Passing unions as a whole
     is not flagged.

     Reading from a union member assumes that member was the last  one	written,
     and  writing to a union member assumes another member with a nontrivial de-
     structor had its destructor called. This is fragile because it cannot  gen-
     erally  be  enforced to be safe in the language and so relies on programmer
     discipline to get it right.

     This rule is part of the "Type safety" profile of the C++ Core  Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-unions.

   cppcoreguidelines-pro-type-vararg
     This check flags all calls to c-style  vararg  functions  and  all  use  of
     va_arg.

     To  allow	for  SFINAE  use of vararg functions, a call is not flagged if a
     literal 0 is passed as the only vararg argument.

     Passing to varargs assumes the correct type will be read. This  is  fragile
     because  it  cannot generally be enforced to be safe in the language and so
     relies on programmer discipline to get it right.

     This rule is part of the "Type safety" profile of the C++ Core  Guidelines,
     see								       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#Pro-type-varargs.

   cppcoreguidelines-slicing
     Flags slicing of member variables or vtable. Slicing happens when copying a
     derived object into a base object: the members of the derived object  (both
     member  variables and virtual member functions) will be discarded. This can
     be misleading especially for member function slicing, for example:

	struct B { int a; virtual int f(); };
	struct D : B { int b; int f() override; };

	void use(B b) {  // Missing reference, intended?
	  b.f();  // Calls B::f.
	}

	D d;
	use(d);  // Slice.

     See  the  relevant  C++   Core   Guidelines   sections   for   details:   -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#es63-dont-slice						       -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#c145-access-polymorphic-objects-through-pointers-and-references

   cppcoreguidelines-special-member-functions
     The check finds classes where some but not all of the special member  func-
     tions are defined.

     By  default the compiler defines a copy constructor, copy assignment opera-
     tor, move constructor, move assignment operator and destructor. The default
     can be suppressed by explicit user-definitions.  The  relationship  between
     which  functions  will  be  suppressed by definitions of other functions is
     complicated and it is advised that all five are defaulted or explicitly de-
     fined.

     Note that defining a function with = delete is considered to be  a  defini-
     tion.

     This  rule is part of the "Constructors, assignments, and destructors" pro-
     file of the C++ Core Guidelines, corresponding to rule C.21. See

     -
     https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuide-
     lines.md#c21-if-you-define-or-delete-any-default-operation-de-
     fine-or-delete-them-all.

   Options
     AllowSoleDefaultDtor
	    When set to true (default is false), this check doesn't flag classes
	    with a sole, explicitly defaulted destructor. An example for such  a
	    class is:

	       struct A {
		 virtual ~A() = default;
	       };

     AllowMissingMoveFunctions
	    When set to true (default is false), this check doesn't flag classes
	    which define no move operations at all. It still flags classes which
	    define only one of either move constructor or move assignment opera-
	    tor. With this option enabled, the following class won't be flagged:

	       struct A {
		 A(const A&);
		 A& operator=(const A&);
		 ~A();
	       };

     AllowMissingMoveFunctionsWhenCopyIsDeleted
	    When set to true (default is false), this check doesn't flag classes
	    which  define  deleted  copy operations but don't define move opera-
	    tions.  This  flags  is  related  to  Google  C++  Style   Guide   -
	    https://google.github.io/styleguide/cppguide.html#Copyable_Mov-
	    able_Types.  With  this option enabled, the following class won't be
	    flagged:

	       struct A {
		 A(const A&) = delete;
		 A& operator=(const A&) = delete;
		 ~A();
	       };

   darwin-avoid-spinlock
     Finds usages of OSSpinlock, which is deprecated due to  potential	livelock
     problems.

     This check will detect following function invocations:

     * OSSpinlockLock

     * OSSpinlockTry

     * OSSpinlockUnlock

     The   corresponding   information	 about	the  problem  of  OSSpinlock:  -
     https://blog.postmates.com/why-spinlocks-are-bad-on-ios-b69fc5221058

   darwin-dispatch-once-nonstatic
     Finds declarations of dispatch_once_t variables without  static  or  global
     storage. The behavior of using dispatch_once_t predicates with automatic or
     dynamic storage is undefined by libdispatch, and should be avoided.

     It  is  a	common	pattern  to have functions initialize internal static or
     global data once when the function runs, but programmers have been known to
     miss the static on the dispatch_once_t predicate, leading to an  uninitial-
     ized flag value at the mercy of the stack.

     Programmers  have also been known to make dispatch_once_t variables be mem-
     bers of structs or classes, with the intent to lazily perform  some  expen-
     sive  struct  or  class member initialization only once; however, this vio-
     lates the libdispatch requirements.

     See the discussion section of Apple's dispatch_once documentation for  more
     information.

   fuchsia-default-arguments-calls
     Warns if a function or method is called with default arguments.

     For example, given the declaration:

	int foo(int value = 5) { return value; }

     A	function call expression that uses a default argument will be diagnosed.
     Calling it without defaults will not cause a warning:

	foo();	// warning
	foo(0); // no warning

     See     the     features	  disallowed	  in	  Fuchsia      at      -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-default-arguments-declarations
     Warns if a function or method is declared with default parameters.

     For example, the declaration:

	int foo(int value = 5) { return value; }

     will cause a warning.

     See      the      features      disallowed      in     Fuchsia	at     -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-header-anon-namespaces
     The  fuchsia-header-anon-namespaces  check  is   an   alias,   please   see
     google-build-namespace for more information.

   fuchsia-multiple-inheritance
     Warns if a class inherits from multiple classes that are not pure virtual.

     For example, declaring a class that inherits from multiple concrete classes
     is disallowed:

	class Base_A {
	public:
	  virtual int foo() { return 0; }
	};

	class Base_B {
	public:
	  virtual int bar() { return 0; }
	};

	// Warning
	class Bad_Child1 : public Base_A, Base_B {};

     A class that inherits from a pure virtual is allowed:

	class Interface_A {
	public:
	  virtual int foo() = 0;
	};

	class Interface_B {
	public:
	  virtual int bar() = 0;
	};

	// No warning
	class Good_Child1 : public Interface_A, Interface_B {
	  virtual int foo() override { return 0; }
	  virtual int bar() override { return 0; }
	};

     See      the      features      disallowed      in     Fuchsia	at     -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-overloaded-operator
     Warns if an operator is overloaded, except for  the  assignment  (copy  and
     move) operators.

     For example:

	int operator+(int);	// Warning

	B &operator=(const B &Other);  // No warning
	B &operator=(B &&Other) // No warning

     See      the      features      disallowed      in     Fuchsia	at     -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-statically-constructed-objects
     Warns if global, non-trivial objects with static storage  are  constructed,
     unless the object is statically initialized with a constexpr constructor or
     has no explicit constructor.

     For example:

	class A {};

	class B {
	public:
	  B(int Val) : Val(Val) {}
	private:
	  int Val;
	};

	class C {
	public:
	  C(int Val) : Val(Val) {}
	  constexpr C() : Val(0) {}

	private:
	  int Val;
	};

	static A a;	    // No warning, as there is no explicit constructor
	static C c(0);	    // No warning, as constructor is constexpr

	static B b(0);	    // Warning, as constructor is not constexpr
	static C c2(0, 1);  // Warning, as constructor is not constexpr

	static int i;	    // No warning, as it is trivial

	extern int get_i();
	static C(get_i())   // Warning, as the constructor is dynamically initialized

     See      the      features      disallowed      in     Fuchsia	at     -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-trailing-return
     Functions that have trailing returns are disallowed, except for those using
     decltype specifiers and lambda with otherwise unutterable return types.

     For example:

	// No warning
	int add_one(const int arg) { return arg; }

	// Warning
	auto get_add_one() -> int (*)(const int) {
	  return add_one;
	}

     Exceptions are made for lambdas and decltype specifiers:

	// No warning
	auto lambda = [](double x, double y) -> double {return x + y;};

	// No warning
	template <typename T1, typename T2>
	auto fn(const T1 &lhs, const T2 &rhs) -> decltype(lhs + rhs) {
	  return lhs + rhs;
	}

     See     the     features	  disallowed	  in	  Fuchsia      at      -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   fuchsia-virtual-inheritance
     Warns if classes are defined with virtual inheritance.

     For example, classes should not be defined with virtual inheritance:

	class B : public virtual A {};	 // warning

     See      the      features      disallowed      in     Fuchsia	at     -
     https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md

   google-build-explicit-make-pair
     Check that make_pair's template arguments are deduced.

     G++ 4.6 in C++11 mode fails badly if  make_pair's	template  arguments  are
     specified explicitly, and such use isn't intended in any case.

     Corresponding cpplint.py check name: build/explicit_make_pair.

   google-build-namespaces
     cert-dcl59-cpp   redirects   here	as  an	alias  for  this  check.   fuch-
     sia-header-anon-namespaces redirects here as an alias for this check.

     Finds anonymous namespaces in headers.

     https://google.github.io/styleguide/cppguide.html#Namespaces

     Corresponding cpplint.py check name: build/namespaces.

   Options
     HeaderFileExtensions
	    A comma-separated list of filename extensions of header  files  (the
	    filename  extensions  should  not  include	"."  prefix). Default is
	    "h,hh,hpp,hxx".  For header files without an extension, use an empty
	    string (if there are no other desired extensions) or leave an  empty
	    element  in  the  list.  e.g.,  "h,hh,hpp,hxx,"  (note  the trailing
	    comma).

   google-build-using-namespace
     Finds using namespace directives.

     The check implements the following rule of the Google C++ Style Guide:
	You may not use a using-directive to make all  names  from  a  namespace
	available.

	// Forbidden -- This pollutes the namespace.
	using namespace foo;

     Corresponding cpplint.py check name: build/namespaces.

   google-default-arguments
     Checks that default arguments are not given for virtual methods.

     See https://google.github.io/styleguide/cppguide.html#Default_Arguments

   google-explicit-constructor
     Checks that constructors callable with a single argument and conversion op-
     erators  are  marked  explicit  to avoid the risk of unintentional implicit
     conversions.

     Consider this example:

	struct S {
	  int x;
	  operator bool() const { return true; }
	};

	bool f() {
	  S a{1};
	  S b{2};
	  return a == b;
	}

     The function will return true, since the objects are  implicitly  converted
     to bool before comparison, which is unlikely to be the intent.

     The check will suggest inserting explicit before the constructor or conver-
     sion  operator  declaration. However, copy and move constructors should not
     be explicit, as well as constructors taking a single initializer_list argu-
     ment.

     This code:

	struct S {
	  S(int a);
	  explicit S(const S&);
	  operator bool() const;
	  ...

     will become

	struct S {
	  explicit S(int a);
	  S(const S&);
	  explicit operator bool() const;
	  ...

     See https://google.github.io/styleguide/cppguide.html#Explicit_Constructors

   google-global-names-in-headers
     Flag global namespace pollution in header files. Right now it only triggers
     on using declarations and directives.

     The       relevant       style	  guide       section	     is        -
     https://google.github.io/styleguide/cppguide.html#Namespaces.

   Options
     HeaderFileExtensions
	    A  comma-separated	list of filename extensions of header files (the
	    filename extensions should not contain "." prefix). Default is  "h".
	    For header files without an extension, use an empty string (if there
	    are  no  other  desired extensions) or leave an empty element in the
	    list. e.g., "h,hh,hpp,hxx," (note the trailing comma).

   google-objc-avoid-nsobject-new
     Finds calls to +new or overrides of it, which are prohibited by the  Google
     Objective-C style guide.

     The Google Objective-C style guide forbids calling +new or overriding it in
     class  implementations,  preferring +alloc and -init methods to instantiate
     objects.

     An example:

	NSDate *now = [NSDate new];
	Foo *bar = [Foo new];

     Instead, code should use +alloc/-init or class factory methods.

	NSDate *now = [NSDate date];
	Foo *bar = [[Foo alloc] init];

     This check corresponds to the Google Objective-C Style Guide  rule  Do  Not
     Use +new.

   google-objc-avoid-throwing-exception
     Finds uses of throwing exceptions usages in Objective-C files.

     For  the  same reason as the Google C++ style guide, we prefer not throwing
     exceptions from Objective-C code.

     The      corresponding	 C++	   style       guide	   rule:       -
     https://google.github.io/styleguide/cppguide.html#Exceptions

     Instead,  prefer  passing in NSError ** and return BOOL to indicate success
     or failure.

     A counterexample:

	- (void)readFile {
	  if ([self isError]) {
	    @throw [NSException exceptionWithName:...];
	  }
	}

     Instead, returning an error via NSError ** is preferred:

	- (BOOL)readFileWithError:(NSError **)error {
	  if ([self isError]) {
	    *error = [NSError errorWithDomain:...];
	    return NO;
	  }
	  return YES;
	}

     The	corresponding	     style	   guide	 rule:	       -
     https://google.github.io/styleguide/objcguide.html#avoid-throwing-excep-
     tions

   google-objc-function-naming
     Finds  function  declarations  in	Objective-C files that do not follow the
     pattern described in the Google Objective-C Style Guide.

     The   corresponding   style   guide   rule   can	be   found    here:    -
     https://google.github.io/styleguide/objcguide.html#function-names

     All  function names should be in Pascal case. Functions whose storage class
     is not static should have an appropriate prefix.

     The following code sample does not follow this pattern:

	static bool is_positive(int i) { return i > 0; }
	bool IsNegative(int i) { return i < 0; }

     The sample above might be corrected to the following code:

	static bool IsPositive(int i) { return i > 0; }
	bool *ABCIsNegative(int i) { return i < 0; }

   google-objc-global-variable-declaration
     Finds global variable declarations in Objective-C files that do not  follow
     the pattern of variable names in Google's Objective-C Style Guide.

     The	 corresponding	       style	     guide	  rule:        -
     https://google.github.io/styleguide/objcguide.html#variable-names

     All the global variables should follow the pattern of g[A-Z].*  (variables)
     or  k[A-Z].*  (constants). The check will suggest a variable name that fol-
     lows the pattern if it can be inferred from the original name.

     For code:

	static NSString* myString = @"hello";

     The fix will be:

	static NSString* gMyString = @"hello";

     Another example of constant:

	static NSString* const myConstString = @"hello";

     The fix will be:

	static NSString* const kMyConstString = @"hello";

     However for code that prefixed with non-alphabetical characters like:

	static NSString* __anotherString = @"world";

     The check will give a warning message but will not be  able  to  suggest  a
     fix. The user needs to fix it on their own.

   google-readability-avoid-underscore-in-googletest-name
     Checks whether there are underscores in googletest test and test case names
     in test macros:

     * TEST

     * TEST_F

     * TEST_P

     * TYPED_TEST

     * TYPED_TEST_P

     The FRIEND_TEST macro is not included.

     For example:

	TEST(TestCaseName, Illegal_TestName) {}
	TEST(Illegal_TestCaseName, TestName) {}

     would trigger the check. Underscores are not allowed in test names nor test
     case names.

     The DISABLED_ prefix, which may be used to disable individual tests, is ig-
     nored  when  checking test names, but the rest of the rest of the test name
     is still checked.

     This check does not propose any fixes.

   google-readability-braces-around-statements
     The google-readability-braces-around-statements check is an  alias,  please
     see readability-braces-around-statements for more information.

   google-readability-casting
     Finds usages of C-style casts.

     https://google.github.io/styleguide/cppguide.html#Casting

     Corresponding cpplint.py check name: readability/casting.

     This  check is similar to -Wold-style-cast, but it suggests automated fixes
     in some cases. The reported locations should not be different from the ones
     generated by -Wold-style-cast.

   google-readability-function-size
     The  google-readability-function-size  check  is  an  alias,   please   see
     readability-function-size for more information.

   google-readability-namespace-comments
     The  google-readability-namespace-comments  check	is  an alias, please see
     llvm-namespace-comment for more information.

   google-readability-todo
     Finds TODO comments without a username or bug number.

     The       relevant       style	  guide       section	     is        -
     https://google.github.io/styleguide/cppguide.html#TODO_Comments.

     Corresponding cpplint.py check: readability/todo

   google-runtime-int
     Finds  uses  of  short,  long and long long and suggest replacing them with
     u?intXX(_t)?.

     The	corresponding	     style	   guide	 rule:	       -
     https://google.github.io/styleguide/cppguide.html#Integer_Types.

     Corresponding cpplint.py check: runtime/int.

   Options
     UnsignedTypePrefix
	    A string specifying the unsigned type prefix. Default is uint.

     SignedTypePrefix
	    A string specifying the signed type prefix. Default is int.

     TypeSuffix
	    A string specifying the type suffix. Default is an empty string.

   google-runtime-operator
     Finds overloads of unary operator &.

     https://google.github.io/styleguide/cppguide.html#Operator_Overloading

     Corresponding cpplint.py check name: runtime/operator.

   google-upgrade-googletest-case
     Finds uses of deprecated Google Test version 1.9 APIs with names containing
     case and replaces them with equivalent APIs with suite.

     All  names  containing  case  are	being replaced to be consistent with the
     meanings of "test case" and "test suite" as used by the International Soft-
     ware Testing Qualifications Board and ISO 29119.

     The new names are a part of Google Test version 1.9 (release  pending).  It
     is  recommended  that users update their dependency to version 1.9 and then
     use this check to remove deprecated names.

     The affected APIs are:

     * Member	functions    of    testing::Test,    testing::TestInfo,    test-
       ing::TestEventListener,	testing::UnitTest,  and any type inheriting from
       these types

     * The	macros	    TYPED_TEST_CASE,	  TYPED_TEST_CASE_P,	  REGIS-
       TER_TYPED_TEST_CASE_P, and INSTANTIATE_TYPED_TEST_CASE_P

     * The type alias testing::TestCase

     Examples of fixes created by this check:

	class FooTest : public testing::Test {
	public:
	  static void SetUpTestCase();
	  static void TearDownTestCase();
	};

	TYPED_TEST_CASE(BarTest, BarTypes);

     becomes

	class FooTest : public testing::Test {
	public:
	  static void SetUpTestSuite();
	  static void TearDownTestSuite();
	};

	TYPED_TEST_SUITE(BarTest, BarTypes);

     For  better  consistency  of  user code, the check renames both virtual and
     non-virtual member functions with matching  names	in  derived  types.  The
     check  tries to provide a only warning when a fix cannot be made safely, as
     is the case with some template and macro uses.

   hicpp-avoid-c-arrays
     The    hicpp-avoid-c-arrays    check    is    an	 alias,    please    see
     modernize-avoid-c-arrays for more information.

   hicpp-avoid-goto
     The  hicpp-avoid-goto  check  is  an alias to cppcoreguidelines-avoid-goto.
     Rule 6.3.1 High Integrity C++ requires that goto  only  skips  parts  of  a
     block and is not used for other reasons.

     Both coding guidelines implement the same exception to the usage of goto.

   hicpp-braces-around-statements
     The   hicpp-braces-around-statements   check   is	 an  alias,  please  see
     readability-braces-around-statements for more information.  It enforces the
     rule 6.1.1.

   hicpp-deprecated-headers
     The   hicpp-deprecated-headers   check   is   an	 alias,    please    see
     modernize-deprecated-headers  for	more  information.  It enforces the rule
     1.3.3.

   hicpp-exception-baseclass
     Ensure that every value that in  a  throw	expression  is	an  instance  of
     std::exception.

     This enforces rule 15.1 of the High Integrity C++ Coding Standard.

	class custom_exception {};

	void throwing() noexcept(false) {
	  // Problematic throw expressions.
	  throw int(42);
	  throw custom_exception();
	}

	class mathematical_error : public std::exception {};

	void throwing2() noexcept(false) {
	  // These kind of throws are ok.
	  throw mathematical_error();
	  throw std::runtime_error();
	  throw std::exception();
	}

   hicpp-explicit-conversions
     This  check  is  an alias for google-explicit-constructor.  Used to enforce
     parts of rule 5.4.1.  This check will enforce that constructors and conver-
     sion operators are marked explicit.  Other forms of casting checks are  im-
     plemented	in  other places.  The following checks can be used to check for
     more forms of casting:

     * cppcoreguidelines-pro-type-static-cast-downcast

     * cppcoreguidelines-pro-type-reinterpret-cast

     * cppcoreguidelines-pro-type-const-cast

     * cppcoreguidelines-pro-type-cstyle-cast

   hicpp-function-size
     This check is an alias for readability-function-size.   Useful  to  enforce
     multiple sections on function complexity.

     * rule 8.2.2

     * rule 8.3.1

     * rule 8.3.2

   hicpp-invalid-access-moved
     This check is an alias for bugprone-use-after-move.

     Implements  parts	of the rule 8.4.1 to check if moved-from objects are ac-
     cessed.

   hicpp-member-init
     This check is an alias for cppcoreguidelines-pro-type-member-init.   Imple-
     ments  the  check	for rule 12.4.2 to initialize class members in the right
     order.

   hicpp-move-const-arg
     The    hicpp-move-const-arg    check    is    an	 alias,    please    see
     performance-move-const-arg  for  more  information.   It  enforces the rule
     17.3.1.

   hicpp-multiway-paths-covered
     This check discovers situations where code paths are not fully-covered.  It
     furthermore suggests using if instead of switch if the code  will	be  more
     clear.   The  rule  6.1.2	and  rule 6.1.4 of the High Integrity C++ Coding
     Standard are enforced.

     if-else if chains that miss a final else branch might  lead  to  unexpected
     program  execution  and  be  the result of a logical error.  If the missing
     else branch is intended you can leave it empty with a  clarifying	comment.
     This warning can be noisy on some code bases, so it is disabled by default.

	void f1() {
	  int i = determineTheNumber();

	   if(i > 0) {
	     // Some Calculation
	   } else if (i < 0) {
	     // Precondition violated or something else.
	   }
	   // ...
	}

     Similar  arguments hold for switch statements which do not cover all possi-
     ble code paths.

	// The missing default branch might be a logical error. It can be kept empty
	// if there is nothing to do, making it explicit.
	void f2(int i) {
	  switch (i) {
	  case 0: // something
	    break;
	  case 1: // something else
	    break;
	  }
	  // All other numbers?
	}

	// Violates this rule as well, but already emits a compiler warning (-Wswitch).
	enum Color { Red, Green, Blue, Yellow };
	void f3(enum Color c) {
	  switch (c) {
	  case Red: // We can't drive for now.
	    break;
	  case Green:  // We are allowed to drive.
	    break;
	  }
	  // Other cases missing
	}

     The rule 6.1.4 requires every switch statement to have at	least  two  case
     labels  other  than a default label.  Otherwise, the switch could be better
     expressed with an if statement.  Degenerated switch statements without  any
     labels are caught as well.

	// Degenerated switch that could be better written as `if`
	int i = 42;
	switch(i) {
	  case 1: // do something here
	  default: // do somethe else here
	}

	// Should rather be the following:
	if (i == 1) {
	  // do something here
	}
	else {
	  // do something here
	}

	// A completely degenerated switch will be diagnosed.
	int i = 42;
	switch(i) {}

   Options
     WarnOnMissingElse
	    Boolean  flag  that  activates  a warning for missing else branches.
	    Default is false.

   hicpp-named-parameter
     This check is an alias for readability-named-parameter.

     Implements rule 8.2.1.

   hicpp-new-delete-operators
     This check is an  alias  for  misc-new-delete-overloads.	Implements  rule
     12.3.1 to ensure the new and delete operators have the correct signature.

   hicpp-no-array-decay
     The    hicpp-no-array-decay    check    is    an	 alias,    please    see
     cppcoreguidelines-pro-bounds-array-to-pointer-decay for  more  information.
     It enforces the rule 4.1.1.

   hicpp-no-assembler
     Check for assembler statements. No fix is offered.

     Inline assembler is forbidden by the High Intergrity C++ Coding Standard as
     it restricts the portability of code.

   hicpp-no-malloc
     The     hicpp-no-malloc	 check	   is	  an	 alias,    please    see
     cppcoreguidelines-no-malloc for more information.	 It  enforces  the  rule
     5.3.2.

   hicpp-noexcept-move
     This check is an alias for performance-noexcept-move-constructor.	Checks -
     rule 12.5.4 to mark move assignment and move construction noexcept.

   hicpp-signed-bitwise
     Finds uses of bitwise operations on signed integer types, which may lead to
     undefined or implementation defined behaviour.

     The  according  rule is defined in the High Integrity C++ Standard, Section
     5.6.1.

   Options
     IgnorePositiveIntegerLiterals
	    If this option is set to true, the check will not  warn  on  bitwise
	    operations	with  positive	integer  literals, e.g. ~0, 2 << 1, etc.
	    Default value is false.

   hicpp-special-member-functions
     This check  is  an  alias	for  cppcoreguidelines-special-member-functions.
     Checks  that special member functions have the correct signature, according
     to rule 12.5.7.

   hicpp-static-assert
     The hicpp-static-assert check is an alias,  please  see  misc-static-assert
     for more information.  It enforces the rule 7.1.10.

   hicpp-undelegated-constructor
     This check is an alias for bugprone-undelegated-constructor.  Partially im-
     plements rule 12.4.5 to find misplaced constructor calls inside a construc-
     tor.

	struct Ctor {
	  Ctor();
	  Ctor(int);
	  Ctor(int, int);
	  Ctor(Ctor *i) {
	    // All Ctor() calls result in a temporary object
	    Ctor(); // did you intend to call a delegated constructor?
	    Ctor(0); // did you intend to call a delegated constructor?
	    Ctor(1, 2); // did you intend to call a delegated constructor?
	    foo();
	  }
	};

   hicpp-uppercase-literal-suffix
     The   hicpp-uppercase-literal-suffix   check   is	 an  alias,  please  see
     readability-uppercase-literal-suffix for more information.

   hicpp-use-auto
     The hicpp-use-auto check is an alias,  please  see  modernize-use-auto  for
     more information.	It enforces the rule 7.1.8.

   hicpp-use-emplace
     The  hicpp-use-emplace  check is an alias, please see modernize-use-emplace
     for more information.  It enforces the rule 17.4.2.

   hicpp-use-equals-default
     This check is an alias for modernize-use-equals-default.	Implements  rule
     12.5.1 to explicitly default special member functions.

   hicpp-use-equals-delete
     This  check  is  an alias for modernize-use-equals-delete.  Implements rule
     12.5.1 to explicitly default or delete special member functions.

   hicpp-use-noexcept
     The hicpp-use-noexcept check is an alias, please see modernize-use-noexcept
     for more information.  It enforces the rule 1.3.5.

   hicpp-use-nullptr
     The hicpp-use-nullptr check is an alias, please  see  modernize-use-nullptr
     for more information.  It enforces the rule 2.5.3.

   hicpp-use-override
     This  check is an alias for modernize-use-override.  Implements rule 10.2.1
     to declare a virtual function override when overriding.

   hicpp-vararg
     The     hicpp-vararg     check	is     an     alias,	 please      see
     cppcoreguidelines-pro-type-vararg	for more information.  It enforces the -
     rule 14.1.1.

   linuxkernel-must-use-errs
     Checks Linux kernel code to see if it uses the results from  the  functions
     in  linux/err.h. Also checks to see if code uses the results from functions
     that directly return a value from one of these error functions.

     This is important in the Linux kernel  because  ERR_PTR,  PTR_ERR,  IS_ERR,
     IS_ERR_OR_NULL,   ERR_CAST,  and  PTR_ERR_OR_ZERO	return	values	must  be
     checked, since positive pointers and negative error codes are being used in
     the same context. These functions are marked  with  __attribute__((warn_un-
     used_result)),  but  some	kernel versions do not have this warning enabled
     for clang.

     Examples:

	/* Trivial unused call to an ERR function */
	PTR_ERR_OR_ZERO(some_function_call());

	/* A function that returns ERR_PTR. */
	void *fn() { ERR_PTR(-EINVAL); }

	/* An invalid use of fn. */
	fn();

   llvm-else-after-return
     The   llvm-else-after-return   check    is    an	 alias,    please    see
     readability-else-after-return for more information.

   llvm-header-guard
     Finds and fixes header guards that do not adhere to LLVM style.

   Options
     HeaderFileExtensions
	    A  comma-separated	list of filename extensions of header files (the
	    filename extensions should	not  include  "."  prefix).  Default  is
	    "h,hh,hpp,hxx".  For header files without an extension, use an empty
	    string  (if there are no other desired extensions) or leave an empty
	    element in	the  list.  e.g.,  "h,hh,hpp,hxx,"  (note  the	trailing
	    comma).

   llvm-include-order
     Checks the correct order of #includes.

     See https://llvm.org/docs/CodingStandards.html#include-style

   llvm-namespace-comment
     google-readability-namespace-comments  redirects  here as an alias for this
     check.

     Checks that long namespaces have a closing comment.

     https://llvm.org/docs/CodingStandards.html#namespace-indentation

     https://google.github.io/styleguide/cppguide.html#Namespaces

	namespace n1 {
	void f();
	}

	// becomes

	namespace n1 {
	void f();
	}  // namespace n1

   Options
     ShortNamespaceLines
	    Requires the closing brace of the namespace definition  to	be  fol-
	    lowed  by  a  closing  comment if the body of the namespace has more
	    than ShortNamespaceLines lines of code. The value is an unsigned in-
	    teger that defaults to 1U.

     SpacesBeforeComments
	    An unsigned integer specifying the number of spaces before the  com-
	    ment closing a namespace definition. Default is 1U.

   llvm-prefer-isa-or-dyn-cast-in-conditionals
     Looks  at	conditionals  and finds and replaces cases of cast<>, which will
     assert rather than return a null pointer, and dyn_cast<> where  the  return
     value  is	not  captured. Additionally, finds and replaces cases that match
     the pattern var && isa<X>(var), where var is evaluated twice.

	// Finds these:
	if (auto x = cast<X>(y)) {}
	// is replaced by:
	if (auto x = dyn_cast<X>(y)) {}

	if (cast<X>(y)) {}
	// is replaced by:
	if (isa<X>(y)) {}

	if (dyn_cast<X>(y)) {}
	// is replaced by:
	if (isa<X>(y)) {}

	if (var && isa<T>(var)) {}
	// is replaced by:
	if (isa_and_nonnull<T>(var.foo())) {}

	// Other cases are ignored, e.g.:
	if (auto f = cast<Z>(y)->foo()) {}
	if (cast<Z>(y)->foo()) {}
	if (X.cast(y)) {}

   llvm-prefer-register-over-unsigned
     Finds historical use of unsigned to hold vregs and  physregs  and	rewrites
     them to use Register.

     Currently	this  works  by  finding  all variables of unsigned integer type
     whose initializer begins with an implicit cast from Register to unsigned.

	void example(MachineOperand &MO) {
	  unsigned Reg = MO.getReg();
	  ...
	}

     becomes:

	void example(MachineOperand &MO) {
	  Register Reg = MO.getReg();
	  ...
	}

   llvm-qualified-auto
     The    llvm-qualified-auto    check    is	  an	alias,	  please     see
     readability-qualified-auto for more information.

   llvm-twine-local
     Looks  for  local	Twine  variables  which are prone to use after frees and
     should be generally avoided.

	static Twine Moo = Twine("bark") + "bah";

	// becomes

	static std::string Moo = (Twine("bark") + "bah").str();

   llvmlibc-callee-namespace
     Checks all calls resolve to functions within __llvm_libc namespace.

	namespace __llvm_libc {

	// Allow calls with the fully qualified name.
	__llvm_libc::strlen("hello");

	// Allow calls to compiler provided functions.
	(void)__builtin_abs(-1);

	// Bare calls are allowed as long as they resolve to the correct namespace.
	strlen("world");

	// Disallow calling into functions in the global namespace.
	::strlen("!");

	} // namespace __llvm_libc

   llvmlibc-implementation-in-namespace
     Checks that all declarations in the llvm-libc implementation are within the
     correct namespace.

	// Correct: implementation inside the correct namespace.
	namespace __llvm_libc {
	    void LLVM_LIBC_ENTRYPOINT(strcpy)(char *dest, const char *src) {}
	    // Namespaces within __llvm_libc namespace are allowed.
	    namespace inner{
		int localVar = 0;
	    }
	    // Functions with C linkage are allowed.
	    extern "C" void str_fuzz(){}
	}

	// Incorrect: implementation not in a namespace.
	void LLVM_LIBC_ENTRYPOINT(strcpy)(char *dest, const char *src) {}

	// Incorrect: outer most namespace is not correct.
	namespace something_else {
	    void LLVM_LIBC_ENTRYPOINT(strcpy)(char *dest, const char *src) {}
	}

   llvmlibc-restrict-system-libc-headers
     Finds includes of system libc headers not provided by the	compiler  within
     llvm-libc implementations.

	#include <stdio.h>	      // Not allowed because it is part of system libc.
	#include <stddef.h>	      // Allowed because it is provided by the compiler.
	#include "internal/stdio.h"   // Allowed because it is NOT part of system libc.

     This  check is necessary because accidentally including system libc headers
     can lead to subtle and hard to detect bugs. For example consider  a  system
     libc  whose  dirent  struct  has  slightly  different  field  ordering than
     llvm-libc.  While this will compile successfully,	this  can  cause  issues
     during runtime because they are ABI incompatible.

   Options
     Includes
	    A  string  containing a comma separated glob list of allowed include
	    filenames. Similar to the -checks glob list for  running  clang-tidy
	    itself,  the two wildcard characters are * and -, to include and ex-
	    clude globs, respectively. The default is -*,  which  disallows  all
	    includes.

	    This can be used to allow known safe includes such as Linux develop-
	    ment  headers. See portability-restrict-system-includes for more de-
	    tails.

   misc-definitions-in-headers
     Finds non-extern non-inline function and  variable  definitions  in  header
     files, which can lead to potential ODR violations in case these headers are
     included from multiple translation units.

	// Foo.h
	int a = 1; // Warning: variable definition.
	extern int d; // OK: extern variable.

	namespace N {
	  int e = 2; // Warning: variable definition.
	}

	// Warning: variable definition.
	const char* str = "foo";

	// OK: internal linkage variable definitions are ignored for now.
	// Although these might also cause ODR violations, we can be less certain and
	// should try to keep the false-positive rate down.
	static int b = 1;
	const int c = 1;
	const char* const str2 = "foo";
	constexpr int k = 1;

	// Warning: function definition.
	int g() {
	  return 1;
	}

	// OK: inline function definition is allowed to be defined multiple times.
	inline int e() {
	  return 1;
	}

	class A {
	public:
	  int f1() { return 1; } // OK: implicitly inline member function definition is allowed.
	  int f2();

	  static int d;
	};

	// Warning: not an inline member function definition.
	int A::f2() { return 1; }

	// OK: class static data member declaration is allowed.
	int A::d = 1;

	// OK: function template is allowed.
	template<typename T>
	T f3() {
	  T a = 1;
	  return a;
	}

	// Warning: full specialization of a function template is not allowed.
	template <>
	int f3() {
	  int a = 1;
	  return a;
	}

	template <typename T>
	struct B {
	  void f1();
	};

	// OK: member function definition of a class template is allowed.
	template <typename T>
	void B<T>::f1() {}

	class CE {
	  constexpr static int i = 5; // OK: inline variable definition.
	};

	inline int i = 5; // OK: inline variable definition.

	constexpr int f10() { return 0; } // OK: constexpr function implies inline.

	// OK: C++14 variable templates are inline.
	template <class T>
	constexpr T pi = T(3.1415926L);

   Options
     HeaderFileExtensions
	    A  comma-separated	list of filename extensions of header files (the
	    filename extensions should	not  include  "."  prefix).  Default  is
	    "h,hh,hpp,hxx".  For header files without an extension, use an empty
	    string  (if there are no other desired extensions) or leave an empty
	    element in	the  list.  e.g.,  "h,hh,hpp,hxx,"  (note  the	trailing
	    comma).

     UseHeaderFileExtension
	    When  true,  the  check  will  use the file extension to distinguish
	    header files. Default is true.

   misc-misplaced-const
     This check diagnoses when a const qualifier is applied to a typedef/  using
     to  a  pointer type rather than to the pointee, because such constructs are
     often misleading to developers because the const  applies	to  the  pointer
     rather than the pointee.

     For  instance,  in  the  following  code, the resulting type is int * const
     rather than const int *:

	typedef int *int_ptr;
	void f(const int_ptr ptr) {
	  *ptr = 0; // potentially quite unexpectedly the int can be modified here
	  ptr = 0; // does not compile
	}

     The check does not diagnose when the underlying  typedef/using  type  is  a
     pointer  to  a  const  type or a function pointer type. This is because the
     const qualifier is less likely to be mistaken because it would be redundant
     (or disallowed) on the underlying pointee type.

   misc-new-delete-overloads
     cert-dcl54-cpp redirects here as an alias for this check.

     The check flags overloaded operator new() and operator  delete()  functions
     that  do  not  have  a corresponding free store function defined within the
     same scope.  For instance, the check will flag a class implementation of  a
     non-placement  operator  new()  when  the	class  does  not  also	define a
     non-placement operator delete() function as well.

     The check does not flag implicitly-defined operators,  deleted  or  private
     operators, or placement operators.

     This check corresponds to CERT C++ Coding Standard rule DCL54-CPP. Overload
     allocation and deallocation functions as a pair in the same scope.

   misc-no-recursion
     Finds  strongly  connected functions (by analyzing the call graph for SCC's
     (Strongly Connected Components) that are loops), diagnoses each function in
     the cycle, and displays one example of a possible call graph  loop  (recur-
     sion).

     References:

     * CERT  C++ Coding Standard rule DCL56-CPP. Avoid cycles during initializa-
       tion of static objects.

     * JPL Institutional Coding Standard for the C Programming Language (JPL DO-
       CID D-60411) rule 2.4 Do not use direct or indirect recursion.

     * OpenCL Specification, Version 1.2 rule 6.9 Restrictions: i. Recursion  is
       not supported..

     Limitations:

     * The check does not handle calls done through function pointers

     * The check does not handle C++ destructors

   misc-non-copyable-objects
     cert-fio38-c redirects here as an alias for this check.

     The  check  flags dereferences and non-pointer declarations of objects that
     are not meant to be passed by value,  such  as  C	FILE  objects  or  POSIX
     pthread_mutex_t objects.

     This  check  corresponds  to  CERT C++ Coding Standard rule FIO38-C. Do not
     copy a FILE object.

   misc-non-private-member-variables-in-classes
     cppcoreguidelines-non-private-member-variables-in-classes redirects here as
     an alias for this check.

     Finds classes that contain non-static data members in addition to	user-de-
     clared  non-static  member functions and diagnose all data members declared
     with a non-public access specifier. The data members should be declared  as
     private and accessed through member functions instead of exposed to derived
     classes or class consumers.

   Options
     IgnoreClassesWithAllMemberVariablesBeingPublic
	    Allows  to	completely ignore classes if all the member variables in
	    that class a declared with a public access specifier.

     IgnorePublicMemberVariables
	    Allows to ignore (not diagnose) all the  member  variables	declared
	    with a public access specifier.

   misc-redundant-expression
     Detect redundant expressions which are typically errors due to copy-paste.

     Depending on the operator expressions may be

     * redundant,

     * always true,

     * always false,

     * always a constant (zero or one).

     Examples:

	((x+1) | (x+1)) 	    // (x+1) is redundant
	(p->x == p->x)		    // always true
	(p->x < p->x)		    // always false
	(speed - speed + 1 == 12)   // speed - speed is always zero

   misc-static-assert
     cert-dcl03-c redirects here as an alias for this check.

     Replaces  assert()  with static_assert() if the condition is evaluatable at
     compile time.

     The condition of static_assert() is evaluated  at	compile  time  which  is
     safer and more efficient.

   misc-throw-by-value-catch-by-reference
     cert-err09-cpp  redirects	here as an alias for this check.  cert-err61-cpp
     redirects here as an alias for this check.

     Finds violations of the rule "Throw by value, catch by reference" presented
     for example in "C++ Coding Standards" by H. Sutter and A. Alexandrescu,  as
     well  as  the  CERT C++ Coding Standard rule ERR61-CPP. Catch exceptions by
     lvalue reference.

     Exceptions:

	    * Throwing string literals will  not  be  flagged  despite	being  a
	      pointer.	They  are  not	susceptible  to slicing and the usage of
	      string literals is idomatic.

	    * Catching character  pointers  (char,  wchar_t,  unicode  character
	      types) will not be flagged to allow catching sting literals.

	    * Moved  named  values will not be flagged as not throwing an anony-
	      mous temporary. In this case we can be sure that	the  user  knows
	      that  the  object  can't be accessed outside catch blocks handling
	      the error.

	    * Throwing function parameters will not be flagged as  not	throwing
	      an anonymous temporary. This allows helper functions for throwing.

	    * Re-throwing caught exception variables will not be flragged as not
	      throwing an anonymous temporary. Although this can usually be done
	      by just writing throw; it happens often enough in real code.

   Options
     CheckThrowTemporaries
	    Triggers   detection   of  violations  of  the  CERT  recommendation
	    ERR09-CPP. Throw anonymous temporaries.  Default is true.

     WarnOnLargeObject
	    Also warns for any large, trivial object caught by value. Catching a
	    large object by value is not dangerous but affects	the  performance
	    negatively. The maximum size of an object allowed to be caught with-
	    out warning can be set using the MaxSize option.  Default is false.

     MaxSize
	    Determines	the maximum size of an object allowed to be caught with-
	    out warning. Only applicable if WarnOnLargeObject is set to true. If
	    the   option   is	set   by   the	 user	 to    std::numeric_lim-
	    its<uint64_t>::max()  then it reverts to the default value.  Default
	    is the size of size_t.

   misc-unconventional-assign-operator
     Finds declarations of assign operators with the wrong return  and/or  argu-
     ment  types  and  definitions with good return type but wrong return state-
     ments.

	* The return type must be Class&.

	* Works with move-assign and assign by value.

	* Private and deleted operators are ignored.

	* The operator must always return *this.

   misc-uniqueptr-reset-release
     Find and replace unique_ptr::reset(release()) with std::move().

     Example:

	std::unique_ptr<Foo> x, y;
	x.reset(y.release()); -> x = std::move(y);

     If y is already rvalue, std::move() is not added.	x  and	y  can	also  be
     std::unique_ptr<Foo>*.

   misc-unused-alias-decls
     Finds unused namespace alias declarations.

	namespace my_namespace {
	class C {};
	}
	namespace unused_alias = ::my_namespace;

   misc-unused-parameters
     Finds  unused  function  parameters. Unused parameters may signify a bug in
     the code (e.g. when a different parameter is used instead).  The  suggested
     fixes either comment parameter name out or remove the parameter completely,
     if  all callers of the function are in the same translation unit and can be
     updated.

     The check is similar to the -Wunused-parameter compiler diagnostic and  can
     be  used  to  prepare a codebase to enabling of that diagnostic. By default
     the check is more permissive (see StrictMode).

	void a(int i) { /*some code that doesn't use `i`*/ }

	// becomes

	void a(int  /*i*/) { /*some code that doesn't use `i`*/ }

	static void staticFunctionA(int i);
	static void staticFunctionA(int i) { /*some code that doesn't use `i`*/ }

	// becomes

	static void staticFunctionA()
	static void staticFunctionA() { /*some code that doesn't use `i`*/ }

   Options
     StrictMode
	    When false (default value), the check will ignore  trivially  unused
	    parameters,  i.e.  when the corresponding function has an empty body
	    (and in case of constructors - no  constructor  initializers).  When
	    the  function  body  is empty, an unused parameter is unlikely to be
	    unnoticed by a human reader, and there's basically no  place  for  a
	    bug to hide.

   misc-unused-using-decls
     Finds unused using declarations.

     Example:

	namespace n { class C; }
	using n::C;  // Never actually used.

   modernize-avoid-bind
     The  check  finds	uses of std::bind and boost::bind and replaces them with
     lambdas. Lambdas will use value-capture unless reference capture is explic-
     itly requested with std::ref or boost::ref.

     It supports arbitrary callables including member  functions,  function  ob-
     jects,  and  free	functions, and all variations thereof. Anything that you
     can pass to the first argument of bind should  be	diagnosable.  Currently,
     the  only	known case where a fix-it is unsupported is when the same place-
     holder is specified multiple times in the parameter list.

     Given:

	int add(int x, int y) { return x + y; }

     Then:

	void f() {
	  int x = 2;
	  auto clj = std::bind(add, x, _1);
	}

     is replaced by:

	void f() {
	  int x = 2;
	  auto clj = [=](auto && arg1) { return add(x, arg1); };
	}

     std::bind can be hard to read and can result in larger object files and bi-
     naries due to type information that will  not  be	produced  by  equivalent
     lambdas.

   Options
     PermissiveParameterList
	    If the option is set to true, the check will append auto&&... to the
	    end  of every placeholder parameter list. Without this, it is possi-
	    ble for a fix-it to perform an incorrect transformation in the  case
	    where the result of the bind is used in the context of a type erased
	    functor such as std::function which allows mismatched arguments. For
	    example:

	int add(int x, int y) { return x + y; }
	int foo() {
	  std::function<int(int,int)> ignore_args = std::bind(add, 2, 2);
	  return ignore_args(3, 3);
	}

     is  valid	code, and returns 4. The actual values passed to ignore_args are
     simply ignored. Without PermissiveParameterList, this would be  transformed
     into

	int add(int x, int y) { return x + y; }
	int foo() {
	  std::function<int(int,int)> ignore_args = [] { return add(2, 2); }
	  return ignore_args(3, 3);
	}

     which  will  not  compile,  since the lambda does not contain an operator()
     that that accepts 2 arguments. With permissive parameter list,  it  instead
     generates

	int add(int x, int y) { return x + y; }
	int foo() {
	  std::function<int(int,int)> ignore_args = [](auto&&...) { return add(2, 2); }
	  return ignore_args(3, 3);
	}

     which is correct.

     This check requires using C++14 or higher to run.

   modernize-avoid-c-arrays
     cppcoreguidelines-avoid-c-arrays redirects here as an alias for this check.

     hicpp-avoid-c-arrays redirects here as an alias for this check.

     Finds  C-style  array  types  and recommend to use std::array<> / std::vec-
     tor<>. All types of C arrays are diagnosed.

     However, fix-it are potentially dangerous in header files and are therefore
     not emitted right now.

	int a[] = {1, 2}; // warning: do not declare C-style arrays, use std::array<> instead

	int b[1]; // warning: do not declare C-style arrays, use std::array<> instead

	void foo() {
	  int c[b[0]]; // warning: do not declare C VLA arrays, use std::vector<> instead
	}

	template <typename T, int Size>
	class array {
	  T d[Size]; // warning: do not declare C-style arrays, use std::array<> instead

	  int e[1]; // warning: do not declare C-style arrays, use std::array<> instead
	};

	array<int[4], 2> d; // warning: do not declare C-style arrays, use std::array<> instead

	using k = int[4]; // warning: do not declare C-style arrays, use std::array<> instead

     However, the extern "C" code is ignored, since it is common to  share  such
     headers between C code, and C++ code.

	// Some header
	extern "C" {

	int f[] = {1, 2}; // not diagnosed

	int j[1]; // not diagnosed

	inline void bar() {
	  {
	    int j[j[0]]; // not diagnosed
	  }
	}

	}

     Similarly,  the main() function is ignored. Its second and third parameters
     can be either char* argv[] or char** argv, but can not be std::array<>.

   modernize-concat-nested-namespaces
     Checks for use of nested namespaces such as namespace a { namespace b { ...
     } } and suggests changing to the more concise syntax introduced  in  C++17:
     namespace a::b { ... }.  Inline namespaces are not modified.

     For example:

	namespace n1 {
	namespace n2 {
	void t();
	}
	}

	namespace n3 {
	namespace n4 {
	namespace n5 {
	void t();
	}
	}
	namespace n6 {
	namespace n7 {
	void t();
	}
	}
	}

     Will be modified to:

	namespace n1::n2 {
	void t();
	}

	namespace n3 {
	namespace n4::n5 {
	void t();
	}
	namespace n6::n7 {
	void t();
	}
	}

   modernize-deprecated-headers
     Some  headers  from C library were deprecated in C++ and are no longer wel-
     come in C++ codebases. Some have no effect in C++. For more  details  refer
     to the C++ 14 Standard [depr.c.headers] section.

     This  check replaces C standard library headers with their C++ alternatives
     and removes redundant ones.

     Important note: the Standard doesn't guarantee that the C++ headers declare
     all the same functions in the global namespace. The check	in  its  current
     form  can	break  the  code that uses library symbols from the global name-
     space.

     * <assert.h>

     * <complex.h>

     * <ctype.h>

     * <errno.h>

     * <fenv.h>     // deprecated since C++11

     * <float.h>

     * <inttypes.h>

     * <limits.h>

     * <locale.h>

     * <math.h>

     * <setjmp.h>

     * <signal.h>

     * <stdarg.h>

     * <stddef.h>

     * <stdint.h>

     * <stdio.h>

     * <stdlib.h>

     * <string.h>

     * <tgmath.h>   // deprecated since C++11

     * <time.h>

     * <uchar.h>    // deprecated since C++11

     * <wchar.h>

     * <wctype.h>

     If the specified standard is older than C++11 the check will  only  replace
     headers deprecated before C++11, otherwise -- every header that appeared in
     the previous list.

     These headers don't have effect in C++:

     * <iso646.h>

     * <stdalign.h>

     * <stdbool.h>

   modernize-deprecated-ios-base-aliases
     Detects  usage of the deprecated member types of std::ios_base and replaces
     those that have a non-deprecated equivalent.
	       +--------------------------+-------------------------+
	       | Deprecated member type   | Replacement 	    |
	       +--------------------------+-------------------------+
	       | std::ios_base::io_state  | std::ios_base::iostate  |
	       +--------------------------+-------------------------+
	       | std::ios_base::open_mode | std::ios_base::openmode |
	       +--------------------------+-------------------------+
	       | std::ios_base::seek_dir  | std::ios_base::seekdir  |
	       +--------------------------+-------------------------+
	       | std::ios_base::streamoff |			    |
	       +--------------------------+-------------------------+
	       | std::ios_base::streampos |			    |
	       +--------------------------+-------------------------+

   modernize-loop-convert
     This check converts for(...; ...; ...) loops to  use  the	new  range-based
     loops in C++11.

     Three kinds of loops can be converted:

     * Loops over statically allocated arrays.

     * Loops over containers, using iterators.

     * Loops over array-like containers, using operator[] and at().

   MinConfidence option
   risky
     In  loops where the container expression is more complex than just a refer-
     ence to a declared expression (a variable, function, enum, etc.), and  some
     part  of  it  appears elsewhere in the loop, we lower our confidence in the
     transformation due to the increased risk of changing semantics.   Transfor-
     mations  for  these  loops  are marked as risky, and thus will only be con-
     verted if the minimum required confidence level is set to risky.

	int arr[10][20];
	int l = 5;

	for (int j = 0; j < 20; ++j)
	  int k = arr[l][j] + l; // using l outside arr[l] is considered risky

	for (int i = 0; i < obj.getVector().size(); ++i)
	  obj.foo(10); // using 'obj' is considered risky

     See Range-based loops evaluate end() only once for an example of an  incor-
     rect  transformation  when  the minimum required confidence level is set to
     risky.

   reasonable (Default)
     If a loop calls .end() or .size() after each iteration, the  transformation
     for  that	loop  is marked as reasonable, and thus will be converted if the
     required confidence level is set to reasonable (default) or lower.

	// using size() is considered reasonable
	for (int i = 0; i < container.size(); ++i)
	  cout << container[i];

   safe
     Any other loops that do not match the above criteria to be marked as  risky
     or  reasonable  are marked safe, and thus will be converted if the required
     confidence level is set to safe or lower.

	int arr[] = {1,2,3};

	for (int i = 0; i < 3; ++i)
	  cout << arr[i];

   Example
     Original:

	const int N = 5;
	int arr[] = {1,2,3,4,5};
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);

	// safe conversion
	for (int i = 0; i < N; ++i)
	  cout << arr[i];

	// reasonable conversion
	for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	  cout << *it;

	// reasonable conversion
	for (int i = 0; i < v.size(); ++i)
	  cout << v[i];

     After applying the check with minimum confidence level  set  to  reasonable
     (default):

	const int N = 5;
	int arr[] = {1,2,3,4,5};
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);

	// safe conversion
	for (auto & elem : arr)
	  cout << elem;

	// reasonable conversion
	for (auto & elem : v)
	  cout << elem;

	// reasonable conversion
	for (auto & elem : v)
	  cout << elem;

   Reverse Iterator Support
     The converter is also capable of transforming iterator loops which use rbe-
     gin  and  rend  for looping backwards over a container. Out of the box this
     will automatically happen in C++20 mode using the ranges  library,  however
     the  check can be configured to work without C++20 by specifying a function
     to reverse a range and optionally	the  header  file  where  that	function
     lives.

     UseCxx20ReverseRanges
	    When  set  to  true  convert loops when in C++20 or later mode using
	    std::ranges::reverse_view.	Default value is true.

     MakeReverseRangeFunction
	    Specify the function used to reverse an iterator pair, the	function
	    should  accept  a  class  with  rbegin and rend methods and return a
	    class with begin and end methods methods that call	the  rbegin  and
	    rend  methods respectively. Common examples are ranges::reverse_view
	    and llvm::reverse.	Default value is an empty string.

     MakeReverseRangeHeader
	    Specifies the header  file	where  MakeReverseRangeFunction  is  de-
	    clared.  For  the  previous  examples  this  option  would be set to
	    range/v3/view/reverse.hpp and llvm/ADT/STLExtras.h respectively.  If
	    this is an empty string and  MakeReverseRangeFunction  is  set,  the
	    check  will  proceed  on the assumption that the function is already
	    available in the translation unit.	This can  be  wrapped  in  angle
	    brackets to signify to add the include as a system include.  Default
	    value is an empty string.

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

   Limitations
     There  are certain situations where the tool may erroneously perform trans-
     formations that remove information and change semantics. Users of the  tool
     should  be  aware of the behaviour and limitations of the check outlined by
     the cases below.

   Comments inside loop headers
     Comments inside the original loop	header	are  ignored  and  deleted  when
     transformed.

	for (int i = 0; i < N; /* This will be deleted */ ++i) { }

   Range-based loops evaluate end() only once
     The  C++11  range-based for loop calls .end() only once during the initial-
     ization of the loop. If in the original loop .end() is  called  after  each
     iteration the semantics of the transformed loop may differ.

	// The following is semantically equivalent to the C++11 range-based for loop,
	// therefore the semantics of the header will not change.
	for (iterator it = container.begin(), e = container.end(); it != e; ++it) { }

	// Instead of calling .end() after each iteration, this loop will be
	// transformed to call .end() only once during the initialization of the loop,
	// which may affect semantics.
	for (iterator it = container.begin(); it != container.end(); ++it) { }

     As  explained  above, calling member functions of the container in the body
     of the loop is considered risky. If the called member function modifies the
     container the semantics of the converted loop will differ due to .end() be-
     ing called only once.

	bool flag = false;
	for (vector<T>::iterator it = vec.begin(); it != vec.end(); ++it) {
	  // Add a copy of the first element to the end of the vector.
	  if (!flag) {
	    // This line makes this transformation 'risky'.
	    vec.push_back(*it);
	    flag = true;
	  }
	  cout << *it;
	}

     The original code above prints out the contents of the container  including
     the  newly  added	element while the converted loop, shown below, will only
     print the original contents and not the newly added element.

	bool flag = false;
	for (auto & elem : vec) {
	  // Add a copy of the first element to the end of the vector.
	  if (!flag) {
	    // This line makes this transformation 'risky'
	    vec.push_back(elem);
	    flag = true;
	  }
	  cout << elem;
	}

     Semantics will also be affected if .end() has side effects. For example, in
     the case where calls to .end() are logged the semantics will change in  the
     transformed loop if .end() was originally called after each iteration.

	iterator end() {
	  num_of_end_calls++;
	  return container.end();
	}

   Overloaded operator->() with side effects
     Similarly,  if  operator->()  was	overloaded to have side effects, such as
     logging, the semantics will change. If the iterator's operator->() was used
     in the original loop it will be replaced with <container  element>.<member>
     instead  due  to  the  implicit  dereference as part of the range-based for
     loop.  Therefore any side effect of the  overloaded  operator->()	will  no
     longer be performed.

	for (iterator it = c.begin(); it != c.end(); ++it) {
	  it->func(); // Using operator->()
	}
	// Will be transformed to:
	for (auto & elem : c) {
	  elem.func(); // No longer using operator->()
	}

   Pointers and references to containers
     While most of the check's risk analysis is dedicated to determining whether
     the  iterator  or container was modified within the loop, it is possible to
     circumvent the analysis by accessing and modifying the container through  a
     pointer or reference.

     If  the container were directly used instead of using the pointer or refer-
     ence the following transformation would have only been applied at the risky
     level since calling a member function of the container is considered risky.
     The check cannot identify expressions associated with  the  container  that
     are different than the one used in the loop header, therefore the transfor-
     mation below ends up being performed at the safe level.

	vector<int> vec;

	vector<int> *ptr = &vec;
	vector<int> &ref = vec;

	for (vector<int>::iterator it = vec.begin(), e = vec.end(); it != e; ++it) {
	  if (!flag) {
	    // Accessing and modifying the container is considered risky, but the risk
	    // level is not raised here.
	    ptr->push_back(*it);
	    ref.push_back(*it);
	    flag = true;
	  }
	}

   OpenMP
     As  range-based  for  loops  are  only available since OpenMP 5, this check
     should not been used on code with a compatibility	requirements  of  OpenMP
     prior to version 5. It is intentional that this check does not make any at-
     tempts to exclude incorrect diagnostics on OpenMP for loops prior to OpenMP
     5.

     To  prevent  this	check  to be applied (and to break) OpenMP for loops but
     still be  applied	to  non-OpenMP	for  loops  the  usage	of  NOLINT  (see
     Suppressing  Undesired  Diagnostics)  on  the  specific for loops is recom-
     mended.

   modernize-make-shared
     This check finds the creation  of	std::shared_ptr  objects  by  explicitly
     calling  the  constructor and a new expression, and replaces it with a call
     to std::make_shared.

	auto my_ptr = std::shared_ptr<MyPair>(new MyPair(1, 2));

	// becomes

	auto my_ptr = std::make_shared<MyPair>(1, 2);

     This check also finds calls to std::shared_ptr::reset() with a new  expres-
     sion, and replaces it with a call to std::make_shared.

	my_ptr.reset(new MyPair(1, 2));

	// becomes

	my_ptr = std::make_shared<MyPair>(1, 2);

   Options
     MakeSmartPtrFunction
	    A string specifying the name of make-shared-ptr function. Default is
	    std::make_shared.

     MakeSmartPtrFunctionHeader
	    A  string  specifying  the	corresponding  header of make-shared-ptr
	    function.  Default is memory.

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     IgnoreMacros
	    If set to true, the check will not give warnings inside macros.  De-
	    fault is true.

     IgnoreDefaultInitialization
	    If	set  to  non-zero,  the  check	does not suggest edits that will
	    transform default initialization into value initialization, as  this
	    can cause performance regressions. Default is 1.

   modernize-make-unique
     This  check  finds  the  creation	of std::unique_ptr objects by explicitly
     calling the constructor and a new expression, and replaces it with  a  call
     to std::make_unique, introduced in C++14.

	auto my_ptr = std::unique_ptr<MyPair>(new MyPair(1, 2));

	// becomes

	auto my_ptr = std::make_unique<MyPair>(1, 2);

     This  check also finds calls to std::unique_ptr::reset() with a new expres-
     sion, and replaces it with a call to std::make_unique.

	my_ptr.reset(new MyPair(1, 2));

	// becomes

	my_ptr = std::make_unique<MyPair>(1, 2);

   Options
     MakeSmartPtrFunction
	    A string specifying the name of make-unique-ptr function. Default is
	    std::make_unique.

     MakeSmartPtrFunctionHeader
	    A string specifying  the  corresponding  header  of  make-unique-ptr
	    function.  Default is <memory>.

     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     IgnoreMacros
	    If	set to true, the check will not give warnings inside macros. De-
	    fault is true.

     IgnoreDefaultInitialization
	    If set to non-zero, the check  does  not  suggest  edits  that  will
	    transform  default initialization into value initialization, as this
	    can cause performance regressions. Default is 1.

   modernize-pass-by-value
     With move semantics added to the language and the standard library  updated
     with  move  constructors added for many types it is now interesting to take
     an argument directly by value, instead  of  by  const-reference,  and  then
     copy.  This check allows the compiler to take care of choosing the best way
     to construct the copy.

     The transformation is usually beneficial when the calling	code  passes  an
     rvalue  and  assumes the move construction is a cheap operation. This short
     example illustrates how the construction of the value happens:

	void foo(std::string s);
	std::string get_str();

	void f(const std::string &str) {
	  foo(str);	  // lvalue  -> copy construction
	  foo(get_str()); // prvalue -> move construction
	}

     NOTE:
	Currently,  only  constructors	are   transformed   to	 make	use   of
	pass-by-value.	Contributions that handle other situations are welcome!

   Pass-by-value in constructors
     Replaces  the  uses  of  const-references	constructor  parameters that are
     copied into class fields. The parameter is then moved with std::move().

     Since std::move() is a library function declared in  <utility>  it  may  be
     necessary	to  add  this  include. The check will add the include directive
     when necessary.

	 #include <string>

	 class Foo {
	 public:
	-  Foo(const std::string &Copied, const std::string &ReadOnly)
	-    : Copied(Copied), ReadOnly(ReadOnly)
	+  Foo(std::string Copied, const std::string &ReadOnly)
	+    : Copied(std::move(Copied)), ReadOnly(ReadOnly)
	   {}

	 private:
	   std::string Copied;
	   const std::string &ReadOnly;
	 };

	 std::string get_cwd();

	 void f(const std::string &Path) {
	   // The parameter corresponding to 'get_cwd()' is move-constructed. By
	   // using pass-by-value in the Foo constructor we managed to avoid a
	   // copy-construction.
	   Foo foo(get_cwd(), Path);
	 }

     If the parameter is used more than  once  no  transformation  is  performed
     since  moved  objects  have an undefined state. It means the following code
     will be left untouched:

	#include <string>

	void pass(const std::string &S);

	struct Foo {
	  Foo(const std::string &S) : Str(S) {
	    pass(S);
	  }

	  std::string Str;
	};

   Known limitations
     A situation where the generated code can be wrong is when the object refer-
     enced is modified before the assignment in the init-list through a "hidden"
     reference.

     Example:

	 std::string s("foo");

	 struct Base {
	   Base() {
	     s = "bar";
	   }
	 };

	 struct Derived : Base {
	-  Derived(const std::string &S) : Field(S)
	+  Derived(std::string S) : Field(std::move(S))
	   { }

	   std::string Field;
	 };

	 void f() {
	-  Derived d(s); // d.Field holds "bar"
	+  Derived d(s); // d.Field holds "foo"
	 }

   Note about delayed template parsing
     When delayed template parsing is enabled, constructors  part  of  templated
     contexts;	templated  constructors,  constructors	in class templates, con-
     structors of inner classes of template classes, etc., are not  transformed.
     Delayed  template	parsing  is enabled by default on Windows as a Microsoft
     extension: Clang Compiler User^as Manual - Microsoft extensions.

     Delayed template parsing can be enabled using the	-fdelayed-template-pars-
     ing flag and disabled using -fno-delayed-template-parsing.

     Example:

	  template <typename T> class C {
	    std::string S;

	  public:
	=  // using -fdelayed-template-parsing (default on Windows)
	=  C(const std::string &S) : S(S) {}

	+  // using -fno-delayed-template-parsing (default on non-Windows systems)
	+  C(std::string S) : S(std::move(S)) {}
	  };

     SEE ALSO:
	For  more  information	about the pass-by-value idiom, read: Want Speed?
	Pass by Value.

   Options
     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     ValuesOnly
	    When true, the check only warns about copied parameters that are al-
	    ready passed by value. Default is false.

   modernize-raw-string-literal
     This check selectively replaces string literals containing escaped  charac-
     ters with raw string literals.

     Example:

	const char *const Quotes{"embedded \"quotes\""};
	const char *const Paragraph{"Line one.\nLine two.\nLine three.\n"};
	const char *const SingleLine{"Single line.\n"};
	const char *const TrailingSpace{"Look here -> \n"};
	const char *const Tab{"One\tTwo\n"};
	const char *const Bell{"Hello!\a  And welcome!"};
	const char *const Path{"C:\\Program Files\\Vendor\\Application.exe"};
	const char *const RegEx{"\\w\\([a-z]\\)"};

     becomes

	const char *const Quotes{R"(embedded "quotes")"};
	const char *const Paragraph{"Line one.\nLine two.\nLine three.\n"};
	const char *const SingleLine{"Single line.\n"};
	const char *const TrailingSpace{"Look here -> \n"};
	const char *const Tab{"One\tTwo\n"};
	const char *const Bell{"Hello!\a  And welcome!"};
	const char *const Path{R"(C:\Program Files\Vendor\Application.exe)"};
	const char *const RegEx{R"(\w\([a-z]\))"};

     The  presence  of	any  of the following escapes can cause the string to be
     converted to a raw string literal: \\, \', \", \?, and octal or hexadecimal
     escapes for printable ASCII characters.

     A string literal containing only escaped newlines is a common way of  writ-
     ing  lines  of  text  output. Introducing physical newlines with raw string
     literals in this case is likely to impede readability. These string  liter-
     als are left unchanged.

     An  escaped  horizontal tab, form feed, or vertical tab prevents the string
     literal from being converted. The presence of a horizontal tab,  form  feed
     or vertical tab in source code is not visually obvious.

   modernize-redundant-void-arg
     Find and remove redundant void argument lists.

     Examples:
		 +-----------------------------+-------------------------+
		 | Initial code 	       | Code with applied fixes |
		 +-----------------------------+-------------------------+
		 | int f(void); 	       | int f();		 |
		 +-----------------------------+-------------------------+
		 | int (*f(void))(void);       | int (*f())();		 |
		 +-----------------------------+-------------------------+
		 | typedef		   int | typedef int (*f_t())(); |
		 | (*f_t(void))(void);	       |			 |
		 +-----------------------------+-------------------------+
		 | void (C::*p)(void);	       | void (C::*p)();	 |
		 +-----------------------------+-------------------------+
		 | C::C(void) {}	       | C::C() {}		 |
		 +-----------------------------+-------------------------+
		 | C::~C(void) {}	       | C::~C() {}		 |
		 +-----------------------------+-------------------------+

   modernize-replace-auto-ptr
     This check replaces the uses  of  the  deprecated	class  std::auto_ptr  by
     std::unique_ptr  (introduced  in C++11). The transfer of ownership, done by
     the copy-constructor and the  assignment  operator,  is  changed  to  match
     std::unique_ptr usage by using explicit calls to std::move().

     Migration example:

	-void take_ownership_fn(std::auto_ptr<int> int_ptr);
	+void take_ownership_fn(std::unique_ptr<int> int_ptr);

	 void f(int x) {
	-  std::auto_ptr<int> a(new int(x));
	-  std::auto_ptr<int> b;
	+  std::unique_ptr<int> a(new int(x));
	+  std::unique_ptr<int> b;

	-  b = a;
	-  take_ownership_fn(b);
	+  b = std::move(a);
	+  take_ownership_fn(std::move(b));
	 }

     Since  std::move()  is  a	library function declared in <utility> it may be
     necessary to add this include. The check will  add  the  include  directive
     when necessary.

   Known Limitations
     * If headers modification is not activated or if a header is not allowed to
       be changed this check will produce broken code (compilation error), where
       the  headers'  code will stay unchanged while the code using them will be
       changed.

     * Client code that declares a reference to  an  std::auto_ptr  coming  from
       code that can't be migrated (such as a header coming from a 3rd party li-
       brary)  will produce a compilation error after migration. This is because
       the type of the reference will be changed to std::unique_ptr but the type
       returned  by  the  library  won't  change,   binding   a   reference   to
       std::unique_ptr	from  an  std::auto_ptr.  This pattern doesn't make much
       sense and usually std::auto_ptr are stored by value  (otherwise	what  is
       the point in using them instead of a reference or a pointer?).

	 // <3rd-party header...>
	 std::auto_ptr<int> get_value();
	 const std::auto_ptr<int> & get_ref();

	 // <calling code (with migration)...>
	-std::auto_ptr<int> a(get_value());
	+std::unique_ptr<int> a(get_value()); // ok, unique_ptr constructed from auto_ptr

	-const std::auto_ptr<int> & p = get_ptr();
	+const std::unique_ptr<int> & p = get_ptr(); // won't compile

     * Non-instantiated templates aren't modified.

	template <typename X>
	void f() {
	    std::auto_ptr<X> p;
	}

	// only 'f<int>()' (or similar) will trigger the replacement.

   Options
     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

   modernize-replace-disallow-copy-and-assign-macro
     Finds  macro expansions of DISALLOW_COPY_AND_ASSIGN(Type) and replaces them
     with a deleted copy constructor and a deleted assignment operator.

     Before the delete keyword was introduced in C++11 it was common practice to
     declare a copy constructor and an assignment operator as a private members.
     This effectively makes them unusable to the public API of a class.

     With the advent of the delete keyword in C++11 we can abandon  the  private
     access  of  the copy constructor and the assignment operator and delete the
     methods entirely.

     When running this check on a code like this:

	class Foo {
	private:
	  DISALLOW_COPY_AND_ASSIGN(Foo);
	};

     It will be transformed to this:

	class Foo {
	private:
	  Foo(const Foo &) = delete;
	  const Foo &operator=(const Foo &) = delete;
	};

   Known Limitations
     * Notice that the migration example above leaves the private access  speci-
       fication    untouched.	 You	might	 want	 to    run   the   check
       modernize-use-equals-delete to get warnings for deleted functions in pri-
       vate sections.

   Options
     MacroName
	    A string specifying the macro name whose expansion will be replaced.
	    Default is DISALLOW_COPY_AND_ASSIGN.

     See: https://en.cppreference.com/w/cpp/language/function#Deleted_functions

   modernize-replace-random-shuffle
     This check will find occurrences of std::random_shuffle and replace it with
     std::shuffle. In C++17 std::random_shuffle will no longer be available  and
     thus we need to replace it.

     Below  are  two  examples of what kind of occurrences will be found and two
     examples of what it will be replaced with.

	std::vector<int> v;

	// First example
	std::random_shuffle(vec.begin(), vec.end());

	// Second example
	std::random_shuffle(vec.begin(), vec.end(), randomFunc);

     Both of these examples will be replaced with:

	std::shuffle(vec.begin(), vec.end(), std::mt19937(std::random_device()()));

     The second example will also receive a warning that randomFunc is no longer
     supported in the same way as before so if the user wants the same function-
     ality, the user will need to change the implementation of the randomFunc.

     One thing to be aware of here is that std::random_device is quite expensive
     to initialize. So if you are using  the  code  in	a  performance	critical
     place, you probably want to initialize it elsewhere.  Another thing is that
     the seeding quality of the suggested fix is quite poor: std::mt19937 has an
     internal state of 624 32-bit integers, but is only seeded with a single in-
     teger.  So  if  you  require higher quality randomness, you should consider
     seeding better, for example:

	std::shuffle(v.begin(), v.end(), []() {
	  std::mt19937::result_type seeds[std::mt19937::state_size];
	  std::random_device device;
	  std::uniform_int_distribution<typename std::mt19937::result_type> dist;
	  std::generate(std::begin(seeds), std::end(seeds), [&] { return dist(device); });
	  std::seed_seq seq(std::begin(seeds), std::end(seeds));
	  return std::mt19937(seq);
	}());

   modernize-return-braced-init-list
     Replaces explicit calls to the constructor in a return with a  braced  ini-
     tializer list. This way the return type is not needlessly duplicated in the
     function definition and the return statement.

	Foo bar() {
	  Baz baz;
	  return Foo(baz);
	}

	// transforms to:

	Foo bar() {
	  Baz baz;
	  return {baz};
	}

   modernize-shrink-to-fit
     Replace   copy   and   swap   tricks  on  shrinkable  containers  with  the
     shrink_to_fit() method call.

     The shrink_to_fit() method is more readable and  more  effective  than  the
     copy and swap trick to reduce the capacity of a shrinkable container.  Note
     that, the shrink_to_fit() method is only available in C++11 and up.

   modernize-unary-static-assert
     The check diagnoses any static_assert declaration with an empty string lit-
     eral  and	provides a fix-it to replace the declaration with a single-argu-
     ment static_assert declaration.

     The check is only applicable for C++17 and later code.

     The following code:

	void f_textless(int a) {
	  static_assert(sizeof(a) <= 10, "");
	}

     is replaced by:

	void f_textless(int a) {
	  static_assert(sizeof(a) <= 10);
	}

   modernize-use-auto
     This check is responsible for using the auto type	specifier  for	variable
     declarations to improve code readability and maintainability. For example:

	std::vector<int>::iterator I = my_container.begin();

	// transforms to:

	auto I = my_container.begin();

     The  auto	type  specifier  will only be introduced in situations where the
     variable type matches the type of	the  initializer  expression.  In  other
     words  auto  should deduce the same type that was originally spelled in the
     source.  However, not every situation should be transformed:

	int val = 42;
	InfoStruct &I = SomeObject.getInfo();

	// Should not become:

	auto val = 42;
	auto &I = SomeObject.getInfo();

     In this example using auto for builtins  doesn't  improve	readability.  In
     other  situations	it  makes the code less self-documenting impairing read-
     ability and maintainability. As a result, auto is used only  introduced  in
     specific situations described below.

   Iterators
     Iterator type specifiers tend to be long and used frequently, especially in
     loop  constructs.	Since  the  functions generating iterators have a common
     format, the type specifier can be replaced without obscuring the meaning of
     code while improving readability and maintainability.

	for (std::vector<int>::iterator I = my_container.begin(),
					E = my_container.end();
	     I != E; ++I) {
	}

	// becomes

	for (auto I = my_container.begin(), E = my_container.end(); I != E; ++I) {
	}

     The check will only replace iterator type-specifiers when all of  the  fol-
     lowing conditions are satisfied:

     * The iterator is for one of the standard container in std namespace:

       * array

       * deque

       * forward_list

       * list

       * vector

       * map

       * multimap

       * set

       * multiset

       * unordered_map

       * unordered_multimap

       * unordered_set

       * unordered_multiset

       * queue

       * priority_queue

       * stack

     * The  iterator is one of the possible iterator types for standard contain-
       ers:

       * iterator

       * reverse_iterator

       * const_iterator

       * const_reverse_iterator

     * In addition to using iterator types directly, typedefs or other	ways  of
       referring  to  those types are also allowed. However, implementation-spe-
       cific types for which a type like std::vector<int>::iterator is itself  a
       typedef will not be transformed. Consider the following examples:

	// The following direct uses of iterator types will be transformed.
	std::vector<int>::iterator I = MyVec.begin();
	{
	  using namespace std;
	  list<int>::iterator I = MyList.begin();
	}

	// The type specifier for J would transform to auto since it's a typedef
	// to a standard iterator type.
	typedef std::map<int, std::string>::const_iterator map_iterator;
	map_iterator J = MyMap.begin();

	// The following implementation-specific iterator type for which
	// std::vector<int>::iterator could be a typedef would not be transformed.
	__gnu_cxx::__normal_iterator<int*, std::vector> K = MyVec.begin();

     * The  initializer for the variable being declared is not a braced initial-
       izer list. Otherwise, use of auto would cause the type of the variable to
       be deduced as std::initializer_list.

   New expressions
     Frequently, when a pointer  is  declared  and  initialized  with  new,  the
     pointee  type  is written twice: in the declaration type and in the new ex-
     pression. In this cases, the declaration type can be replaced with auto im-
     proving readability and maintainability.

	TypeName *my_pointer = new TypeName(my_param);

	// becomes

	auto *my_pointer = new TypeName(my_param);

     The check will also replace the declaration type in multiple  declarations,
     if the following conditions are satisfied:

     * All  declared variables have the same type (i.e. all of them are pointers
       to the same type).

     * All declared variables are initialized with a new expression.

     * The types of all the new expressions are the same than the pointee of the
       declaration type.

	TypeName *my_first_pointer = new TypeName, *my_second_pointer = new TypeName;

	// becomes

	auto *my_first_pointer = new TypeName, *my_second_pointer = new TypeName;

   Cast expressions
     Frequently, when a variable is declared and initialized with  a  cast,  the
     variable type is written twice: in the declaration type and in the cast ex-
     pression. In this cases, the declaration type can be replaced with auto im-
     proving readability and maintainability.

	TypeName *my_pointer = static_cast<TypeName>(my_param);

	// becomes

	auto *my_pointer = static_cast<TypeName>(my_param);

     The  check handles static_cast, dynamic_cast, const_cast, reinterpret_cast,
     functional casts, C-style casts  and  function  templates	that  behave  as
     casts,  such  as  llvm::dyn_cast, boost::lexical_cast and gsl::narrow_cast.
     Calls to function templates are considered to behave as casts if the  first
     template  argument is explicit and is a type, and the function returns that
     type, or a pointer or reference to it.

   Known Limitations
     * If the initializer is an explicit conversion constructor, the check  will
       not replace the type specifier even though it would be safe to do so.

     * User-defined iterators are not handled at this time.

   Options
     MinTypeNameLength
	    If	the option is set to non-zero (default 5), the check will ignore
	    type names having a length less than the option  value.  The  option
	    affects  expressions only, not iterators.  Spaces between multi-lex-
	    eme type names (long int) are considered as one.  If the RemoveStars
	    option (see below) is set to true, then *s	in  the  type  are  also
	    counted as a part of the type name.

	// MinTypeNameLength = 0, RemoveStars=0

	int a = static_cast<int>(foo());	    // ---> auto a = ...
	// length(bool *) = 4
	bool *b = new bool;			    // ---> auto *b = ...
	unsigned c = static_cast<unsigned>(foo());  // ---> auto c = ...

	// MinTypeNameLength = 5, RemoveStars=0

	int a = static_cast<int>(foo());		 // ---> int  a = ...
	bool b = static_cast<bool>(foo());		 // ---> bool b = ...
	bool *pb = static_cast<bool*>(foo());		 // ---> bool *pb = ...
	unsigned c = static_cast<unsigned>(foo());	 // ---> auto c = ...
	// length(long <on-or-more-spaces> int) = 8
	long int d = static_cast<long int>(foo());	 // ---> auto d = ...

	// MinTypeNameLength = 5, RemoveStars=1

	int a = static_cast<int>(foo());		 // ---> int  a = ...
	// length(int * * ) = 5
	int **pa = static_cast<int**>(foo());		 // ---> auto pa = ...
	bool b = static_cast<bool>(foo());		 // ---> bool b = ...
	bool *pb = static_cast<bool*>(foo());		 // ---> auto pb = ...
	unsigned c = static_cast<unsigned>(foo());	 // ---> auto c = ...
	long int d = static_cast<long int>(foo());	 // ---> auto d = ...

     RemoveStars
	    If	the option is set to true (default is false), the check will re-
	    move stars from the non-typedef pointer types  when  replacing  type
	    names with auto. Otherwise, the check will leave stars. For example:

	TypeName *my_first_pointer = new TypeName, *my_second_pointer = new TypeName;

	// RemoveStars = 0

	auto *my_first_pointer = new TypeName, *my_second_pointer = new TypeName;

	// RemoveStars = 1

	auto my_first_pointer = new TypeName, my_second_pointer = new TypeName;

   modernize-use-bool-literals
     Finds integer literals which are cast to bool.

	bool p = 1;
	bool f = static_cast<bool>(1);
	std::ios_base::sync_with_stdio(0);
	bool x = p ? 1 : 0;

	// transforms to

	bool p = true;
	bool f = true;
	std::ios_base::sync_with_stdio(false);
	bool x = p ? true : false;

   Options
     IgnoreMacros
	    If	set to true, the check will not give warnings inside macros. De-
	    fault is true.

   modernize-use-default
     This check has been renamed to modernize-use-equals-default.

   modernize-use-default-member-init
     This check converts a default constructor's member  initializers  into  the
     new  default  member  initializers in C++11. Other member initializers that
     match the default member initializer are removed. This can reduce	repeated
     code or allow use of '= default'.

	struct A {
	  A() : i(5), j(10.0) {}
	  A(int i) : i(i), j(10.0) {}
	  int i;
	  double j;
	};

	// becomes

	struct A {
	  A() {}
	  A(int i) : i(i) {}
	  int i{5};
	  double j{10.0};
	};

     NOTE:
	Only  converts member initializers for built-in types, enums, and point-
	ers.  The readability-redundant-member-init check will remove  redundant
	member initializers for classes.

   Options
     UseAssignment
	    If	this  option  is  set to true (default is false), the check will
	    initialise members with an assignment. For example:

	struct A {
	  A() {}
	  A(int i) : i(i) {}
	  int i = 5;
	  double j = 10.0;
	};

     IgnoreMacros
	    If this option is set to true (default is true), the check will  not
	    warn about members declared inside macros.

   modernize-use-emplace
     The  check  flags	insertions to an STL-style container done by calling the
     push_back method with an explicitly-constructed temporary of the  container
     element  type.  In this case, the corresponding emplace_back method results
     in less verbose and potentially more efficient code.  Right now  the  check
     doesn't  support  push_front  and	insert.   It also doesn't support insert
     functions for associative containers because replacing insert with  emplace
     may result in speed regression, but it might get support with some addition
     flag in the future.

     By  default  only	std::vector, std::deque, std::list are considered.  This
     list can be modified using the ContainersWithPushBack option.

     Before:

	std::vector<MyClass> v;
	v.push_back(MyClass(21, 37));

	std::vector<std::pair<int, int>> w;

	w.push_back(std::pair<int, int>(21, 37));
	w.push_back(std::make_pair(21L, 37L));

     After:

	std::vector<MyClass> v;
	v.emplace_back(21, 37);

	std::vector<std::pair<int, int>> w;
	w.emplace_back(21, 37);
	w.emplace_back(21L, 37L);

     By default, the check is able  to	remove	unnecessary  std::make_pair  and
     std::make_tuple  calls  from push_back calls on containers of std::pair and
     std::tuple. Custom tuple-like types can be modified by the  TupleTypes  op-
     tion;  custom  make functions can be modified by the TupleMakeFunctions op-
     tion.

     The other situation is when we pass arguments that will be converted  to  a
     type inside a container.

     Before:

	std::vector<boost::optional<std::string> > v;
	v.push_back("abc");

     After:

	std::vector<boost::optional<std::string> > v;
	v.emplace_back("abc");

     In  some  cases the transformation would be valid, but the code wouldn't be
     exception safe. In this case the calls of push_back won't be replaced.

	std::vector<std::unique_ptr<int>> v;
	v.push_back(std::unique_ptr<int>(new int(0)));
	auto *ptr = new int(1);
	v.push_back(std::unique_ptr<int>(ptr));

     This is because replacing it with emplace_back could cause a leak	of  this
     pointer  if emplace_back would throw exception before emplacement (e.g. not
     enough memory to add a new element).

     For more info read item 42 - "Consider emplacement instead  of  insertion."
     of Scott Meyers "Effective Modern C++".

     The  default  smart  pointers  that  are  considered  are	std::unique_ptr,
     std::shared_ptr, std::auto_ptr. To specify other smart  pointers  or  other
     classes use the SmartPointers option.

     Check also doesn't fire if any argument of the constructor call would be:

	* a bit-field (bit-fields can't bind to rvalue/universal reference)

	* a new expression (to avoid leak)

	* if the argument would be converted via derived-to-base cast.

     This check requires C++11 or higher to run.

   Options
     ContainersWithPushBack
	    Semicolon-separated  list  of  class names of custom containers that
	    support push_back.

     IgnoreImplicitConstructors
	    When true, the check will ignore implicitly constructed arguments of
	    push_back, e.g.

	       std::vector<std::string> v;
	       v.push_back("a"); // Ignored when IgnoreImplicitConstructors is `true`.

	    Default is false.

     SmartPointers
	    Semicolon-separated list of class names of custom smart pointers.

     TupleTypes
	    Semicolon-separated list of std::tuple-like class names.

     TupleMakeFunctions
	    Semicolon-separated list  of  std::make_tuple-like	function  names.
	    Those function calls will be removed from push_back calls and turned
	    into emplace_back.

   Example
	std::vector<MyTuple<int, bool, char>> x;
	x.push_back(MakeMyTuple(1, false, 'x'));

     transforms to:

	std::vector<MyTuple<int, bool, char>> x;
	x.emplace_back(1, false, 'x');

     when  TupleTypes is set to MyTuple and TupleMakeFunctions is set to MakeMy-
     Tuple.

   modernize-use-equals-default
     This check replaces default bodies of special member functions with  =  de-
     fault;. The explicitly defaulted function declarations enable more opportu-
     nities  in  optimization,	because  the compiler might treat explicitly de-
     faulted functions as trivial.

	struct A {
	  A() {}
	  ~A();
	};
	A::~A() {}

	// becomes

	struct A {
	  A() = default;
	  ~A();
	};
	A::~A() = default;

     NOTE:
	Move-constructor and move-assignment operator are not supported yet.

   Options
     IgnoreMacros
	    If set to true, the check will not give warnings inside macros.  De-
	    fault is true.

   modernize-use-equals-delete
     This  check  marks  unimplemented	private  special member functions with =
     delete.  To avoid false-positives, this check only applies in a translation
     unit that has all other member functions implemented.

	struct A {
	private:
	  A(const A&);
	  A& operator=(const A&);
	};

	// becomes

	struct A {
	private:
	  A(const A&) = delete;
	  A& operator=(const A&) = delete;
	};

     IgnoreMacros
	    If this option is set to true (default is true), the check will  not
	    warn about functions declared inside macros.

   modernize-use-nodiscard
     Adds  [[nodiscard]] attributes (introduced in C++17) to member functions in
     order to highlight at compile time which return values should  not  be  ig-
     nored.

     Member  functions need to satisfy the following conditions to be considered
     by this check:

	* no [[nodiscard]],  [[noreturn]],  __attribute__((warn_unused_result)),
	  [[clang::warn_unused_result]]   nor	[[gcc::warn_unused_result]]  at-
	  tribute,

	* non-void return type,

	* non-template return types,

	* const member function,

	* non-variadic functions,

	* no non-const reference parameters,

	* no pointer parameters,

	* no template parameters,

	* no template function parameters,

	* not be a member of a class with mutable member variables,

	* no Lambdas,

	* no conversion functions.

     Such functions have no means of altering any state or passing values  other
     than  via	the  return type. Unless the member functions are altering state
     via some external call (e.g. I/O).

   Example
	bool empty() const;
	bool empty(int i) const;

     transforms to:

	[[nodiscard] bool empty() const;
	[[nodiscard] bool empty(int i) const;

   Options
     ReplacementString
	    Specifies a macro to use instead of [[nodiscard]].	This  is  useful
	    when  maintaining source code that needs to compile with a pre-C++17
	    compiler.

   Example
	bool empty() const;
	bool empty(int i) const;

     transforms to:

	NO_DISCARD bool empty() const;
	NO_DISCARD bool empty(int i) const;

     if the ReplacementString option is set to NO_DISCARD.

     NOTE:
	If the ReplacementString is not a C++ attribute, but  instead  a  macro,
	then  that  macro must be defined in scope or the fix-it will not be ap-
	plied.

     NOTE:
	For alternative  __attribute__	syntax	options  to  mark  functions  as
	[[nodiscard]]	   in	   non-c++17	 source     code.      See     -
	https://clang.llvm.org/docs/AttributeReference.html#nodiscard-warn-un-
	used-result

   modernize-use-noexcept
     This check replaces deprecated dynamic exception  specifications  with  the
     appropriate  noexcept specification (introduced in C++11).  By default this
     check will replace throw() with noexcept, and  throw(<exception>[,...])  or
     throw(...) with noexcept(false).

   Example
	void foo() throw();
	void bar() throw(int) {}

     transforms to:

	void foo() noexcept;
	void bar() noexcept(false) {}

   Options
     ReplacementString
	    Users can use ReplacementString to specify a macro to use instead of
	    noexcept.	This  is  useful  when maintaining source code that uses
	    custom exception specification marking other than noexcept.   Fix-it
	    hints will only be generated for non-throwing specifications.

   Example
	void bar() throw(int);
	void foo() throw();

     transforms to:

	void bar() throw(int);	// No fix-it generated.
	void foo() NOEXCEPT;

     if the ReplacementString option is set to NOEXCEPT.

     UseNoexceptFalse

     Enabled by default, disabling will generate fix-it hints that remove throw-
     ing  dynamic  exception specs, e.g., throw(<something>), completely without
     providing a replacement text, except for destructors and  delete  operators
     that are noexcept(true) by default.

   Example
	void foo() throw(int) {}

	struct bar {
	  void foobar() throw(int);
	  void operator delete(void *ptr) throw(int);
	  void operator delete[](void *ptr) throw(int);
	  ~bar() throw(int);
	}

     transforms to:

	void foo() {}

	struct bar {
	  void foobar();
	  void operator delete(void *ptr) noexcept(false);
	  void operator delete[](void *ptr) noexcept(false);
	  ~bar() noexcept(false);
	}

     if the UseNoexceptFalse option is set to false.

   modernize-use-nullptr
     The check converts the usage of null pointer constants (eg. NULL, 0) to use
     the new C++11 nullptr keyword.

   Example
	void assignment() {
	  char *a = NULL;
	  char *b = 0;
	  char c = 0;
	}

	int *ret_ptr() {
	  return 0;
	}

     transforms to:

	void assignment() {
	  char *a = nullptr;
	  char *b = nullptr;
	  char c = 0;
	}

	int *ret_ptr() {
	  return nullptr;
	}

   Options
     NullMacros
	    Comma-separated  list  of macro names that will be transformed along
	    with NULL. By default this check will only replace	the  NULL  macro
	    and will skip any similar user-defined macros.

   Example
	#define MY_NULL (void*)0
	void assignment() {
	  void *p = MY_NULL;
	}

     transforms to:

	#define MY_NULL NULL
	void assignment() {
	  int *p = nullptr;
	}

     if the NullMacros option is set to MY_NULL.

   modernize-use-override
     Adds override (introduced in C++11) to overridden virtual functions and re-
     moves virtual from those functions as it is not required.

     virtual  on non base class implementations was used to help indicate to the
     user that a function was virtual. C++ compilers did not use the presence of
     this to signify an overridden function.

     In C++ 11 override and final keywords were introduced to  allow  overridden
     functions	to  be	marked appropriately. Their presence allows compilers to
     verify that an overridden function correctly overrides a base class  imple-
     mentation.

     This can be useful as compilers can generate a compile time error when:

	* The base class implementation function signature changes.

	* The user has not created the override with the correct signature.

   Options
     IgnoreDestructors
	    If set to true, this check will not diagnose destructors. Default is
	    false.

     AllowOverrideAndFinal
	    If	set  to true, this check will not diagnose override as redundant
	    with final. This is useful when code will be compiled by a	compiler
	    with  warning/error  checking flags requiring override explicitly on
	    overridden members, such as gcc -Wsuggest-override/gcc  -Werror=sug-
	    gest-override.  Default is false.

     OverrideSpelling
	    Specifies  a  macro  to use instead of override. This is useful when
	    maintaining source code that also needs to compile with a  pre-C++11
	    compiler.

     FinalSpelling
	    Specifies a macro to use instead of final. This is useful when main-
	    taining source code that also needs to compile with a pre-C++11 com-
	    piler.

     NOTE:
	For    more    information    on    the    use	 of   override	 see   -
	https://en.cppreference.com/w/cpp/language/override

   modernize-use-trailing-return-type
     Rewrites function signatures to use a trailing return type  (introduced  in
     C++11).  This  transformation  is purely stylistic.  The return type before
     the function name is replaced by auto and inserted after the function para-
     meter list (and qualifiers).

   Example
	int f1();
	inline int f2(int arg) noexcept;
	virtual float f3() const && = delete;

     transforms to:

	auto f1() -> int;
	inline auto f2(int arg) -> int noexcept;
	virtual auto f3() const && -> float = delete;

   Known Limitations
     The following categories of return types cannot be rewritten currently:

     * function pointers

     * member function pointers

     * member pointers

     Unqualified names in the return type might erroneously refer  to  different
     entities  after the rewrite.  Preventing such errors requires a full lookup
     of all unqualified names present in the return type in  the  scope  of  the
     trailing  return type location.  This location includes e.g. function para-
     meter names and members of the enclosing  class  (including  all  inherited
     classes).	Such a lookup is currently not implemented.

     Given the following piece of code

	struct S { long long value; };
	S f(unsigned S) { return {S * 2}; }
	class CC {
	  int S;
	  struct S m();
	};
	S CC::m() { return {0}; }

     a careless rewrite would produce the following output:

	struct S { long long value; };
	auto f(unsigned S) -> S { return {S * 2}; } // error
	class CC {
	  int S;
	  auto m() -> struct S;
	};
	auto CC::m() -> S { return {0}; } // error

     This  code fails to compile because the S in the context of f refers to the
     equally named function parameter.	Similarly, the S in  the  context  of  m
     refers to the equally named class member.	The check can currently only de-
     tect and avoid a clash with a function parameter name.

   modernize-use-transparent-functors
     Prefer transparent functors to non-transparent ones. When using transparent
     functors,	the  type  does  not  need to be repeated. The code is easier to
     read, maintain and less prone to errors. It is not  possible  to  introduce
     unwanted conversions.

	// Non-transparent functor
	std::map<int, std::string, std::greater<int>> s;

	// Transparent functor.
	std::map<int, std::string, std::greater<>> s;

	// Non-transparent functor
	using MyFunctor = std::less<MyType>;

     It  is  not always a safe transformation though. The following case will be
     untouched to preserve the semantics.

	// Non-transparent functor
	std::map<const char *, std::string, std::greater<std::string>> s;

   Options
     SafeMode
	    If the option is set to true, the  check  will  not  diagnose  cases
	    where  using  a  transparent functor cannot be guaranteed to produce
	    identical results as the original code. The default value  for  this
	    option is false.

     This check requires using C++14 or higher to run.

   modernize-use-uncaught-exceptions
     This  check  will warn on calls to std::uncaught_exception and replace them
     with calls to std::uncaught_exceptions, since  std::uncaught_exception  was
     deprecated in C++17.

     Below are a few examples of what kind of occurrences will be found and what
     they will be replaced with.

	#define MACRO1 std::uncaught_exception
	#define MACRO2 std::uncaught_exception

	int uncaught_exception() {
	  return 0;
	}

	int main() {
	  int res;

	  res = uncaught_exception();
	  // No warning, since it is not the deprecated function from namespace std

	  res = MACRO2();
	  // Warning, but will not be replaced

	  res = std::uncaught_exception();
	  // Warning and replaced

	  using std::uncaught_exception;
	  // Warning and replaced

	  res = uncaught_exception();
	  // Warning and replaced
	}

     After applying the fixes the code will look like the following:

	#define MACRO1 std::uncaught_exception
	#define MACRO2 std::uncaught_exception

	int uncaught_exception() {
	  return 0;
	}

	int main() {
	  int res;

	  res = uncaught_exception();

	  res = MACRO2();

	  res = std::uncaught_exceptions();

	  using std::uncaught_exceptions;

	  res = uncaught_exceptions();
	}

   modernize-use-using
     The check converts the usage of typedef with using keyword.

     Before:

	typedef int variable;

	class Class{};
	typedef void (Class::* MyPtrType)() const;

	typedef struct { int a; } R_t, *R_p;

     After:

	using variable = int;

	class Class{};
	using MyPtrType = void (Class::*)() const;

	using R_t = struct { int a; };
	using R_p = R_t*;

     This check requires using C++11 or higher to run.

   Options
     IgnoreMacros
	    If	set to true, the check will not give warnings inside macros. De-
	    fault is true.

   mpi-buffer-deref
     This check verifies if a buffer passed to an MPI  (Message  Passing  Inter-
     face)  function is sufficiently dereferenced. Buffers should be passed as a
     single pointer or array. As MPI function  signatures  specify  void  *  for
     their buffer types, insufficiently dereferenced buffers can be passed, like
     for  example  as double pointers or multidimensional arrays, without a com-
     piler warning emitted.

     Examples:

	// A double pointer is passed to the MPI function.
	char *buf;
	MPI_Send(&buf, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);

	// A multidimensional array is passed to the MPI function.
	short buf[1][1];
	MPI_Send(buf, 1, MPI_SHORT, 0, 0, MPI_COMM_WORLD);

	// A pointer to an array is passed to the MPI function.
	short *buf[1];
	MPI_Send(buf, 1, MPI_SHORT, 0, 0, MPI_COMM_WORLD);

   mpi-type-mismatch
     This check verifies if buffer type  and  MPI  (Message  Passing  Interface)
     datatype  pairs  match for used MPI functions. All MPI datatypes defined by
     the MPI standard (3.1) are verified by this check. User  defined  typedefs,
     custom  MPI datatypes and null pointer constants are skipped, in the course
     of verification.

     Example:

	// In this case, the buffer type matches MPI datatype.
	char buf;
	MPI_Send(&buf, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);

	// In the following case, the buffer type does not match MPI datatype.
	int buf;
	MPI_Send(&buf, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);

   objc-avoid-nserror-init
     Finds improper initialization of NSError objects.

     According to Apple developer document, we should always use factory  method
     errorWithDomain:code:userInfo:  to  create  new  NSError objects instead of
     [NSError alloc] init]. Otherwise it will lead to a warning  message  during
     runtime.

     The     corresponding     information    about    NSError	  creation:    -
     https://developer.apple.com/library/content/documentation/Cocoa/Concep-
     tual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html

   objc-dealloc-in-category
     Finds implementations of -dealloc in Objective-C categories.  The	category
     implementation  will override any -dealloc in the class implementation, po-
     tentially causing issues.

     Classes implement -dealloc to perform important actions  to  deallocate  an
     object.  If  a  category on the class implements -dealloc, it will override
     the class's implementation and unexpected deallocation behavior may occur.

   objc-forbidden-subclassing
     Finds Objective-C classes which are subclasses of classes which are not de-
     signed to be subclassed.

     By default, includes a list of Objective-C classes which are publicly docu-
     mented as not supporting subclassing.

     NOTE:
	Instead of using this check, for code under your control, you should add
	__attribute__((objc_subclassing_restricted)) before your @interface dec-
	larations to ensure the compiler prevents others from  subclassing  your
	Objective-C		   classes.		    See 	       -
	https://clang.llvm.org/docs/AttributeReference.html#objc-subclassing-re-
	stricted

   Options
     ForbiddenSuperClassNames
	    Semicolon-separated list of names of Objective-C  classes  which  do
	    not support subclassing.

	    Defaults  to  ABNewPersonViewController;ABPeoplePickerNavigationCon-
	    troller;ABPersonViewController;ABUnknownPersonViewCon-
	    troller;NSHashTable;NSMapTable;NSPointerArray;NSPointerFunc-
	    tions;NSTimer;UIActionSheet;UIAlertView;UIImagePickerController;UI-
	    TextInputMode;UIWebView.

   objc-missing-hash
     Finds Objective-C implementations that implement -isEqual: without also ap-
     propriately implementing -hash.

     Apple documentation highlights that objects that are equal  must  have  the
     same		     hash		     value:		       -
     https://developer.apple.com/documentation/objectivec/1418956-nsob-
     ject/1418795-isequal?language=objc

     Note that the check only verifies the presence of -hash in scenarios  where
     its  omission  could result in unexpected behavior. The verification of the
     implementation of -hash is  the  responsibility  of  the  developer,  e.g.,
     through the addition of unit tests to verify the implementation.

   objc-nsinvocation-argument-lifetime
     Finds  calls to NSInvocation methods under ARC that don't have proper argu-
     ment object lifetimes. When passing Objective-C objects  as  parameters  to
     the NSInvocation methods getArgument:atIndex: and getReturnValue:, the val-
     ues are copied by value into the argument pointer, which leads to to incor-
     rect  releasing  behavior	if  the  object  pointers are not declared __un-
     safe_unretained.

     For code:

	id arg;
	[invocation getArgument:&arg atIndex:2];

	__strong id returnValue;
	[invocation getReturnValue:&returnValue];

     The fix will be:

	__unsafe_unretained id arg;
	[invocation getArgument:&arg atIndex:2];

	__unsafe_unretained id returnValue;
	[invocation getReturnValue:&returnValue];

     The check will warn on being passed instance variable references that  have
     lifetimes other than __unsafe_unretained, but does not propose a fix:

	// "id _returnValue" is declaration of instance variable of class.
	[invocation getReturnValue:&self->_returnValue];

   objc-property-declaration
     Finds  property  declarations  in	Objective-C files that do not follow the
     pattern of property names in Apple's programming guide. The  property  name
     should be in the format of Lower Camel Case.

     For code:

	@property(nonatomic, assign) int LowerCamelCase;

     The fix will be:

	@property(nonatomic, assign) int lowerCamelCase;

     The  check will only fix 'CamelCase' to 'camelCase'. In some other cases we
     will only provide warning messages since the property name could be compli-
     cated.  Users will need to come up with a proper name by their own.

     This check also accepts special acronyms as prefixes or suffixes. Such pre-
     fixes or suffixes will suppress the Lower Camel Case check according to the
     guide:								       -
     https://developer.apple.com/library/content/documentation/Cocoa/Concep-
     tual/CodingGuidelines/Articles/NamingBasics.html#//ap-
     ple_ref/doc/uid/20001281-1002931-BBCFHEAB

     For      a      full      list	 of	 well-known	 acronyms:     -
     https://developer.apple.com/library/content/documentation/Cocoa/Concep-
     tual/CodingGuidelines/Articles/APIAbbreviations.html#//ap-
     ple_ref/doc/uid/20001285-BCIHCGAE

     The	    corresponding	     style	      rule:	       -
     https://developer.apple.com/library/content/documentation/Cocoa/Concep-
     tual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//ap-
     ple_ref/doc/uid/20001284-1001757

     The  check  will also accept property declared in category with a prefix of
     lowercase letters followed by a '_' to avoid naming conflict. For example:

	@property(nonatomic, assign) int abc_lowerCamelCase;

     The	    corresponding	     style	      rule:	       -
     https://developer.apple.com/library/content/qa/qa1908/_index.html

   objc-super-self
     Finds invocations of -self on super instances in initializers of subclasses
     of NSObject and recommends calling a superclass initializer instead.

     Invoking  -self  on  super instances in initializers is a common programmer
     error when the programmer's original intent is to call  a	superclass  ini-
     tializer.	Failing  to  call  a  superclass  initializer breaks initializer
     chaining and can result in invalid object initialization.

   openmp-exception-escape
     Analyzes OpenMP Structured Blocks and checks that no exception escapes  out
     of the Structured Block it was thrown in.

     As per the OpenMP specification, a structured block is an executable state-
     ment,  possibly  compound, with a single entry at the top and a single exit
     at the bottom. Which means, throw may not be used to to 'exit' out  of  the
     structured  block.  If  an  exception  is not caught in the same structured
     block it was thrown in, the behaviour is undefined.

     FIXME: this check does not model SEH, setjmp/longjmp.

     WARNING! This check may be expensive on large source files.

   Options
     IgnoredExceptions
	    Comma-separated list containing type names which are not counted  as
	    thrown exceptions in the check. Default value is an empty string.

   openmp-use-default-none
     Finds  OpenMP  directives that are allowed to contain a default clause, but
     either don't specify it or the clause is specified but with the kind  other
     than none, and suggests to use the default(none) clause.

     Using  default(none)  clause  forces  developers to explicitly specify data
     sharing attributes for the variables referenced in the construct, thus mak-
     ing it obvious which variables are referenced, and what is their data shar-
     ing attribute, thus increasing readability and possibly making errors  eas-
     ier to spot.

   Example
	// ``for`` directive can not have ``default`` clause, no diagnostics.
	void n0(const int a) {
	#pragma omp for
	  for (int b = 0; b < a; b++)
	    ;
	}

	// ``parallel`` directive.

	// ``parallel`` directive can have ``default`` clause, but said clause is not
	// specified, diagnosed.
	void p0_0() {
	#pragma omp parallel
	  ;
	  // WARNING: OpenMP directive ``parallel`` does not specify ``default``
	  //	      clause. Consider specifying ``default(none)`` clause.
	}

	// ``parallel`` directive can have ``default`` clause, and said clause is
	// specified, with ``none`` kind, all good.
	void p0_1() {
	#pragma omp parallel default(none)
	  ;
	}

	// ``parallel`` directive can have ``default`` clause, and said clause is
	// specified, but with ``shared`` kind, which is not ``none``, diagnose.
	void p0_2() {
	#pragma omp parallel default(shared)
	  ;
	  // WARNING: OpenMP directive ``parallel`` specifies ``default(shared)``
	  //	      clause. Consider using ``default(none)`` clause instead.
	}

	// ``parallel`` directive can have ``default`` clause, and said clause is
	// specified, but with ``firstprivate`` kind, which is not ``none``, diagnose.
	void p0_3() {
	#pragma omp parallel default(firstprivate)
	  ;
	  // WARNING: OpenMP directive ``parallel`` specifies ``default(firstprivate)``
	  //	      clause. Consider using ``default(none)`` clause instead.
	}

   performance-faster-string-find
     Optimize calls to std::string::find() and friends when the needle passed is
     a	single	character string literal. The character literal overload is more
     efficient.

     Examples:

	str.find("A");

	// becomes

	str.find('A');

   Options
     StringLikeClasses
	    Semicolon-separated list of names of string-like classes. By default
	    only ::std::basic_string and  ::std::basic_string_view  are  consid-
	    ered.   The  check	will  only consider member functions named find,
	    rfind,   find_first_of,    find_first_not_of,    find_last_of,    or
	    find_last_not_of within these classes.

   performance-for-range-copy
     Finds  C++11 for ranges where the loop variable is copied in each iteration
     but it would suffice to obtain it by const reference.

     The check is only applied to loop variables of types that are expensive  to
     copy which means they are not trivially copyable or have a non-trivial copy
     constructor or destructor.

     To  ensure  that  it is safe to replace the copy with a const reference the
     following heuristic is employed:

     1. The loop variable is const qualified.

     2. The loop variable is not const, but only const methods or operators  are
	invoked  on  it,  or  it is used as const reference or value argument in
	constructors or function calls.

   Options
     WarnOnAllAutoCopies
	    When true, warns on any use of auto as the type of	the  range-based
	    for loop variable. Default is false.

     AllowedTypes
	    A semicolon-separated list of names of types allowed to be copied in
	    each  iteration.  Regular  expressions are accepted, e.g. [Rr]ef(er-
	    ence)?$ matches every type with suffix Ref, ref, Reference and  ref-
	    erence. The default is empty.

   performance-implicit-cast-in-loop
     This check has been renamed to performance-implicit-conversion-in-loop.

   performance-implicit-conversion-in-loop
     This  warning  appears  in a range-based loop with a loop variable of const
     ref type where the type of the variable does not match the one returned  by
     the iterator. This means that an implicit conversion happens, which can for
     example result in expensive deep copies.

     Example:

	map<int, vector<string>> my_map;
	for (const pair<int, vector<string>>& p : my_map) {}
	// The iterator type is in fact pair<const int, vector<string>>, which means
	// that the compiler added a conversion, resulting in a copy of the vectors.

     The  easiest  solution is usually to use const auto& instead of writing the
     type manually.

   performance-inefficient-algorithm
     Warns on inefficient use of STL algorithms on associative containers.

     Associative containers implements some of the algorithms as  methods  which
     should  be preferred to the algorithms in the algorithm header. The methods
     can take advantage of the order of the elements.

	std::set<int> s;
	auto it = std::find(s.begin(), s.end(), 43);

	// becomes

	auto it = s.find(43);

	std::set<int> s;
	auto c = std::count(s.begin(), s.end(), 43);

	// becomes

	auto c = s.count(43);

   performance-inefficient-string-concatenation
     This check warns about the performance overhead arising from  concatenating
     strings using the operator+, for instance:

	std::string a("Foo"), b("Bar");
	a = a + b;

     Instead  of  this	structure  you	should	use  operator+= or std::string's
     (std::basic_string) class member function append(). For instance:

	std::string a("Foo"), b("Baz");
	for (int i = 0; i < 20000; ++i) {
	    a = a + "Bar" + b;
	}

     Could be rewritten in a greatly more efficient way like:

	std::string a("Foo"), b("Baz");
	for (int i = 0; i < 20000; ++i) {
	    a.append("Bar").append(b);
	}

     And this can be rewritten too:

	void f(const std::string&) {}
	std::string a("Foo"), b("Baz");
	void g() {
	    f(a + "Bar" + b);
	}

     In a slightly more efficient way like:

	void f(const std::string&) {}
	std::string a("Foo"), b("Baz");
	void g() {
	    f(std::string(a).append("Bar").append(b));
	}

   Options
     StrictMode
	    When false, the check will only check the string usage in while, for
	    and for-range statements. Default is false.

   performance-inefficient-vector-operation
     Finds possible inefficient  std::vector  operations  (e.g.  push_back,  em-
     place_back) that may cause unnecessary memory reallocations.

     It  can  also  find  calls that add element to protobuf repeated field in a
     loop without calling Reserve() before the loop. Calling Reserve() first can
     avoid unnecessary memory reallocations.

     Currently, the check only detects following kinds of loops  with  a  single
     statement body:

     * Counter-based for loops start with 0:

	std::vector<int> v;
	for (int i = 0; i < n; ++i) {
	  v.push_back(n);
	  // This will trigger the warning since the push_back may cause multiple
	  // memory reallocations in v. This can be avoid by inserting a 'reserve(n)'
	  // statement before the for statement.
	}

	SomeProto p;
	for (int i = 0; i < n; ++i) {
	  p.add_xxx(n);
	  // This will trigger the warning since the add_xxx may cause multiple memory
	  // reallocations. This can be avoid by inserting a
	  // 'p.mutable_xxx().Reserve(n)' statement before the for statement.
	}

     * For-range loops like for (range-declaration : range_expression), the type
       of range_expression can be std::vector, std::array, std::deque, std::set,
       std::unordered_set, std::map, std::unordered_set:

	std::vector<int> data;
	std::vector<int> v;

	for (auto element : data) {
	  v.push_back(element);
	  // This will trigger the warning since the 'push_back' may cause multiple
	  // memory reallocations in v. This can be avoid by inserting a
	  // 'reserve(data.size())' statement before the for statement.
	}

   Options
     VectorLikeClasses
	    Semicolon-separated list of names of vector-like classes. By default
	    only ::std::vector is considered.

     EnableProto
	    When  true,  the  check will also warn on inefficient operations for
	    proto repeated fields. Otherwise, the check only  warns  on  ineffi-
	    cient vector operations. Default is false.

   performance-move-const-arg
     The check warns

     * if std::move() is called with a constant argument,

     * if std::move() is called with an argument of a trivially-copyable type,

     * if the result of std::move() is passed as a const reference argument.

     In  all  three  cases,  the  check  will  suggest	a  fix	that removes the
     std::move().

     Here are examples of each of the three cases:

	const string s;
	return std::move(s);  // Warning: std::move of the const variable has no effect

	int x;
	return std::move(x);  // Warning: std::move of the variable of a trivially-copyable type has no effect

	void f(const string &s);
	string s;
	f(std::move(s));  // Warning: passing result of std::move as a const reference argument; no move will actually happen

   Options
     CheckTriviallyCopyableMove
	    If true, enables detection of trivially copyable types that  do  not
	    have a move constructor. Default is true.

   performance-move-constructor-init
     "cert-oop11-cpp" redirects here as an alias for this check.

     The check flags user-defined move constructors that have a ctor-initializer
     initializing a member or base class through a copy constructor instead of a
     move constructor.

   Options
     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

   performance-no-automatic-move
     Finds local variables that cannot be automatically moved due to constness.

     Under certain conditions, local values are automatically moved out when re-
     turning  from a function. A common mistake is to declare local lvalue vari-
     ables const, which prevents the move.

     Example [1]:

	StatusOr<std::vector<int>> Cool() {
	  std::vector<int> obj = ...;
	  return obj;  // calls StatusOr::StatusOr(std::vector<int>&&)
	}

	StatusOr<std::vector<int>> NotCool() {
	  const std::vector<int> obj = ...;
	  return obj;  // calls `StatusOr::StatusOr(const std::vector<int>&)`
	}

     The former version (Cool) should be preferred over the latter  (Uncool)  as
     it will avoid allocations and potentially large memory copies.

   Semantics
     In  the  example  above, StatusOr::StatusOr(T&&) have the same semantics as
     long as the copy and move constructors for T have the same semantics.  Note
     that  there is no guarantee that S::S(T&&) and S::S(const T&) have the same
     semantics for any single S, so we're not providing automated fixes for this
     check, and judgement should be exerted when making the suggested changes.

   -Wreturn-std-move
     Another case where the move cannot happen is the following:

	StatusOr<std::vector<int>> Uncool() {
	  std::vector<int>&& obj = ...;
	  return obj;  // calls `StatusOr::StatusOr(const std::vector<int>&)`
	}

     In that case the fix is more consensual: just return std::move(obj).   This
     is handled by the -Wreturn-std-move warning.

   performance-no-int-to-ptr
     Diagnoses every integer to pointer cast.

     While casting an (integral) pointer to an integer is obvious - you just get
     the  integral  value  of  the  pointer, casting an integer to an (integral)
     pointer is deceivingly different. While you will get a  pointer  with  that
     integral  value,  if  you	got that integral value via a pointer-to-integer
     cast originally, the new pointer will lack the provenance information  from
     the original pointer.

     So  while	(integral)  pointer to integer casts are effectively no-ops, and
     are transparent to the optimizer, integer to (integral) pointer  casts  are
     NOT transparent, and may conceal information from optimizer.

     While  that  may  be the intention, it is not always so. For example, let's
     take a look at a routine to align the pointer up to the multiple of 16: The
     obvious, naive implementation for that is:

	char* src(char* maybe_underbiased_ptr) {
	  uintptr_t maybe_underbiased_intptr = (uintptr_t)maybe_underbiased_ptr;
	  uintptr_t aligned_biased_intptr = maybe_underbiased_intptr + 15;
	  uintptr_t aligned_intptr = aligned_biased_intptr & (~15);
	  return (char*)aligned_intptr; // warning: avoid integer to pointer casts [performance-no-int-to-ptr]
	}

     The check will rightfully diagnose that cast.

     But when provenance concealment is not the goal of the code, but  an  acci-
     dent,  this  example  can be rewritten as follows, without using integer to
     pointer cast:

	char*
	tgt(char* maybe_underbiased_ptr) {
	    uintptr_t maybe_underbiased_intptr = (uintptr_t)maybe_underbiased_ptr;
	    uintptr_t aligned_biased_intptr = maybe_underbiased_intptr + 15;
	    uintptr_t aligned_intptr = aligned_biased_intptr & (~15);
	    uintptr_t bias = aligned_intptr - maybe_underbiased_intptr;
	    return maybe_underbiased_ptr + bias;
	}

   performance-noexcept-move-constructor
     The check flags user-defined move constructors and assignment operators not
     marked with noexcept or marked with noexcept(expr) where expr evaluates  to
     false (but is not a false literal itself).

     Move  constructors  of all the types used with STL containers, for example,
     need to be declared noexcept. Otherwise STL will choose  copy  constructors
     instead. The same is valid for move assignment operations.

   performance-trivially-destructible
     Finds   types   that  could  be  made  trivially-destructible  by	removing
     out-of-line defaulted destructor declarations.

	struct A: TrivialType {
	  ~A(); // Makes A non-trivially-destructible.
	  TrivialType trivial_fields;
	};
	A::~A() = default;

   performance-type-promotion-in-math-fn
     Finds calls to C math library functions (from math.h  or,	in  C++,  cmath)
     with implicit float to double promotions.

     For  example,  warns  on ::sin(0.f), because this funciton's parameter is a
     double. You probably meant to call std::sin(0.f) (in C++), or sinf(0.f) (in
     C).

	float a;
	asin(a);

	// becomes

	float a;
	std::asin(a);

   performance-unnecessary-copy-initialization
     Finds local variable declarations that are initialized using the copy  con-
     structor  of a non-trivially-copyable type but it would suffice to obtain a
     const reference.

     The check is only applied if it is safe to replace the copy by a const ref-
     erence. This is the case when the variable is const qualified or when it is
     only used as a const, i.e. only const methods or operators are  invoked  on
     it,  or  it is used as const reference or value argument in constructors or
     function calls.

     Example:

	const string& constReference();
	void Function() {
	  // The warning will suggest making this a const reference.
	  const string UnnecessaryCopy = constReference();
	}

	struct Foo {
	  const string& name() const;
	};
	void Function(const Foo& foo) {
	  // The warning will suggest making this a const reference.
	  string UnnecessaryCopy1 = foo.name();
	  UnnecessaryCopy1.find("bar");

	  // The warning will suggest making this a const reference.
	  string UnnecessaryCopy2 = UnnecessaryCopy1;
	  UnnecessaryCopy2.find("bar");
	}

   Options
     AllowedTypes
	    A semicolon-separated list of names of types allowed to be	initial-
	    ized  by  copying. Regular expressions are accepted, e.g. [Rr]ef(er-
	    ence)?$ matches every type with suffix Ref, ref, Reference and  ref-
	    erence. The default is empty.

   performance-unnecessary-value-param
     Flags  value  parameter  declarations  of	expensive to copy types that are
     copied for each invocation but it would suffice to pass them by const  ref-
     erence.

     The check is only applied to parameters of types that are expensive to copy
     which means they are not trivially copyable or have a non-trivial copy con-
     structor or destructor.

     To  ensure that it is safe to replace the value parameter with a const ref-
     erence the following heuristic is employed:

     1. the parameter is const qualified;

     2. the parameter is not const, but only const methods or operators are  in-
	voked  on it, or it is used as const reference or value argument in con-
	structors or function calls.

     Example:

	void f(const string Value) {
	  // The warning will suggest making Value a reference.
	}

	void g(ExpensiveToCopy Value) {
	  // The warning will suggest making Value a const reference.
	  Value.ConstMethd();
	  ExpensiveToCopy Copy(Value);
	}

     If the parameter is not const, only copied  or  assigned  once  and  has  a
     non-trivial  move-constructor  or move-assignment operator respectively the
     check will suggest to move it.

     Example:

	void setValue(string Value) {
	  Field = Value;
	}

     Will become:

	#include <utility>

	void setValue(string Value) {
	  Field = std::move(Value);
	}

   Options
     IncludeStyle
	    A string specifying which include-style is used, llvm or google. De-
	    fault is llvm.

     AllowedTypes
	    A semicolon-separated list of names of types allowed to be passed by
	    value.  Regular  expressions  are  accepted,  e.g.	[Rr]ef(erence)?$
	    matches  every  type  with suffix Ref, ref, Reference and reference.
	    The default is empty.

   portability-restrict-system-includes
     Checks to selectively allow or disallow a configurable list of system head-
     ers.

     For example:

     In order to only allow zlib.h from the system you would set the options  to
     -*,zlib.h.

	#include <curses.h>	  // Bad: disallowed system header.
	#include <openssl/ssl.h>  // Bad: disallowed system header.
	#include <zlib.h>	  // Good: allowed system header.
	#include "src/myfile.h"   // Good: non-system header always allowed.

     In  order	to  allow everything except zlib.h from the system you would set
     the options to *,-zlib.h.

	#include <curses.h>	  // Good: allowed system header.
	#include <openssl/ssl.h>  // Good: allowed system header.
	#include <zlib.h>	  // Bad: disallowed system header.
	#include "src/myfile.h"   // Good: non-system header always allowed.

     Since the options support globbing you can use wildcarding to allow  groups
     of headers.

     -*,openssl/*.h will allow all openssl headers but disallow any others.

	#include <curses.h>	  // Bad: disallowed system header.
	#include <openssl/ssl.h>  // Good: allowed system header.
	#include <openssl/rsa.h>  // Good: allowed system header.
	#include <zlib.h>	  // Bad: disallowed system header.
	#include "src/myfile.h"   // Good: non-system header always allowed.

   Options
     Includes
	    A  string  containing a comma separated glob list of allowed include
	    filenames. Similar to the -checks glob list for  running  clang-tidy
	    itself,  the two wildcard characters are * and -, to include and ex-
	    clude globs, respectively. The default is *, which	allows	all  in-
	    cludes.

   portability-simd-intrinsics
     Finds  SIMD  intrinsics  calls and suggests std::experimental::simd (P0214)
     alternatives.

     If the option Suggest is set to true, for

	_mm_add_epi32(a, b); // x86
	vec_add(a, b);	     // Power

     the check suggests an alternative: operator+ on std::experimental::simd ob-
     jects.

     Otherwise, it just complains the intrinsics are non-portable (and there are
     P0214 alternatives).

     Many architectures provide SIMD operations (e.g.  x86  SSE/AVX,  Power  Al-
     tiVec/VSX, ARM NEON). It is common that SIMD code implementing the same al-
     gorithm,  is  written in multiple target-dispatching pieces to optimize for
     different architectures or micro-architectures.

     The C++ standard proposal P0214 and its extensions cover many  common  SIMD
     operations.  By  migrating from target-dependent intrinsics to P0214 opera-
     tions, the SIMD code can be simplified and pieces for different targets can
     be unified.

     Refer to P0214 for introduction and motivation for the data-parallel  stan-
     dard library.

   Options
     Suggest
	    If	this  option  is  set to true (default is false), the check will
	    suggest P0214 alternatives, otherwise it only points out the intrin-
	    sic function is non-portable.

     Std    The namespace used to suggest P0214 alternatives. If not  specified,
	    std:: for -std=c++20 and std::experimental:: for -std=c++11.

   readability-avoid-const-params-in-decls
     Checks  whether  a  function  declaration has parameters that are top level
     const.

     const values in declarations do not affect the signature of a function,  so
     they should not be put there.

     Examples:

	void f(const string);	// Bad: const is top level.
	void f(const string&);	// Good: const is not top level.

   readability-braces-around-statements
     google-readability-braces-around-statements  redirects here as an alias for
     this check.

     Checks that bodies of if statements and loops (for, do  while,  and  while)
     are inside braces.

     Before:

	if (condition)
	  statement;

     After:

	if (condition) {
	  statement;
	}

   Options
     ShortStatementLines
	    Defines  the  minimal number of lines that the statement should have
	    in order to trigger this check.

	    The number of lines is counted from the end of condition or  initial
	    keyword  (do/else)	until  the last line of the inner statement. De-
	    fault value 0 means that braces will be added to all statements (not
	    having them already).

   readability-const-return-type
     Checks for functions with a const-qualified return type and recommends  re-
     moval  of	the const keyword. Such use of const is usually superfluous, and
     can prevent valuable compiler optimizations.  Does not (yet)  fix	trailing
     return types.

     Examples:

	const int foo();
	const Clazz foo();
	Clazz *const foo();

     Note  that this applies strictly to top-level qualification, which excludes
     pointers or references to const values. For example, these are fine:

	const int* foo();
	const int& foo();
	const Clazz* foo();

   readability-container-size-empty
     Checks whether a call to the size() method can be replaced with a	call  to
     empty().

     The emptiness of a container should be checked using the empty() method in-
     stead  of	the  size()  method.  It is not guaranteed that size() is a con-
     stant-time function, and it is generally  more  efficient	and  also  shows
     clearer  intent  to  use empty(). Furthermore some containers may implement
     the empty() method but not implement the size() method. Using empty() when-
     ever possible makes it easier to switch to another container in the future.

     The check issues warning if a container  has  size()  and	empty()  methods
     matching following signatures:

	size_type size() const;
	bool empty() const;

     size_type can be any kind of integer type.

   readability-convert-member-functions-to-static
     Finds non-static member functions that can be made static because the func-
     tions don't use this.

     After  applying  modifications as suggested by the check, running the check
     again might find more opportunities to mark member functions static.

     After making a member function static, you might  want  to  run  the  check
     readability-static-accessed-through-instance  to  replace	calls  like  In-
     stance.method() by Class::method().

   readability-delete-null-pointer
     Checks the if statements where a pointer's existence is  checked  and  then
     deletes  the  pointer.  The check is unnecessary as deleting a null pointer
     has no effect.

	int *p;
	if (p)
	  delete p;

   readability-deleted-default
     This  check  has  been  deprecated  prefer   to   make   use   of	 the   -
     Wdefaulted-function-deleted flag.

   readability-else-after-return
     LLVM  Coding  Standards  advises  to  reduce indentation where possible and
     where it makes understanding code easier.	Early exit is one  of  the  sug-
     gested  enforcements of that. Please do not use else or else if after some-
     thing that interrupts control flow - like return, break, continue, throw.

     The following piece of code illustrates how the check works. This piece  of
     code:

	void foo(int Value) {
	  int Local = 0;
	  for (int i = 0; i < 42; i++) {
	    if (Value == 1) {
	      return;
	    } else {
	      Local++;
	    }

	    if (Value == 2)
	      continue;
	    else
	      Local++;

	    if (Value == 3) {
	      throw 42;
	    } else {
	      Local++;
	    }
	  }
	}

     Would be transformed into:

	void foo(int Value) {
	  int Local = 0;
	  for (int i = 0; i < 42; i++) {
	    if (Value == 1) {
	      return;
	    }
	    Local++;

	    if (Value == 2)
	      continue;
	    Local++;

	    if (Value == 3) {
	      throw 42;
	    }
	    Local++;
	  }
	}

   Options
     WarnOnUnfixable
	    When  true,  emit a warning for cases where the check can't output a
	    Fix-It. These can occur with declarations  inside  the  else  branch
	    that would have an extended lifetime if the else branch was removed.
	    Default value is true.

     WarnOnConditionVariables
	    When true, the check will attempt to refactor a variable defined in-
	    side  the  condition  of  the  if statement that is used in the else
	    branch defining them just before the if statement. This can only  be
	    done if the if statement is the last statement in its parents scope.
	    Default value is true.

   LLVM alias
     There  is	an  alias  of this check called llvm-else-after-return.  In that
     version the options WarnOnUnfixable and WarnOnConditionVariables  are  both
     set to false by default.

     This check helps to enforce this LLVM Coding Standards recommendation.

   readability-function-cognitive-complexity
     Checks function Cognitive Complexity metric.

     The  metric  is  implemented as per the COGNITIVE COMPLEXITY by SonarSource
     specification version 1.2 (19 April 2017).

   Options
     Threshold
	    Flag functions with Cognitive Complexity exceeding this number.  The
	    default is 25.

   Building blocks
     There are three basic building blocks of a Cognitive Complexity metric:

   Increment
     The following structures increase the function's Cognitive Complexity  met-
     ric (by 1):

     * Conditional operators:

	  * if()

	  * else if()

	  * else

	  * cond ? true : false

     * switch()

     * Loops:

	  * for()

	  * C++11 range-based for()

	  * while()

	  * do while()

     * catch ()

     * goto LABEL, goto *(&&LABEL)),

     * sequences of binary logical operators:

	  * boolean1 || boolean2

	  * boolean1 && boolean2

   Nesting level
     While  by itself the nesting level not change the function's Cognitive Com-
     plexity metric, it is tracked, and is used  by  the  next,  third	building
     block.  The following structures increase the nesting level (by 1):

     * Conditional operators:

	  * if()

	  * else if()

	  * else

	  * cond ? true : false

     * switch()

     * Loops:

	  * for()

	  * C++11 range-based for()

	  * while()

	  * do while()

     * catch ()

     * Nested functions:

	  * C++11 Lambda

	  * Nested class

	  * Nested struct

     * GNU statement expression

     * Apple Block Declaration

   Nesting increment
     This  is  where  the previous basic building block, Nesting level, matters.
     The following structures increase the function's Cognitive Complexity  met-
     ric by the current Nesting level:

     * Conditional operators:

	  * if()

	  * cond ? true : false

     * switch()

     * Loops:

	  * for()

	  * C++11 range-based for()

	  * while()

	  * do while()

     * catch ()

   Examples
     The simplest case. This function has Cognitive Complexity of 0.

	void function0() {}

     Slightly better example. This function has Cognitive Complexity of 1.

	int function1(bool var) {
	  if(var) // +1, nesting level +1
	    return 42;
	  return 0;
	}

     Full example. This function has Cognitive Complexity of 3.

	int function3(bool var1, bool var2) {
	  if(var1) { // +1, nesting level +1
	    if(var2)  // +2 (1 + current nesting level of 1), nesting level +1
	      return 42;
	  }

	  return 0;
	}

   Limitations
     The metric is implemented with two notable exceptions:

	    * preprocessor  conditionals (#ifdef, #if, #elif, #else, #endif) are
	      not accounted for.

	    * each method in a recursion cycle is not accounted for. It can't be
	      fully implemented, because cross-translational-unit analysis would
	      be needed, which is currently not possible in clang-tidy.

   readability-function-size
     google-readability-function-size redirects here as an alias for this check.

     Checks for large functions based on various metrics.

   Options
     LineThreshold
	    Flag functions exceeding this number of lines.  The  default  is  -1
	    (ignore the number of lines).

     StatementThreshold
	    Flag  functions exceeding this number of statements. This may differ
	    significantly from the number of lines for macro-heavy code. The de-
	    fault is 800.

     BranchThreshold
	    Flag functions exceeding this number of control statements. The  de-
	    fault is -1 (ignore the number of branches).

     ParameterThreshold
	    Flag functions that exceed a specified number of parameters. The de-
	    fault is -1 (ignore the number of parameters).

     NestingThreshold
	    Flag compound statements which create next nesting level after Nest-
	    ingThreshold.  This may differ significantly from the expected value
	    for macro-heavy code. The default is -1 (ignore the nesting level).

     VariableThreshold
	    Flag functions exceeding this number of variables  declared  in  the
	    body.   The  default is -1 (ignore the number of variables).  Please
	    note that function parameters and variables declared in lambdas, GNU
	    Statement Expressions, and nested class  inline  functions	are  not
	    counted.

   readability-identifier-naming
     Checks for identifiers naming style mismatch.

     This check will try to enforce coding guidelines on the identifiers naming.
     It supports one of the following casing types and tries to convert from one
     to another if a mismatch is detected

     Casing types include:

	* lower_case,

	* UPPER_CASE,

	* camelBack,

	* CamelCase,

	* camel_Snake_Back,

	* Camel_Snake_Case,

	* aNy_CasE.

     It  also  supports  a fixed prefix and suffix that will be prepended or ap-
     pended to the identifiers, regardless of the casing.

     Many configuration options are available, in order to  be	able  to  create
     different	rules  for different kinds of identifiers. In general, the rules
     are falling back to a more generic rule if the specific case is not config-
     ured.

     The naming of virtual methods is reported where  they  occur  in  the  base
     class,  but  not  where  they  are overridden, as it can't be fixed locally
     there.  This also applies for pseudo-override patterns like CRTP.

   Options
     The following options are describe below:

	* AbstractClassCase,	  AbstractClassPrefix,	    AbstractClassSuffix,
	  AbstractClassIgnoredRegexp

	* AggressiveDependentMemberLookup

	* ClassCase, ClassPrefix, ClassSuffix, ClassIgnoredRegexp

	* ClassConstantCase,	  ClassConstantPrefix,	    ClassConstantSuffix,
	  ClassConstantIgnoredRegexp

	* ClassMemberCase,	   ClassMemberPrefix,	      ClassMemberSuffix,
	  ClassMemberIgnoredRegexp

	* ClassMethodCase,	   ClassMethodPrefix,	      ClassMethodSuffix,
	  ClassMethodIgnoredRegexp

	* ConstantCase, ConstantPrefix, ConstantSuffix, ConstantIgnoredRegexp

	* ConstantMemberCase,	 ConstantMemberPrefix,	   ConstantMemberSuffix,
	  ConstantMemberIgnoredRegexp

	* ConstantParameterCase,			ConstantParameterPrefix,
	  ConstantParameterSuffix, ConstantParameterIgnoredRegexp

	* ConstantPointerParameterCase, 	 ConstantPointerParameterPrefix,
	  ConstantPointerParameterSuffix, ConstantPointerParameterIgnoredRegexp

	* ConstexprFunctionCase,			ConstexprFunctionPrefix,
	  ConstexprFunctionSuffix, ConstexprFunctionIgnoredRegexp

	* ConstexprMethodCase,	 ConstexprMethodPrefix,   ConstexprMethodSuffix,
	  ConstexprMethodIgnoredRegexp

	* ConstexprVariableCase,			ConstexprVariablePrefix,
	  ConstexprVariableSuffix, ConstexprVariableIgnoredRegexp

	* EnumCase, EnumPrefix, EnumSuffix, EnumIgnoredRegexp

	* EnumConstantCase,	  EnumConstantPrefix,	     EnumConstantSuffix,
	  EnumConstantIgnoredRegexp

	* FunctionCase, FunctionPrefix, FunctionSuffix, FunctionIgnoredRegexp

	* GetConfigPerFile

	* GlobalConstantCase,	  GlobalConstantPrefix,    GlobalConstantSuffix,
	  GlobalConstantIgnoredRegexp

	* GlobalConstantPointerCase,		    GlobalConstantPointerPrefix,
	  GlobalConstantPointerSuffix, GlobalConstantPointerIgnoredRegexp

	* GlobalFunctionCase,	  GlobalFunctionPrefix,    GlobalFunctionSuffix,
	  GlobalFunctionIgnoredRegexp

	* GlobalPointerCase,	  GlobalPointerPrefix,	    GlobalPointerSuffix,
	  GlobalPointerIgnoredRegexp

	* GlobalVariableCase,	  GlobalVariablePrefix,    GlobalVariableSuffix,
	  GlobalVariableIgnoredRegexp

	* IgnoreMainLikeFunctions

	* InlineNamespaceCase,	 InlineNamespacePrefix,   InlineNamespaceSuffix,
	  InlineNamespaceIgnoredRegexp

	* LocalConstantCase,	  LocalConstantPrefix,	    LocalConstantSuffix,
	  LocalConstantIgnoredRegexp

	* LocalConstantPointerCase,		     LocalConstantPointerPrefix,
	  LocalConstantPointerSuffix, LocalConstantPointerIgnoredRegexp

	* LocalPointerCase,	   LocalPointerPrefix,	     LocalPointerSuffix,
	  LocalPointerIgnoredRegexp

	* LocalVariableCase,	  LocalVariablePrefix,	    LocalVariableSuffix,
	  LocalVariableIgnoredRegexp

	* MacroDefinitionCase,	 MacroDefinitionPrefix,   MacroDefinitionSuffix,
	  MacroDefinitionIgnoredRegexp

	* MemberCase, MemberPrefix, MemberSuffix, MemberIgnoredRegexp

	* MethodCase, MethodPrefix, MethodSuffix, MethodIgnoredRegexp

	* NamespaceCase,	    NamespacePrefix,		NamespaceSuffix,
	  NamespaceIgnoredRegexp

	* ParameterCase,	    ParameterPrefix,		ParameterSuffix,
	  ParameterIgnoredRegexp

	* ParameterPackCase,	  ParameterPackPrefix,	    ParameterPackSuffix,
	  ParameterPackIgnoredRegexp

	* PointerParameterCase,  PointerParameterPrefix, PointerParameterSuffix,
	  PointerParameterIgnoredRegexp

	* PrivateMemberCase,	  PrivateMemberPrefix,	    PrivateMemberSuffix,
	  PrivateMemberIgnoredRegexp

	* PrivateMethodCase,	  PrivateMethodPrefix,	    PrivateMethodSuffix,
	  PrivateMethodIgnoredRegexp

	* ProtectedMemberCase,	 ProtectedMemberPrefix,   ProtectedMemberSuffix,
	  ProtectedMemberIgnoredRegexp

	* ProtectedMethodCase,	 ProtectedMethodPrefix,   ProtectedMethodSuffix,
	  ProtectedMethodIgnoredRegexp

	* PublicMemberCase,	  PublicMemberPrefix,	     PublicMemberSuffix,
	  PublicMemberIgnoredRegexp

	* PublicMethodCase,	   PublicMethodPrefix,	     PublicMethodSuffix,
	  PublicMethodIgnoredRegexp

	* ScopedEnumConstantCase,		       ScopedEnumConstantPrefix,
	  ScopedEnumConstantSuffix, ScopedEnumConstantIgnoredRegexp

	* StaticConstantCase,	  StaticConstantPrefix,    StaticConstantSuffix,
	  StaticConstantIgnoredRegexp

	* StaticVariableCase,	 StaticVariablePrefix,	   StaticVariableSuffix,
	  StaticVariableIgnoredRegexp

	* StructCase, StructPrefix, StructSuffix, StructIgnoredRegexp

	* TemplateParameterCase,			TemplateParameterPrefix,
	  TemplateParameterSuffix, TemplateParameterIgnoredRegexp

	* TemplateTemplateParameterCase,	TemplateTemplateParameterPrefix,
	  TemplateTemplateParameterSuffix,
	  TemplateTemplateParameterIgnoredRegexp

	* TypeAliasCase,	    TypeAliasPrefix,		TypeAliasSuffix,
	  TypeAliasIgnoredRegexp

	* TypedefCase, TypedefPrefix, TypedefSuffix, TypedefIgnoredRegexp

	* TypeTemplateParameterCase,		    TypeTemplateParameterPrefix,
	  TypeTemplateParameterSuffix, TypeTemplateParameterIgnoredRegexp

	* UnionCase, UnionPrefix, UnionSuffix, UnionIgnoredRegexp

	* ValueTemplateParameterCase,		   ValueTemplateParameterPrefix,
	  ValueTemplateParameterSuffix, ValueTemplateParameterIgnoredRegexp

	* VariableCase, VariablePrefix, VariableSuffix, VariableIgnoredRegexp

	* VirtualMethodCase,	  VirtualMethodPrefix,	    VirtualMethodSuffix,
	  VirtualMethodIgnoredRegexp

     AbstractClassCase
	    When  defined, the check will ensure abstract class names conform to
	    the selected casing.

     AbstractClassPrefix
	    When defined, the check will ensure abstract class	names  will  add
	    the prefixed with the given value (regardless of casing).

     AbstractClassIgnoredRegexp
	    Identifier	naming checks won't be enforced for abstract class names
	    matching this regular expression.

     AbstractClassSuffix
	    When defined, the check will ensure abstract class	names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* AbstractClassCase of lower_case

	* AbstractClassPrefix of pre_

	* AbstractClassSuffix of _post

     Identifies and/or transforms abstract class names as follows:

     Before:

	class ABSTRACT_CLASS {
	public:
	  ABSTRACT_CLASS();
	};

     After:

	class pre_abstract_class_post {
	public:
	  pre_abstract_class_post();
	};

     AggressiveDependentMemberLookup
	    When  set  to true the check will look in dependent base classes for
	    dependent member references that need changing. This can lead to er-
	    rors with template specializations so the default value is false.

     For example using values of:

	* ClassMemberCase of lower_case

     Before:

	template <typename T>
	struct Base {
	  T BadNamedMember;
	};

	template <typename T>
	struct Derived : Base<T> {
	  void reset() {
	    this->BadNamedMember = 0;
	  }
	};

     After if AggressiveDependentMemberLookup is false:

	template <typename T>
	struct Base {
	  T bad_named_member;
	};

	template <typename T>
	struct Derived : Base<T> {
	  void reset() {
	    this->BadNamedMember = 0;
	  }
	};

     After if AggressiveDependentMemberLookup is true:

	template <typename T>
	struct Base {
	  T bad_named_member;
	};

	template <typename T>
	struct Derived : Base<T> {
	  void reset() {
	    this->bad_named_member = 0;
	  }
	};

     ClassCase
	    When defined, the check will ensure class names conform to	the  se-
	    lected casing.

     ClassPrefix
	    When  defined,  the  check will ensure class names will add the pre-
	    fixed with the given value (regardless of casing).

     ClassIgnoredRegexp
	    Identifier naming checks won't be enforced for class names	matching
	    this regular expression.

     ClassSuffix
	    When  defined, the check will ensure class names will add the suffix
	    with the given value (regardless of casing).

     For example using values of:

	* ClassCase of lower_case

	* ClassPrefix of pre_

	* ClassSuffix of _post

     Identifies and/or transforms class names as follows:

     Before:

	class FOO {
	public:
	  FOO();
	  ~FOO();
	};

     After:

	class pre_foo_post {
	public:
	  pre_foo_post();
	  ~pre_foo_post();
	};

     ClassConstantCase
	    When defined, the check will ensure class constant names conform  to
	    the selected casing.

     ClassConstantPrefix
	    When  defined,  the  check will ensure class constant names will add
	    the prefixed with the given value (regardless of casing).

     ClassConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for class constant  names
	    matching this regular expression.

     ClassConstantSuffix
	    When  defined,  the  check will ensure class constant names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ClassConstantCase of lower_case

	* ClassConstantPrefix of pre_

	* ClassConstantSuffix of _post

     Identifies and/or transforms class constant names as follows:

     Before:

	class FOO {
	public:
	  static const int CLASS_CONSTANT;
	};

     After:

	class FOO {
	public:
	  static const int pre_class_constant_post;
	};

     ClassMemberCase
	    When defined, the check will ensure class member  names  conform  to
	    the selected casing.

     ClassMemberPrefix
	    When  defined, the check will ensure class member names will add the
	    prefixed with the given value (regardless of casing).

     ClassMemberIgnoredRegexp
	    Identifier naming checks won't be enforced for  class  member  names
	    matching this regular expression.

     ClassMemberSuffix
	    When  defined, the check will ensure class member names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* ClassMemberCase of lower_case

	* ClassMemberPrefix of pre_

	* ClassMemberSuffix of _post

     Identifies and/or transforms class member names as follows:

     Before:

	class FOO {
	public:
	  static int CLASS_CONSTANT;
	};

     After:

	class FOO {
	public:
	  static int pre_class_constant_post;
	};

     ClassMethodCase
	    When defined, the check will ensure class method  names  conform  to
	    the selected casing.

     ClassMethodPrefix
	    When  defined, the check will ensure class method names will add the
	    prefixed with the given value (regardless of casing).

     ClassMethodIgnoredRegexp
	    Identifier naming checks won't be enforced for  class  method  names
	    matching this regular expression.

     ClassMethodSuffix
	    When  defined, the check will ensure class method names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* ClassMethodCase of lower_case

	* ClassMethodPrefix of pre_

	* ClassMethodSuffix of _post

     Identifies and/or transforms class method names as follows:

     Before:

	class FOO {
	public:
	  int CLASS_MEMBER();
	};

     After:

	class FOO {
	public:
	  int pre_class_member_post();
	};

     ConstantCase
	    When defined, the check will ensure constant names	conform  to  the
	    selected casing.

     ConstantPrefix
	    When defined, the check will ensure constant names will add the pre-
	    fixed with the given value (regardless of casing).

     ConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for constant names match-
	    ing this regular expression.

     ConstantSuffix
	    When defined, the check will ensure constant names will add the suf-
	    fix with the given value (regardless of casing).

     For example using values of:

	* ConstantCase of lower_case

	* ConstantPrefix of pre_

	* ConstantSuffix of _post

     Identifies and/or transforms constant names as follows:

     Before:

	void function() { unsigned const MyConst_array[] = {1, 2, 3}; }

     After:

	void function() { unsigned const pre_myconst_array_post[] = {1, 2, 3}; }

     ConstantMemberCase
	    When defined, the check will ensure constant member names conform to
	    the selected casing.

     ConstantMemberPrefix
	    When  defined,  the check will ensure constant member names will add
	    the prefixed with the given value (regardless of casing).

     ConstantMemberIgnoredRegexp
	    Identifier naming checks won't be enforced for constant member names
	    matching this regular expression.

     ConstantMemberSuffix
	    When defined, the check will ensure constant member names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstantMemberCase of lower_case

	* ConstantMemberPrefix of pre_

	* ConstantMemberSuffix of _post

     Identifies and/or transforms constant member names as follows:

     Before:

	class Foo {
	  char const MY_ConstMember_string[4] = "123";
	}

     After:

	class Foo {
	  char const pre_my_constmember_string_post[4] = "123";
	}

     ConstantParameterCase
	    When defined, the check will ensure constant parameter names conform
	    to the selected casing.

     ConstantParameterPrefix
	    When  defined,  the  check will ensure constant parameter names will
	    add the prefixed with the given value (regardless of casing).

     ConstantParameterIgnoredRegexp
	    Identifier naming checks won't be enforced	for  constant  parameter
	    names matching this regular expression.

     ConstantParameterSuffix
	    When  defined,  the  check will ensure constant parameter names will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstantParameterCase of lower_case

	* ConstantParameterPrefix of pre_

	* ConstantParameterSuffix of _post

     Identifies and/or transforms constant parameter names as follows:

     Before:

	void GLOBAL_FUNCTION(int PARAMETER_1, int const CONST_parameter);

     After:

	void GLOBAL_FUNCTION(int PARAMETER_1, int const pre_const_parameter_post);

     ConstantPointerParameterCase
	    When defined, the check will ensure constant pointer parameter names
	    conform to the selected casing.

     ConstantPointerParameterPrefix
	    When defined, the check will ensure constant pointer parameter names
	    will add the prefixed with the given value (regardless of casing).

     ConstantPointerParameterIgnoredRegexp
	    Identifier naming checks won't be enforced for constant pointer  pa-
	    rameter names matching this regular expression.

     ConstantPointerParameterSuffix
	    When defined, the check will ensure constant pointer parameter names
	    will add the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstantPointerParameterCase of lower_case

	* ConstantPointerParameterPrefix of pre_

	* ConstantPointerParameterSuffix of _post

     Identifies and/or transforms constant pointer parameter names as follows:

     Before:

	void GLOBAL_FUNCTION(int const *CONST_parameter);

     After:

	void GLOBAL_FUNCTION(int const *pre_const_parameter_post);

     ConstexprFunctionCase
	    When defined, the check will ensure constexpr function names conform
	    to the selected casing.

     ConstexprFunctionPrefix
	    When  defined,  the  check will ensure constexpr function names will
	    add the prefixed with the given value (regardless of casing).

     ConstexprFunctionIgnoredRegexp
	    Identifier naming checks won't be enforced	for  constexpr	function
	    names matching this regular expression.

     ConstexprFunctionSuffix
	    When  defined,  the  check will ensure constexpr function names will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstexprFunctionCase of lower_case

	* ConstexprFunctionPrefix of pre_

	* ConstexprFunctionSuffix of _post

     Identifies and/or transforms constexpr function names as follows:

     Before:

	constexpr int CE_function() { return 3; }

     After:

	constexpr int pre_ce_function_post() { return 3; }

     ConstexprMethodCase
	    When defined, the check will ensure constexpr method  names  conform
	    to the selected casing.

     ConstexprMethodPrefix
	    When  defined, the check will ensure constexpr method names will add
	    the prefixed with the given value (regardless of casing).

     ConstexprMethodIgnoredRegexp
	    Identifier naming checks won't  be	enforced  for  constexpr  method
	    names matching this regular expression.

     ConstexprMethodSuffix
	    When  defined, the check will ensure constexpr method names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstexprMethodCase of lower_case

	* ConstexprMethodPrefix of pre_

	* ConstexprMethodSuffix of _post

     Identifies and/or transforms constexpr method names as follows:

     Before:

	class Foo {
	public:
	  constexpr int CST_expr_Method() { return 2; }
	}

     After:

	class Foo {
	public:
	  constexpr int pre_cst_expr_method_post() { return 2; }
	}

     ConstexprVariableCase
	    When defined, the check will ensure constexpr variable names conform
	    to the selected casing.

     ConstexprVariablePrefix
	    When defined, the check will ensure constexpr  variable  names  will
	    add the prefixed with the given value (regardless of casing).

     ConstexprVariableIgnoredRegexp
	    Identifier	naming	checks	won't be enforced for constexpr variable
	    names matching this regular expression.

     ConstexprVariableSuffix
	    When defined, the check will ensure constexpr  variable  names  will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* ConstexprVariableCase of lower_case

	* ConstexprVariablePrefix of pre_

	* ConstexprVariableSuffix of _post

     Identifies and/or transforms constexpr variable names as follows:

     Before:

	constexpr int ConstExpr_variable = MyConstant;

     After:

	constexpr int pre_constexpr_variable_post = MyConstant;

     EnumCase
	    When defined, the check will ensure enumeration names conform to the
	    selected casing.

     EnumPrefix
	    When  defined,  the check will ensure enumeration names will add the
	    prefixed with the given value (regardless of casing).

     EnumIgnoredRegexp
	    Identifier naming checks won't be  enforced  for  enumeration  names
	    matching this regular expression.

     EnumSuffix
	    When  defined,  the check will ensure enumeration names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* EnumCase of lower_case

	* EnumPrefix of pre_

	* EnumSuffix of _post

     Identifies and/or transforms enumeration names as follows:

     Before:

	enum FOO { One, Two, Three };

     After:

	enum pre_foo_post { One, Two, Three };

     EnumConstantCase
	    When defined, the check will ensure enumeration constant names  con-
	    form to the selected casing.

     EnumConstantPrefix
	    When  defined, the check will ensure enumeration constant names will
	    add the prefixed with the given value (regardless of casing).

     EnumConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for enumeration	constant
	    names matching this regular expression.

     EnumConstantSuffix
	    When  defined, the check will ensure enumeration constant names will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* EnumConstantCase of lower_case

	* EnumConstantPrefix of pre_

	* EnumConstantSuffix of _post

     Identifies and/or transforms enumeration constant names as follows:

     Before:

	enum FOO { One, Two, Three };

     After:

	enum FOO { pre_One_post, pre_Two_post, pre_Three_post };

     FunctionCase
	    When defined, the check will ensure function names	conform  to  the
	    selected casing.

     FunctionPrefix
	    When defined, the check will ensure function names will add the pre-
	    fixed with the given value (regardless of casing).

     FunctionIgnoredRegexp
	    Identifier naming checks won't be enforced for function names match-
	    ing this regular expression.

     FunctionSuffix
	    When defined, the check will ensure function names will add the suf-
	    fix with the given value (regardless of casing).

     For example using values of:

	* FunctionCase of lower_case

	* FunctionPrefix of pre_

	* FunctionSuffix of _post

     Identifies and/or transforms function names as follows:

     Before:

	char MY_Function_string();

     After:

	char pre_my_function_string_post();

     GetConfigPerFile
	    When  true	the  check  will look for the configuration for where an
	    identifier is declared. Useful for when included header files use  a
	    different style.  Default value is true.

     GlobalConstantCase
	    When defined, the check will ensure global constant names conform to
	    the selected casing.

     GlobalConstantPrefix
	    When  defined,  the check will ensure global constant names will add
	    the prefixed with the given value (regardless of casing).

     GlobalConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for global constant names
	    matching this regular expression.

     GlobalConstantSuffix
	    When defined, the check will ensure global constant names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* GlobalConstantCase of lower_case

	* GlobalConstantPrefix of pre_

	* GlobalConstantSuffix of _post

     Identifies and/or transforms global constant names as follows:

     Before:

	unsigned const MyConstGlobal_array[] = {1, 2, 3};

     After:

	unsigned const pre_myconstglobal_array_post[] = {1, 2, 3};

     GlobalConstantPointerCase
	    When  defined,  the  check will ensure global constant pointer names
	    conform to the selected casing.

     GlobalConstantPointerPrefix
	    When defined, the check will ensure global	constant  pointer  names
	    will add the prefixed with the given value (regardless of casing).

     GlobalConstantPointerIgnoredRegexp
	    Identifier	naming	checks	won't  be  enforced  for global constant
	    pointer names matching this regular expression.

     GlobalConstantPointerSuffix
	    When defined, the check will ensure global	constant  pointer  names
	    will add the suffix with the given value (regardless of casing).

     For example using values of:

	* GlobalConstantPointerCase of lower_case

	* GlobalConstantPointerPrefix of pre_

	* GlobalConstantPointerSuffix of _post

     Identifies and/or transforms global constant pointer names as follows:

     Before:

	int *const MyConstantGlobalPointer = nullptr;

     After:

	int *const pre_myconstantglobalpointer_post = nullptr;

     GlobalFunctionCase
	    When defined, the check will ensure global function names conform to
	    the selected casing.

     GlobalFunctionPrefix
	    When  defined,  the check will ensure global function names will add
	    the prefixed with the given value (regardless of casing).

     GlobalFunctionIgnoredRegexp
	    Identifier naming checks won't be enforced for global function names
	    matching this regular expression.

     GlobalFunctionSuffix
	    When defined, the check will ensure global function names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* GlobalFunctionCase of lower_case

	* GlobalFunctionPrefix of pre_

	* GlobalFunctionSuffix of _post

     Identifies and/or transforms global function names as follows:

     Before:

	void GLOBAL_FUNCTION(int PARAMETER_1, int const CONST_parameter);

     After:

	void pre_global_function_post(int PARAMETER_1, int const CONST_parameter);

     GlobalPointerCase
	    When  defined, the check will ensure global pointer names conform to
	    the selected casing.

     GlobalPointerPrefix
	    When defined, the check will ensure global pointer	names  will  add
	    the prefixed with the given value (regardless of casing).

     GlobalPointerIgnoredRegexp
	    Identifier	naming checks won't be enforced for global pointer names
	    matching this regular expression.

     GlobalPointerSuffix
	    When defined, the check will ensure global pointer	names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* GlobalPointerCase of lower_case

	* GlobalPointerPrefix of pre_

	* GlobalPointerSuffix of _post

     Identifies and/or transforms global pointer names as follows:

     Before:

	int *GLOBAL3;

     After:

	int *pre_global3_post;

     GlobalVariableCase
	    When defined, the check will ensure global variable names conform to
	    the selected casing.

     GlobalVariablePrefix
	    When  defined,  the check will ensure global variable names will add
	    the prefixed with the given value (regardless of casing).

     GlobalVariableIgnoredRegexp
	    Identifier naming checks won't be enforced for global variable names
	    matching this regular expression.

     GlobalVariableSuffix
	    When defined, the check will ensure global variable names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* GlobalVariableCase of lower_case

	* GlobalVariablePrefix of pre_

	* GlobalVariableSuffix of _post

     Identifies and/or transforms global variable names as follows:

     Before:

	int GLOBAL3;

     After:

	int pre_global3_post;

     IgnoreMainLikeFunctions
	    When  set to true functions that have a similar signature to main or
	    wmain won't enforce checks on the names of	their  parameters.   De-
	    fault value is false.

     InlineNamespaceCase
	    When  defined, the check will ensure inline namespaces names conform
	    to the selected casing.

     InlineNamespacePrefix
	    When defined, the check will ensure inline namespaces names will add
	    the prefixed with the given value (regardless of casing).

     InlineNamespaceIgnoredRegexp
	    Identifier naming checks won't be  enforced  for  inline  namespaces
	    names matching this regular expression.

     InlineNamespaceSuffix
	    When defined, the check will ensure inline namespaces names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* InlineNamespaceCase of lower_case

	* InlineNamespacePrefix of pre_

	* InlineNamespaceSuffix of _post

     Identifies and/or transforms inline namespaces names as follows:

     Before:

	namespace FOO_NS {
	inline namespace InlineNamespace {
	...
	}
	} // namespace FOO_NS

     After:

	namespace FOO_NS {
	inline namespace pre_inlinenamespace_post {
	...
	}
	} // namespace FOO_NS

     LocalConstantCase
	    When  defined, the check will ensure local constant names conform to
	    the selected casing.

     LocalConstantPrefix
	    When defined, the check will ensure local constant	names  will  add
	    the prefixed with the given value (regardless of casing).

     LocalConstantIgnoredRegexp
	    Identifier	naming checks won't be enforced for local constant names
	    matching this regular expression.

     LocalConstantSuffix
	    When defined, the check will ensure local constant	names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* LocalConstantCase of lower_case

	* LocalConstantPrefix of pre_

	* LocalConstantSuffix of _post

     Identifies and/or transforms local constant names as follows:

     Before:

	void foo() { int const local_Constant = 3; }

     After:

	void foo() { int const pre_local_constant_post = 3; }

     LocalConstantPointerCase
	    When  defined,  the  check	will ensure local constant pointer names
	    conform to the selected casing.

     LocalConstantPointerPrefix
	    When defined, the check will ensure  local	constant  pointer  names
	    will add the prefixed with the given value (regardless of casing).

     LocalConstantPointerIgnoredRegexp
	    Identifier	naming	checks	won't  be  enforced  for  local constant
	    pointer names matching this regular expression.

     LocalConstantPointerSuffix
	    When defined, the check will ensure  local	constant  pointer  names
	    will add the suffix with the given value (regardless of casing).

     For example using values of:

	* LocalConstantPointerCase of lower_case

	* LocalConstantPointerPrefix of pre_

	* LocalConstantPointerSuffix of _post

     Identifies and/or transforms local constant pointer names as follows:

     Before:

	void foo() { int const *local_Constant = 3; }

     After:

	void foo() { int const *pre_local_constant_post = 3; }

     LocalPointerCase
	    When  defined,  the check will ensure local pointer names conform to
	    the selected casing.

     LocalPointerPrefix
	    When defined, the check will ensure local pointer names will add the
	    prefixed with the given value (regardless of casing).

     LocalPointerIgnoredRegexp
	    Identifier naming checks won't be enforced for local  pointer  names
	    matching this regular expression.

     LocalPointerSuffix
	    When defined, the check will ensure local pointer names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* LocalPointerCase of lower_case

	* LocalPointerPrefix of pre_

	* LocalPointerSuffix of _post

     Identifies and/or transforms local pointer names as follows:

     Before:

	void foo() { int *local_Constant; }

     After:

	void foo() { int *pre_local_constant_post; }

     LocalVariableCase
	    When  defined, the check will ensure local variable names conform to
	    the selected casing.

     LocalVariablePrefix
	    When defined, the check will ensure local variable	names  will  add
	    the prefixed with the given value (regardless of casing).

     LocalVariableIgnoredRegexp
	    Identifier	naming checks won't be enforced for local variable names
	    matching this regular expression.

     For example using values of:

	* LocalVariableCase of CamelCase

	* LocalVariableIgnoredRegexp of \w{1,2}

     Will exclude variables with a length less than or equal to 2 from the camel
     case check applied to other variables.

     LocalVariableSuffix
	    When defined, the check will ensure local variable	names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* LocalVariableCase of lower_case

	* LocalVariablePrefix of pre_

	* LocalVariableSuffix of _post

     Identifies and/or transforms local variable names as follows:

     Before:

	void foo() { int local_Constant; }

     After:

	void foo() { int pre_local_constant_post; }

     MacroDefinitionCase
	    When defined, the check will ensure macro definitions conform to the
	    selected casing.

     MacroDefinitionPrefix
	    When  defined,  the check will ensure macro definitions will add the
	    prefixed with the given value (regardless of casing).

     MacroDefinitionIgnoredRegexp
	    Identifier naming checks won't be  enforced  for  macro  definitions
	    matching this regular expression.

     MacroDefinitionSuffix
	    When  defined,  the check will ensure macro definitions will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* MacroDefinitionCase of lower_case

	* MacroDefinitionPrefix of pre_

	* MacroDefinitionSuffix of _post

     Identifies and/or transforms macro definitions as follows:

     Before:

	#define MY_MacroDefinition

     After:

	#define pre_my_macro_definition_post

     Note: This will not warn on builtin macros or macros defined on the command
     line using the -D flag.

     MemberCase
	    When defined, the check will ensure member names conform to the  se-
	    lected casing.

     MemberPrefix
	    When  defined,  the check will ensure member names will add the pre-
	    fixed with the given value (regardless of casing).

     MemberIgnoredRegexp
	    Identifier naming checks won't be enforced for member names matching
	    this regular expression.

     MemberSuffix
	    When defined, the check will ensure member names will add the suffix
	    with the given value (regardless of casing).

     For example using values of:

	* MemberCase of lower_case

	* MemberPrefix of pre_

	* MemberSuffix of _post

     Identifies and/or transforms member names as follows:

     Before:

	class Foo {
	  char MY_ConstMember_string[4];
	}

     After:

	class Foo {
	  char pre_my_constmember_string_post[4];
	}

     MethodCase
	    When defined, the check will ensure method names conform to the  se-
	    lected casing.

     MethodPrefix
	    When  defined,  the check will ensure method names will add the pre-
	    fixed with the given value (regardless of casing).

     MethodIgnoredRegexp
	    Identifier naming checks won't be enforced for method names matching
	    this regular expression.

     MethodSuffix
	    When defined, the check will ensure method names will add the suffix
	    with the given value (regardless of casing).

     For example using values of:

	* MethodCase of lower_case

	* MethodPrefix of pre_

	* MethodSuffix of _post

     Identifies and/or transforms method names as follows:

     Before:

	class Foo {
	  char MY_Method_string();
	}

     After:

	class Foo {
	  char pre_my_method_string_post();
	}

     NamespaceCase
	    When defined, the check will ensure namespace names conform  to  the
	    selected casing.

     NamespacePrefix
	    When  defined,  the  check	will ensure namespace names will add the
	    prefixed with the given value (regardless of casing).

     NamespaceIgnoredRegexp
	    Identifier naming checks  won't  be  enforced  for	namespace  names
	    matching this regular expression.

     NamespaceSuffix
	    When  defined,  the  check	will ensure namespace names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* NamespaceCase of lower_case

	* NamespacePrefix of pre_

	* NamespaceSuffix of _post

     Identifies and/or transforms namespace names as follows:

     Before:

	namespace FOO_NS {
	...
	}

     After:

	namespace pre_foo_ns_post {
	...
	}

     ParameterCase
	    When defined, the check will ensure parameter names conform  to  the
	    selected casing.

     ParameterPrefix
	    When  defined,  the  check	will ensure parameter names will add the
	    prefixed with the given value (regardless of casing).

     ParameterIgnoredRegexp
	    Identifier naming checks  won't  be  enforced  for	parameter  names
	    matching this regular expression.

     ParameterSuffix
	    When  defined,  the  check	will ensure parameter names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* ParameterCase of lower_case

	* ParameterPrefix of pre_

	* ParameterSuffix of _post

     Identifies and/or transforms parameter names as follows:

     Before:

	void GLOBAL_FUNCTION(int PARAMETER_1, int const CONST_parameter);

     After:

	void GLOBAL_FUNCTION(int pre_parameter_post, int const CONST_parameter);

     ParameterPackCase
	    When defined, the check will ensure parameter pack names conform  to
	    the selected casing.

     ParameterPackPrefix
	    When  defined,  the  check will ensure parameter pack names will add
	    the prefixed with the given value (regardless of casing).

     ParameterPackIgnoredRegexp
	    Identifier naming checks won't be enforced for parameter pack  names
	    matching this regular expression.

     ParameterPackSuffix
	    When  defined,  the  check will ensure parameter pack names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ParameterPackCase of lower_case

	* ParameterPackPrefix of pre_

	* ParameterPackSuffix of _post

     Identifies and/or transforms parameter pack names as follows:

     Before:

	template <typename... TYPE_parameters> {
	  void FUNCTION(int... TYPE_parameters);
	}

     After:

	template <typename... TYPE_parameters> {
	  void FUNCTION(int... pre_type_parameters_post);
	}

     PointerParameterCase
	    When defined, the check will ensure pointer parameter names  conform
	    to the selected casing.

     PointerParameterPrefix
	    When defined, the check will ensure pointer parameter names will add
	    the prefixed with the given value (regardless of casing).

     PointerParameterIgnoredRegexp
	    Identifier	naming	checks	won't  be enforced for pointer parameter
	    names matching this regular expression.

     PointerParameterSuffix
	    When defined, the check will ensure pointer parameter names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* PointerParameterCase of lower_case

	* PointerParameterPrefix of pre_

	* PointerParameterSuffix of _post

     Identifies and/or transforms pointer parameter names as follows:

     Before:

	void FUNCTION(int *PARAMETER);

     After:

	void FUNCTION(int *pre_parameter_post);

     PrivateMemberCase
	    When defined, the check will ensure private member names conform  to
	    the selected casing.

     PrivateMemberPrefix
	    When  defined,  the  check will ensure private member names will add
	    the prefixed with the given value (regardless of casing).

     PrivateMemberIgnoredRegexp
	    Identifier naming checks won't be enforced for private member  names
	    matching this regular expression.

     PrivateMemberSuffix
	    When  defined,  the  check will ensure private member names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* PrivateMemberCase of lower_case

	* PrivateMemberPrefix of pre_

	* PrivateMemberSuffix of _post

     Identifies and/or transforms private member names as follows:

     Before:

	class Foo {
	private:
	  int Member_Variable;
	}

     After:

	class Foo {
	private:
	  int pre_member_variable_post;
	}

     PrivateMethodCase
	    When defined, the check will ensure private method names conform  to
	    the selected casing.

     PrivateMethodPrefix
	    When  defined,  the  check will ensure private method names will add
	    the prefixed with the given value (regardless of casing).

     PrivateMethodIgnoredRegexp
	    Identifier naming checks won't be enforced for private method  names
	    matching this regular expression.

     PrivateMethodSuffix
	    When  defined,  the  check will ensure private method names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* PrivateMethodCase of lower_case

	* PrivateMethodPrefix of pre_

	* PrivateMethodSuffix of _post

     Identifies and/or transforms private method names as follows:

     Before:

	class Foo {
	private:
	  int Member_Method();
	}

     After:

	class Foo {
	private:
	  int pre_member_method_post();
	}

     ProtectedMemberCase
	    When defined, the check will ensure protected member  names  conform
	    to the selected casing.

     ProtectedMemberPrefix
	    When  defined, the check will ensure protected member names will add
	    the prefixed with the given value (regardless of casing).

     ProtectedMemberIgnoredRegexp
	    Identifier naming checks won't  be	enforced  for  protected  member
	    names matching this regular expression.

     ProtectedMemberSuffix
	    When  defined, the check will ensure protected member names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ProtectedMemberCase of lower_case

	* ProtectedMemberPrefix of pre_

	* ProtectedMemberSuffix of _post

     Identifies and/or transforms protected member names as follows:

     Before:

	class Foo {
	protected:
	  int Member_Variable;
	}

     After:

	class Foo {
	protected:
	  int pre_member_variable_post;
	}

     ProtectedMethodCase
	    When defined, the check will ensure protected method  names  conform
	    to the selected casing.

     ProtectedMethodPrefix
	    When  defined, the check will ensure protected method names will add
	    the prefixed with the given value (regardless of casing).

     ProtectedMethodIgnoredRegexp
	    Identifier naming checks won't  be	enforced  for  protected  method
	    names matching this regular expression.

     ProtectedMethodSuffix
	    When  defined, the check will ensure protected method names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* ProtectedMethodCase of lower_case

	* ProtectedMethodPrefix of pre_

	* ProtectedMethodSuffix of _post

     Identifies and/or transforms protect method names as follows:

     Before:

	class Foo {
	protected:
	  int Member_Method();
	}

     After:

	class Foo {
	protected:
	  int pre_member_method_post();
	}

     PublicMemberCase
	    When defined, the check will ensure public member names  conform  to
	    the selected casing.

     PublicMemberPrefix
	    When defined, the check will ensure public member names will add the
	    prefixed with the given value (regardless of casing).

     PublicMemberIgnoredRegexp
	    Identifier	naming	checks won't be enforced for public member names
	    matching this regular expression.

     PublicMemberSuffix
	    When defined, the check will ensure public member names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* PublicMemberCase of lower_case

	* PublicMemberPrefix of pre_

	* PublicMemberSuffix of _post

     Identifies and/or transforms public member names as follows:

     Before:

	class Foo {
	public:
	  int Member_Variable;
	}

     After:

	class Foo {
	public:
	  int pre_member_variable_post;
	}

     PublicMethodCase
	    When defined, the check will ensure public method names  conform  to
	    the selected casing.

     PublicMethodPrefix
	    When defined, the check will ensure public method names will add the
	    prefixed with the given value (regardless of casing).

     PublicMethodIgnoredRegexp
	    Identifier	naming	checks won't be enforced for public method names
	    matching this regular expression.

     PublicMethodSuffix
	    When defined, the check will ensure public method names will add the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* PublicMethodCase of lower_case

	* PublicMethodPrefix of pre_

	* PublicMethodSuffix of _post

     Identifies and/or transforms public method names as follows:

     Before:

	class Foo {
	public:
	  int Member_Method();
	}

     After:

	class Foo {
	public:
	  int pre_member_method_post();
	}

     ScopedEnumConstantCase
	    When defined, the check will ensure scoped enum constant names  con-
	    form to the selected casing.

     ScopedEnumConstantPrefix
	    When  defined, the check will ensure scoped enum constant names will
	    add the prefixed with the given value (regardless of casing).

     ScopedEnumConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for scoped enum	constant
	    names matching this regular expression.

     ScopedEnumConstantSuffix
	    When  defined, the check will ensure scoped enum constant names will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* ScopedEnumConstantCase of lower_case

	* ScopedEnumConstantPrefix of pre_

	* ScopedEnumConstantSuffix of _post

     Identifies and/or transforms enumeration constant names as follows:

     Before:

	enum class FOO { One, Two, Three };

     After:

	enum class FOO { pre_One_post, pre_Two_post, pre_Three_post };

     StaticConstantCase
	    When defined, the check will ensure static constant names conform to
	    the selected casing.

     StaticConstantPrefix
	    When defined, the check will ensure static constant names  will  add
	    the prefixed with the given value (regardless of casing).

     StaticConstantIgnoredRegexp
	    Identifier naming checks won't be enforced for static constant names
	    matching this regular expression.

     StaticConstantSuffix
	    When  defined,  the check will ensure static constant names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* StaticConstantCase of lower_case

	* StaticConstantPrefix of pre_

	* StaticConstantSuffix of _post

     Identifies and/or transforms static constant names as follows:

     Before:

	static unsigned const MyConstStatic_array[] = {1, 2, 3};

     After:

	static unsigned const pre_myconststatic_array_post[] = {1, 2, 3};

     StaticVariableCase
	    When defined, the check will ensure static variable names conform to
	    the selected casing.

     StaticVariablePrefix
	    When defined, the check will ensure static variable names  will  add
	    the prefixed with the given value (regardless of casing).

     StaticVariableIgnoredRegexp
	    Identifier naming checks won't be enforced for static variable names
	    matching this regular expression.

     StaticVariableSuffix
	    When  defined,  the check will ensure static variable names will add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* StaticVariableCase of lower_case

	* StaticVariablePrefix of pre_

	* StaticVariableSuffix of _post

     Identifies and/or transforms static variable names as follows:

     Before:

	static unsigned MyStatic_array[] = {1, 2, 3};

     After:

	static unsigned pre_mystatic_array_post[] = {1, 2, 3};

     StructCase
	    When defined, the check will ensure struct names conform to the  se-
	    lected casing.

     StructPrefix
	    When  defined,  the check will ensure struct names will add the pre-
	    fixed with the given value (regardless of casing).

     StructIgnoredRegexp
	    Identifier naming checks won't be enforced for struct names matching
	    this regular expression.

     StructSuffix
	    When defined, the check will ensure struct names will add the suffix
	    with the given value (regardless of casing).

     For example using values of:

	* StructCase of lower_case

	* StructPrefix of pre_

	* StructSuffix of _post

     Identifies and/or transforms struct names as follows:

     Before:

	struct FOO {
	  FOO();
	  ~FOO();
	};

     After:

	struct pre_foo_post {
	  pre_foo_post();
	  ~pre_foo_post();
	};

     TemplateParameterCase
	    When defined, the check will ensure template parameter names conform
	    to the selected casing.

     TemplateParameterPrefix
	    When defined, the check will ensure template  parameter  names  will
	    add the prefixed with the given value (regardless of casing).

     TemplateParameterIgnoredRegexp
	    Identifier	naming	checks	won't be enforced for template parameter
	    names matching this regular expression.

     TemplateParameterSuffix
	    When defined, the check will ensure template  parameter  names  will
	    add the suffix with the given value (regardless of casing).

     For example using values of:

	* TemplateParameterCase of lower_case

	* TemplateParameterPrefix of pre_

	* TemplateParameterSuffix of _post

     Identifies and/or transforms template parameter names as follows:

     Before:

	template <typename T> class Foo {};

     After:

	template <typename pre_t_post> class Foo {};

     TemplateTemplateParameterCase
	    When  defined,  the  check	will  ensure template template parameter
	    names conform to the selected casing.

     TemplateTemplateParameterPrefix
	    When defined, the check  will  ensure  template  template  parameter
	    names will add the prefixed with the given value (regardless of cas-
	    ing).

     TemplateTemplateParameterIgnoredRegexp
	    Identifier naming checks won't be enforced for template template pa-
	    rameter names matching this regular expression.

     TemplateTemplateParameterSuffix
	    When  defined,  the  check	will  ensure template template parameter
	    names will add the suffix with the given value (regardless	of  cas-
	    ing).

     For example using values of:

	* TemplateTemplateParameterCase of lower_case

	* TemplateTemplateParameterPrefix of pre_

	* TemplateTemplateParameterSuffix of _post

     Identifies and/or transforms template template parameter names as follows:

     Before:

	template <template <typename> class TPL_parameter, int COUNT_params,
		  typename... TYPE_parameters>

     After:

	template <template <typename> class pre_tpl_parameter_post, int COUNT_params,
		  typename... TYPE_parameters>

     TypeAliasCase
	    When  defined, the check will ensure type alias names conform to the
	    selected casing.

     TypeAliasPrefix
	    When defined, the check will ensure type alias names  will	add  the
	    prefixed with the given value (regardless of casing).

     TypeAliasIgnoredRegexp
	    Identifier	naming	checks	won't  be  enforced for type alias names
	    matching this regular expression.

     TypeAliasSuffix
	    When defined, the check will ensure type alias names  will	add  the
	    suffix with the given value (regardless of casing).

     For example using values of:

	* TypeAliasCase of lower_case

	* TypeAliasPrefix of pre_

	* TypeAliasSuffix of _post

     Identifies and/or transforms type alias names as follows:

     Before:

	using MY_STRUCT_TYPE = my_structure;

     After:

	using pre_my_struct_type_post = my_structure;

     TypedefCase
	    When defined, the check will ensure typedef names conform to the se-
	    lected casing.

     TypedefPrefix
	    When  defined, the check will ensure typedef names will add the pre-
	    fixed with the given value (regardless of casing).

     TypedefIgnoredRegexp
	    Identifier naming checks won't be enforced for typedef names  match-
	    ing this regular expression.

     TypedefSuffix
	    When  defined, the check will ensure typedef names will add the suf-
	    fix with the given value (regardless of casing).

     For example using values of:

	* TypedefCase of lower_case

	* TypedefPrefix of pre_

	* TypedefSuffix of _post

     Identifies and/or transforms typedef names as follows:

     Before:

	typedef int MYINT;

     After:

	typedef int pre_myint_post;

     TypeTemplateParameterCase
	    When defined, the check will ensure type  template	parameter  names
	    conform to the selected casing.

     TypeTemplateParameterPrefix
	    When  defined,  the  check will ensure type template parameter names
	    will add the prefixed with the given value (regardless of casing).

     TypeTemplateParameterIgnoredRegexp
	    Identifier naming checks won't be enforced for type  template  names
	    matching this regular expression.

     TypeTemplateParameterSuffix
	    When  defined,  the  check will ensure type template parameter names
	    will add the suffix with the given value (regardless of casing).

     For example using values of:

	* TypeTemplateParameterCase of lower_case

	* TypeTemplateParameterPrefix of pre_

	* TypeTemplateParameterSuffix of _post

     Identifies and/or transforms type template parameter names as follows:

     Before:

	template <template <typename> class TPL_parameter, int COUNT_params,
		  typename... TYPE_parameters>

     After:

	template <template <typename> class TPL_parameter, int COUNT_params,
		  typename... pre_type_parameters_post>

     UnionCase
	    When defined, the check will ensure union names conform to	the  se-
	    lected casing.

     UnionPrefix
	    When  defined,  the  check will ensure union names will add the pre-
	    fixed with the given value (regardless of casing).

     UnionIgnoredRegexp
	    Identifier naming checks won't be enforced for union names	matching
	    this regular expression.

     UnionSuffix
	    When  defined, the check will ensure union names will add the suffix
	    with the given value (regardless of casing).

     For example using values of:

	* UnionCase of lower_case

	* UnionPrefix of pre_

	* UnionSuffix of _post

     Identifies and/or transforms union names as follows:

     Before:

	union FOO {
	  int a;
	  char b;
	};

     After:

	union pre_foo_post {
	  int a;
	  char b;
	};

     ValueTemplateParameterCase
	    When defined, the check will ensure value template	parameter  names
	    conform to the selected casing.

     ValueTemplateParameterPrefix
	    When  defined,  the check will ensure value template parameter names
	    will add the prefixed with the given value (regardless of casing).

     ValueTemplateParameterIgnoredRegexp
	    Identifier naming checks won't be enforced for value template  para-
	    meter names matching this regular expression.

     ValueTemplateParameterSuffix
	    When  defined,  the check will ensure value template parameter names
	    will add the suffix with the given value (regardless of casing).

     For example using values of:

	* ValueTemplateParameterCase of lower_case

	* ValueTemplateParameterPrefix of pre_

	* ValueTemplateParameterSuffix of _post

     Identifies and/or transforms value template parameter names as follows:

     Before:

	template <template <typename> class TPL_parameter, int COUNT_params,
		  typename... TYPE_parameters>

     After:

	template <template <typename> class TPL_parameter, int pre_count_params_post,
		  typename... TYPE_parameters>

     VariableCase
	    When defined, the check will ensure variable names	conform  to  the
	    selected casing.

     VariablePrefix
	    When defined, the check will ensure variable names will add the pre-
	    fixed with the given value (regardless of casing).

     VariableIgnoredRegexp
	    Identifier naming checks won't be enforced for variable names match-
	    ing this regular expression.

     VariableSuffix
	    When defined, the check will ensure variable names will add the suf-
	    fix with the given value (regardless of casing).

     For example using values of:

	* VariableCase of lower_case

	* VariablePrefix of pre_

	* VariableSuffix of _post

     Identifies and/or transforms variable names as follows:

     Before:

	unsigned MyVariable;

     After:

	unsigned pre_myvariable_post;

     VirtualMethodCase
	    When  defined, the check will ensure virtual method names conform to
	    the selected casing.

     VirtualMethodPrefix
	    When defined, the check will ensure virtual method	names  will  add
	    the prefixed with the given value (regardless of casing).

     VirtualMethodIgnoredRegexp
	    Identifier	naming checks won't be enforced for virtual method names
	    matching this regular expression.

     VirtualMethodSuffix
	    When defined, the check will ensure virtual method	names  will  add
	    the suffix with the given value (regardless of casing).

     For example using values of:

	* VirtualMethodCase of lower_case

	* VirtualMethodPrefix of pre_

	* VirtualMethodSuffix of _post

     Identifies and/or transforms virtual method names as follows:

     Before:

	class Foo {
	public:
	  virtual int MemberFunction();
	}

     After:

	class Foo {
	public:
	  virtual int pre_member_function_post();
	}

   readability-implicit-bool-cast
     This check has been renamed to readability-implicit-bool-conversion.

   readability-implicit-bool-conversion
     This  check can be used to find implicit conversions between built-in types
     and booleans. Depending on use case, it may simply help with readability of
     the code, or in some cases, point to potential bugs which remain  unnoticed
     due to implicit conversions.

     The  following  is  a real-world example of bug which was hiding behind im-
     plicit bool conversion:

	class Foo {
	  int m_foo;

	public:
	  void setFoo(bool foo) { m_foo = foo; } // warning: implicit conversion bool -> int
	  int getFoo() { return m_foo; }
	};

	void use(Foo& foo) {
	  bool value = foo.getFoo(); // warning: implicit conversion int -> bool
	}

     This code is the result of unsuccessful refactoring, where  type  of  m_foo
     changed  from  bool to int. The programmer forgot to change all occurrences
     of bool, and the remaining code is no longer correct, yet it still compiles
     without any visible warnings.

     In addition to issuing warnings, fix-it hints are provided  to  help  solve
     the  reported  issues.  This can be used for improving readability of code,
     for example:

	void conversionsToBool() {
	  float floating;
	  bool boolean = floating;
	  // ^ propose replacement: bool boolean = floating != 0.0f;

	  int integer;
	  if (integer) {}
	  // ^ propose replacement: if (integer != 0) {}

	  int* pointer;
	  if (!pointer) {}
	  // ^ propose replacement: if (pointer == nullptr) {}

	  while (1) {}
	  // ^ propose replacement: while (true) {}
	}

	void functionTakingInt(int param);

	void conversionsFromBool() {
	  bool boolean;
	  functionTakingInt(boolean);
	  // ^ propose replacement: functionTakingInt(static_cast<int>(boolean));

	  functionTakingInt(true);
	  // ^ propose replacement: functionTakingInt(1);
	}

     In general, the following conversion types are checked:

     * integer expression/literal to boolean (conversion from a single bit  bit-
       field  to boolean is explicitly allowed, since there's no ambiguity / in-
       formation loss in this case),

     * floating expression/literal to boolean,

     * pointer/pointer to member/nullptr/NULL to boolean,

     * boolean expression/literal to integer (conversion from boolean to a  sin-
       gle bit bitfield is explicitly allowed),

     * boolean expression/literal to floating.

     The rules for generating fix-it hints are:

     * in case of conversions from other built-in type to bool, an explicit com-
       parison is proposed to make it clear what exactly is being compared:

       * bool  boolean	=  floating;  is  changed  to bool boolean = floating ==
	 0.0f;,

       * for other types, appropriate literals	are  used  (0,	0u,  0.0f,  0.0,
	 nullptr),

     * in  case of negated expressions conversion to bool, the proposed replace-
       ment with comparison is simplified:

       * if (!pointer) is changed to if (pointer == nullptr),

     * in case of conversions from bool to other  built-in  types,  an	explicit
       static_cast  is	proposed  to  make  it clear that a conversion is taking
       place:

       * int  integer  =  boolean;  is	 changed   to	int   integer	=   sta-
	 tic_cast<int>(boolean);,

     * if the conversion is performed on type literals, an equivalent literal is
       proposed, according to what type is actually expected, for example:

       * functionTakingBool(0); is changed to functionTakingBool(false);,

       * functionTakingInt(true); is changed to functionTakingInt(1);,

       * for  other types, appropriate literals are used (false, true, 0, 1, 0u,
	 1u, 0.0f, 1.0f, 0.0, 1.0f).

     Some additional accommodations are made for pre-C++11 dialects:

     * false literal conversion to pointer is detected,

     * instead of nullptr literal, 0 is proposed as replacement.

     Occurrences of implicit conversions inside macros and  template  instantia-
     tions  are  deliberately  ignored, as it is not clear how to deal with such
     cases.

   Options
     AllowIntegerConditions
	    When true, the check will allow conditional integer conversions. De-
	    fault is false.

     AllowPointerConditions
	    When true, the check will allow conditional pointer conversions. De-
	    fault is false.

   readability-inconsistent-declaration-parameter-name
     Find function declarations which differ in parameter names.

     Example:

	// in foo.hpp:
	void foo(int a, int b, int c);

	// in foo.cpp:
	void foo(int d, int e, int f); // warning

     This check should help to enforce consistency in large projects,  where  it
     often happens that a definition of function is refactored, changing the pa-
     rameter names, but its declaration in header file is not updated. With this
     check,  we can easily find and correct such inconsistencies, keeping decla-
     ration and definition always in sync.

     Unnamed parameters are allowed and are not taken into account when  compar-
     ing function declarations, for example:

	void foo(int a);
	void foo(int); // no warning

     One  name	is  also  allowed  to be a case-insensitive prefix/suffix of the
     other:

	void foo(int count);
	void foo(int count_input) { // no warning
	  int count = adjustCount(count_input);
	}

     To help with refactoring, in some cases fix-it hints are generated to align
     parameter names to a single naming convention. This works with the  assump-
     tion that the function definition is the most up-to-date version, as it di-
     rectly references parameter names in its body. Example:

	void foo(int a); // warning and fix-it hint (replace "a" to "b")
	int foo(int b) { return b + 2; } // definition with use of "b"

     In  the  case  of	multiple redeclarations or function template specializa-
     tions, a warning is issued for every redeclaration or specialization incon-
     sistent with the definition or the first declaration seen in a  translation
     unit.

     IgnoreMacros
	    If	this option is set to true (default is true), the check will not
	    warn about names declared inside macros.

     Strict
	    If this option is set to true (default is false),  then  names  must
	    match exactly (or be absent).

   readability-isolate-declaration
     Detects  local  variable  declarations declaring more than one variable and
     tries to refactor the code to one statement per declaration.

     The automatic code-transformation will use  the  same  indentation  as  the
     original for every created statement and add a line break after each state-
     ment.  It keeps the order of the variable declarations consistent, too.

	void f() {
	  int * pointer = nullptr, value = 42, * const const_ptr = &value;
	  // This declaration will be diagnosed and transformed into:
	  // int * pointer = nullptr;
	  // int value = 42;
	  // int * const const_ptr = &value;
	}

     The check excludes places where it is necessary or common to declare multi-
     ple  variables  in one statement and there is no other way supported in the
     language. Please note that structured bindings are not considered.

	// It is not possible to transform this declaration and doing the declaration
	// before the loop will increase the scope of the variable 'Begin' and 'End'
	// which is undesirable.
	for (int Begin = 0, End = 100; Begin < End; ++Begin);
	if (int Begin = 42, Result = some_function(Begin); Begin == Result);

	// It is not possible to transform this declaration because the result is
	// not functionality preserving as 'j' and 'k' would not be part of the
	// 'if' statement anymore.
	if (SomeCondition())
	  int i = 42, j = 43, k = function(i,j);

   Limitations
     Global variables and member variables are excluded.

     The check currently does not support the automatic transformation	of  mem-
     ber-pointer-types.

	struct S {
	  int a;
	  const int b;
	  void f() {}
	};

	void f() {
	  // Only a diagnostic message is emitted
	  int S::*p = &S::a, S::*const q = &S::a;
	}

     Furthermore,  the	transformation	is very cautious when it detects various
     kinds of macros or preprocessor directives in the range of  the  statement.
     In  this  case  the  transformation  will	not  happen  to avoid unexpected
     side-effects due to macros.

	#define NULL 0
	#define MY_NICE_TYPE int **
	#define VAR_NAME(name) name##__LINE__
	#define A_BUNCH_OF_VARIABLES int m1 = 42, m2 = 43, m3 = 44;

	void macros() {
	  int *p1 = NULL, *p2 = NULL;
	  // Will be transformed to
	  // int *p1 = NULL;
	  // int *p2 = NULL;

	  MY_NICE_TYPE p3, v1, v2;
	  // Won't be transformed, but a diagnostic is emitted.

	  int VAR_NAME(v3),
	      VAR_NAME(v4),
	      VAR_NAME(v5);
	  // Won't be transformed, but a diagnostic is emitted.

	  A_BUNCH_OF_VARIABLES
	  // Won't be transformed, but a diagnostic is emitted.

	  int Unconditional,
	#if CONFIGURATION
	      IfConfigured = 42,
	#else
	      IfConfigured = 0;
	#endif
	  // Won't be transformed, but a diagnostic is emitted.
	}

   readability-magic-numbers
     Detects magic numbers, integer or floating point literals that are embedded
     in code and not introduced via constants or symbols.

     Many coding guidelines advise replacing the magic values with symbolic con-
     stants to improve readability. Here are a few references:

	* Rule ES.45: Avoid ^amagic constants^a; use  symbolic  constants  in  C++
	  Core Guidelines

	* Rule	5.1.1  Use  symbolic  names instead of literal values in code in
	  High Integrity C++

	* Item 17 in "C++ Coding Standards: 101 Rules, Guidelines and Best Prac-
	  tices" by Herb Sutter and Andrei Alexandrescu

	* Chapter 17 in "Clean Code - A handbook of  agile  software  craftsman-
	  ship." by Robert C. Martin

	* Rule	20701  in  "TRAIN  REAL  TIME  DATA  PROTOCOL  Coding  Rules" by
	  Armin-Hagen Weiss, Bombardier

	* http://wiki.c2.com/?MagicNumber

     Examples of magic values:

	double circleArea = 3.1415926535 * radius * radius;

	double totalCharge = 1.08 * itemPrice;

	int getAnswer() {
	   return -3; // FILENOTFOUND
	}

	for (int mm = 1; mm <= 12; ++mm) {
	   std::cout << month[mm] << '\n';
	}

     Example with magic values refactored:

	double circleArea = M_PI * radius * radius;

	const double TAX_RATE = 0.08;  // or make it variable and read from a file

	double totalCharge = (1.0 + TAX_RATE) * itemPrice;

	int getAnswer() {
	   return E_FILE_NOT_FOUND;
	}

	for (int mm = 1; mm <= MONTHS_IN_A_YEAR; ++mm) {
	   std::cout << month[mm] << '\n';
	}

     For integral literals by default only 0 and 1 (and -1) integer  values  are
     accepted	without   a   warning.	 This	can   be   overridden  with  the
     IgnoredIntegerValues option. Negative values are accepted if their absolute
     value is present in the IgnoredIntegerValues list.

     As a special case for integral values, all powers of two  can  be	accepted
     without warning by enabling the IgnorePowersOf2IntegerValues option.

     For  floating point literals by default the 0.0 floating point value is ac-
     cepted without a warning. The set of ignored floating point literals can be
     configured using the IgnoredFloatingPointValues option.  For each value  in
     that  set,  the  given  string value is converted to a floating-point value
     representation used by the target architecture. If a floating-point literal
     value compares equal to one of the converted values, then that  literal  is
     not diagnosed by this check. Because floating-point equality is used to de-
     termine  whether  to diagnose or not, the user needs to be aware of the de-
     tails of floating-point representations for any values that cannot be  pre-
     cisely represented for their target architecture.

     For  each value in the IgnoredFloatingPointValues set, both the single-pre-
     cision form and double-precision form are accepted (for example, if 3.14 is
     in the set, neither 3.14f nor 3.14 will produce a warning).

     Scientific notation is supported for both source  code  input  and  option.
     Alternatively, the check for the floating point numbers can be disabled for
     all  floating point values by enabling the IgnoreAllFloatingPointValues op-
     tion.

     Since values 0 and 0.0 are so common as the base counter of loops, or  ini-
     tialization values for sums, they are always accepted without warning, even
     if not present in the respective ignored values list.

   Options
     IgnoredIntegerValues
	    Semicolon-separated list of magic positive integers that will be ac-
	    cepted  without a warning. Default values are {1, 2, 3, 4}, and 0 is
	    accepted unconditionally.

     IgnorePowersOf2IntegerValues
	    Boolean value indicating whether to accept all powers-of-two integer
	    values without warning. Default value is false.

     IgnoredFloatingPointValues
	    Semicolon-separated list of magic  positive  floating  point  values
	    that  will	be  accepted without a warning. Default values are {1.0,
	    100.0} and 0.0 is accepted unconditionally.

     IgnoreAllFloatingPointValues
	    Boolean value indicating whether to accept all floating point values
	    without warning. Default value is false.

     IgnoreBitFieldsWidths
	    Boolean value indicating whether to  accept  magic	numbers  as  bit
	    field  widths without warning. This is useful for example for regis-
	    ter definitions which are generated  from  hardware  specifications.
	    Default value is true.

   readability-make-member-function-const
     Finds  non-static member functions that can be made const because the func-
     tions don't use this in a non-const way.

     This check tries to annotate methods according to	logical  constness  (not
     physical  constness).   Therefore, it will suggest to add a const qualifier
     to a non-const method only if this method does something  that  is  already
     possible though the public interface on a const pointer to the object:

     * reading a public member variable

     * calling a public const-qualified member function

     * returning const-qualified this

     * passing const-qualified this as a parameter.

     This check will also suggest to add a const qualifier to a non-const method
     if  this method uses private data and functions in a limited number of ways
     where logical constness and physical constness coincide:

     * reading a member variable of builtin type

     Specifically, this check will not suggest to add a  const	to  a  non-const
     method  if  the  method reads a private member variable of pointer type be-
     cause that allows to modify the pointee which might  not  preserve  logical
     constness.   For  the same reason, it does not allow to call private member
     functions or member functions on private member variables.

     In addition, this check ignores functions that

     * are declared virtual

     * contain a const_cast

     * are templated or part of a class template

     * have an empty body

     * do     not     (implicitly)	use	 this	   at	   all	    (see
       readability-convert-member-functions-to-static).

     The following real-world examples will be preserved by the check:

	class E1 {
	  Pimpl &getPimpl() const;
	public:
	  int &get() {
	    // Calling a private member function disables this check.
	    return getPimpl()->i;
	  }
	  ...
	};

	class E2 {
	public:
	  const int *get() const;
	  // const_cast disables this check.
	  S *get() {
	    return const_cast<int*>(const_cast<const C*>(this)->get());
	  }
	  ...
	};

     After  applying  modifications as suggested by the check, running the check
     again might find more opportunities to mark member functions const.

   readability-misleading-indentation
     Correct indentation helps to understand code. Mismatch of	the  syntactical
     structure and the indentation of the code may hide serious problems.  Miss-
     ing  braces  can also make it significantly harder to read the code, there-
     fore it is important to use braces.

     The way to avoid dangling else is to always check that an else  belongs  to
     the if that begins in the same column.

     You  can  omit braces when your inner part of e.g. an if statement has only
     one statement in it. Although in that case you should begin the next state-
     ment in the same column with the if.

     Examples:

	// Dangling else:
	if (cond1)
	  if (cond2)
	    foo1();
	else
	  foo2();  // Wrong indentation: else belongs to if(cond2) statement.

	// Missing braces:
	if (cond1)
	  foo1();
	  foo2();  // Not guarded by if(cond1).

   Limitations
     Note that this check only works as expected when the  tabs  or  spaces  are
     used consistently and not mixed.

   readability-misplaced-array-index
     This check warns for unusual array index syntax.

     The following code has unusual array index syntax:

	void f(int *X, int Y) {
	  Y[X] = 0;
	}

     becomes

	void f(int *X, int Y) {
	  X[Y] = 0;
	}

     The check warns about such unusual syntax for readability reasons:

	    * There are programmers that are not familiar with this unusual syn-
	      tax.

	    * It is possible that variables are mixed up.

   readability-named-parameter
     Find functions with unnamed arguments.

     The check implements the following rule originating in the Google C++ Style
     Guide:

     -
     https://google.github.io/styleguide/cppguide.html#Function_Declara-
     tions_and_Definitions

     All parameters should be named, with identical names in the declaration and
     implementation.

     Corresponding cpplint.py check name: readability/function.

   readability-non-const-parameter
     The check finds function parameters of a pointer type that could be changed
     to point to a constant type instead.

     When  const is used properly, many mistakes can be avoided. Advantages when
     using const properly:

     * prevent unintentional modification of data;

     * get additional warnings such as using uninitialized data;

     * make it easier for developers to see possible side effects.

     This check is not strict about constness, it only warns when the  constness
     will make the function interface safer.

	// warning here; the declaration "const char *p" would make the function
	// interface safer.
	char f1(char *p) {
	  return *p;
	}

	// no warning; the declaration could be more const "const int * const p" but
	// that does not make the function interface safer.
	int f2(const int *p) {
	  return *p;
	}

	// no warning; making x const does not make the function interface safer
	int f3(int x) {
	  return x;
	}

	// no warning; Technically, *p can be const ("const struct S *p"). But making
	// *p const could be misleading. People might think that it's safe to pass
	// const data to this function.
	struct S { int *a; int *b; };
	int f3(struct S *p) {
	  *(p->a) = 0;
	}

   readability-qualified-auto
     Adds  pointer  qualifications  to	auto-typed variables that are deduced to
     pointers.

     LLVM Coding Standards advises to make it obvious if a auto  typed	variable
     is a pointer. This check will transform auto to auto * when the type is de-
     duced to be a pointer.

	for (auto Data : MutatablePtrContainer) {
	  change(*Data);
	}
	for (auto Data : ConstantPtrContainer) {
	  observe(*Data);
	}

     Would be transformed into:

	for (auto *Data : MutatablePtrContainer) {
	  change(*Data);
	}
	for (const auto *Data : ConstantPtrContainer) {
	  observe(*Data);
	}

     Note  const  volatile  qualified types will retain their const and volatile
     qualifiers. Pointers to pointers will not be fully qualified.

	const auto Foo = cast<int *>(Baz1);
	const auto Bar = cast<const int *>(Baz2);
	volatile auto FooBar = cast<int *>(Baz3);
	auto BarFoo = cast<int **>(Baz4);

     Would be transformed into:

	auto *const Foo = cast<int *>(Baz1);
	const auto *const Bar = cast<const int *>(Baz2);
	auto *volatile FooBar = cast<int *>(Baz3);
	auto *BarFoo = cast<int **>(Baz4);

   Options
     AddConstToQualified
	    When set to true the check will add const qualifiers  variables  de-
	    fined as auto * or auto & when applicable.	Default value is true.

	auto Foo1 = cast<const int *>(Bar1);
	auto *Foo2 = cast<const int *>(Bar2);
	auto &Foo3 = cast<const int &>(Bar3);

     If AddConstToQualified is set to false,  it will be transformed into:

	const auto *Foo1 = cast<const int *>(Bar1);
	auto *Foo2 = cast<const int *>(Bar2);
	auto &Foo3 = cast<const int &>(Bar3);

     Otherwise it will be transformed into:

	const auto *Foo1 = cast<const int *>(Bar1);
	const auto *Foo2 = cast<const int *>(Bar2);
	const auto &Foo3 = cast<const int &>(Bar3);

     Note in the LLVM alias, the default value is false.

   readability-redundant-access-specifiers
     Finds  classes,  structs, and unions containing redundant member (field and
     method) access specifiers.

   Example
	class Foo {
	public:
	  int x;
	  int y;
	public:
	  int z;
	protected:
	  int a;
	public:
	  int c;
	}

     In the example above, the second public declaration can be removed  without
     any changes of behavior.

   Options
     CheckFirstDeclaration
	    If	set  to  true,	the check will also diagnose if the first access
	    specifier declaration is redundant (e.g. private  inside  class,  or
	    public inside struct or union).  Default is false.

   Example
	struct Bar {
	public:
	  int x;
	}

     If  CheckFirstDeclaration	option is enabled, a warning about redundant ac-
     cess specifier will be emitted, because public is the default member access
     for structs.

   readability-redundant-control-flow
     This check looks for procedures (functions returning no value) with  return
     statements  at  the  end of the function. Such return statements are redun-
     dant.

     Loop statements (for, while, do while) are checked for  redundant	continue
     statements at the end of the loop body.

     Examples:

     The following function f contains a redundant return statement:

	extern void g();
	void f() {
	  g();
	  return;
	}

     becomes

	extern void g();
	void f() {
	  g();
	}

     The following function k contains a redundant continue statement:

	void k() {
	  for (int i = 0; i < 10; ++i) {
	    continue;
	  }
	}

     becomes

	void k() {
	  for (int i = 0; i < 10; ++i) {
	  }
	}

   readability-redundant-declaration
     Finds redundant variable and function declarations.

	extern int X;
	extern int X;

     becomes

	extern int X;

     Such  redundant declarations can be removed without changing program behav-
     iour.  They can for instance be  unintentional  left  overs  from	previous
     refactorings when code has been moved around. Having redundant declarations
     could in worst case mean that there are typos in the code that cause bugs.

     Normally  the  code  can  be automatically fixed, clang-tidy can remove the
     second declaration. However there are 2 cases when you need to fix the code
     manually:

     * When the declarations are in different header files;

     * When multiple variables are declared together.

   Options
     IgnoreMacros
	    If set to true, the check will not give warnings inside macros.  De-
	    fault is true.

   readability-redundant-function-ptr-dereference
     Finds redundant dereferences of a function pointer.

     Before:

	int f(int,int);
	int (*p)(int, int) = &f;

	int i = (**p)(10, 50);

     After:

	int f(int,int);
	int (*p)(int, int) = &f;

	int i = (*p)(10, 50);

   readability-redundant-member-init
     Finds  member initializations that are unnecessary because the same default
     constructor would be called if they were not present.

   Example
	// Explicitly initializing the member s is unnecessary.
	class Foo {
	public:
	  Foo() : s() {}

	private:
	  std::string s;
	};

   Options
     IgnoreBaseInCopyConstructors
	    Default is false.

	    When true, the check will ignore unnecessary base class  initializa-
	    tions  within  copy  constructors,	since some compilers issue warn-
	    ings/errors when base classes are not explicitly intialized in  copy
	    constructors.  For example, gcc with -Wextra or -Werror=extra issues
	    warning or error base class 'Bar' should be  explicitly  initialized
	    in the copy constructor if Bar() were removed in the following exam-
	    ple:

	// Explicitly initializing member s and base class Bar is unnecessary.
	struct Foo : public Bar {
	  // Remove s() below. If IgnoreBaseInCopyConstructors!=0, keep Bar().
	  Foo(const Foo& foo) : Bar(), s() {}
	  std::string s;
	};

   readability-redundant-preprocessor
     Finds potentially redundant preprocessor directives. At the moment the fol-
     lowing cases are detected:

     * #ifdef  ..  #endif  pairs  which are nested inside an outer pair with the
       same condition. For example:

	#ifdef FOO
	#ifdef FOO // inner ifdef is considered redundant
	void f();
	#endif
	#endif

     * Same for #ifndef .. #endif pairs. For example:

	#ifndef FOO
	#ifndef FOO // inner ifndef is considered redundant
	void f();
	#endif
	#endif

     * #ifndef inside an #ifdef with the same condition:

	#ifdef FOO
	#ifndef FOO // inner ifndef is considered redundant
	void f();
	#endif
	#endif

     * #ifdef inside an #ifndef with the same condition:

	#ifndef FOO
	#ifdef FOO // inner ifdef is considered redundant
	void f();
	#endif
	#endif

     * #if .. #endif pairs which are nested inside an outer pair with  the  same
       condition. For example:

	#define FOO 4
	#if FOO == 4
	#if FOO == 4 // inner if is considered redundant
	void f();
	#endif
	#endif

   readability-redundant-smartptr-get
     Find and remove redundant calls to smart pointer's .get() method.

     Examples:

	ptr.get()->Foo()  ==>  ptr->Foo()
	*ptr.get()  ==>  *ptr
	*ptr->get()  ==>  **ptr
	if (ptr.get() == nullptr) ... => if (ptr == nullptr) ...

     IgnoreMacros
	    If	this option is set to true (default is true), the check will not
	    warn about calls inside macros.

   readability-redundant-string-cstr
     Finds unnecessary calls to std::string::c_str() and std::string::data().

   readability-redundant-string-init
     Finds unnecessary string initializations.

   Examples
	// Initializing string with empty string literal is unnecessary.
	std::string a = "";
	std::string b("");

	// becomes

	std::string a;
	std::string b;

	// Initializing a string_view with an empty string literal produces an
	// instance that compares equal to string_view().
	std::string_view a = "";
	std::string_view b("");

	// becomes
	std::string_view a;
	std::string_view b;

   Options
     StringNames
	    Default is ::std::basic_string;::std::basic_string_view.

	    Semicolon-delimited list of class names to apply this check to.   By
	    default ::std::basic_string applies to std::string and std::wstring.
	    Set  to  e.g. ::std::basic_string;llvm::StringRef;QString to perform
	    this check on custom classes.

   readability-simplify-boolean-expr
     Looks for boolean expressions involving boolean  constants  and  simplifies
     them to use the appropriate boolean expression directly.

     Examples:
		    +-----------------------------+------------+
		    | Initial expression	  | Result     |
		    +-----------------------------+------------+
		    | if (b == true)		  | if (b)     |
		    +-----------------------------+------------+
		    | if (b == false)		  | if (!b)    |
		    +-----------------------------+------------+
		    | if (b && true)		  | if (b)     |
		    +-----------------------------+------------+
		    | if (b && false)		  | if (false) |
		    +-----------------------------+------------+
		    | if (b || true)		  | if (true)  |
		    +-----------------------------+------------+
		    | if (b || false)		  | if (b)     |
		    +-----------------------------+------------+
		    | e ? true : false		  | e	       |
		    +-----------------------------+------------+
		    | e ? false : true		  | !e	       |
		    +-----------------------------+------------+
		    | if (true) t(); else f();	  | t();       |
		    +-----------------------------+------------+
		    | if (false) t(); else f();   | f();       |
		    +-----------------------------+------------+
		    | if  (e)  return  true; else | return e;  |
		    | return false;		  |	       |
		    +-----------------------------+------------+
		    | if (e) return  false;  else | return !e; |
		    | return true;		  |	       |
		    +-----------------------------+------------+
		    | if  (e)  b = true; else b = | b = e;     |
		    | false;			  |	       |
		    +-----------------------------+------------+
		    | if (e) b = false; else b	= | b = !e;    |
		    | true;			  |	       |
		    +-----------------------------+------------+
		    | if  (e) return true; return | return e;  |
		    | false;			  |	       |
		    +-----------------------------+------------+
		    | if (e) return false; return | return !e; |
		    | true;			  |	       |
		    +-----------------------------+------------+

     The resulting expression e is modified as follows:

	    1. Unnecessary parentheses around the expression are removed.

	    2. Negated applications of ! are eliminated.

	    3. Negated applications of comparison operators are changed  to  use
	       the opposite condition.

	    4. Implicit  conversions of pointers, including pointers to members,
	       to bool are replaced with  explicit  comparisons  to  nullptr  in
	       C++11 or NULL in C++98/03.

	    5. Implicit casts to bool are replaced with explicit casts to bool.

	    6. Object  expressions with explicit operator bool conversion opera-
	       tors are replaced with explicit casts to bool.

	    7. Implicit conversions of integral types to bool are replaced  with
	       explicit comparisons to 0.

     Examples:

	    1. The  ternary  assignment bool b = (i < 0) ? true : false; has re-
	       dundant parentheses and becomes bool b = i < 0;.

	    2. The conditional return if (!b) return false; return true; has  an
	       implied double negation and becomes return b;.

	    3. The  conditional return if (i < 0) return false; return true; be-
	       comes return i >= 0;.

	       The conditional return if (i != 0) return false; return true; be-
	       comes return i == 0;.

	    4. The conditional return if (p) return true; return false;  has  an
	       implicit  conversion of a pointer to bool and becomes return p !=
	       nullptr;.

	       The ternary assignment bool b = (i & 1) ? true :  false;  has  an
	       implicit conversion of i & 1 to bool and becomes bool b = (i & 1)
	       != 0;.

	    5. The conditional return if (i & 1) return true; else return false;
	       has  an	implicit conversion of an integer quantity i & 1 to bool
	       and becomes return (i & 1) != 0;

	    6. Given struct X { explicit operator bool(); };, and an instance  x
	       of  struct  X,  the conditional return if (x) return true; return
	       false; becomes return static_cast<bool>(x);

   Options
     ChainedConditionalReturn
	    If true, conditional boolean return statements  at	the  end  of  an
	    if/else if chain will be transformed. Default is false.

     ChainedConditionalAssignment
	    If true, conditional boolean assignments at the end of an if/else if
	    chain will be transformed. Default is false.

   readability-simplify-subscript-expr
     This  check simplifies subscript expressions. Currently this covers calling
     .data() and immediately doing an array subscript operation to obtain a sin-
     gle element, in which case simply calling operator[] suffice.

     Examples:

	std::string s = ...;
	char c = s.data()[i];  // char c = s[i];

   Options
     Types  The list of type(s) that triggers this check. Default is  ::std::ba-
	    sic_string;::std::basic_string_view;::std::vector;::std::array

   readability-static-accessed-through-instance
     Checks for member expressions that access static members through instances,
     and replaces them with uses of the appropriate qualified-id.

     Example:

     The following code:

	struct C {
	  static void foo();
	  static int x;
	};

	C *c1 = new C();
	c1->foo();
	c1->x;

     is changed to:

	C *c1 = new C();
	C::foo();
	C::x;

   readability-static-definition-in-anonymous-namespace
     Finds static function and variable definitions in anonymous namespace.

     In  this  case, static is redundant, because anonymous namespace limits the
     visibility of definitions to a single translation unit.

	namespace {
	  static int a = 1; // Warning.
	  static const b = 1; // Warning.
	}

     The check will apply a fix by removing the redundant static qualifier.

   readability-string-compare
     Finds string comparisons using the compare method.

     A common mistake is to use the string's compare method instead of using the
     equality or inequality operators. The compare method is intended for  sort-
     ing functions and thus returns a negative number, a positive number or zero
     depending on the lexicographical relationship between the strings compared.
     If  an  equality or inequality check can suffice, that is recommended. This
     is recommended to avoid the risk of incorrect interpretation of the  return
     value  and  to simplify the code. The string equality and inequality opera-
     tors can also be faster than the compare method due to early termination.

     Examples:

	std::string str1{"a"};
	std::string str2{"b"};

	// use str1 != str2 instead.
	if (str1.compare(str2)) {
	}

	// use str1 == str2 instead.
	if (!str1.compare(str2)) {
	}

	// use str1 == str2 instead.
	if (str1.compare(str2) == 0) {
	}

	// use str1 != str2 instead.
	if (str1.compare(str2) != 0) {
	}

	// use str1 == str2 instead.
	if (0 == str1.compare(str2)) {
	}

	// use str1 != str2 instead.
	if (0 != str1.compare(str2)) {
	}

	// Use str1 == "foo" instead.
	if (str1.compare("foo") == 0) {
	}

     The above code examples shows the list of	if-statements  that  this  check
     will  give  a warning for. All of them uses compare to check if equality or
     inequality of two strings instead of using the correct operators.

   readability-uniqueptr-delete-release
     Replace delete <unique_ptr>.release() with  <unique_ptr>  =  nullptr.   The
     latter is shorter, simpler and does not require use of raw pointer APIs.

	std::unique_ptr<int> P;
	delete P.release();

	// becomes

	std::unique_ptr<int> P;
	P = nullptr;

   readability-uppercase-literal-suffix
     cert-dcl16-c  redirects  here as an alias for this check.	By default, only
     the suffixes that begin with l (l, ll, lu, llu, but not u, ul, ull) are di-
     agnosed by that alias.

     hicpp-uppercase-literal-suffix redirects here as an alias for this check.

     Detects when the integral literal or floating point (decimal  or  hexadeci-
     mal) literal has a non-uppercase suffix and provides a fix-it hint with the
     uppercase suffix.

     All valid combinations of suffixes are supported.

	auto x = 1;  // OK, no suffix.

	auto x = 1u; // warning: integer literal suffix 'u' is not upper-case

	auto x = 1U; // OK, suffix is uppercase.

	...

   Options
     NewSuffixes
	    Optionally, a list of the destination suffixes can be provided. When
	    the suffix is found, a case-insensitive lookup in that list is made,
	    and  if  a	replacement  is found that is different from the current
	    suffix, then the diagnostic is issued. This allows for  fine-grained
	    control  of  what  suffixes  to consider and what their replacements
	    should be.

   Example
     Given a list L;uL:

     * l -> L

     * L will be kept as is.

     * ul -> uL

     * Ul -> uL

     * UL -> uL

     * uL will be kept as is.

     * ull will be kept as is, since it is not in the list

     * and so on.

     IgnoreMacros
	    If this option is set to true (default is true), the check will  not
	    warn about literal suffixes inside macros.

   readability-use-anyofallof
     Finds  range-based  for loops that can be replaced by a call to std::any_of
     or  std::all_of.  In  C++	20   mode,   suggests	std::ranges::any_of   or
     std::ranges::all_of.

     Example:

	bool all_even(std::vector<int> V) {
	  for (int I : V) {
	    if (I % 2)
	      return false;
	  }
	  return true;
	  // Replace loop by
	  // return std::ranges::all_of(V, [](int I) { return I % 2 == 0; });
	}

   zircon-temporary-objects
     Warns  on	construction of specific temporary objects in the Zircon kernel.
     If the object should be flagged, If the object should be flagged, the fully
     qualified type name must be explicitly passed to the check.

     For example, given the list of classes "Foo" and "NS::Bar", all of the fol-
     lowing will trigger the warning:

	Foo();
	Foo F = Foo();
	func(Foo());

	namespace NS {

	Bar();

	}

     With the same list, the following will not trigger the warning:

	Foo F;		       // Non-temporary construction okay
	Foo F(param);	       // Non-temporary construction okay
	Foo *F = new Foo();    // New construction okay

	Bar();		       // Not NS::Bar, so okay
	NS::Bar B;	       // Non-temporary construction okay

     Note that objects must be explicitly specified in order to be flagged,  and
     so objects that inherit a specified object will not be flagged.

     This  check matches temporary objects without regard for inheritance and so
     a prohibited base class type does	not  similarly	prohibit  derived  class
     types.

	class Derived : Foo {} // Derived is not explicitly disallowed
	Derived();	       // and so temporary construction is okay

   Options
     Names  A  semi-colon-separated list of fully-qualified names of C++ classes
	    that should not be constructed as temporaries. Default is empty.
     +---------------------------------------------------------+--------------+
     | Name						       | Offers fixes |
     +---------------------------------------------------------+--------------+
     | abseil-duration-addition 			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-comparison			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-conversion-cast			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-division 			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-factory-float			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-factory-scale			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-subtraction			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-duration-unnecessary-conversion		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-faster-strsplit-delimiter 		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-no-internal-dependencies			       |	      |
     +---------------------------------------------------------+--------------+
     | abseil-no-namespace				       |	      |
     +---------------------------------------------------------+--------------+
     | abseil-redundant-strcat-calls			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-str-cat-append				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-string-find-startswith			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-string-find-str-contains			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-time-comparison				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-time-subtraction				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | abseil-upgrade-duration-conversions		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | altera-kernel-name-restriction			       |	      |
     +---------------------------------------------------------+--------------+
     | altera-single-work-item-barrier			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | altera-struct-pack-align 			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-accept				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-accept4				       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-creat				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-dup				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-epoll-create			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-epoll-create1			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-fopen				       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-inotify-init			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-inotify-init1			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-memfd-create			       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-open				       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-pipe				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-pipe2				       |	      |
     +---------------------------------------------------------+--------------+
     | android-cloexec-socket				       |	      |
     +---------------------------------------------------------+--------------+
     | android-comparison-in-temp-failure-retry 	       |	      |
     +---------------------------------------------------------+--------------+
     | boost-use-to-string				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-argument-comment			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-assert-side-effect			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-bad-signal-to-kill-thread		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-bool-pointer-implicit-conversion	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-branch-clone				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-copy-constructor-init			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-dangling-handle 			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-dynamic-static-initializers		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-exception-escape			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-fold-init-type				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-forward-declaration-namespace		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-forwarding-reference-overload		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-inaccurate-erase			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-incorrect-roundings			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-infinite-loop				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-integer-division			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-lambda-function-name			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-macro-parentheses			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-macro-repeated-side-effects		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-misplaced-operator-in-strlen-in-alloc	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-misplaced-pointer-arithmetic-in-alloc	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-misplaced-widening-cast 		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-move-forwarding-reference		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-multiple-statement-macro		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-no-escape				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-not-null-terminated-result		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-parent-virtual-call			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-posix-return				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-redundant-branch-condition		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-reserved-identifier			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-signal-handler				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-signed-char-misuse			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-sizeof-container			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-sizeof-expression			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-spuriously-wake-up-functions		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-string-constructor			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-string-integer-assignment		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-string-literal-with-embedded-nul	       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-enum-usage			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-include			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-memset-usage 		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-missing-comma		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-semicolon			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-suspicious-string-compare		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-swapped-arguments			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-terminating-continue			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-throw-keyword-missing			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-too-small-loop-variable 		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-undefined-memory-manipulation		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-undelegated-constructor 		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-unhandled-self-assignment		       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-unused-raii				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | bugprone-unused-return-value			       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-use-after-move				       |	      |
     +---------------------------------------------------------+--------------+
     | bugprone-virtual-near-miss			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cert-dcl21-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-dcl50-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-dcl58-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-env33-c					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-err34-c					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-err52-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-err58-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-err60-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-flp30-c					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-mem57-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-msc50-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-msc51-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-oop57-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-oop58-cpp					       |	      |
     +---------------------------------------------------------+--------------+
     | cert-sig30-c					       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-core.DynamicTypePropagation	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-core.uninitialized.CapturedBlockVariable |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-cplusplus.InnerPointer		       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-nullability.NullableReturnedFromNonnull  |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-optin.osx.OSObjectCStyleCast	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-optin.performance.GCDAntipattern	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-optin.performance.Padding 	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-optin.portability.UnixAPI 	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.MIG				       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.NumberObjectConversion	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.OSObjectRetainCount		       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.ObjCProperty			       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.cocoa.AutoreleaseWrite	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.cocoa.Loops			       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.cocoa.MissingSuperCall	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.cocoa.NonNilReturnValue	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak	       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-valist.CopyToSelf 		       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-valist.Uninitialized		       |	      |
     +---------------------------------------------------------+--------------+
     | clang-analyzer-valist.Unterminated		       |	      |
     +---------------------------------------------------------+--------------+
     | concurrency-mt-unsafe				       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-avoid-goto			       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-avoid-non-const-global-variables      |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-init-variables 		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-interfaces-global-init 	       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-macro-usage			       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-narrowing-conversions		       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-no-malloc			       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-owning-memory			       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-bounds-array-to-pointer-decay     |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-bounds-constant-array-index       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-bounds-pointer-arithmetic	       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-const-cast		       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-cstyle-cast		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-member-init		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-reinterpret-cast	       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-static-cast-downcast	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-union-access		       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-pro-type-vararg		       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-slicing			       |	      |
     +---------------------------------------------------------+--------------+
     | cppcoreguidelines-special-member-functions	       |	      |
     +---------------------------------------------------------+--------------+
     | darwin-avoid-spinlock				       |	      |
     +---------------------------------------------------------+--------------+
     | darwin-dispatch-once-nonstatic			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-default-arguments-calls			       |	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-default-arguments-declarations		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-multiple-inheritance			       |	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-overloaded-operator			       |	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-statically-constructed-objects		       |	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-trailing-return				       |	      |
     +---------------------------------------------------------+--------------+
     | fuchsia-virtual-inheritance			       |	      |
     +---------------------------------------------------------+--------------+
     | google-build-explicit-make-pair			       |	      |
     +---------------------------------------------------------+--------------+
     | google-build-namespaces				       |	      |
     +---------------------------------------------------------+--------------+
     | google-build-using-namespace			       |	      |
     +---------------------------------------------------------+--------------+
     | google-default-arguments 			       |	      |
     +---------------------------------------------------------+--------------+
     | google-explicit-constructor			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | google-global-names-in-headers			       |	      |
     +---------------------------------------------------------+--------------+
     | google-objc-avoid-nsobject-new			       |	      |
     +---------------------------------------------------------+--------------+
     | google-objc-avoid-throwing-exception		       |	      |
     +---------------------------------------------------------+--------------+
     | google-objc-function-naming			       |	      |
     +---------------------------------------------------------+--------------+
     | google-objc-global-variable-declaration		       |	      |
     +---------------------------------------------------------+--------------+
     | google-readability-avoid-underscore-in-googletest-name  |	      |
     +---------------------------------------------------------+--------------+
     | google-readability-casting			       |	      |
     +---------------------------------------------------------+--------------+
     | google-readability-todo				       |	      |
     +---------------------------------------------------------+--------------+
     | google-runtime-int				       |	      |
     +---------------------------------------------------------+--------------+
     | google-runtime-operator				       |	      |
     +---------------------------------------------------------+--------------+
     | google-runtime-references			       |	      |
     +---------------------------------------------------------+--------------+
     | google-upgrade-googletest-case			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | hicpp-avoid-goto 				       |	      |
     +---------------------------------------------------------+--------------+
     | hicpp-exception-baseclass			       |	      |
     +---------------------------------------------------------+--------------+
     | hicpp-multiway-paths-covered			       |	      |
     +---------------------------------------------------------+--------------+
     | hicpp-no-assembler				       |	      |
     +---------------------------------------------------------+--------------+
     | hicpp-signed-bitwise				       |	      |
     +---------------------------------------------------------+--------------+
     | linuxkernel-must-use-errs			       |	      |
     +---------------------------------------------------------+--------------+
     | llvm-header-guard				       |	      |
     +---------------------------------------------------------+--------------+
     | llvm-include-order				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | llvm-namespace-comment				       |	      |
     +---------------------------------------------------------+--------------+
     | llvm-prefer-isa-or-dyn-cast-in-conditionals	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | llvm-prefer-register-over-unsigned		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | llvm-twine-local 				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | llvmlibc-callee-namespace			       |	      |
     +---------------------------------------------------------+--------------+
     | llvmlibc-implementation-in-namespace		       |	      |
     +---------------------------------------------------------+--------------+
     | llvmlibc-restrict-system-libc-headers		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-definitions-in-headers			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-misplaced-const				       |	      |
     +---------------------------------------------------------+--------------+
     | misc-new-delete-overloads			       |	      |
     +---------------------------------------------------------+--------------+
     | misc-no-recursion				       |	      |
     +---------------------------------------------------------+--------------+
     | misc-non-copyable-objects			       |	      |
     +---------------------------------------------------------+--------------+
     | misc-non-private-member-variables-in-classes	       |	      |
     +---------------------------------------------------------+--------------+
     | misc-redundant-expression			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-static-assert				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-throw-by-value-catch-by-reference		       |	      |
     +---------------------------------------------------------+--------------+
     | misc-unconventional-assign-operator		       |	      |
     +---------------------------------------------------------+--------------+
     | misc-uniqueptr-reset-release			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-unused-alias-decls				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-unused-parameters				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | misc-unused-using-decls				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-avoid-bind				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-avoid-c-arrays 			       |	      |
     +---------------------------------------------------------+--------------+
     | modernize-concat-nested-namespaces		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-deprecated-headers			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-deprecated-ios-base-aliases		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-loop-convert				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-make-shared				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-make-unique				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-pass-by-value				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-raw-string-literal			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-redundant-void-arg			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-replace-auto-ptr			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-replace-disallow-copy-and-assign-macro        | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-replace-random-shuffle 		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-return-braced-init-list		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-shrink-to-fit				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-unary-static-assert			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-auto				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-bool-literals			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-default-member-init		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-emplace				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-equals-default			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-equals-delete			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-nodiscard				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-noexcept				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-nullptr				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-override				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-trailing-return-type		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-transparent-functors		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-uncaught-exceptions		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | modernize-use-using				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | mpi-buffer-deref 				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | mpi-type-mismatch				       | Yes	      |
     +---------------------------------------------------------+--------------+
     | objc-avoid-nserror-init				       |	      |
     +---------------------------------------------------------+--------------+
     | objc-dealloc-in-category 			       |	      |
     +---------------------------------------------------------+--------------+
     | objc-forbidden-subclassing			       |	      |
     +---------------------------------------------------------+--------------+
     | objc-missing-hash				       |	      |
     +---------------------------------------------------------+--------------+
     | objc-nsinvocation-argument-lifetime		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | objc-property-declaration			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | objc-super-self					       | Yes	      |
     +---------------------------------------------------------+--------------+
     | openmp-exception-escape				       |	      |
     +---------------------------------------------------------+--------------+
     | openmp-use-default-none				       |	      |
     +---------------------------------------------------------+--------------+
     | performance-faster-string-find			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-for-range-copy			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-implicit-conversion-in-loop		       |	      |
     +---------------------------------------------------------+--------------+
     | performance-inefficient-algorithm		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-inefficient-string-concatenation	       |	      |
     +---------------------------------------------------------+--------------+
     | performance-inefficient-vector-operation 	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-move-const-arg			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-move-constructor-init		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-no-automatic-move			       |	      |
     +---------------------------------------------------------+--------------+
     | performance-no-int-to-ptr			       |	      |
     +---------------------------------------------------------+--------------+
     | performance-noexcept-move-constructor		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-trivially-destructible		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-type-promotion-in-math-fn		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | performance-unnecessary-copy-initialization	       |	      |
     +---------------------------------------------------------+--------------+
     | performance-unnecessary-value-param		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | portability-restrict-system-includes		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | portability-simd-intrinsics			       |	      |
     +---------------------------------------------------------+--------------+
     | readability-avoid-const-params-in-decls		       |	      |
     +---------------------------------------------------------+--------------+
     | readability-braces-around-statements		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-const-return-type			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-container-size-empty 		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-convert-member-functions-to-static	       |	      |
     +---------------------------------------------------------+--------------+
     | readability-delete-null-pointer			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-deleted-default			       |	      |
     +---------------------------------------------------------+--------------+
     | readability-else-after-return			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-function-cognitive-complexity	       |	      |
     +---------------------------------------------------------+--------------+
     | readability-function-size			       |	      |
     +---------------------------------------------------------+--------------+
     | readability-identifier-naming			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-implicit-bool-conversion		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-inconsistent-declaration-parameter-name     | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-isolate-declaration			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-magic-numbers			       |	      |
     +---------------------------------------------------------+--------------+
     | readability-make-member-function-const		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-misleading-indentation		       |	      |
     +---------------------------------------------------------+--------------+
     | readability-misplaced-array-index		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-named-parameter			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-non-const-parameter			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-qualified-auto			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-access-specifiers		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-control-flow		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-declaration		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-function-ptr-dereference	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-member-init		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-preprocessor		       |	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-smartptr-get		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-string-cstr		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-redundant-string-init		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-simplify-boolean-expr		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-simplify-subscript-expr		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-static-accessed-through-instance	       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-static-definition-in-anonymous-namespace    | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-string-compare			       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-uniqueptr-delete-release		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-uppercase-literal-suffix		       | Yes	      |
     +---------------------------------------------------------+--------------+
     | readability-use-anyofallof			       |	      |
     +---------------------------------------------------------+--------------+
     | zircon-temporary-objects 			       |	      |
     +---------------------------------------------------------+--------------+

   Aliases..
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| Name										| Redirect					      | Offers fixes |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-con36-c									| bugprone-spuriously-wake-up-functions 	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-con54-cpp								| bugprone-spuriously-wake-up-functions 	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl03-c									| misc-static-assert				      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl16-c									| readability-uppercase-literal-suffix		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl37-c									| bugprone-reserved-identifier			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl51-cpp								| bugprone-reserved-identifier			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl54-cpp								| misc-new-delete-overloads			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-dcl59-cpp								| google-build-namespaces			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-err09-cpp								| misc-throw-by-value-catch-by-reference	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-err61-cpp								| misc-throw-by-value-catch-by-reference	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-fio38-c									| misc-non-copyable-objects			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-msc30-c									| cert-msc50-cpp				      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-msc32-c									| cert-msc51-cpp				      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-oop11-cpp								| performance-move-constructor-init		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-oop54-cpp								| bugprone-unhandled-self-assignment		      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-pos44-c									| bugprone-bad-signal-to-kill-thread		      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cert-str34-c									| bugprone-signed-char-misuse			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.CallAndMessage						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.DivideZero						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.NonNullParamChecker					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.NullDereference						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.StackAddressEscape					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.UndefinedBinaryOperatorResult				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.VLASize							| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.uninitialized.ArraySubscript				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.uninitialized.Assign					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.uninitialized.Branch					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-core.uninitialized.UndefReturn 				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-cplusplus.Move 						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-cplusplus.NewDelete						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-cplusplus.NewDeleteLeaks					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-deadcode.DeadStores						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-nullability.NullPassedToNonnull				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-nullability.NullReturnedFromNonnull				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-nullability.NullableDereferenced				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-nullability.NullablePassedToNonnull				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-optin.cplusplus.UninitializedObject				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-optin.cplusplus.VirtualCall					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-optin.mpi.MPI-Checker						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker | Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker	| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.API							| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.SecKeychainAPI						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.AtSync						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.ClassRelease 					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.Dealloc						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.IncompatibleMethodTypes				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.NSAutoreleasePool					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.NSError						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.NilArg						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.ObjCGenerics 					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.RetainCount						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.SelfInit						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.SuperDealloc 					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.UnusedIvars						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.cocoa.VariadicMethodTypes					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.coreFoundation.CFError					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.coreFoundation.CFNumber					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.coreFoundation.CFRetainRelease				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.coreFoundation.containers.OutOfBounds			| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-osx.coreFoundation.containers.PointerSizedValues		| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.FloatLoopCounter					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling		| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.UncheckedReturn				| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.bcmp					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.bcopy					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.bzero					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.getpw					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.gets					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.mkstemp					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.mktemp					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.rand					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.strcpy					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-security.insecureAPI.vfork					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.API							| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.Malloc							| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.MallocSizeof						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.MismatchedDeallocator					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.Vfork							| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.cstring.BadSizeArg					| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| clang-analyzer-unix.cstring.NullArg						| Clang Static Analyzer 			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cppcoreguidelines-avoid-c-arrays						| modernize-avoid-c-arrays			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cppcoreguidelines-avoid-magic-numbers 					| readability-magic-numbers			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cppcoreguidelines-c-copy-assignment-signature 				| misc-unconventional-assign-operator		      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cppcoreguidelines-explicit-virtual-functions					| modernize-use-override			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| cppcoreguidelines-non-private-member-variables-in-classes			| misc-non-private-member-variables-in-classes	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| fuchsia-header-anon-namespaces						| google-build-namespaces			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| google-readability-braces-around-statements					| readability-braces-around-statements		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| google-readability-function-size						| readability-function-size			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| google-readability-namespace-comments 					| llvm-namespace-comment			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-avoid-c-arrays								| modernize-avoid-c-arrays			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-braces-around-statements						| readability-braces-around-statements		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-deprecated-headers							| modernize-deprecated-headers			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-explicit-conversions							| google-explicit-constructor			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-function-size								| readability-function-size			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-invalid-access-moved							| bugprone-use-after-move			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-member-init								| cppcoreguidelines-pro-type-member-init	      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-move-const-arg								| performance-move-const-arg			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-named-parameter 							| readability-named-parameter			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-new-delete-operators							| misc-new-delete-overloads			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-no-array-decay								| cppcoreguidelines-pro-bounds-array-to-pointer-decay | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-no-malloc								| cppcoreguidelines-no-malloc			      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-noexcept-move								| performance-noexcept-move-constructor 	      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-special-member-functions						| cppcoreguidelines-special-member-functions	      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-static-assert								| misc-static-assert				      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-undelegated-constructor 						| bugprone-undelegated-constructor		      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-uppercase-literal-suffix						| readability-uppercase-literal-suffix		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-auto								| modernize-use-auto				      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-emplace								| modernize-use-emplace 			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-equals-default							| modernize-use-equals-default			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-equals-delete							| modernize-use-equals-delete			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-noexcept								| modernize-use-noexcept			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-nullptr								| modernize-use-nullptr 			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-use-override								| modernize-use-override			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| hicpp-vararg									| cppcoreguidelines-pro-type-vararg		      | 	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| llvm-else-after-return							| readability-else-after-return 		      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+
| llvm-qualified-auto								| readability-qualified-auto			      | Yes	     |
+-------------------------------------------------------------------------------+-----------------------------------------------------+--------------+

   Clang-tidy IDE/Editor Integrations
     Apart from being a standalone tool, clang-tidy is integrated  into  various
     IDEs,  code  analyzers,  and editors. We recommend using clangd which inte-
     grates clang-tidy and is available in most major  editors	through  plugins
     (Vim, Emacs, Visual Studio Code, Sublime Text and more).

     The  following  table  shows the most well-known clang-tidy integrations in
     detail.
+-------------+------------+-------------+-------------+-------------+------------+
|	      | Feature    |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Tool	      | On-the-fly | Check  list | Options  to | Configura-  | Custom	  |
|	      | inspection | configura-  | checks      | tion	 via | clang-tidy |
|	      | 	   | tion (GUI)  | (GUI)       | .clang-tidy | binary	  |
|	      | 	   |		 |	       | files	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| A.L.E.  for | +	   | -		 | -	       | -	     | +	  |
| Vim	      | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Clang Power | -	   | +		 | -	       | +	     | -	  |
| Tools   for | 	   |		 |	       |	     |		  |
| Visual Stu- | 	   |		 |	       |	     |		  |
| dio	      | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Clangd      | +	   | -		 | -	       | +	     | -	  |
+-------------+------------+-------------+-------------+-------------+------------+
| CLion IDE   | +	   | +		 | +	       | +	     | +	  |
+-------------+------------+-------------+-------------+-------------+------------+
| CodeChecker | -	   | -		 | -	       | -	     | +	  |
+-------------+------------+-------------+-------------+-------------+------------+
| CPPCheck    | -	   | -		 | -	       | -	     | -	  |
+-------------+------------+-------------+-------------+-------------+------------+
| CPPDepend   | -	   | -		 | -	       | -	     | -	  |
+-------------+------------+-------------+-------------+-------------+------------+
| Flycheck    | +	   | -		 | -	       | +	     | +	  |
| for Emacs   | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| KDevelop    | -	   | +		 | +	       | +	     | +	  |
| IDE	      | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Qt  Creator | +	   | +		 | -	       | +	     | +	  |
| IDE	      | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| ReSharper   | +	   | +		 | -	       | +	     | +	  |
| C++ for Vi- | 	   |		 |	       |	     |		  |
| sual Studio | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Syntastic   | +	   | -		 | -	       | -	     | +	  |
| for Vim     | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+
| Visual  As- | +	   | +		 | -	       | -	     | -	  |
| sist	  for | 	   |		 |	       |	     |		  |
| Visual Stu- | 	   |		 |	       |	     |		  |
| dio	      | 	   |		 |	       |	     |		  |
+-------------+------------+-------------+-------------+-------------+------------+

     IDEs

     CLion 2017.2 and  later  integrates  clang-tidy  as  an  extension  to  the
     built-in  code  analyzer.	Starting  from	2018.2	EAP,  CLion allows using
     clang-tidy via Clangd. Inspections and applicable quick-fixes are performed
     on the fly, and checks can be configured in standard command  line  format.
     In this integration, you can switch to the clang-tidy binary different from
     the bundled one, pass the configuration in .clang-tidy files instead of us-
     ing the IDE settings, and configure options for particular checks.

     KDevelop  with  the kdev-clang-tidy plugin, starting from version 5.1, per-
     forms static analysis using clang-tidy. The plugin launches the  clang-tidy
     binary  from the specified location and parses its output to provide a list
     of issues.

     QtCreator 4.6 integrates clang-tidy warnings into	the  editor  diagnostics
     under  the  Clang Code Model. To employ clang-tidy inspection in QtCreator,
     you need to create a copy of one of the presets and choose the checks to be
     performed. Since QtCreator 4.7 project-wide analysis is possible with the -
     Clang Tools analyzer.

     MS Visual Studio has a native clang-tidy-vs plugin and also  can  integrate
     clang-tidy by means of three other tools. The ReSharper C++ extension, ver-
     sion 2017.3 and later, provides seamless clang-tidy integration: checks and
     quick-fixes  run  alongside  native inspections. Apart from that, ReSharper
     C++ incorporates clang-tidy  as  a  separate  step  of  its  code	clean-up
     process. Visual Assist build 2210 includes a subset of clang-tidy checklist
     to inspect the code as you edit.  Another way to bring clang-tidy function-
     ality to Visual Studio is the Clang Power Tools plugin, which includes most
     of  the clang-tidy checks and runs them during compilation or as a separate
     step of code analysis.

     Editors

     Emacs24,  when  expanded  with  the  Flycheck  plugin,   incorporates   the
     clang-tidy  inspection  into  the	syntax	analyzer. For Vim, you can use -
     Syntastic, which includes clang-tidy, or A.L.E., a lint engine that applies
     clang-tidy along with other linters.

     Analyzers

     clang-tidy is integrated in CPPDepend starting from version  2018.1  and  -
     CPPCheck 1.82. CPPCheck integration lets you import Visual Studio solutions
     and  run  the clang-tidy inspection on them. The CodeChecker application of
     version 5.3 or later, which also comes as a plugin  for  Eclipse,	supports
     clang-tidy  as  a	static	analysis  instrument  and allows to use a custom
     clang-tidy binary.

   Getting Involved
     clang-tidy has several own checks and can run Clang static analyzer checks,
     but its power is in the ability to easily write custom checks.

     Checks are organized in modules, which can be linked into	clang-tidy  with
     minimal or no code changes in clang-tidy.

     Checks  can  plug	into  the  analysis  on  the  preprocessor level using -
     PPCallbacks or on the AST level using AST Matchers. When an error is found,
     checks can report them in a way similar to how Clang  diagnostics	work.  A
     fix-it hint can be attached to a diagnostic message.

     The interface provided by clang-tidy makes it easy to write useful and pre-
     cise  checks  in  just  a few lines of code. If you have an idea for a good
     check, the rest of this document explains how to do this.

     There are a few tools particularly useful when developing clang-tidy
     checks:

	    * add_new_check.py is a script to automate the process of  adding  a
	      new  check,  it  will  create the check, update the CMake file and
	      create a test;

	    * rename_check.py does what the script name suggests, renames an ex-
	      isting check;

	    * clang-query is  invaluable  for  interactive  prototyping  of  AST
	      matchers and exploration of the Clang AST;

	    * clang-check  with  the -ast-dump (and optionally -ast-dump-filter)
	      provides a convenient way to dump AST of a C++ program.

     If   CMake   is   configured   with   CLANG_TIDY_ENABLE_STATIC_ANALYZER=NO,
     clang-tidy  will  not be built with support for the clang-analyzer-* checks
     or the mpi-* checks.

   Choosing the Right Place for your Check
     If you have an idea of a check, you should decide whether it should be  im-
     plemented as a:

     * Clang  diagnostic:  if the check is generic enough, targets code patterns
       that most probably are bugs (rather than style  or  readability	issues),
       can  be	implemented  effectively  and  with extremely low false positive
       rate, it may make a good Clang diagnostic.

     * Clang static analyzer check: if the check requires some sort  of  control
       flow  analysis,	it  should  probably be implemented as a static analyzer
       check.

     * clang-tidy check is a good choice for linter-style  checks,  checks  that
       are related to a certain coding style, checks that address code readabil-
       ity, etc.

   Preparing your Workspace
     If  you  are  new	to LLVM development, you should read the Getting Started
     with the LLVM System, Using Clang Tools and How To Setup Clang Tooling  For
     LLVM  documents  to  check  out and build LLVM, Clang and Clang Extra Tools
     with CMake.

     Once you are done, change	to  the  llvm/clang-tools-extra  directory,  and
     let's start!

   The Directory Structure
     clang-tidy  source code resides in the llvm/clang-tools-extra directory and
     is structured as follows:

	clang-tidy/			  # Clang-tidy core.
	|-- ClangTidy.h 		  # Interfaces for users.
	|-- ClangTidyCheck.h		  # Interfaces for checks.
	|-- ClangTidyModule.h		  # Interface for clang-tidy modules.
	|-- ClangTidyModuleRegistry.h	  # Interface for registering of modules.
	   ...
	|-- google/			  # Google clang-tidy module.
	|-+
	  |-- GoogleTidyModule.cpp
	  |-- GoogleTidyModule.h
		...
	|-- llvm/			  # LLVM clang-tidy module.
	|-+
	  |-- LLVMTidyModule.cpp
	  |-- LLVMTidyModule.h
		...
	|-- objc/			  # Objective-C clang-tidy module.
	|-+
	  |-- ObjCTidyModule.cpp
	  |-- ObjCTidyModule.h
		...
	|-- tool/			  # Sources of the clang-tidy binary.
		...
	test/clang-tidy/		  # Integration tests.
	    ...
	unittests/clang-tidy/		  # Unit tests.
	|-- ClangTidyTest.h
	|-- GoogleModuleTest.cpp
	|-- LLVMModuleTest.cpp
	|-- ObjCModuleTest.cpp
	    ...

   Writing a clang-tidy Check
     So you have an idea of a useful check for clang-tidy.

     First, if you're not familiar with LLVM development,  read  through  the  -
     Getting  Started  with  LLVM  document  for instructions on setting up your
     workflow and the LLVM Coding Standards  document  to  familiarize	yourself
     with the coding style used in the project. For code reviews we mostly use -
     LLVM Phabricator.

     Next, you need to decide which module the check belongs to. Modules are lo-
     cated  in subdirectories of clang-tidy/ and contain checks targeting a cer-
     tain aspect of code quality (performance, readability, etc.), certain  cod-
     ing  style  or  standard  (Google,  LLVM, CERT, etc.)  or a widely used API
     (e.g. MPI). Their names are same as  user-facing  check  groups  names  de-
     scribed above.

     After   choosing	the   module  and  the	name  for  the	check,	run  the
     clang-tidy/add_new_check.py script to create the skeleton of the check  and
     plug it to clang-tidy. It's the recommended way of adding new checks.

     If we want to create a readability-awesome-function-names, we would run:

	$ clang-tidy/add_new_check.py readability awesome-function-names

     The add_new_check.py script will:

	    * create  the class for your check inside the specified module's di-
	      rectory and register it in the module and in the build system;

	    * create a lit test file in the test/clang-tidy/ directory;

	    * create  a   documentation   file	 and   include	 it   into   the
	      docs/clang-tidy/checks/list.rst.

     Let's see in more detail at the check class definition:

	...

	#include "../ClangTidyCheck.h"

	namespace clang {
	namespace tidy {
	namespace readability {

	...
	class AwesomeFunctionNamesCheck : public ClangTidyCheck {
	public:
	  AwesomeFunctionNamesCheck(StringRef Name, ClangTidyContext *Context)
	      : ClangTidyCheck(Name, Context) {}
	  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
	  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
	};

	} // namespace readability
	} // namespace tidy
	} // namespace clang

	...

     Constructor of the check receives the Name and Context parameters, and must
     forward them to the ClangTidyCheck constructor.

     In  our  case  the check needs to operate on the AST level and it overrides
     the registerMatchers and check methods. If we wanted to analyze code on the
     preprocessor level, we'd need instead to override	the  registerPPCallbacks
     method.

     In  the  registerMatchers method we create an AST Matcher (see AST Matchers
     for more information) that will find the pattern in the AST that we want to
     inspect. The results of the matching are passed to the check method,  which
     can further inspect them and report diagnostics.

	using namespace ast_matchers;

	void AwesomeFunctionNamesCheck::registerMatchers(MatchFinder *Finder) {
	  Finder->addMatcher(functionDecl().bind("x"), this);
	}

	void AwesomeFunctionNamesCheck::check(const MatchFinder::MatchResult &Result) {
	  const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("x");
	  if (!MatchedDecl->getIdentifier() || MatchedDecl->getName().startswith("awesome_"))
	    return;
	  diag(MatchedDecl->getLocation(), "function %0 is insufficiently awesome")
	      << MatchedDecl
	      << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_");
	}

     (If   you	 want	to  see  an  example  of  a  useful  check,  look  at  -
     clang-tidy/google/ExplicitConstructorCheck.h	      and	       -
     clang-tidy/google/ExplicitConstructorCheck.cpp).

   Registering your Check
     (The  add_new_check.py  takes  care of registering the check in an existing
     module. If you want to create a new module or know the details, read on.)

     The check should be registered in the corresponding module with a	distinct
     name:

	class MyModule : public ClangTidyModule {
	 public:
	  void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
	    CheckFactories.registerCheck<ExplicitConstructorCheck>(
		"my-explicit-constructor");
	  }
	};

     Now  we  need to register the module in the ClangTidyModuleRegistry using a
     statically initialized variable:

	static ClangTidyModuleRegistry::Add<MyModule> X("my-module",
							"Adds my lint checks.");

     When using LLVM build system, we need to use the following hack  to  ensure
     the module is linked into the clang-tidy binary:

     Add this near the ClangTidyModuleRegistry::Add<MyModule> variable:

	// This anchor is used to force the linker to link in the generated object file
	// and thus register the MyModule.
	volatile int MyModuleAnchorSource = 0;

     And  this to the main translation unit of the clang-tidy binary (or the bi-
     nary you link the clang-tidy library in) clang-tidy/tool/ClangTidyMain.cpp:

	// This anchor is used to force the linker to link the MyModule.
	extern volatile int MyModuleAnchorSource;
	static int MyModuleAnchorDestination = MyModuleAnchorSource;

   Configuring Checks
     If a check needs configuration options, it can  access  check-specific  op-
     tions  using  the Options.get<Type>("SomeOption", DefaultValue) call in the
     check constructor.  In  this  case  the  check  should  also  override  the
     ClangTidyCheck::storeOptions  method  to  make  the options provided by the
     check discoverable. This method lets  clang-tidy  know  which  options  the
     check implements and what the current values are (e.g. for the -dump-config
     command line option).

	class MyCheck : public ClangTidyCheck {
	  const unsigned SomeOption1;
	  const std::string SomeOption2;

	public:
	  MyCheck(StringRef Name, ClangTidyContext *Context)
	    : ClangTidyCheck(Name, Context),
	      SomeOption(Options.get("SomeOption1", -1U)),
	      SomeOption(Options.get("SomeOption2", "some default")) {}

	  void storeOptions(ClangTidyOptions::OptionMap &Opts) override {
	    Options.store(Opts, "SomeOption1", SomeOption1);
	    Options.store(Opts, "SomeOption2", SomeOption2);
	  }
	  ...

     Assuming  the  check is registered with the name "my-check", the option can
     then be set in a .clang-tidy file in the following way:

	CheckOptions:
	  - key: my-check.SomeOption1
	    value: 123
	  - key: my-check.SomeOption2
	    value: 'some other value'

     If you need to specify check options on a command line, you can use the in-
     line YAML format:

	$ clang-tidy -config="{CheckOptions: [{key: a, value: b}, {key: x, value: y}]}" ...

   Testing Checks
     To run tests for clang-tidy use the command:

	$ ninja check-clang-tools

     clang-tidy checks can be tested using either unit tests or lit tests.  Unit
     tests  may  be  more  convenient  to  test complex replacements with strict
     checks. Lit tests allow using partial text matching and regular expressions
     which makes them more suitable for writing  compact  tests  for  diagnostic
     messages.

     The check_clang_tidy.py script provides an easy way to test both diagnostic
     messages  and  fix-its. It filters out CHECK lines from the test file, runs
     clang-tidy and verifies messages and fixes with two separate FileCheck  in-
     vocations:  once  with  FileCheck's directive prefix set to CHECK-MESSAGES,
     validating the diagnostic messages, and once with the directive prefix  set
     to CHECK-FIXES, running against the fixed code (i.e., the code after gener-
     ated fix-its are applied). In particular, CHECK-FIXES: can be used to check
     that  code  was not modified by fix-its, by checking that it is present un-
     changed in the fixed code. The full set of FileCheck directives  is  avail-
     able  (e.g.,  CHECK-MESSAGES-SAME:,  CHECK-MESSAGES-NOT:), though typically
     the basic CHECK forms (CHECK-MESSAGES and CHECK-FIXES) are  sufficient  for
     clang-tidy  tests. Note that the FileCheck documentation mostly assumes the
     default prefix (CHECK),  and  hence  describes  the  directive  as  CHECK:,
     CHECK-SAME:,  CHECK-NOT:,	etc.   Replace	CHECK  by  either CHECK-FIXES or
     CHECK-MESSAGES for clang-tidy tests.

     An  additional  check  enabled  by  check_clang_tidy.py  ensures  that   if
     CHECK-MESSAGES:  is used in a file then every warning or error must have an
     associated CHECK in that file. Or, you can use CHECK-NOTES: instead, if you
     want to also ensure that all the notes are checked.

     To use the check_clang_tidy.py script, put a .cpp file with the appropriate
     RUN  line	in  the  test/clang-tidy  directory.  Use  CHECK-MESSAGES:   and
     CHECK-FIXES:  lines  to  write checks against diagnostic messages and fixed
     code.

     It's advised to make the checks as specific as  possible  to  avoid  checks
     matching  to incorrect parts of the input. Use [[@LINE+X]]/[[@LINE-X]] sub-
     stitutions and distinct function and variable names in the test code.

     Here's an example of a test using the check_clang_tidy.py script (the  full
     source code is at test/clang-tidy/google-readability-casting.cpp):

	// RUN: %check_clang_tidy %s google-readability-casting %t

	void f(int a) {
	  int b = (int)a;
	  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: redundant cast to the same type [google-readability-casting]
	  // CHECK-FIXES: int b = a;
	}

     To  check	more  than  one  scenario  in the same test file use -check-suf-
     fix=SUFFIX-NAME on check_clang_tidy.py command line or -check-suffixes=SUF-
     FIX-NAME-1,SUFFIX-NAME-2,....  With -check-suffix[es]=SUFFIX-NAME you  need
     to  replace  your	CHECK-*  directives  with CHECK-MESSAGES-SUFFIX-NAME and
     CHECK-FIXES-SUFFIX-NAME.

     Here's an example:

	// RUN: %check_clang_tidy -check-suffix=USING-A %s misc-unused-using-decls %t -- -- -DUSING_A
	// RUN: %check_clang_tidy -check-suffix=USING-B %s misc-unused-using-decls %t -- -- -DUSING_B
	// RUN: %check_clang_tidy %s misc-unused-using-decls %t
	...
	// CHECK-MESSAGES-USING-A: :[[@LINE-8]]:10: warning: using decl 'A' {{.*}}
	// CHECK-MESSAGES-USING-B: :[[@LINE-7]]:10: warning: using decl 'B' {{.*}}
	// CHECK-MESSAGES: :[[@LINE-6]]:10: warning: using decl 'C' {{.*}}
	// CHECK-FIXES-USING-A-NOT: using a::A;$
	// CHECK-FIXES-USING-B-NOT: using a::B;$
	// CHECK-FIXES-NOT: using a::C;$

     There are many dark corners in the C++ language, and it may be difficult to
     make your check work perfectly in all cases, especially if it issues fix-it
     hints. The most frequent pitfalls are macros and templates:

     1. code written in a macro body/template definition may  have  a  different
	meaning depending on the macro expansion/template instantiation;

     2. multiple macro expansions/template instantiations may result in the same
	code being inspected by the check multiple times (possibly, with differ-
	ent meanings, see 1), and the same warning (or a slightly different one)
	may  be  issued by the check multiple times; clang-tidy will deduplicate
	_identical_ warnings, but if the warnings are slightly different, all of
	them will be shown to the user (and used for applying fixes, if any);

     3. making replacements to a macro body/template definition may be fine  for
	some  macro  expansions/template  instantiations,  but easily break some
	other expansions/instantiations.

   Running clang-tidy on LLVM
     To test a check it's best to try it out on a larger  code	base.  LLVM  and
     Clang  are  the natural targets as you already have the source code around.
     The most convenient way to run clang-tidy is with a compile  command  data-
     base; CMake can automatically generate one, for a description of how to en-
     able it see How To Setup Clang Tooling For LLVM. Once compile_commands.json
     is  in place and a working version of clang-tidy is in PATH the entire code
     base can be analyzed with clang-tidy/tool/run-clang-tidy.py. The script ex-
     ecutes clang-tidy with the default set of checks on every translation  unit
     in the compile command database and displays the resulting warnings and er-
     rors. The script provides multiple configuration flags.

     * The  default  set of checks can be overridden using the -checks argument,
       taking  the  identical	format	 as   clang-tidy   does.   For	 example
       -checks=-*,modernize-use-override  will	run  the  modernize-use-override
       check only.

     * To restrict the files examined you can provide one or  more  regex  argu-
       ments  that  the  file  names  are  matched  against.   run-clang-tidy.py
       clang-tidy/.*Check\.cpp will only analyze clang-tidy checks. It may  also
       be necessary to restrict the header files warnings are displayed from us-
       ing  the -header-filter flag. It has the same behavior as the correspond-
       ing clang-tidy flag.

     * To apply suggested fixes -fix can be passed as an argument. This  gathers
       all  changes  in  a temporary directory and applies them. Passing -format
       will run clang-format over changed lines.

   On checks profiling
     clang-tidy can collect per-check profiling info, and  output  it  for  each
     processed source file (translation unit).

     To  enable  profiling  info collection, use the -enable-check-profile argu-
     ment.  The timings will be output to stderr as a table. Example output:

	$ clang-tidy -enable-check-profile -checks=-*,readability-function-size source.cpp
	===-------------------------------------------------------------------------===
				  clang-tidy checks profiling
	===-------------------------------------------------------------------------===
	  Total Execution Time: 1.0282 seconds (1.0258 wall clock)

	   ---User Time---   --System Time--   --User+System--	 ---Wall Time---  --- Name ---
	   0.9136 (100.0%)   0.1146 (100.0%)   1.0282 (100.0%)	 1.0258 (100.0%)  readability-function-size
	   0.9136 (100.0%)   0.1146 (100.0%)   1.0282 (100.0%)	 1.0258 (100.0%)  Total

     It can also store that data as JSON files for further  processing.  Example
     output:

	$ clang-tidy -enable-check-profile -store-check-profile=.  -checks=-*,readability-function-size source.cpp
	$ # Note that there won't be timings table printed to the console.
	$ ls /tmp/out/
	20180516161318717446360-source.cpp.json
	$ cat 20180516161318717446360-source.cpp.json
	{
	"file": "/path/to/source.cpp",
	"timestamp": "2018-05-16 16:13:18.717446360",
	"profile": {
	  "time.clang-tidy.readability-function-size.wall": 1.0421266555786133e+00,
	  "time.clang-tidy.readability-function-size.user": 9.2088400000005421e-01,
	  "time.clang-tidy.readability-function-size.sys": 1.2418899999999974e-01
	}
	}

     There is only one argument that controls profile storage:

     * -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.   If
       the  prefix  is	not an absolute path, it is considered to be relative to
       the directory from where you have run clang-tidy. All . and ..	patterns
       in the path are collapsed, and symlinks are resolved.

       Example:  Let's suppose you have a source file named example.cpp, located
       in the /source directory. Only the input filename is used, not  the  full
       path  to  the  source file. Additionally, it is prefixed with the current
       timestamp.

       * If you specify -store-check-profile=/tmp,  then  the  profile	will  be
	 saved to /tmp/<ISO8601-like timestamp>-example.cpp.json

       * If   you  run	clang-tidy  from  within  /foo	directory,  and  specify
	 -store-check-profile=.,  then	the  profile  will  still  be  saved  to
	 /foo/<ISO8601-like timestamp>-example.cpp.json

     clang-tidy is a clang-based C++ "linter" tool. Its purpose is to provide an
     extensible  framework for diagnosing and fixing typical programming errors,
     like style violations, interface misuse, or bugs that can	be  deduced  via
     static  analysis. clang-tidy is modular and provides a convenient interface
     for writing new checks.

   Using clang-tidy
     clang-tidy is a LibTooling-based tool, and it's easier to work with if  you
     set  up  a compile command database for your project (for an example of how
     to do this see How To Setup Tooling For LLVM). You can also specify  compi-
     lation options on the command line after --:

	$ clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...

     clang-tidy  has  its  own	checks	and  can  also run Clang static analyzer
     checks. Each check has a name and the checks to run can be chosen using the
     -checks= option, which specifies a comma-separated  list  of  positive  and
     negative  (prefixed  with	-)  globs. Positive globs add subsets of checks,
     negative globs remove them. For example,

	$ clang-tidy test.cpp -checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*

     will disable all default checks (-*) and enable all clang-analyzer-* checks
     except for clang-analyzer-cplusplus* ones.

     The -list-checks option lists all the enabled  checks.  When  used  without
     -checks=,	it  shows  checks  enabled  by default. Use -checks=* to see all
     available checks or with any other value of -checks= to  see  which  checks
     are enabled by this value.

     There are currently the following groups of checks:
		+--------------------+-----------------------------+
		| Name prefix	     | Description		   |
		+--------------------+-----------------------------+
		| abseil-	     | Checks  related	to  Abseil |
		|		     | library. 		   |
		+--------------------+-----------------------------+
		| altera-	     | Checks  related	to  OpenCL |
		|		     | programming for FPGAs.	   |
		+--------------------+-----------------------------+
		| android-	     | Checks related to Android.  |
		+--------------------+-----------------------------+
		| boost-	     | Checks related to Boost li- |
		|		     | brary.			   |
		+--------------------+-----------------------------+
		| bugprone-	     | Checks that target bugprone |
		|		     | code constructs. 	   |
		+--------------------+-----------------------------+
		| cert- 	     | Checks  related to CERT Se- |
		|		     | cure Coding Guidelines.	   |
		+--------------------+-----------------------------+
		| clang-analyzer-    | Clang	Static	  Analyzer |
		|		     | checks.			   |
		+--------------------+-----------------------------+
		| concurrency-	     | Checks  related	to concur- |
		|		     | rent programming (including |
		|		     | threads,   fibers,   corou- |
		|		     | tines, etc.).		   |
		+--------------------+-----------------------------+
		| cppcoreguidelines- | Checks  related to C++ Core |
		|		     | Guidelines.		   |
		+--------------------+-----------------------------+
		| darwin-	     | Checks  related	to  Darwin |
		|		     | coding conventions.	   |
		+--------------------+-----------------------------+
		| fuchsia-	     | Checks  related	to Fuchsia |
		|		     | coding conventions.	   |
		+--------------------+-----------------------------+
		| google-	     | Checks  related	to  Google |
		|		     | coding conventions.	   |
		+--------------------+-----------------------------+
		| hicpp-	     | Checks  related to High In- |
		|		     | tegrity	C++  Coding  Stan- |
		|		     | dard.			   |
		+--------------------+-----------------------------+
		| linuxkernel-	     | Checks related to the Linux |
		|		     | Kernel coding conventions.  |
		+--------------------+-----------------------------+
		| llvm- 	     | Checks  related to the LLVM |
		|		     | coding conventions.	   |
		+--------------------+-----------------------------+
		| llvmlibc-	     | Checks	related   to   the |
		|		     | LLVM-libc coding standards. |
		+--------------------+-----------------------------+
		| misc- 	     | Checks  that we didn't have |
		|		     | a better category for.	   |
		+--------------------+-----------------------------+
		| modernize-	     | Checks that advocate  usage |
		|		     | of  modern (currently "mod- |
		|		     | ern"  means  "C++11")  lan- |
		|		     | guage constructs.	   |
		+--------------------+-----------------------------+
		| mpi-		     | Checks related to MPI (Mes- |
		|		     | sage Passing Interface).    |
		+--------------------+-----------------------------+
		| objc- 	     | Checks  related	to  Objec- |
		|		     | tive-C coding conventions.  |
		+--------------------+-----------------------------+
		| openmp-	     | Checks  related	to  OpenMP |
		|		     | API.			   |
		+--------------------+-----------------------------+
		| performance-	     | Checks  that target perfor- |
		|		     | mance-related issues.	   |
		+--------------------+-----------------------------+
		| portability-	     | Checks that  target  porta- |
		|		     | bility-related  issues that |
		|		     | don't relate to any partic- |
		|		     | ular coding style.	   |
		+--------------------+-----------------------------+
		| readability-	     | Checks  that  target  read- |
		|		     | ability-related issues that |
		|		     | don't relate to any partic- |
		|		     | ular coding style.	   |
		+--------------------+-----------------------------+
		| zircon-	     | Checks  related	to  Zircon |
		|		     | kernel coding conventions.  |
		+--------------------+-----------------------------+

     Clang diagnostics are treated in a similar way as check diagnostics.  Clang
     diagnostics  are  displayed  by  clang-tidy  and  can be filtered out using
     -checks= option. However, the -checks= option does not  affect  compilation
     arguments,  so  it  can  not  turn  on Clang warnings which are not already
     turned on in build configuration. The -warnings-as-errors= option	upgrades
     any warnings emitted under the -checks= flag to errors (but it does not en-
     able any checks itself).

     Clang  diagnostics have check names starting with clang-diagnostic-.  Diag-
     nostics which have a corresponding warning option, are named clang-diagnos-
     tic-<warning-option>, e.g. Clang warning controlled by -Wliteral-conversion
     will be reported with check name clang-diagnostic-literal-conversion.

     The -fix flag instructs clang-tidy to fix found errors if supported by cor-
     responding checks.

     An overview of all the command-line options:

	$ clang-tidy --help
	USAGE: clang-tidy [options] <source0> [... <sourceN>]

	OPTIONS:

	Generic Options:

	  --help			 - Display available options (--help-hidden for more)
	  --help-list			 - Display list of available options (--help-list-hidden for more)
	  --version			 - Display the version of this program

	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: [{key: x,
								       value: 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.
	  --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.
	  --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.
	  -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.
	  --system-headers		 - Display the errors from system headers.
	  --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.

	<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.

	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
	    ---
	    Checks:		 '-*,some-check'
	    WarningsAsErrors:	 ''
	    HeaderFilterRegex:	 ''
	    FormatStyle:	 none
	    InheritParentConfig: true
	    User:		 user
	    CheckOptions:
	      - key:		 some-check.SomeOption
		value:		 'some value'
	    ...

   Suppressing Undesired Diagnostics
     clang-tidy diagnostics are intended to call out code that does  not  adhere
     to a coding standard, or is otherwise problematic in some way.  However, if
     the  code	is known to be correct, it may be useful to silence the warning.
     Some clang-tidy checks provide a check-specific way to silence the diagnos-
     tics, e.g.  bugprone-use-after-move can be silenced by re-initializing  the
     variable  after  it  has been moved out, bugprone-string-integer-assignment
     can  be  suppressed  by   explicitly   casting   the   integer   to   char,
     readability-implicit-bool-conversion  can	also  be suppressed by using ex-
     plicit casts, etc.

     If a specific suppression mechanism is not available for a certain warning,
     or its use is not desired for some reason, clang-tidy has a generic  mecha-
     nism to suppress diagnostics using NOLINT or NOLINTNEXTLINE comments.

     The NOLINT comment instructs clang-tidy to ignore warnings on the same line
     (it doesn't apply to a function, a block of code or any other language con-
     struct,  it  applies to the line of code it is on). If introducing the com-
     ment in the same line would change the formatting in undesired way, the NO-
     LINTNEXTLINE comment allows to suppress clang-tidy  warnings  on  the  next
     line.

     Both  comments can be followed by an optional list of check names in paren-
     theses (see below for the formal syntax).

     For example:

	class Foo {
	  // Suppress all the diagnostics for the line
	  Foo(int param); // NOLINT

	  // Consider explaining the motivation to suppress the warning.
	  Foo(char param); // NOLINT: Allow implicit conversion from `char`, because <some valid reason>.

	  // Silence only the specified checks for the line
	  Foo(double param); // NOLINT(google-explicit-constructor, google-runtime-int)

	  // Silence only the specified diagnostics for the next line
	  // NOLINTNEXTLINE(google-explicit-constructor, google-runtime-int)
	  Foo(bool param);
	};

     The formal syntax of NOLINT/NOLINTNEXTLINE is the following:

	lint-comment:
	  lint-command
	  lint-command lint-args

	lint-args:
	  ( check-name-list )

	check-name-list:
	  check-name
	  check-name-list , check-name

	lint-command:
	  NOLINT
	  NOLINTNEXTLINE

     Note that whitespaces between NOLINT/NOLINTNEXTLINE and the opening  paren-
     thesis  are  not  allowed (in this case the comment will be treated just as
     NOLINT/NOLINTNEXTLINE), whereas in check names list (inside  the  parenthe-
     sis) whitespaces can be used and will be ignored.

CLANG-INCLUDE-FIXER
   Contents
     * Clang-Include-Fixer

       * Setup

	 * Creating a Symbol Index From a Compilation Database

	 * Integrate with Vim

	 * Integrate with Emacs

       * How it Works

     One of the major nuisances of C++ compared to other languages is the manual
     management  of  #include  directives  in any file.  clang-include-fixer ad-
     dresses one aspect of this problem by providing an automated way of  adding
     #include directives for missing symbols in one translation unit.

     While  inserting  missing	#include, clang-include-fixer adds missing name-
     space qualifiers to all instances of an unidentified symbol if  the  symbol
     is missing some prefix namespace qualifiers.

   Setup
     To  use  clang-include-fixer two databases are required. Both can be gener-
     ated with existing tools.

     * Compilation database. Contains the compiler commands for any  given  file
       in  a project and can be generated by CMake, see How To Setup Tooling For
       LLVM.

     * Symbol index. Contains all symbol information in a  project  to	match  a
       given identifier to a header file.

     Ideally both databases (compile_commands.json and find_all_symbols_db.yaml)
     are  linked  into	the root of the source tree they correspond to. Then the
     clang-include-fixer can automatically pick them up if called with a  source
     file  from  that tree. Note that by default compile_commands.json as gener-
     ated by CMake does not include header files, so only  implementation  files
     can be handled by tools.

   Creating a Symbol Index From a Compilation Database
     The  include  fixer  contains  find-all-symbols,  a tool to create a symbol
     database in YAML format from a compilation database by parsing  all  source
     files  listed  in	it. The following list of commands shows how to set up a
     database for LLVM, any project built by CMake should follow similar steps.

	$ cd path/to/llvm-build
	$ ninja find-all-symbols // build find-all-symbols tool.
	$ ninja clang-include-fixer // build clang-include-fixer tool.
	$ ls compile_commands.json # Make sure compile_commands.json exists.
	  compile_commands.json
	$ path/to/llvm/source/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py
	  ... wait as clang indexes the code base ...
	$ ln -s $PWD/find_all_symbols_db.yaml path/to/llvm/source/ # Link database into the source tree.
	$ ln -s $PWD/compile_commands.json path/to/llvm/source/ # Also link compilation database if it's not there already.
	$ cd path/to/llvm/source
	$ /path/to/clang-include-fixer -db=yaml path/to/file/with/missing/include.cpp
	  Added #include "foo.h"

   Integrate with Vim
     To run clang-include-fixer on a potentially unsaved buffer in Vim. Add  the
     following key binding to your .vimrc:

	noremap <leader>cf :pyf path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/clang-include-fixer.py<cr>

     This  enables  clang-include-fixer  for  NORMAL  and  VISUAL  mode.  Change
     <leader>cf to another binding if you need clang-include-fixer on a  differ-
     ent  key.	The <leader> key is a reference to a specific key defined by the
     mapleader variable and is bound to backslash by default.

     Make sure vim can find clang-include-fixer:

     * Add the path to clang-include-fixer to the PATH environment variable.

     * Or   set   g:clang_include_fixer_path   in   vimrc:    let    g:clang_in-
       clude_fixer_path=path/to/clang-include-fixer

     You  can  customize  the  number  of  headers  being  shown  by setting let
     g:clang_include_fixer_maximum_suggested_headers=5

     Customized settings in .vimrc:

     * let g:clang_include_fixer_path = "clang-include-fixer"

       Set clang-include-fixer binary file path.

     * let g:clang_include_fixer_maximum_suggested_headers = 3

       Set the maximum number of #includes to show. Default is 3.

     * let g:clang_include_fixer_increment_num = 5

       Set the increment number of #includes to show every time when pressing m.
       Default is 5.

     * let g:clang_include_fixer_jump_to_include = 0

       Set to 1 if you want to jump to the new inserted #include  line.  Default
       is 0.

     * let g:clang_include_fixer_query_mode = 0

       Set  to 1 if you want to insert #include for the symbol under the cursor.
       Default is 0. Compared to normal mode, this mode won't parse  the  source
       file  and only search the symbol from database, which is faster than nor-
       mal mode.

     See clang-include-fixer.py for more details.

   Integrate with Emacs
     To run clang-include-fixer on a potentially unsaved buffer in  Emacs.   En-
     sure  that  Emacs finds clang-include-fixer.el by adding the directory con-
     taining the file to the load-path and requiring the clang-include-fixer  in
     your .emacs:

	(add-to-list 'load-path "path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/"
	(require 'clang-include-fixer)

     Within  Emacs  the  tool  can  be	invoked  with  the command M-x clang-in-
     clude-fixer. This will insert the header that defines the	first  undefined
     symbol;  if there is more than one header that would define the symbol, the
     user is prompted to select one.

     To include the header that defines the symbol at point, run  M-x  clang-in-
     clude-fixer-at-point.

     Make sure Emacs can find clang-include-fixer:

     * Either  add the parent directory of clang-include-fixer to the PATH envi-
       ronment	variable,  or  customize  the  Emacs   user   option   clang-in-
       clude-fixer-executable to point to the file name of the program.

   How it Works
     To get the most information out of Clang at parse time, clang-include-fixer
     runs  in tandem with the parse and receives callbacks from Clang's semantic
     analysis. In particular it reuses the existing  support  for  typo  correc-
     tions. Whenever Clang tries to correct a potential typo it emits a callback
     to  the  include  fixer  which then looks for a corresponding file. At this
     point rich lookup information is still available, which is not available in
     the AST at a later stage.

     The identifier that should be typo corrected is then sent to the  database,
     if a header file is returned it is added as an include directive at the top
     of the file.

     Currently	clang-include-fixer  only  inserts a single include at a time to
     avoid getting caught in follow-up errors. If  multiple  #include  additions
     are desired the program can be rerun until a fix-point is reached.

MODULARIZE USER'S MANUAL
   Modularize Usage
     modularize    [<modularize-options>]   [<module-map>|<include-files-list>]*
     [<front-end-options>...]

     <modularize-options> is a place-holder for options specific to  modularize,
     which are described below in Modularize Command Line Options.

     <module-map>  specifies the path of a file name for an existing module map.
     The module map must be well-formed in terms of syntax. Modularize will  ex-
     tract  the header file names from the map. Only normal headers are checked,
     assuming headers marked "private", "textual", or "exclude" are  not  to  be
     checked  as a top-level include, assuming they either are included by other
     headers which are checked, or they are not suitable for modules.

     <include-files-list> specifies the path of a file name for a file	contain-
     ing  the  newline-separated  list	of headers to check with respect to each
     other. Lines beginning with '#' and empty lines are  ignored.  Header  file
     names followed by a colon and other space-separated file names will include
     those  extra  files as dependencies. The file names can be relative or full
     paths, but must be on the same line. For example:

	header1.h
	header2.h
	header3.h: header1.h header2.h

     Note that unless a -prefix (header path) option is specified,  non-absolute
     file paths in the header list file will be relative to the header list file
     directory. Use -prefix to specify a different directory.

     <front-end-options>  is  a  place-holder  for regular Clang front-end argu-
     ments, which must follow the <include-files-list>.  Note that  by	default,
     modularize  assumes .h files contain C++ source, so if you are using a dif-
     ferent language, you might need to use a -x option to tell Clang  that  the
     header contains another language, i.e.:  -x c

     Note  also  that because modularize does not use the clang driver, you will
     likely need to pass in additional compiler  front-end  arguments  to  match
     those passed in by default by the driver.

   Modularize Command Line Options
     -prefix=<header-path>
	    Prepend the given path to non-absolute file paths in the header list
	    file.   By default, headers are assumed to be relative to the header
	    list file directory. Use -prefix to specify a different directory.

     -module-map-path=<module-map-path>
	    Generate a module map and output it to the given file. See	the  de-
	    scription in Module Map Generation.

     -problem-files-list=<problem-files-list-file-name>
	    For  use  only  with  module map assistant. Input list of files that
	    have problems with respect to modules. These will still be	included
	    in	the generated module map, but will be marked as "excluded" head-
	    ers.

     -root-module=<root-name>
	    Put modules generated by the -module-map-path option in an enclosing
	    module with the given name. See the description in Module Map Gener-
	    ation.

     -block-check-header-list-only
	    Limit the #include-inside-extern-or-namespace-block  check	to  only
	    those  headers  explicitly	listed	in  the  header list.  This is a
	    work-around for avoiding error messages for  private  includes  that
	    purposefully get included inside blocks.

     -no-coverage-check
	    Don't do the coverage check for a module map.

     -coverage-check-only
	    Only do the coverage check for a module map.

     -display-file-lists
	    Display  lists of good files (no compile errors), problem files, and
	    a combined list with problem files preceded by a '#'.  This  can  be
	    used  to  quickly  determine  which files have problems.  The latter
	    combined list might be useful in starting to  modularize  a  set  of
	    headers.  You  can	start  with  a	full  list of headers, use -dis-
	    play-file-lists option, and then use the combined list as  your  in-
	    termediate list, uncommenting-out headers as you fix them.

     modularize  is  a standalone tool that checks whether a set of headers pro-
     vides the consistent definitions required to use modules. For  example,  it
     detects  whether  the  same entity (say, a NULL macro or size_t typedef) is
     defined in multiple headers or whether a header produces different  defini-
     tions  under  different circumstances. These conditions cause modules built
     from the headers to behave poorly, and should be fixed before introducing a
     module map.

     modularize also has an assistant mode option for generating  a  module  map
     file  based on the provided header list. The generated file is a functional
     module map that can be used as a starting point for a module.map file.

   Getting Started
     To build from source:

     1. Read Getting Started with the LLVM System and Clang Tools  Documentation
	for  information  on  getting  sources	for LLVM, Clang, and Clang Extra
	Tools.

     2. Getting Started with the LLVM System and Building LLVM with  CMake  give
	directions for how to build. With sources all checked out into the right
	place the LLVM build will build Clang Extra Tools and their dependencies
	automatically.

	* If  using  CMake, you can also use the modularize target to build just
	  the modularize tool and its dependencies.

     Before continuing, take a look at Modularize Usage to  see  how  to  invoke
     modularize.

   What Modularize Checks
     Modularize will check for the following:

     * Duplicate global type and variable definitions

     * Duplicate macro definitions

     * Macro  instances, 'defined(macro)', or #if, #elif, #ifdef, #ifndef condi-
       tions that evaluate differently in a header

     * #include directives inside 'extern "C/C++" {}' or 'namespace  (name)  {}'
       blocks

     * Module  map header coverage completeness (in the case of a module map in-
       put only)

     Modularize will do normal C/C++ parsing, reporting normal errors and  warn-
     ings, but will also report special error messages like the following:

	error: '(symbol)' defined at multiple locations:
	   (file):(row):(column)
	   (file):(row):(column)

	error: header '(file)' has different contents depending on how it was included

     The latter might be followed by messages like the following:

	note: '(symbol)' in (file) at (row):(column) not always provided

     Checks  will also be performed for macro expansions, defined(macro) expres-
     sions, and preprocessor  conditional  directives  that  evaluate  inconsis-
     tently, and can produce error messages like the following:

	 (...)/SubHeader.h:11:5:
	#if SYMBOL == 1
	    ^
	error: Macro instance 'SYMBOL' has different values in this header,
	       depending on how it was included.
	  'SYMBOL' expanded to: '1' with respect to these inclusion paths:
	    (...)/Header1.h
	      (...)/SubHeader.h
	(...)/SubHeader.h:3:9:
	#define SYMBOL 1
		^
	Macro defined here.
	  'SYMBOL' expanded to: '2' with respect to these inclusion paths:
	    (...)/Header2.h
		(...)/SubHeader.h
	(...)/SubHeader.h:7:9:
	#define SYMBOL 2
		^
	Macro defined here.

     Checks will also be performed for '#include' directives that are nested in-
     side  'extern  "C/C++" {}' or 'namespace (name) {}' blocks, and can produce
     error message like the following:

	IncludeInExtern.h:2:3:
	#include "Empty.h"
	^
	error: Include directive within extern "C" {}.
	IncludeInExtern.h:1:1:
	extern "C" {
	^
	The "extern "C" {}" block is here.

   Module Map Coverage Check
     The coverage check uses the Clang library to read and parse the module  map
     file. Starting at the module map file directory, or just the include paths,
     if specified, it will collect the names of all the files it considers head-
     ers (no extension, .h, or .inc--if you need more, modify the isHeader func-
     tion).  It then compares the headers against those referenced in the module
     map, either explicitly named, or implicitly named via an umbrella directory
     or umbrella file, as parsed by the ModuleMap object.  If headers are  found
     which are not referenced or covered by an umbrella directory or file, warn-
     ing  messages  will be produced, and this program will return an error code
     of 1. If no problems are found, an error code of 0 is returned.

     Note that in the case of umbrella headers, this tool invokes  the	compiler
     to preprocess the file, and uses a callback to collect the header files in-
     cluded  by  the umbrella header or any of its nested includes. If any front
     end options are needed for these compiler invocations,  these  can  be  in-
     cluded on the command line after the module map file argument.

     Warning message have the form:
	warning: module.modulemap does not account for file: Level3A.h

     Note  that  for the case of the module map referencing a file that does not
     exist, the module map parser in Clang will (at the time  of  this	writing)
     display an error message.

     To  limit the checks modularize does to just the module map coverage check,
     use the -coverage-check-only option.

     For example:

	modularize -coverage-check-only module.modulemap

   Module Map Generation
     If you specify the -module-map-path=<module map file>, modularize will out-
     put a module map based on the input header list.  A module will be  created
     for  each header. Also, if the header in the header list is a partial path,
     a nested module hierarchy will be created in which a module will be created
     for each subdirectory component in the header path, with the header  itself
     represented  by  the innermost module. If other headers use the same subdi-
     rectories, they will be enclosed in these same modules also.

     For example, for the header list:

	SomeTypes.h
	SomeDecls.h
	SubModule1/Header1.h
	SubModule1/Header2.h
	SubModule2/Header3.h
	SubModule2/Header4.h
	SubModule2.h

     The following module map will be generated:

	// Output/NoProblemsAssistant.txt
	// Generated by: modularize -module-map-path=Output/NoProblemsAssistant.txt \
	     -root-module=Root NoProblemsAssistant.modularize

	module SomeTypes {
	  header "SomeTypes.h"
	  export *
	}
	module SomeDecls {
	  header "SomeDecls.h"
	  export *
	}
	module SubModule1 {
	  module Header1 {
	    header "SubModule1/Header1.h"
	    export *
	  }
	  module Header2 {
	    header "SubModule1/Header2.h"
	    export *
	  }
	}
	module SubModule2 {
	  module Header3 {
	    header "SubModule2/Header3.h"
	    export *
	  }
	  module Header4 {
	    header "SubModule2/Header4.h"
	    export *
	  }
	  header "SubModule2.h"
	  export *
	}

     An optional -root-module=<root-name> option can be used  to  cause  a  root
     module to be created which encloses all the modules.

     An  optional -problem-files-list=<problem-file-name> can be used to input a
     list of files to be excluded, perhaps as a temporary stop-gap measure until
     problem headers can be fixed.

     For example, with the same header list from above:

	// Output/NoProblemsAssistant.txt
	// Generated by: modularize -module-map-path=Output/NoProblemsAssistant.txt \
	     -root-module=Root NoProblemsAssistant.modularize

	module Root {
	  module SomeTypes {
	    header "SomeTypes.h"
	    export *
	  }
	  module SomeDecls {
	    header "SomeDecls.h"
	    export *
	  }
	  module SubModule1 {
	    module Header1 {
	      header "SubModule1/Header1.h"
	      export *
	    }
	    module Header2 {
	      header "SubModule1/Header2.h"
	      export *
	    }
	  }
	  module SubModule2 {
	    module Header3 {
	      header "SubModule2/Header3.h"
	      export *
	    }
	    module Header4 {
	      header "SubModule2/Header4.h"
	      export *
	    }
	    header "SubModule2.h"
	    export *
	  }
	}

     Note that headers with dependents will be ignored with a  warning,  as  the
     Clang module mechanism doesn't support headers the rely on other headers to
     be included first.

     The  module  map format defines some keywords which can't be used in module
     names. If a header has one of these names,  an  underscore  ('_')	will  be
     prepended to the name. For example, if the header name is header.h, because
     header  is  a  keyword, the module name will be _header.  For a list of the
     module map keywords, please see: Lexical structure

PP-TRACE USER'S MANUAL
     pp-trace is a standalone tool that traces preprocessor activity. It's  also
     used  as  a  test of Clang's PPCallbacks interface.  It runs a given source
     file through the Clang preprocessor, displaying selected  information  from
     callback functions overridden in a PPCallbacks derivation. The output is in
     a high-level YAML format, described in pp-trace Output Format.

   pp-trace Usage
   Command Line Format
     pp-trace [<pp-trace-options>] <source-file> [-- <front-end-options>]

     <pp-trace-options>  is  a	place-holder  for  options specific to pp-trace,
     which are described below in Command Line Options.

     <source-file> specifies the source file to run through the preprocessor.

     <front-end-options> is a place-holder for regular Clang  Compiler	Options,
     which must follow the <source-file>.

   Command Line Options
     -callbacks <comma-separated-globs>
	    This option specifies a comma-separated list of globs describing the
	    list  of callbacks that should be traced. Globs are processed in or-
	    der of appearance.	Positive globs add matched callbacks to the set,
	    netative globs (those with the '-' prefix) remove callacks from  the
	    set.

	    * FileChanged

	    * FileSkipped

	    * FileNotFound

	    * InclusionDirective

	    * moduleImport

	    * EndOfMainFile

	    * Ident

	    * PragmaDirective

	    * PragmaComment

	    * PragmaDetectMismatch

	    * PragmaDebug

	    * PragmaMessage

	    * PragmaDiagnosticPush

	    * PragmaDiagnosticPop

	    * PragmaDiagnostic

	    * PragmaOpenCLExtension

	    * PragmaWarning

	    * PragmaWarningPush

	    * PragmaWarningPop

	    * MacroExpands

	    * MacroDefined

	    * MacroUndefined

	    * Defined

	    * SourceRangeSkipped

	    * If

	    * Elif

	    * Ifdef

	    * Ifndef

	    * Else

	    * Endif

     -output <output-file>
	    By	default,  pp-trace  outputs the trace information to stdout. Use
	    this option to output the trace information to a file.

   pp-trace Output Format
     The pp-trace output is formatted as YAML. See https://yaml.org/ for general
     YAML information. It's arranged as a  sequence  of  information  about  the
     callback  call,  including  the callback name and argument information, for
     example::

	---
	- Callback: Name
	  Argument1: Value1
	  Argument2: Value2
	(etc.)
	...

     With real data::

	---
	- Callback: FileChanged
	  Loc: "c:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-include.cpp:1:1"
	  Reason: EnterFile
	  FileType: C_User
	  PrevFID: (invalid)
	  (etc.)
	- Callback: FileChanged
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-include.cpp:5:1"
	  Reason: ExitFile
	  FileType: C_User
	  PrevFID: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/Input/Level1B.h"
	- Callback: EndOfMainFile
	...

     In all but one case (MacroDirective) the "Argument" scalars have  the  same
     name as the argument in the corresponding PPCallbacks callback function.

   Callback Details
     The  following  sections  describe  the  purpose and output format for each
     callback.

     Click on the callback name in the section heading to see the Doxygen  docu-
     mentation for the callback.

     The argument descriptions table describes the callback argument information
     displayed.

     The Argument Name field in most (but not all) cases is the same name as the
     callback function parameter.

     The Argument Value Syntax field describes the values that will be displayed
     for the argument value. It uses an ad hoc representation that mixes literal
     and  symbolic  representations. Enumeration member symbols are shown as the
     actual enum member in a (member1|member2|...) form. A name  in  parentheses
     can  either  represent  a	place holder for the described value, or confus-
     ingly, it might be a literal, such as (null), for a  null	pointer.   Loca-
     tions are shown as quoted only to avoid confusing the documentation genera-
     tor.

     The  Clang  C++  Type field is the type from the callback function declara-
     tion.

     The description describes the argument or what is displayed for it.

     Note that in some cases, such as when a structure pointer	is  an	argument
     value,  only  some  key member or members are shown to represent the value,
     instead of trying to display all members of the structure.

   FileChanged Callback
     FileChanged is called when the preprocessor enters or exits  a  file,  both
     the  top  level file being compiled, as well as any #include directives. It
     will also be called as a result of a system header pragma	or  in	internal
     renaming of a file.

     Argument descriptions:
  +---------------+-----------------------+------------------+------------------+
  | Argument Name | Argument   Value	  | Clang C++ Type   | Description	|
  |		  | Syntax		  |		     |			|
  +---------------+-----------------------+------------------+------------------+
  | Loc 	  | "(file):(line):(col)" | SourceLocation   | The location  of |
  |		  |			  |		     | the directive.	|
  +---------------+-----------------------+------------------+------------------+
  | Reason	  | (EnterFile|Exit-	  | PPCall-	     | Reason	    for |
  |		  | File|SystemHeader-	  | backs::FileChan- | change.		|
  |		  | Pragma|RenameFile)	  | geReason	     |			|
  +---------------+-----------------------+------------------+------------------+
  | FileType	  | (C_User|C_Sys-	  | SrcMgr::Charac-  | Include type.	|
  |		  | tem|C_ExternCSystem)  | teristicKind     |			|
  +---------------+-----------------------+------------------+------------------+
  | PrevFID	  | ((file)|(invalid))	  | FileID	     | Previous   file, |
  |		  |			  |		     | if any.		|
  +---------------+-----------------------+------------------+------------------+

     Example::

	- Callback: FileChanged
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-include.cpp:1:1"
	  Reason: EnterFile
	  FileType: C_User
	  PrevFID: (invalid)

   FileSkipped Callback
     FileSkipped is called when a source file is skipped as the result of header
     guard optimization.

     Argument descriptions:
     +---------------+------------------+-----------------+------------------+
     | Argument Name | Argument   Value | Clang C++ Type  | Description      |
     |		     | Syntax		|		  |		     |
     +---------------+------------------+-----------------+------------------+
     | ParentFile    | ("(file)"     or | const FileEntry | The   file	that |
     |		     | (null))		|		  | #included	 the |
     |		     |			|		  | skipped file.    |
     +---------------+------------------+-----------------+------------------+
     | FilenameTok   | (token)		| const Token	  | The   token   in |
     |		     |			|		  | ParentFile	that |
     |		     |			|		  | indicates	 the |
     |		     |			|		  | skipped file.    |
     +---------------+------------------+-----------------+------------------+
     | FileType      | (C_User|C_Sys-	| SrcMgr::Charac- | The file type.   |
     |		     | tem|C_ExternC-	| teristicKind	  |		     |
     |		     | System)		|		  |		     |
     +---------------+------------------+-----------------+------------------+

     Example::

	- Callback: FileSkipped
	  ParentFile: "/path/filename.h"
	  FilenameTok: "filename.h"
	  FileType: C_User

   FileNotFound Callback
     FileNotFound  is  called  when  an  inclusion  directive	results   in   a
     file-not-found error.

     Argument descriptions:
      +---------------+------------------+----------------+------------------+
      | Argument Name | Argument   Value | Clang C++ Type | Description      |
      | 	      | Syntax		 |		  |		     |
      +---------------+------------------+----------------+------------------+
      | FileName      | "(file)"	 | StringRef	  | The name of  the |
      | 	      | 		 |		  | file  being  in- |
      | 	      | 		 |		  | cluded, as writ- |
      | 	      | 		 |		  | ten    in	 the |
      | 	      | 		 |		  | source code.     |
      +---------------+------------------+----------------+------------------+
      | RecoveryPath  | (path)		 | SmallVec-	  | If	this  client |
      | 	      | 		 | torImpl<char>  | indicates	that |
      | 	      | 		 |		  | it	can  recover |
      | 	      | 		 |		  | from this  miss- |
      | 	      | 		 |		  | ing   file,  the |
      | 	      | 		 |		  | client    should |
      | 	      | 		 |		  | set  this  as an |
      | 	      | 		 |		  | additional	     |
      | 	      | 		 |		  | header    search |
      | 	      | 		 |		  | patch.	     |
      +---------------+------------------+----------------+------------------+

     Example::

	- Callback: FileNotFound
	  FileName: "/path/filename.h"
	  RecoveryPath:

   InclusionDirective Callback
     InclusionDirective  is called when an inclusion directive of any kind (#in-
     clude</code>, #import</code>,  etc.)  has	been  processed,  regardless  of
     whether the inclusion will actually result in an inclusion.

     Argument descriptions:
   +---------------+-----------------------+-----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type  | Description	|
   |		   | Syntax		   |		     |			|
   +---------------+-----------------------+-----------------+------------------+
   | HashLoc	   | "(file):(line):(col)" | SourceLocation  | The location  of |
   |		   |			   |		     | the   '#'   that |
   |		   |			   |		     | starts  the  in- |
   |		   |			   |		     | clusion	 direc- |
   |		   |			   |		     | tive.		|
   +---------------+-----------------------+-----------------+------------------+
   | IncludeTok    | (token)		   | const Token     | The  token  that |
   |		   |			   |		     | indicates    the |
   |		   |			   |		     | kind  of  inclu- |
   |		   |			   |		     | sion  directive, |
   |		   |			   |		     | e.g.,  'include' |
   |		   |			   |		     | or 'import'.	|
   +---------------+-----------------------+-----------------+------------------+
   | FileName	   | "(file)"		   | StringRef	     | The  name of the |
   |		   |			   |		     | file  being  in- |
   |		   |			   |		     | cluded, as writ- |
   |		   |			   |		     | ten    in    the |
   |		   |			   |		     | source code.	|
   +---------------+-----------------------+-----------------+------------------+
   | IsAngled	   | (true|false)	   | bool	     | Whether the file |
   |		   |			   |		     | name   was   en- |
   |		   |			   |		     | closed  in angle |
   |		   |			   |		     | brackets; other- |
   |		   |			   |		     | wise, it was en- |
   |		   |			   |		     | closed	     in |
   |		   |			   |		     | quotes.		|
   +---------------+-----------------------+-----------------+------------------+
   | FilenameRange | "(file)"		   | CharSourceRange | The    character |
   |		   |			   |		     | range   of   the |
   |		   |			   |		     | quotes  or angle |
   |		   |			   |		     | brackets for the |
   |		   |			   |		     | written	   file |
   |		   |			   |		     | name.		|
   +---------------+-----------------------+-----------------+------------------+
   | File	   | "(file)"		   | const FileEntry | The  actual file |
   |		   |			   |		     | that may be  in- |
   |		   |			   |		     | cluded  by  this |
   |		   |			   |		     | inclusion direc- |
   |		   |			   |		     | tive.		|
   +---------------+-----------------------+-----------------+------------------+
   | SearchPath    | "(path)"		   | StringRef	     | Contains     the |
   |		   |			   |		     | search	   path |
   |		   |			   |		     | which  was  used |
   |		   |			   |		     | to find the file |
   |		   |			   |		     | in the file sys- |
   |		   |			   |		     | tem.		|
   +---------------+-----------------------+-----------------+------------------+
   | RelativePath  | "(path)"		   | StringRef	     | The  path  rela- |
   |		   |			   |		     | tive to	Search- |
   |		   |			   |		     | Path,  at  which |
   |		   |			   |		     | the include file |
   |		   |			   |		     | was found.	|
   +---------------+-----------------------+-----------------+------------------+
   | Imported	   | ((module		   | const Module    | The	module, |
   |		   | name)|(null))	   |		     | whenever  an in- |
   |		   |			   |		     | clusion	 direc- |
   |		   |			   |		     | tive  was  auto- |
   |		   |			   |		     | matically turned |
   |		   |			   |		     | into  a	 module |
   |		   |			   |		     | import  or  null |
   |		   |			   |		     | otherwise.	|
   +---------------+-----------------------+-----------------+------------------+

     Example::

	- Callback: InclusionDirective
	  IncludeTok: include
	  FileName: "Input/Level1B.h"
	  IsAngled: false
	  FilenameRange: "Input/Level1B.h"
	  File: "D:/Clang/llvmnewmod/clang-tools-extra/test/pp-trace/Input/Level1B.h"
	  SearchPath: "D:/Clang/llvmnewmod/clang-tools-extra/test/pp-trace"
	  RelativePath: "Input/Level1B.h"
	  Imported: (null)

   moduleImport Callback
     moduleImport is called when there was an explicit module-import syntax.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | ImportLoc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | import directive |
   |		   |			   |		    | token.	       |
   +---------------+-----------------------+----------------+------------------+
   | Path	   | "(path)"		   | ModuleIdPath   | The  identifiers |
   |		   |			   |		    | (and their loca- |
   |		   |			   |		    | tions)   of  the |
   |		   |			   |		    | module "path".   |
   +---------------+-----------------------+----------------+------------------+
   | Imported	   | ((module		   | const Module   | The     imported |
   |		   | name)|(null))	   |		    | module;  can  be |
   |		   |			   |		    | null if  import- |
   |		   |			   |		    | ing failed.      |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: moduleImport
	  ImportLoc: "d:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-modules.cpp:4:2"
	  Path: [{Name: Level1B, Loc: "d:/Clang/llvmnewmod/clang-tools-extra/test/pp-trace/pp-trace-modules.cpp:4:9"}, {Name: Level2B, Loc: "d:/Clang/llvmnewmod/clang-tools-extra/test/pp-trace/pp-trace-modules.cpp:4:17"}]
	  Imported: Level2B

   EndOfMainFile Callback
     EndOfMainFile is called when the end of the main file is reached.

     Argument descriptions:
	+----------------+------------------+----------------+-------------+
	| Argument Name  | Argument   Value | Clang C++ Type | Description |
	|		 | Syntax	    |		     |		   |
	+----------------+------------------+----------------+-------------+
	| (no arguments) |		    |		     |		   |
	+----------------+------------------+----------------+-------------+

     Example::

	- Callback: EndOfMainFile

   Ident Callback
     Ident is called when a #ident or #sccs directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | str	   | (name)		   | const	    | The text of  the |
   |		   |			   | std::string    | directive.       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: Ident
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-ident.cpp:3:1"
	  str: "$Id$"

   PragmaDirective Callback
     PragmaDirective is called when start reading any pragma directive.

     Argument descriptions:
+---------------+----------------------------------+-----------------+------------------+
| Argument Name | Argument   Value		   | Clang C++ Type  | Description	|
|		| Syntax			   |		     |			|
+---------------+----------------------------------+-----------------+------------------+
| Loc		| "(file):(line):(col)" 	   | SourceLocation  | The location  of |
|		|				   |		     | the directive.	|
+---------------+----------------------------------+-----------------+------------------+
| Introducer	| (PIK_Hash-			   | PragmaIntroduc- | The  type of the |
|		| Pragma|PIK__Pragma|PIK___pragma) | erKind	     | pragma	 direc- |
|		|				   |		     | tive.		|
+---------------+----------------------------------+-----------------+------------------+

     Example::

	- Callback: PragmaDirective
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Introducer: PIK_HashPragma

   PragmaComment Callback
     PragmaComment is called when a #pragma comment directive is read.

     Argument descriptions:
  +---------------+-----------------------+------------------+------------------+
  | Argument Name | Argument   Value	  | Clang C++ Type   | Description	|
  |		  | Syntax		  |		     |			|
  +---------------+-----------------------+------------------+------------------+
  | Loc 	  | "(file):(line):(col)" | SourceLocation   | The location  of |
  |		  |			  |		     | the directive.	|
  +---------------+-----------------------+------------------+------------------+
  | Kind	  | ((name)|(null))	  | const    Identi- | The comment kind |
  |		  |			  | fierInfo	     | symbol.		|
  +---------------+-----------------------+------------------+------------------+
  | Str 	  | (message directive)   | const	     | The comment mes- |
  |		  |			  | std::string      | sage directive.	|
  +---------------+-----------------------+------------------+------------------+

     Example::

	- Callback: PragmaComment
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Kind: library
	  Str: kernel32.lib

   PragmaDetectMismatch Callback
     PragmaDetectMismatch is called when a #pragma detect_mismatch directive  is
     read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Name	   | "(name)"		   | const	    | The name.        |
   |		   |			   | std::string    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Value	   | (string)		   | const	    | The value.       |
   |		   |			   | std::string    |		       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaDetectMismatch
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Name: name
	  Value: value

   PragmaDebug Callback
     PragmaDebug is called when a #pragma clang __debug directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | DebugType	   | (string)		   | StringRef	    | Indicates   type |
   |		   |			   |		    | of  debug   mes- |
   |		   |			   |		    | sage.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaDebug
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  DebugType: warning

   PragmaMessage Callback
     PragmaMessage is called when a #pragma message directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Namespace	   | (name)		   | StringRef	    | The namespace of |
   |		   |			   |		    | the  message di- |
   |		   |			   |		    | rective.	       |
   +---------------+-----------------------+----------------+------------------+
   | Kind	   | (PMK_Mes-		   | PPCall-	    | The type of  the |
   |		   | sage|PMK_Warn-	   | backs::Prag-   | message	direc- |
   |		   | ing|PMK_Error)	   | maMessageKind  | tive.	       |
   +---------------+-----------------------+----------------+------------------+
   | Str	   | (string)		   | StringRef	    | The text of  the |
   |		   |			   |		    | message	direc- |
   |		   |			   |		    | tive.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaMessage
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Namespace: "GCC"
	  Kind: PMK_Message
	  Str: The message text.

   PragmaDiagnosticPush Callback
     PragmaDiagnosticPush is called when a #pragma gcc diagnostic push directive
     is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Namespace	   | (name)		   | StringRef	    | Namespace name.  |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaDiagnosticPush
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Namespace: "GCC"

   PragmaDiagnosticPop Callback
     PragmaDiagnosticPop is called when a #pragma gcc diagnostic  pop  directive
     is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Namespace	   | (name)		   | StringRef	    | Namespace name.  |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaDiagnosticPop
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Namespace: "GCC"

   PragmaDiagnostic Callback
     PragmaDiagnostic is called when a #pragma gcc diagnostic directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Namespace	   | (name)		   | StringRef	    | Namespace name.  |
   +---------------+-----------------------+----------------+------------------+
   | mapping	   | (0|MAP_IG- 	   | diag::Severity | Mapping type.    |
   |		   | NORE|MAP_WARN-	   |		    |		       |
   |		   | ING|MAP_ERROR|MAP_FA- |		    |		       |
   |		   | TAL)		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Str	   | (string)		   | StringRef	    | Warning/error    |
   |		   |			   |		    | name.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaDiagnostic
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Namespace: "GCC"
	  mapping: MAP_WARNING
	  Str: WarningName

   PragmaOpenCLExtension Callback
     PragmaOpenCLExtension is called when OpenCL extension is either disabled or
     enabled with a pragma.

     Argument descriptions:
  +---------------+-----------------------+------------------+------------------+
  | Argument Name | Argument   Value	  | Clang C++ Type   | Description	|
  |		  | Syntax		  |		     |			|
  +---------------+-----------------------+------------------+------------------+
  | NameLoc	  | "(file):(line):(col)" | SourceLocation   | The location  of |
  |		  |			  |		     | the name.	|
  +---------------+-----------------------+------------------+------------------+
  | Name	  | (name)		  | const    Identi- | Name symbol.	|
  |		  |			  | fierInfo	     |			|
  +---------------+-----------------------+------------------+------------------+
  | StateLoc	  | "(file):(line):(col)" | SourceLocation   | The location  of |
  |		  |			  |		     | the state.	|
  +---------------+-----------------------+------------------+------------------+
  | State	  | (1|0)		  | unsigned	     | Enabled/disabled |
  |		  |			  |		     | state.		|
  +---------------+-----------------------+------------------+------------------+

     Example::

	- Callback: PragmaOpenCLExtension
	  NameLoc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:10"
	  Name: Name
	  StateLoc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:18"
	  State: 1

   PragmaWarning Callback
     PragmaWarning is called when a #pragma warning directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | WarningSpec   | (string)		   | StringRef	    | The      warning |
   |		   |			   |		    | specifier.       |
   +---------------+-----------------------+----------------+------------------+
   | Ids	   | [(number)[, ...]]	   | ArrayRef<int>  | The warning num- |
   |		   |			   |		    | bers.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaWarning
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  WarningSpec: disable
	  Ids: 1,2,3

   PragmaWarningPush Callback
     PragmaWarningPush is called when a #pragma warning(push) directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+
   | Level	   | (number)		   | int	    | Warning level.   |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaWarningPush
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"
	  Level: 1

   PragmaWarningPop Callback
     PragmaWarningPop is called when a #pragma warning(pop) directive is read.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the directive.   |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: PragmaWarningPop
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-pragma.cpp:3:1"

   MacroExpands Callback
     MacroExpands is called when ::HandleMacroExpandedIdentifier  when	a  macro
     invocation is found.

     Argument descriptions:
 +----------------+-------------------------+------------------+------------------+
 | Argument Name  | Argument   Value	    | Clang C++ Type   | Description	  |
 |		  | Syntax		    |		       |		  |
 +----------------+-------------------------+------------------+------------------+
 | MacroNameTok   | (token)		    | const Token      | The  macro  name |
 |		  |			    |		       | token. 	  |
 +----------------+-------------------------+------------------+------------------+
 | MacroDirective | (MD_De-		    | const   MacroDi- | The   kind    of |
 |		  | fine|MD_Unde-	    | rective	       | macro	directive |
 |		  | fine|MD_Visibil-	    |		       | from	      the |
 |		  | ity)		    |		       | MacroDirective   |
 |		  |			    |		       | structure.	  |
 +----------------+-------------------------+------------------+------------------+
 | Range	  | ["(file):(line):(col)", | SourceRange      | The source range |
 |		  | "(file):(line):(col)"]  |		       | for  the  expan- |
 |		  |			    |		       | sion.		  |
 +----------------+-------------------------+------------------+------------------+
 | Args 	  | [(name)|(number)|<(to-  | const MacroArgs  | The argument to- |
 |		  | ken name)>[, ...]]	    |		       | kens. Names  and |
 |		  |			    |		       | numbers are lit- |
 |		  |			    |		       | eral, everything |
 |		  |			    |		       | else  is  of the |
 |		  |			    |		       | form '<'  token- |
 |		  |			    |		       | Name '>'.	  |
 +----------------+-------------------------+------------------+------------------+

     Example::

	- Callback: MacroExpands
	  MacroNameTok: X_IMPL
	  MacroDirective: MD_Define
	  Range: [(nonfile), (nonfile)]
	  Args: [a <plus> y, b]

   MacroDefined Callback
     MacroDefined is called when a macro definition is seen.

     Argument descriptions:
    +----------------+------------------+------------------+------------------+
    | Argument Name  | Argument   Value | Clang C++ Type   | Description      |
    |		     | Syntax		|		   |		      |
    +----------------+------------------+------------------+------------------+
    | MacroNameTok   | (token)		| const Token	   | The  macro  name |
    |		     |			|		   | token.	      |
    +----------------+------------------+------------------+------------------+
    | MacroDirective | (MD_De-		| const   MacroDi- | The   kind    of |
    |		     | fine|MD_Unde-	| rective	   | macro  directive |
    |		     | fine|MD_Visibil- |		   | from	  the |
    |		     | ity)		|		   | MacroDirective   |
    |		     |			|		   | structure.       |
    +----------------+------------------+------------------+------------------+

     Example::

	- Callback: MacroDefined
	  MacroNameTok: X_IMPL
	  MacroDirective: MD_Define

   MacroUndefined Callback
     MacroUndefined is called when a macro #undef is seen.

     Argument descriptions:
    +----------------+------------------+------------------+------------------+
    | Argument Name  | Argument   Value | Clang C++ Type   | Description      |
    |		     | Syntax		|		   |		      |
    +----------------+------------------+------------------+------------------+
    | MacroNameTok   | (token)		| const Token	   | The  macro  name |
    |		     |			|		   | token.	      |
    +----------------+------------------+------------------+------------------+
    | MacroDirective | (MD_De-		| const   MacroDi- | The   kind    of |
    |		     | fine|MD_Unde-	| rective	   | macro  directive |
    |		     | fine|MD_Visibil- |		   | from	  the |
    |		     | ity)		|		   | MacroDirective   |
    |		     |			|		   | structure.       |
    +----------------+------------------+------------------+------------------+

     Example::

	- Callback: MacroUndefined
	  MacroNameTok: X_IMPL
	  MacroDirective: MD_Define

   Defined Callback
     Defined is called when the 'defined' operator is seen.

     Argument descriptions:
 +----------------+-------------------------+------------------+------------------+
 | Argument Name  | Argument   Value	    | Clang C++ Type   | Description	  |
 |		  | Syntax		    |		       |		  |
 +----------------+-------------------------+------------------+------------------+
 | MacroNameTok   | (token)		    | const Token      | The  macro  name |
 |		  |			    |		       | token. 	  |
 +----------------+-------------------------+------------------+------------------+
 | MacroDirective | (MD_De-		    | const   MacroDi- | The   kind    of |
 |		  | fine|MD_Unde-	    | rective	       | macro	directive |
 |		  | fine|MD_Visibil-	    |		       | from	      the |
 |		  | ity)		    |		       | MacroDirective   |
 |		  |			    |		       | structure.	  |
 +----------------+-------------------------+------------------+------------------+
 | Range	  | ["(file):(line):(col)", | SourceRange      | The source range |
 |		  | "(file):(line):(col)"]  |		       | for  the  direc- |
 |		  |			    |		       | tive.		  |
 +----------------+-------------------------+------------------+------------------+

     Example::

	- Callback: Defined
	  MacroNameTok: MACRO
	  MacroDirective: (null)
	  Range: ["D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:5", "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:19"]

   SourceRangeSkipped Callback
     SourceRangeSkipped is called when a source range is skipped.

     Argument descriptions:
  +---------------+-------------------------+----------------+------------------+
  | Argument Name | Argument   Value	    | Clang C++ Type | Description	|
  |		  | Syntax		    |		     |			|
  +---------------+-------------------------+----------------+------------------+
  | Range	  | ["(file):(line):(col)", | SourceRange    | The source range |
  |		  | "(file):(line):(col)"]  |		     | skipped. 	|
  +---------------+-------------------------+----------------+------------------+

     Example::

	- Callback: SourceRangeSkipped
	  Range: [":/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:2", ":/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:9:2"]

   If Callback
     If is called when an #if is seen.

     Argument descriptions:
  +----------------+-------------------------+----------------+------------------+
  | Argument Name  | Argument	Value	     | Clang C++ Type | Description	 |
  |		   | Syntax		     |		      | 		 |
  +----------------+-------------------------+----------------+------------------+
  | Loc 	   | "(file):(line):(col)"   | SourceLocation | The location  of |
  |		   |			     |		      | the directive.	 |
  +----------------+-------------------------+----------------+------------------+
  | ConditionRange | ["(file):(line):(col)", | SourceRange    | The source range |
  |		   | "(file):(line):(col)"]  |		      | for  the  condi- |
  |		   |			     |		      | tion.		 |
  +----------------+-------------------------+----------------+------------------+
  | ConditionValue | (true|false)	     | bool	      | The    condition |
  |		   |			     |		      | value.		 |
  +----------------+-------------------------+----------------+------------------+

     Example::

	- Callback: If
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:2"
	  ConditionRange: ["D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:4", "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:9:1"]
	  ConditionValue: false

   Elif Callback
     Elif is called when an #elif is seen.

     Argument descriptions:
  +----------------+-------------------------+----------------+------------------+
  | Argument Name  | Argument	Value	     | Clang C++ Type | Description	 |
  |		   | Syntax		     |		      | 		 |
  +----------------+-------------------------+----------------+------------------+
  | Loc 	   | "(file):(line):(col)"   | SourceLocation | The location  of |
  |		   |			     |		      | the directive.	 |
  +----------------+-------------------------+----------------+------------------+
  | ConditionRange | ["(file):(line):(col)", | SourceRange    | The source range |
  |		   | "(file):(line):(col)"]  |		      | for  the  condi- |
  |		   |			     |		      | tion.		 |
  +----------------+-------------------------+----------------+------------------+
  | ConditionValue | (true|false)	     | bool	      | The    condition |
  |		   |			     |		      | value.		 |
  +----------------+-------------------------+----------------+------------------+
  | IfLoc	   | "(file):(line):(col)"   | SourceLocation | The  location of |
  |		   |			     |		      | the directive.	 |
  +----------------+-------------------------+----------------+------------------+

     Example::

	- Callback: Elif
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:10:2"
	  ConditionRange: ["D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:10:4", "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:11:1"]
	  ConditionValue: false
	  IfLoc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:2"

   Ifdef Callback
     Ifdef is called when an #ifdef is seen.

     Argument descriptions:
  +----------------+-----------------------+------------------+------------------+
  | Argument Name  | Argument	Value	   | Clang C++ Type   | Description	 |
  |		   | Syntax		   |		      | 		 |
  +----------------+-----------------------+------------------+------------------+
  | Loc 	   | "(file):(line):(col)" | SourceLocation   | The  location of |
  |		   |			   |		      | the directive.	 |
  +----------------+-----------------------+------------------+------------------+
  | MacroNameTok   | (token)		   | const Token      | The  macro  name |
  |		   |			   |		      | token.		 |
  +----------------+-----------------------+------------------+------------------+
  | MacroDirective | (MD_Define|MD_Unde-   | const   MacroDi- | The   kind    of |
  |		   | fine|MD_Visibility)   | rective	      | macro  directive |
  |		   |			   |		      | from	     the |
  |		   |			   |		      | MacroDirective	 |
  |		   |			   |		      | structure.	 |
  +----------------+-----------------------+------------------+------------------+

     Example::

	- Callback: Ifdef
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp:3:1"
	  MacroNameTok: MACRO
	  MacroDirective: MD_Define

   Ifndef Callback
     Ifndef is called when an #ifndef is seen.

     Argument descriptions:
  +----------------+-----------------------+------------------+------------------+
  | Argument Name  | Argument	Value	   | Clang C++ Type   | Description	 |
  |		   | Syntax		   |		      | 		 |
  +----------------+-----------------------+------------------+------------------+
  | Loc 	   | "(file):(line):(col)" | SourceLocation   | The location  of |
  |		   |			   |		      | the directive.	 |
  +----------------+-----------------------+------------------+------------------+
  | MacroNameTok   | (token)		   | const Token      | The  macro  name |
  |		   |			   |		      | token.		 |
  +----------------+-----------------------+------------------+------------------+
  | MacroDirective | (MD_Define|MD_Unde-   | const   MacroDi- | The    kind   of |
  |		   | fine|MD_Visibility)   | rective	      | macro  directive |
  |		   |			   |		      | from	     the |
  |		   |			   |		      | MacroDirective	 |
  |		   |			   |		      | structure.	 |
  +----------------+-----------------------+------------------+------------------+

     Example::

	- Callback: Ifndef
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp:3:1"
	  MacroNameTok: MACRO
	  MacroDirective: MD_Define

   Else Callback
     Else is called when an #else is seen.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the else	direc- |
   |		   |			   |		    | tive.	       |
   +---------------+-----------------------+----------------+------------------+
   | IfLoc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the  if	direc- |
   |		   |			   |		    | tive.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: Else
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:10:2"
	  IfLoc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:2"

   Endif Callback
     Endif is called when an #endif is seen.

     Argument descriptions:
   +---------------+-----------------------+----------------+------------------+
   | Argument Name | Argument	Value	   | Clang C++ Type | Description      |
   |		   | Syntax		   |		    |		       |
   +---------------+-----------------------+----------------+------------------+
   | Loc	   | "(file):(line):(col)" | SourceLocation | The location  of |
   |		   |			   |		    | the endif direc- |
   |		   |			   |		    | tive.	       |
   +---------------+-----------------------+----------------+------------------+
   | IfLoc	   | "(file):(line):(col)" | SourceLocation | The  location of |
   |		   |			   |		    | the  if	direc- |
   |		   |			   |		    | tive.	       |
   +---------------+-----------------------+----------------+------------------+

     Example::

	- Callback: Endif
	  Loc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:10:2"
	  IfLoc: "D:/Clang/llvm/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp:8:2"

   Building pp-trace
     To build from source:

     1. Read  Getting Started with the LLVM System and Clang Tools Documentation
	for information on getting sources for	LLVM,  Clang,  and  Clang  Extra
	Tools.

     2. Getting  Started  with the LLVM System and Building LLVM with CMake give
	directions for how to build. With sources all checked out into the right
	place the LLVM build will build Clang Extra Tools and their dependencies
	automatically.

	* If using CMake, you can also use the pp-trace target to build just the
	  pp-trace tool and its dependencies.

CLANG-RENAME
   Contents
     * Clang-Rename

       * Using Clang-Rename

       * Vim Integration

       * Emacs Integration

     See also:

     clang-rename is a C++ refactoring tool. Its purpose is to perform efficient
     renaming actions in large-scale projects such as  renaming  classes,  func-
     tions, variables, arguments, namespaces etc.

     The  tool is in a very early development stage, so you might encounter bugs
     and crashes. Submitting reports with information about how to reproduce the
     issue to the LLVM bugtracker will definitely help the project. If you  have
     any ideas or suggestions, you might want to put a feature request there.

   Using Clang-Rename
     clang-rename  is  a  LibTooling-based tool, and it's easier to work with if
     you set up a compile command database for your project (for an  example  of
     how  to  do  this	see How To Setup Tooling For LLVM). You can also specify
     compilation options on the command line after --:

	$ clang-rename -offset=42 -new-name=foo test.cpp -- -Imy_project/include -DMY_DEFINES ...

     To get an offset of a symbol in a file run

	$ grep -FUbo 'foo' file.cpp

     The tool currently supports renaming actions inside  a  single  translation
     unit  only.  It  is  planned  to extend the tool's functionality to support
     multi-TU renaming actions in the future.

     clang-rename also aims to be easily integrated into popular  text	editors,
     such as Vim and Emacs, and improve the workflow of users.

     Although  a  command line interface exists, it is highly recommended to use
     the text editor interface instead for better experience.

     You can also identify one or more symbols to be renamed by giving the fully
     qualified name:

	$ clang-rename -qualified-name=foo -new-name=bar test.cpp

     Renaming multiple symbols at once is supported, too. However,  clang-rename
     doesn't  accept  both -offset and -qualified-name at the same time. So, you
     can either specify multiple -offset or -qualified-name.

	$ clang-rename -offset=42 -new-name=bar1 -offset=150 -new-name=bar2 test.cpp

     or

	$ clang-rename -qualified-name=foo1 -new-name=bar1 -qualified-name=foo2 -new-name=bar2 test.cpp

     Alternatively, {offset | qualified-name} / new-name pairs can be put into a
     YAML file:

	---
	- Offset:	  42
	  NewName:	  bar1
	- Offset:	  150
	  NewName:	  bar2
	...

     or

	---
	- QualifiedName:  foo1
	  NewName:	  bar1
	- QualifiedName:  foo2
	  NewName:	  bar2
	...

     That way you can avoid spelling out all the names	as  command  line  argu-
     ments:

	$ clang-rename -input=test.yaml test.cpp

     clang-rename offers the following options:

	$ clang-rename --help
	USAGE: clang-rename [subcommand] [options] <source0> [... <sourceN>]

	OPTIONS:

	Generic Options:

	  -help 		     - Display available options (-help-hidden for more)
	  -help-list		     - Display list of available options (-help-list-hidden for more)
	  -version		     - Display the version of this program

	clang-rename common options:

	  -export-fixes=<filename>   - YAML file to store suggested fixes in.
	  -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.
	  -force		     - Ignore nonexistent qualified names.
	  -i			     - Overwrite edited <file>s.
	  -input=<string>	     - YAML file to load oldname-newname pairs from.
	  -new-name=<string>	     - The new name to change the symbol to.
	  -offset=<uint>	     - Locates the symbol by offset as opposed to <line>:<column>.
	  -p=<string>		     - Build path
	  -pl			     - Print the locations affected by renaming to stderr.
	  -pn			     - Print the found symbol's name prior to renaming to stderr.
	  -qualified-name=<string>   - The fully qualified name of the symbol.

   Vim Integration
     You  can  call clang-rename directly from Vim! To set up clang-rename inte-
     gration for Vim see clang/tools/clang-rename/clang-rename.py.

     Please note that you have to save all buffers,  in  which	the  replacement
     will happen before running the tool.

     Once  installed,  you  can point your cursor to symbols you want to rename,
     press <leader>cr and type new desired name. The <leader> key is a reference
     to a specific key defined by the mapleader variable and is bound  to  back-
     slash by default.

   Emacs Integration
     You can also use clang-rename while using Emacs! To set up clang-rename in-
     tegration for Emacs see clang-rename/tool/clang-rename.el.

     Once  installed,  you  can point your cursor to symbols you want to rename,
     press M-X, type clang-rename and new desired name.

     Please note that you have to save all buffers,  in  which	the  replacement
     will happen before running the tool.

CLANG-DOC
   Contents
     * Clang-Doc

       * Use

       * Output

       * Configuration

	 * Options

     clang-doc is a tool for generating C and C++ documentation from source code
     and comments.

     The  tool is in a very early development stage, so you might encounter bugs
     and crashes. Submitting reports with information about how to reproduce the
     issue to the LLVM bugtracker will definitely help the project. If you  have
     any ideas or suggestions, please to put a feature request there.

   Use
     clang-doc	is  a  LibTooling-based  tool, and so requires a compile command
     database for your project (for an example of how to  do  this  see  How  To
     Setup Tooling For LLVM).

     By default, the tool will run on all files listed in the given compile com-
     mands database:

	$ clang-doc /path/to/compile_commands.json

     The  tool	can  also  be used on a single file or multiple files if a build
     path is passed with the -p flag.

	$ clang-doc /path/to/file.cpp -p /path/to/build

   Output
     clang-doc produces a directory of documentation. One file is  produced  for
     each  namespace and record in the project source code, containing all docu-
     mentation (including contained functions,	methods,  and  enums)  for  that
     item.

     The top-level directory is configurable through the output flag:

	$ clang-doc -output=output/directory/ compile_commands.json

   Configuration
     Configuration  for  clang-doc is currently limited to command-line options.
     In the future, it may develop the ability to use a configuration file,  but
     no such efforts are currently in progress.

   Options
     clang-doc offers the following options:

	$ clang-doc --help
	USAGE: clang-doc [options] <source0> [... <sourceN>]

	OPTIONS:

	Generic Options:

	  -help 		     - Display available options (-help-hidden for more)
	  -help-list		     - Display list of available options (-help-list-hidden for more)
	  -version		     - Display the version of this program

	clang-doc options:

	  --doxygen		      - Use only doxygen-style comments to generate docs.
	  --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.
	  --format=<value>	      - Format for outputted docs.
	    =yaml		      -   Documentation in YAML format.
	    =md 		      -   Documentation in MD format.
	    =html		      -   Documentation in HTML format.
	  --ignore-map-errors	      - Continue if files are not mapped correctly.
	  --output=<string>	      - Directory for outputting generated files.
	  -p=<string>		      - Build path
	  --project-name=<string>     - Name of project.
	  --public		      - Document only public declarations.
	  --repository=<string>       -
					URL of repository that hosts code.
					Used for links to definition locations.
	  --source-root=<string>      -
					Directory where processed files are stored.
					Links to definition locations will only be
					generated if the file is in this dir.
	  --stylesheets=<string>      - CSS stylesheets to extend the default styles.

     The following flags should only be used if format is set to html: - reposi-
     tory - source-root - stylesheets

     The Doxygen documentation describes the internal software that makes up the
     tools  of clang-tools-extra, not the external use of these tools. The Doxy-
     gen documentation contains no instructions about how to use the tools, only
     the APIs that make up the software. For usage instructions, please see  the
     user's guide or reference manual for each tool.

     * Doxygen documentation

     NOTE:
	This documentation is generated directly from the source code with doxy-
	gen.   Since  the tools of clang-tools-extra are constantly under active
	development, what you're about to read is out of date!

     * Index

     * Search Page

AUTHOR
     The Clang Team

COPYRIGHT
     2007-2026, The Clang Team

12				  Aug 27, 2026		      EXTRACLANGTOOLS(1)

home | help