summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/docs/clang-tidy
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2015-08-27 18:10:07 +0000
committerAlexander Kornienko <alexfh@google.com>2015-08-27 18:10:07 +0000
commitaabfadef84cdcc6aef529348a287e0130f7aee6d (patch)
treec1f69930d251e6b4af7d9d2cc9a17967eb63ff9f /clang-tools-extra/docs/clang-tidy
parent5ce1a84f9a0ae21848b2b7842ae90c2a37d6f6e3 (diff)
downloadbcm5719-llvm-aabfadef84cdcc6aef529348a287e0130f7aee6d.tar.gz
bcm5719-llvm-aabfadef84cdcc6aef529348a287e0130f7aee6d.zip
[clang-tidy] Move clang-tidy docs to a separate directory. Create doc files for checks
The doc files for checks have been generated from the corresponding header files using the docs/clang-tidy/tools/dump_check_docs.py script. Committing the script as well, but the intention is to move all the user-facing docs from header files to the rST files and add links to .h files appropriately. llvm-svn: 246173
Diffstat (limited to 'clang-tools-extra/docs/clang-tidy')
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst19
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst7
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst6
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst29
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst13
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst15
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst14
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst7
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst8
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst25
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/list.rst54
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst4
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst7
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst6
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst18
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst17
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst16
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst11
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst17
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst5
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst7
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst11
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst5
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst9
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst15
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst5
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst6
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst28
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst5
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst4
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst4
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst4
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst29
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst14
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst7
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst15
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst17
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst15
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst14
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst5
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst10
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst76
-rw-r--r--clang-tools-extra/docs/clang-tidy/index.rst510
-rwxr-xr-xclang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py79
53 files changed, 1276 insertions, 0 deletions
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst
new file mode 100644
index 00000000000..2bdd506fdf1
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-explicit-make-pair.rst
@@ -0,0 +1,10 @@
+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'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst
new file mode 100644
index 00000000000..ded979bad6d
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-namespaces.rst
@@ -0,0 +1,9 @@
+google-build-namespaces
+=======================
+
+
+Finds anonymous namespaces in headers.
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Namespaces#Namespaces
+
+Corresponding cpplint.py check name: 'build/namespaces'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst b/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst
new file mode 100644
index 00000000000..4e1a56e9281
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-build-using-namespace.rst
@@ -0,0 +1,19 @@
+google-build-using-namespace
+============================
+
+
+Finds using namespace directives.
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Namespaces#Namespaces
+
+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.
+
+ .. code:: c++
+
+ // Forbidden -- This pollutes the namespace.
+ using namespace foo;
+
+Corresponding cpplint.py check name: ``build/namespaces``.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst
new file mode 100644
index 00000000000..e72bcbf07dc
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-explicit-constructor.rst
@@ -0,0 +1,7 @@
+google-explicit-constructor
+===========================
+
+
+Checks that all single-argument constructors are explicit.
+
+See http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Explicit_Constructors
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst b/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst
new file mode 100644
index 00000000000..3b6815e13fc
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-global-names-in-headers.rst
@@ -0,0 +1,6 @@
+google-global-names-in-headers
+==============================
+
+
+Flag global namespace pollution in header files.
+Right now it only triggers on using declarations and directives.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst
new file mode 100644
index 00000000000..0461d75e499
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-braces-around-statements.rst
@@ -0,0 +1,29 @@
+google-readability-braces-around-statements
+===========================================
+
+
+Checks that bodies of ``if`` statements and loops (``for``, ``range-for``,
+``do-while``, and ``while``) are inside braces
+
+Before:
+
+.. code:: c++
+
+ if (condition)
+ statement;
+
+After:
+
+.. code:: c++
+
+ if (condition) {
+ statement;
+ }
+
+Additionally, one can define an option ``ShortStatementLines`` defining 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. Default value 0
+means that braces will be added to all statements (not having them already).
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst
new file mode 100644
index 00000000000..424e184a01e
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-casting.rst
@@ -0,0 +1,13 @@
+google-readability-casting
+==========================
+
+
+Finds usages of C-style casts.
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Casting#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``.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst
new file mode 100644
index 00000000000..d49e81e5e9d
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-function-size.rst
@@ -0,0 +1,15 @@
+google-readability-function-size
+================================
+
+
+Checks for large functions based on various metrics.
+
+These options are supported:
+
+ * ``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 default is ``800``.
+ * ``BranchThreshold`` - flag functions exceeding this number of control
+ statements. The default is ``-1`` (ignore the number of branches).
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst
new file mode 100644
index 00000000000..cb76ea7e1ac
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-namespace-comments.rst
@@ -0,0 +1,9 @@
+google-readability-namespace-comments
+=====================================
+
+
+Checks that long namespaces have a closing comment.
+
+http://llvm.org/docs/CodingStandards.html#namespace-indentation
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Namespaces
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst
new file mode 100644
index 00000000000..8dba2338477
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-redundant-smartptr-get.rst
@@ -0,0 +1,14 @@
+google-readability-redundant-smartptr-get
+=========================================
+
+
+Find and remove redundant calls to smart pointer's ``.get()`` method.
+
+Examples:
+
+.. code:: c++
+
+ ptr.get()->Foo() ==> ptr->Foo()
+ *ptr.get() ==> *ptr
+ *ptr->get() ==> **ptr
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst b/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst
new file mode 100644
index 00000000000..e07f1bc1d83
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-readability-todo.rst
@@ -0,0 +1,7 @@
+google-readability-todo
+=======================
+
+
+Finds TODO comments without a username or bug number.
+
+Corresponding cpplint.py check: 'readability/todo'
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst
new file mode 100644
index 00000000000..4a82f792740
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-int.rst
@@ -0,0 +1,8 @@
+google-runtime-int
+==================
+
+
+Finds uses of ``short``, ``long`` and ``long long`` and suggest replacing them
+with ``u?intXX(_t)?``.
+
+Correspondig cpplint.py check: 'runtime/int'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst
new file mode 100644
index 00000000000..f0f1fc09b02
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-member-string-references.rst
@@ -0,0 +1,25 @@
+google-runtime-member-string-references
+=======================================
+
+
+Finds members of type ``const string&``.
+
+const string reference members are generally considered unsafe as they can
+be created from a temporary quite easily.
+
+.. code:: c++
+
+ struct S {
+ S(const string &Str) : Str(Str) {}
+ const string &Str;
+ };
+ S instance("string");
+
+In the constructor call a string temporary is created from ``const char *``
+and destroyed immediately after the call. This leaves around a dangling
+reference.
+
+This check emit warnings for both ``std::string`` and ``::string`` const
+reference members.
+
+Corresponding cpplint.py check name: 'runtime/member_string_reference'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst
new file mode 100644
index 00000000000..637cee1550a
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-memset.rst
@@ -0,0 +1,10 @@
+google-runtime-memset
+=====================
+
+
+Finds calls to memset with a literal zero in the length argument.
+
+This is most likely unintended and the length and value arguments are
+swapped.
+
+Corresponding cpplint.py check name: 'runtime/memset'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst
new file mode 100644
index 00000000000..acfbb43af75
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/google-runtime-operator.rst
@@ -0,0 +1,9 @@
+google-runtime-operator
+=======================
+
+
+Finds overloads of unary ``operator &``.
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Operator_Overloading#Operator_Overloading
+
+Corresponding cpplint.py check name: 'runtime/operator'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
new file mode 100644
index 00000000000..1f10dcb9082
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -0,0 +1,54 @@
+List of clang-tidy Checks
+=========================
+
+.. toctree::
+ google-build-explicit-make-pair
+ google-build-namespaces
+ google-build-using-namespace
+ google-explicit-constructor
+ google-global-names-in-headers
+ google-readability-braces-around-statements
+ google-readability-casting
+ google-readability-function-size
+ google-readability-namespace-comments
+ google-readability-redundant-smartptr-get
+ google-readability-todo
+ google-runtime-int
+ google-runtime-member-string-references
+ google-runtime-memset
+ google-runtime-operator
+ llvm-header-guard
+ llvm-include-order
+ llvm-namespace-comment
+ llvm-twine-local
+ misc-argument-comment
+ misc-assert-side-effect
+ misc-assign-operator-signature
+ misc-bool-pointer-implicit-conversion
+ misc-inaccurate-erase
+ misc-inefficient-algorithm
+ misc-macro-parentheses
+ misc-macro-repeated-side-effects
+ misc-move-constructor-init
+ misc-noexcept-move-constructor
+ misc-static-assert
+ misc-swapped-arguments
+ misc-undelegated-constructor
+ misc-uniqueptr-reset-release
+ misc-unused-alias-decls
+ misc-unused-parameters
+ misc-unused-raii
+ misc-use-override
+ modernize-loop-convert
+ modernize-pass-by-value
+ modernize-use-nullptr
+ readability-braces-around-statements
+ readability-container-size-empty
+ readability-else-after-return
+ readability-function-size
+ readability-identifier-naming
+ readability-named-parameter
+ readability-redundant-smartptr-get
+ readability-redundant-string-cstr
+ readability-shrink-to-fit
+ readability-simplify-boolean-expr \ No newline at end of file
diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst
new file mode 100644
index 00000000000..cc4f8d7b231
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst
@@ -0,0 +1,4 @@
+llvm-header-guard
+=================
+
+TODO: add docs
diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst
new file mode 100644
index 00000000000..562ff515529
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-include-order.rst
@@ -0,0 +1,7 @@
+llvm-include-order
+==================
+
+
+Checks the correct order of ``#includes``.
+
+See http://llvm.org/docs/CodingStandards.html#include-style
diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst
new file mode 100644
index 00000000000..8138da71acc
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-namespace-comment.rst
@@ -0,0 +1,9 @@
+llvm-namespace-comment
+======================
+
+
+Checks that long namespaces have a closing comment.
+
+http://llvm.org/docs/CodingStandards.html#namespace-indentation
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Namespaces
diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst
new file mode 100644
index 00000000000..9fb7fec1300
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/llvm-twine-local.rst
@@ -0,0 +1,6 @@
+llvm-twine-local
+================
+
+
+Looks for local ``Twine`` variables which are prone to use after frees and
+should be generally avoided.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst
new file mode 100644
index 00000000000..d3d51218475
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-argument-comment.rst
@@ -0,0 +1,18 @@
+misc-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.
+
+.. code:: c++
+
+ 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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst
new file mode 100644
index 00000000000..dd17732a4cf
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-assert-side-effect.rst
@@ -0,0 +1,17 @@
+misc-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.
+
+There are two 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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst
new file mode 100644
index 00000000000..71d6c7b6d22
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-assign-operator-signature.rst
@@ -0,0 +1,10 @@
+misc-assign-operator-signature
+==============================
+
+
+Finds declarations of assign operators with the wrong return and/or argument
+types.
+
+ * The return type must be ``Class&``.
+ * Works with move-assign and assign by value.
+ * Private and deleted operators are ignored.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst
new file mode 100644
index 00000000000..66fa2ad9a58
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-bool-pointer-implicit-conversion.rst
@@ -0,0 +1,16 @@
+misc-bool-pointer-implicit-conversion
+=====================================
+
+
+Checks for conditions based on implicit conversion from a bool pointer to
+bool.
+
+Example:
+
+.. code:: c++
+
+ bool *p;
+ if (p) {
+ // Never used in a pointer-specific way.
+ }
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst
new file mode 100644
index 00000000000..5d8a8a2378b
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-inaccurate-erase.rst
@@ -0,0 +1,11 @@
+misc-inaccurate-erase
+=====================
+
+
+Checks for inaccurate use of the ``erase()`` method.
+
+Algorithms like ``remove()`` do not actually remove any element from the
+container 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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst
new file mode 100644
index 00000000000..7ef038068c4
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-inefficient-algorithm.rst
@@ -0,0 +1,9 @@
+misc-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 advanatage of the order of the elements.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst
new file mode 100644
index 00000000000..b066272c448
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-parentheses.rst
@@ -0,0 +1,17 @@
+misc-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
+completely 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
+properly.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst
new file mode 100644
index 00000000000..0a1a8d1e978
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-macro-repeated-side-effects.rst
@@ -0,0 +1,5 @@
+misc-macro-repeated-side-effects
+================================
+
+
+Checks for repeated argument with side effects in macros.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst
new file mode 100644
index 00000000000..d105714676b
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-move-constructor-init.rst
@@ -0,0 +1,7 @@
+misc-move-constructor-init
+==========================
+
+
+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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst
new file mode 100644
index 00000000000..9d6438fbca8
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-noexcept-move-constructor.rst
@@ -0,0 +1,11 @@
+misc-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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst
new file mode 100644
index 00000000000..5ee3322eebc
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-static-assert.rst
@@ -0,0 +1,9 @@
+misc-static-assert
+==================
+
+
+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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst
new file mode 100644
index 00000000000..5979d13711e
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-swapped-arguments.rst
@@ -0,0 +1,5 @@
+misc-swapped-arguments
+======================
+
+
+Finds potentially swapped arguments by looking at implicit conversions.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst
new file mode 100644
index 00000000000..d4c567184e5
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-undelegated-constructor.rst
@@ -0,0 +1,9 @@
+misc-undelegated-constructor
+============================
+
+
+Finds creation of temporary objects in constructors that look like a
+function call to another constructor of the same class.
+
+The user most likely meant to use a delegating constructor or base class
+initializer.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst
new file mode 100644
index 00000000000..92c64d763b3
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-uniqueptr-reset-release.rst
@@ -0,0 +1,15 @@
+misc-uniqueptr-reset-release
+============================
+
+
+Find and replace ``unique_ptr::reset(release())`` with ``std::move()``.
+
+Example:
+
+.. code:: c++
+
+ 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>*``.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst
new file mode 100644
index 00000000000..272eb3776ee
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-alias-decls.rst
@@ -0,0 +1,5 @@
+misc-unused-alias-decls
+=======================
+
+
+Finds unused namespace alias declarations.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst
new file mode 100644
index 00000000000..36aae57fd36
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-parameters.rst
@@ -0,0 +1,6 @@
+misc-unused-parameters
+======================
+
+
+Finds unused parameters and fixes them, so that ``-Wunused-parameter`` can be
+turned on.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst
new file mode 100644
index 00000000000..99e50ec755d
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-unused-raii.rst
@@ -0,0 +1,28 @@
+misc-unused-raii
+================
+
+
+Finds temporaries that look like RAII objects.
+
+The canonical example for this is a scoped lock.
+
+.. code:: c++
+
+ {
+ 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 no user-declared constructor. Those are very unlikely
+ to be RAII objects.
+ * Ignore objects at the end of a compound statement (doesn't change
+ behavior).
+ * Ignore objects returned from a call.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst b/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst
new file mode 100644
index 00000000000..d579507f954
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc-use-override.rst
@@ -0,0 +1,5 @@
+misc-use-override
+=================
+
+
+Use C++11's ``override`` and remove ``virtual`` where applicable.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst
new file mode 100644
index 00000000000..0bd0cfec5d8
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-loop-convert.rst
@@ -0,0 +1,4 @@
+modernize-loop-convert
+======================
+
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst
new file mode 100644
index 00000000000..56a0fc303a1
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-pass-by-value.rst
@@ -0,0 +1,4 @@
+modernize-pass-by-value
+=======================
+
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst
new file mode 100644
index 00000000000..1c181773270
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-nullptr.rst
@@ -0,0 +1,4 @@
+modernize-use-nullptr
+=====================
+
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst
new file mode 100644
index 00000000000..c12aed1765c
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-braces-around-statements.rst
@@ -0,0 +1,29 @@
+readability-braces-around-statements
+====================================
+
+
+Checks that bodies of ``if`` statements and loops (``for``, ``range-for``,
+``do-while``, and ``while``) are inside braces
+
+Before:
+
+.. code:: c++
+
+ if (condition)
+ statement;
+
+After:
+
+.. code:: c++
+
+ if (condition) {
+ statement;
+ }
+
+Additionally, one can define an option ``ShortStatementLines`` defining 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. Default value 0
+means that braces will be added to all statements (not having them already).
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst
new file mode 100644
index 00000000000..86562df6a68
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-container-size-empty.rst
@@ -0,0 +1,14 @@
+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
+instead of the ``size()`` method. It is not guaranteed that ``size()`` is a
+constant-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()``
+whenever possible makes it easier to switch to another container in the
+future.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst
new file mode 100644
index 00000000000..54a3f6642b4
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-else-after-return.rst
@@ -0,0 +1,7 @@
+readability-else-after-return
+=============================
+
+
+Flags the usages of ``else`` after ``return``.
+
+http://llvm.org/docs/CodingStandards.html#don-t-use-else-after-a-return
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst
new file mode 100644
index 00000000000..7d5650903d8
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-function-size.rst
@@ -0,0 +1,15 @@
+readability-function-size
+=========================
+
+
+Checks for large functions based on various metrics.
+
+These options are supported:
+
+ * ``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 default is ``800``.
+ * ``BranchThreshold`` - flag functions exceeding this number of control
+ statements. The default is ``-1`` (ignore the number of branches).
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst
new file mode 100644
index 00000000000..66319a593c9
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst
@@ -0,0 +1,17 @@
+readability-identifier-naming
+=============================
+
+
+Checks for identifiers naming style mismatch.
+
+This check will try to enforce coding guidelines on the identifiers naming.
+It supports ``lower_case``, ``UPPER_CASE``, ``camelBack`` and ``CamelCase`` casing
+and tries to convert from one to another if a mismatch is detected.
+
+It also supports a fixed prefix and suffix that will be prepended or
+appended to the identifiers, regardless of the casing.
+
+Many configuration options are available, in order to be able to create
+different rules for different kind of identifier. In general, the
+rules are falling back to a more generic rule if the specific case is not
+configured.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst
new file mode 100644
index 00000000000..bfcabdd9dcb
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-named-parameter.rst
@@ -0,0 +1,15 @@
+readability-named-parameter
+===========================
+
+
+Find functions with unnamed arguments.
+
+The check implements the following rule originating in the Google C++ Style
+Guide:
+
+http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Function_Declarations_and_Definitions#Function_Declarations_and_Definitions
+
+All parameters should be named, with identical names in the declaration and
+implementation.
+
+Corresponding cpplint.py check name: 'readability/function'.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst
new file mode 100644
index 00000000000..c01fbb4bc6a
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst
@@ -0,0 +1,14 @@
+readability-redundant-smartptr-get
+==================================
+
+
+Find and remove redundant calls to smart pointer's ``.get()`` method.
+
+Examples:
+
+.. code:: c++
+
+ ptr.get()->Foo() ==> ptr->Foo()
+ *ptr.get() ==> *ptr
+ *ptr->get() ==> **ptr
+
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst
new file mode 100644
index 00000000000..25b6b086590
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-redundant-string-cstr.rst
@@ -0,0 +1,5 @@
+readability-redundant-string-cstr
+=================================
+
+
+Finds unnecessary calls to ``std::string::c_str()``.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst
new file mode 100644
index 00000000000..6bc192e10c2
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-shrink-to-fit.rst
@@ -0,0 +1,10 @@
+readability-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.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst
new file mode 100644
index 00000000000..0abdb040052
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst
@@ -0,0 +1,76 @@
+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 false;`` ``return e;``
+``if (e) return false; else return true;`` ``return !e;``
+``if (e) b = true; else b = false;`` ``b = e;``
+``if (e) b = false; else b = true;`` ``b = !e;``
+``if (e) return true; return false;`` ``return e;``
+``if (e) return false; return true;`` ``return !e;``
+=========================================== ================
+
+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 pointer to ``bool`` are replaced with explicit
+ comparisons to ``nullptr``.
+ 5. Implicit casts to ``bool`` are replaced with explicit casts to ``bool``.
+ 6. Object expressions with ``explicit operator bool`` conversion operators
+ are replaced with explicit casts to ``bool``.
+
+Examples:
+ 1. The ternary assignment ``bool b = (i < 0) ? true : false;`` has redundant
+ 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;`` becomes
+ ``return i >= 0;``.
+
+ The conditional return ``if (i != 0) return false; return true;`` becomes
+ ``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 = static_cast<bool>(i & 1);``.
+
+ 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 static_cast<bool>(i & 1);``
+
+ 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);``
+
+When a conditional boolean return or assignment appears at the end of a
+chain of ``if``, ``else if`` statements, the conditional statement is left
+unchanged unless the option ``ChainedConditionalReturn`` or
+``ChainedConditionalAssignment``, respectively, is specified as non-zero.
+The default value for both options is zero.
+
diff --git a/clang-tools-extra/docs/clang-tidy/index.rst b/clang-tools-extra/docs/clang-tidy/index.rst
new file mode 100644
index 00000000000..cc76bb7134e
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/index.rst
@@ -0,0 +1,510 @@
+==========
+Clang-Tidy
+==========
+
+.. toctree::
+ :maxdepth: 1
+
+ checks/list
+
+
+:program:`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. :program:`clang-tidy` is modular and provides a convenient
+interface for writing new checks.
+
+
+Using clang-tidy
+================
+
+:program:`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
+compilation options on the command line after ``--``:
+
+.. code-block:: console
+
+ $ clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...
+
+:program:`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,
+
+.. code-block:: console
+
+ $ clang-tidy test.cpp -checks=-*,clang-analyzer-*,-clang-analyzer-alpha*
+
+will disable all default checks (``-*``) and enable all ``clang-analyzer-*``
+checks except for ``clang-analyzer-alpha*`` 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:
+
+* Checks related to the LLVM coding conventions have names starting with
+ ``llvm-``.
+
+* Checks related to the Google coding conventions have names starting with
+ ``google-``.
+
+* Checks with names starting with ``misc-`` don't relate to any particular
+ coding style.
+
+* Clang static analyzer checks are named starting with ``clang-analyzer-``.
+
+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.
+
+Clang diagnostics have check names starting with ``clang-diagnostic-``.
+Diagnostics which have a corresponding warning option, are named
+``clang-diagostic-<warning-option>``, e.g. Clang warning controlled by
+``-Wliteral-conversion`` will be reported with check name
+``clang-diagnostic-literal-conversion``.
+
+The ``-fix`` flag instructs :program:`clang-tidy` to fix found errors if
+supported by corresponding checks.
+
+An overview of all the command-line options:
+
+.. code-block:: console
+
+ $ clang-tidy -help
+ USAGE: clang-tidy [options] <source0> [... <sourceN>]
+
+ OPTIONS:
+
+ General 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:
+
+ -analyze-temporary-dtors - Enable temporary destructor-aware analysis in
+ clang-analyzer- checks.
+ This option overrides the value read from a
+ .clang-tidy file.
+ -checks=<string> - Comma-separated list of globs with optional '-'
+ prefix. Globs are processed in order of appearance
+ in the list. Globs without '-' prefix add checks
+ with matching names to the set, globs with the '-'
+ prefix remove checks with matching names from the
+ set of enabled checks.
+ This option's value is appended to the value read
+ from a .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
+ should 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.
+ -enable-check-profile - Enable per-check timing profiles, and print a report to stderr.
+ -export-fixes=<filename> - YAML file to store suggested fixes in. The
+ stored fixes can be applied to the input source
+ code with clang-apply-replacements.
+ -extra-arg=<string> - Additional argument to append to the compiler command line
+ -extra-arg-before=<string> - Additional argument to prepend to the compiler command line
+ -fix - Apply suggested fixes. Without -fix-errors
+ clang-tidy will bail out if any compilation
+ errors were found.
+ -fix-errors - Apply suggested fixes even if compilation errors
+ were found. If compiler errors have attached
+ fix-its, clang-tidy will apply them as well.
+ -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 value read from a
+ .clang-tidy file.
+ -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
+ -system-headers - Display the errors from system headers.
+
+ -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:
+ http://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 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'
+ HeaderFilterRegex: ''
+ AnalyzeTemporaryDtors: false
+ User: user
+ CheckOptions:
+ - key: some-check.SomeOption
+ value: 'some value'
+ ...
+
+.. _LibTooling: http://clang.llvm.org/docs/LibTooling.html
+.. _How To Setup Tooling For LLVM: http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
+
+
+Getting Involved
+================
+
+:program:`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 :program:`clang-tidy`
+with minimal or no code changes in clang-tidy.
+
+Checks can plug 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 precise
+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.
+
+.. _AST Matchers: http://clang.llvm.org/docs/LibASTMatchers.html
+.. _PPCallbacks: http://clang.llvm.org/doxygen/classclang_1_1PPCallbacks.html
+
+
+Choosing the Right Place for your Check
+---------------------------------------
+
+If you have an idea of a check, you should decide whether it should be
+implemented 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 readability, 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 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/tools/clang/tools/extra`` directory, and
+let's start!
+
+.. _Getting Started with the LLVM System: http://llvm.org/docs/GettingStarted.html
+.. _Using Clang Tools: http://clang.llvm.org/docs/ClangTools.html
+
+
+The Directory Structure
+-----------------------
+
+:program:`clang-tidy` source code resides in the
+``llvm/tools/clang/tools/extra`` directory and is structured as follows:
+
+::
+
+ clang-tidy/ # Clang-tidy core.
+ |-- ClangTidy.h # Interfaces for users and 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
+ ...
+ |-- tool/ # Sources of the clang-tidy binary.
+ ...
+ test/clang-tidy/ # Integration tests.
+ ...
+ unittests/clang-tidy/ # Unit tests.
+ |-- ClangTidyTest.h
+ |-- GoogleModuleTest.cpp
+ |-- LLVMModuleTest.cpp
+ ...
+
+
+Writing a clang-tidy Check
+--------------------------
+
+So you have an idea of a useful check for :program:`clang-tidy`.
+
+You need to decide which module the check belongs to. If the check verifies
+conformance of the code to a certain coding style, it probably deserves a
+separate module and a directory in ``clang-tidy/`` (there are LLVM and Google
+modules already).
+
+After choosing the module, you need to create a class for your check:
+
+.. code-block:: c++
+
+ #include "../ClangTidy.h"
+
+ namespace clang {
+ namespace tidy {
+
+ class MyCheck : public ClangTidyCheck {
+ };
+
+ } // namespace tidy
+ } // namespace clang
+
+Next, you need to decide whether it should operate on the preprocessor level or
+on the AST level. Let's imagine that we need to work with the AST in our check.
+In this case we need to override two methods:
+
+.. code-block:: c++
+
+ ...
+ class ExplicitConstructorCheck : public ClangTidyCheck {
+ public:
+ ExplicitConstructorCheck(StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context) {}
+ void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+ void check(ast_matchers::MatchFinder::MatchResult &Result) override;
+ };
+
+Constructor of the check receives the ``Name`` and ``Context`` parameters, and
+must forward them to the ``ClangTidyCheck`` constructor.
+
+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.
+
+.. code-block:: c++
+
+ using namespace ast_matchers;
+
+ void ExplicitConstructorCheck::registerMatchers(MatchFinder *Finder) {
+ Finder->addMatcher(constructorDecl().bind("ctor"), this);
+ }
+
+ void ExplicitConstructorCheck::check(const MatchFinder::MatchResult &Result) {
+ const CXXConstructorDecl *Ctor =
+ Result.Nodes.getNodeAs<CXXConstructorDecl>("ctor");
+ // Do not be confused: isExplicit means 'explicit' keyword is present,
+ // isImplicit means that it's a compiler-generated constructor.
+ if (Ctor->isOutOfLine() || Ctor->isExplicit() || Ctor->isImplicit())
+ return;
+ if (Ctor->getNumParams() == 0 || Ctor->getMinRequiredArguments() > 1)
+ return;
+ SourceLocation Loc = Ctor->getLocation();
+ diag(Loc, "Single-argument constructors must be explicit")
+ << FixItHint::CreateInsertion(Loc, "explicit ");
+ }
+
+(The full code for this check resides in
+``clang-tidy/google/ExplicitConstructorCheck.{h,cpp}``).
+
+
+Registering your Check
+----------------------
+
+The check should be registered in the corresponding module with a distinct name:
+
+.. code-block:: c++
+
+ 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:
+
+.. code-block:: c++
+
+ 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:
+
+.. code-block:: c++
+
+ // 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 binary
+you link the ``clang-tidy`` library in) ``clang-tidy/tool/ClangTidyMain.cpp``:
+
+.. code-block:: c++
+
+ // 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 options
+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 :program:`clang-tidy` know which options
+the check implements and what the current values are (e.g. for the
+``-dump-config`` command line option).
+
+.. code-block:: c++
+
+ 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:
+
+.. code-block:: yaml
+
+ 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 inline
+YAML format:
+
+.. code-block:: bash
+
+ $ clang-tidy -config="{CheckOptions: [{key: a, value: b}, {key: x, value: y}]}" ...
+
+
+Testing Checks
+--------------
+
+:program:`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 :program:`clang-tidy` and verifies messages and fixes with two
+separate `FileCheck`_ invocations. To use the 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]]``
+substitutions and distinct function and variable names in the test code.
+
+Here's an example of a test using the ``check_clang_tidy.py`` script:
+
+.. code-block:: bash
+
+ // RUN: %python %S/check_clang_tidy.py %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;
+ }
+
+.. _lit: http://llvm.org/docs/CommandGuide/lit.html
+.. _FileCheck: http://llvm.org/docs/CommandGuide/FileCheck.html
+
+
+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 around. The most
+convenient way to run :program:`clang-tidy` is with a compile command database;
+CMake can automatically generate one, for a description of how to enable it see
+`How To Setup Tooling For LLVM`_. Once ``compile_commands.json`` is in place and
+a working version of :program:`clang-tidy` is in ``PATH`` the entire code base
+can be analyzed with ``clang-tidy/tool/run-clang-tidy.py``. The script executes
+:program:`clang-tidy` with the default set of checks on every translation unit
+in the compile command database and displays the resulting warnings and errors.
+The script provides multiple configuration flags.
+
+* The default set of checks can be overridden using the ``-checks`` argument,
+ taking the identical format as :program:`clang-tidy` does. For example
+ ``-checks=-*,misc-use-override`` will run the ``misc-use-override``
+ checker only.
+
+* To restrict the files examined you can provide one or more regex arguments
+ that the file names are matched against.
+ ``run-clang-tidy.py clang-tidy/.*Check\.cpp`` will only analyze clang-tidy
+ checkers. It may also be necessary to restrict the header files warnings are
+ displayed from using the ``-header-filter`` flag. It has the same behavior
+ as the corresponding :program:`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.
+
diff --git a/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py b/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py
new file mode 100755
index 00000000000..5f376e76eec
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/tools/dump_check_docs.py
@@ -0,0 +1,79 @@
+#!/usr/bin/python
+
+r"""
+Create stubs for check documentation files.
+"""
+
+import os
+import re
+import sys
+
+def main():
+ clang_tidy_dir = os.path.normpath(
+ os.path.join(os.path.dirname(sys.argv[0]), '..', '..', '..',
+ 'clang-tidy'))
+
+ checks_doc_dir = os.path.normpath(
+ os.path.join(clang_tidy_dir, '..', 'docs', 'clang-tidy', 'checks'))
+
+ registered_checks = {}
+ defined_checks = {}
+
+ for dir_name, subdir_list, file_list in os.walk(clang_tidy_dir):
+ print('Processing directory ' + dir_name + '...')
+ for file_name in file_list:
+ full_name = os.path.join(dir_name, file_name)
+ if file_name.endswith('Module.cpp'):
+ print('Module ' + file_name)
+ with open(full_name, 'r') as f:
+ text = f.read()
+ for class_name, check_name in re.findall(
+ r'\.\s*registerCheck\s*<\s*([A-Za-z0-9:]+)\s*>\(\s*"([a-z0-9-]+)"',
+ text):
+ registered_checks[check_name] = class_name
+ elif file_name.endswith('.h'):
+ print(' ' + file_name + '...')
+ with open(full_name, 'r') as f:
+ text = f.read()
+ for comment, _, _, class_name in re.findall(
+ r'((([\r\n]//)[^\r\n]*)*)\s+class (\w+)\s*:' +
+ '\s*public\s+ClangTidyCheck\s*\{', text):
+ defined_checks[class_name] = comment
+
+ print('Registered checks [%s]: [%s]' %
+ (len(registered_checks), registered_checks))
+ print('Check implementations: %s' % len(defined_checks))
+
+ checks = registered_checks.keys()
+ checks.sort()
+
+ for check_name in checks:
+ doc_file_name = os.path.join(checks_doc_dir, check_name + '.rst')
+ #if os.path.exists(doc_file_name):
+ # print('Skipping existing file %s...')
+ # continue
+ print('Updating %s...' % doc_file_name)
+ with open(doc_file_name, 'w') as f:
+ class_name = re.sub(r'.*:', '', registered_checks[check_name])
+ f.write(check_name + '\n' + ('=' * len(check_name)) + '\n\n')
+ if class_name in defined_checks:
+ text = defined_checks[class_name]
+ text = re.sub(r'\n//+ ?(\\brief )?', r'\n', text)
+ text = re.sub(r'(\n *)\\code\n', r'\1.. code:: c++\n\n', text)
+ text = re.sub(r'(\n *)\\endcode(\n|$)', r'\n', text)
+ text = re.sub(r'`', r'``', text)
+ f.write(text + '\n')
+ else:
+ f.write('TODO: add docs\n')
+
+ with open(os.path.join(checks_doc_dir, 'list.rst'), 'w') as f:
+ f.write(
+r"""List of clang-tidy Checks
+=========================
+
+.. toctree::
+ """ + '\n '.join(checks))
+
+
+if __name__ == '__main__':
+ main()
OpenPOWER on IntegriCloud