diff --git a/clang-tools-extra/clang-tidy/add_new_check.py b/clang-tools-extra/clang-tidy/add_new_check.py --- a/clang-tools-extra/clang-tidy/add_new_check.py +++ b/clang-tools-extra/clang-tidy/add_new_check.py @@ -294,37 +294,88 @@ def update_checks_list(clang_tidy_path): docs_dir = os.path.join(clang_tidy_path, '../docs/clang-tidy/checks') filename = os.path.normpath(os.path.join(docs_dir, 'list.rst')) + # Read the content of the current list.rst file with open(filename, 'r') as f: lines = f.readlines() + # Get all existing docs doc_files = list(filter(lambda s: s.endswith('.rst') and s != 'list.rst', os.listdir(docs_dir))) doc_files.sort() - def format_link(doc_file): + def has_auto_fix(check_name): + dirname, _, check_name = check_name.partition("-") + + checkerCode = os.path.join(dirname,get_camel_name(check_name)) + ".cpp" + + if not os.path.isfile(checkerCode): + return "" + + with open(checkerCode) as f: + code = f.read() + if 'FixItHint' in code or "ReplacementText" in code or "fixit" in code: + # Some stupid heuristics to figure out if a checker has an autofix or not + return ' "Yes"' + return "" + + def process_doc(doc_file): check_name = doc_file.replace('.rst', '') + with open(os.path.join(docs_dir, doc_file), 'r') as doc: content = doc.read() match = re.search('.*:orphan:.*', content) + if match: - return '' + # Orphan page, don't list it + return '', '' match = re.search('.*:http-equiv=refresh: \d+;URL=(.*).html.*', content) - if match: - return ' %(check)s (redirects to %(target)s) <%(check)s>\n' % { - 'check': check_name, - 'target': match.group(1) - } - return ' %s\n' % check_name + # Is it a redirect? + return check_name, match + + def format_link(doc_file): + check_name, match = process_doc(doc_file) + if not match: + return ' `%(check)s <%(check)s.html>`_,%(autofix)s\n' % { + 'check': check_name, + 'autofix': has_auto_fix(check_name) + } + else: + return '' + + def format_link_alias(doc_file): + check_name, match = process_doc(doc_file) + if match: + if match.group(1) == 'https://clang.llvm.org/docs/analyzer/checkers': + titleRedirect = 'Clang Static Analyzer' + else: + titleRedirect = match.group(1) + # The checker is just a redirect + return ' `%(check)s <%(check)s.html>`_, `%(title)s <%(target)s.html>`_,%(autofix)s\n' % { + 'check': check_name, + 'target': match.group(1), + 'title': titleRedirect, + 'autofix': has_auto_fix(match.group(1)) + } + return '' checks = map(format_link, doc_files) + checks_alias = map(format_link_alias, doc_files) print('Updating %s...' % filename) with open(filename, 'w') as f: for line in lines: f.write(line) - if line.startswith('.. toctree::'): + if line.strip() == ".. csv-table::": + # We dump the checkers + f.write(' :header: "Name", "Offers fixes"\n') + f.write(' :widths: 50, 20\n') f.writelines(checks) + # and the aliases + f.write('.. csv-table:: Aliases..\n') + f.write(' :header: "Name", "Redirect", "Offers fixes"\n') + f.write(' :widths: 50, 50, 10\n') + f.writelines(checks_alias) break @@ -345,6 +396,11 @@ 'underline': '=' * len(check_name_dashes)}) +def get_camel_name(check_name): + return ''.join(map(lambda elem: elem.capitalize(), + check_name.split('-'))) + 'Check' + + def main(): language_to_extension = { 'c': 'c', @@ -384,13 +440,11 @@ module = args.module check_name = args.check - + check_name_camel = get_camel_name(check_name) if check_name.startswith(module): print('Check name "%s" must not start with the module "%s". Exiting.' % ( check_name, module)) return - check_name_camel = ''.join(map(lambda elem: elem.capitalize(), - check_name.split('-'))) + 'Check' clang_tidy_path = os.path.dirname(sys.argv[0]) module_path = os.path.join(clang_tidy_path, module) diff --git a/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp b/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp --- a/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/boost/BoostTidyModule.cpp @@ -9,6 +9,58 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "Foo12Check.h" +#include "Foo13Check.h" +#include "MyCheck10Check.h" +#include "MyCheck11Check.h" +#include "MyCheck12Check.h" +#include "MyCheck14Check.h" +#include "MyCheck19Check.h" +#include "MyCheck1Check.h" +#include "MyCheck20Check.h" +#include "MyCheck21Check.h" +#include "MyCheck22Check.h" +#include "MyCheck23Check.h" +#include "MyCheck24Check.h" +#include "MyCheck25Check.h" +#include "MyCheck26Check.h" +#include "MyCheck27Check.h" +#include "MyCheck28Check.h" +#include "MyCheck29Check.h" +#include "MyCheck2Check.h" +#include "MyCheck30Check.h" +#include "MyCheck31Check.h" +#include "MyCheck32Check.h" +#include "MyCheck33Check.h" +#include "MyCheck34Check.h" +#include "MyCheck35Check.h" +#include "MyCheck36Check.h" +#include "MyCheck37Check.h" +#include "MyCheck38Check.h" +#include "MyCheck39Check.h" +#include "MyCheck3Check.h" +#include "MyCheck4Check.h" +#include "MyCheck50Check.h" +#include "MyCheck51Check.h" +#include "MyCheck52Check.h" +#include "MyCheck54Check.h" +#include "MyCheck565Check.h" +#include "MyCheck57Check.h" +#include "MyCheck58Check.h" +#include "MyCheck59Check.h" +#include "MyCheck5Check.h" +#include "MyCheck60Check.h" +#include "MyCheck61Check.h" +#include "MyCheck62Check.h" +#include "MyCheck63Check.h" +#include "MyCheck64Check.h" +#include "MyCheck66Check.h" +#include "MyCheck68Check.h" +#include "MyCheck69Check.h" +#include "MyCheck6Check.h" +#include "MyCheck7Check.h" +#include "MyCheck8Check.h" +#include "MyCheck9Check.h" #include "UseToStringCheck.h" using namespace clang::ast_matchers; @@ -19,6 +71,110 @@ class BoostModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck( + "boost-foo12"); + CheckFactories.registerCheck( + "boost-foo13"); + CheckFactories.registerCheck( + "boost-my-check-1"); + CheckFactories.registerCheck( + "boost-my-check-10"); + CheckFactories.registerCheck( + "boost-my-check-11"); + CheckFactories.registerCheck( + "boost-my-check-12"); + CheckFactories.registerCheck( + "boost-my-check-14"); + CheckFactories.registerCheck( + "boost-my-check-19"); + CheckFactories.registerCheck( + "boost-my-check-2"); + CheckFactories.registerCheck( + "boost-my-check-20"); + CheckFactories.registerCheck( + "boost-my-check-21"); + CheckFactories.registerCheck( + "boost-my-check-22"); + CheckFactories.registerCheck( + "boost-my-check-23"); + CheckFactories.registerCheck( + "boost-my-check-24"); + CheckFactories.registerCheck( + "boost-my-check-25"); + CheckFactories.registerCheck( + "boost-my-check-26"); + CheckFactories.registerCheck( + "boost-my-check-27"); + CheckFactories.registerCheck( + "boost-my-check-28"); + CheckFactories.registerCheck( + "boost-my-check-29"); + CheckFactories.registerCheck( + "boost-my-check-3"); + CheckFactories.registerCheck( + "boost-my-check-30"); + CheckFactories.registerCheck( + "boost-my-check-31"); + CheckFactories.registerCheck( + "boost-my-check-32"); + CheckFactories.registerCheck( + "boost-my-check-33"); + CheckFactories.registerCheck( + "boost-my-check-34"); + CheckFactories.registerCheck( + "boost-my-check-35"); + CheckFactories.registerCheck( + "boost-my-check-36"); + CheckFactories.registerCheck( + "boost-my-check-37"); + CheckFactories.registerCheck( + "boost-my-check-38"); + CheckFactories.registerCheck( + "boost-my-check-39"); + CheckFactories.registerCheck( + "boost-my-check-4"); + CheckFactories.registerCheck( + "boost-my-check-5"); + CheckFactories.registerCheck( + "boost-my-check-50"); + CheckFactories.registerCheck( + "boost-my-check-51"); + CheckFactories.registerCheck( + "boost-my-check-52"); + CheckFactories.registerCheck( + "boost-my-check-54"); + CheckFactories.registerCheck( + "boost-my-check-565"); + CheckFactories.registerCheck( + "boost-my-check-57"); + CheckFactories.registerCheck( + "boost-my-check-58"); + CheckFactories.registerCheck( + "boost-my-check-59"); + CheckFactories.registerCheck( + "boost-my-check-6"); + CheckFactories.registerCheck( + "boost-my-check-60"); + CheckFactories.registerCheck( + "boost-my-check-61"); + CheckFactories.registerCheck( + "boost-my-check-62"); + CheckFactories.registerCheck( + "boost-my-check-63"); + CheckFactories.registerCheck( + "boost-my-check-64"); + CheckFactories.registerCheck( + "boost-my-check-66"); + CheckFactories.registerCheck( + "boost-my-check-68"); + CheckFactories.registerCheck( + "boost-my-check-69"); + CheckFactories.registerCheck( + "boost-my-check-7"); + CheckFactories.registerCheck( + "boost-my-check-8"); + CheckFactories.registerCheck( + "boost-my-check-9"); CheckFactories.registerCheck("boost-use-to-string"); } }; diff --git a/clang-tools-extra/clang-tidy/boost/CMakeLists.txt b/clang-tools-extra/clang-tidy/boost/CMakeLists.txt --- a/clang-tools-extra/clang-tidy/boost/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/boost/CMakeLists.txt @@ -2,6 +2,58 @@ add_clang_library(clangTidyBoostModule BoostTidyModule.cpp + Foo12Check.cpp + Foo13Check.cpp + MyCheck10Check.cpp + MyCheck11Check.cpp + MyCheck12Check.cpp + MyCheck14Check.cpp + MyCheck19Check.cpp + MyCheck1Check.cpp + MyCheck20Check.cpp + MyCheck21Check.cpp + MyCheck22Check.cpp + MyCheck23Check.cpp + MyCheck24Check.cpp + MyCheck25Check.cpp + MyCheck26Check.cpp + MyCheck27Check.cpp + MyCheck28Check.cpp + MyCheck29Check.cpp + MyCheck2Check.cpp + MyCheck30Check.cpp + MyCheck31Check.cpp + MyCheck32Check.cpp + MyCheck33Check.cpp + MyCheck34Check.cpp + MyCheck35Check.cpp + MyCheck36Check.cpp + MyCheck37Check.cpp + MyCheck38Check.cpp + MyCheck39Check.cpp + MyCheck3Check.cpp + MyCheck4Check.cpp + MyCheck50Check.cpp + MyCheck51Check.cpp + MyCheck52Check.cpp + MyCheck54Check.cpp + MyCheck565Check.cpp + MyCheck57Check.cpp + MyCheck58Check.cpp + MyCheck59Check.cpp + MyCheck5Check.cpp + MyCheck60Check.cpp + MyCheck61Check.cpp + MyCheck62Check.cpp + MyCheck63Check.cpp + MyCheck64Check.cpp + MyCheck66Check.cpp + MyCheck68Check.cpp + MyCheck69Check.cpp + MyCheck6Check.cpp + MyCheck7Check.cpp + MyCheck8Check.cpp + MyCheck9Check.cpp UseToStringCheck.cpp LINK_LIBS diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -67,6 +67,11 @@ Improvements to clang-tidy -------------------------- +- New :doc:`boost-my-check-69 + ` check. + + FIXME: add release notes. + - New :doc:`bugprone-bad-signal-to-kill-thread ` check. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -3,10 +3,15 @@ Clang-Tidy Checks ================= +.. toctree:: + :glob: + :hidden: + + * + .. csv-table:: :header: "Name", "Offers fixes" :widths: 50, 20 - `abseil-duration-addition `_, "Yes" `abseil-duration-comparison `_, "Yes" `abseil-duration-conversion-cast `_, "Yes" @@ -26,8 +31,8 @@ `abseil-upgrade-duration-conversions `_, "Yes" `android-cloexec-accept `_, "Yes" `android-cloexec-accept4 `_, - `android-cloexec-creat `_, - `android-cloexec-dup `_, + `android-cloexec-creat `_, "Yes" + `android-cloexec-dup `_, "Yes" `android-cloexec-epoll-create `_, `android-cloexec-epoll-create1 `_, `android-cloexec-fopen `_, @@ -35,10 +40,73 @@ `android-cloexec-inotify-init1 `_, `android-cloexec-memfd-create `_, `android-cloexec-open `_, - `android-cloexec-pipe `_, + `android-cloexec-pipe `_, "Yes" `android-cloexec-pipe2 `_, `android-cloexec-socket `_, - `android-comparison-in-temp-failure-retry `_, "Yes" + `android-comparison-in-temp-failure-retry `_, + `boost-foo `_, "Yes" + `boost-foo10 `_, "Yes" + `boost-foo11 `_, "Yes" + `boost-foo12 `_, "Yes" + `boost-foo13 `_, "Yes" + `boost-foo2 `_, "Yes" + `boost-foo3 `_, "Yes" + `boost-foo4 `_, "Yes" + `boost-foo5 `_, "Yes" + `boost-foo6 `_, "Yes" + `boost-foo7 `_, "Yes" + `boost-foo8 `_, "Yes" + `boost-foo9 `_, "Yes" + `boost-my-check-1 `_, "Yes" + `boost-my-check-10 `_, "Yes" + `boost-my-check-11 `_, "Yes" + `boost-my-check-12 `_, "Yes" + `boost-my-check-14 `_, "Yes" + `boost-my-check-19 `_, "Yes" + `boost-my-check-2 `_, "Yes" + `boost-my-check-20 `_, "Yes" + `boost-my-check-21 `_, "Yes" + `boost-my-check-22 `_, "Yes" + `boost-my-check-23 `_, "Yes" + `boost-my-check-24 `_, "Yes" + `boost-my-check-25 `_, "Yes" + `boost-my-check-26 `_, "Yes" + `boost-my-check-27 `_, "Yes" + `boost-my-check-28 `_, "Yes" + `boost-my-check-29 `_, "Yes" + `boost-my-check-3 `_, "Yes" + `boost-my-check-30 `_, "Yes" + `boost-my-check-31 `_, "Yes" + `boost-my-check-32 `_, "Yes" + `boost-my-check-33 `_, "Yes" + `boost-my-check-34 `_, "Yes" + `boost-my-check-35 `_, "Yes" + `boost-my-check-36 `_, "Yes" + `boost-my-check-37 `_, "Yes" + `boost-my-check-38 `_, "Yes" + `boost-my-check-39 `_, "Yes" + `boost-my-check-4 `_, "Yes" + `boost-my-check-5 `_, "Yes" + `boost-my-check-50 `_, "Yes" + `boost-my-check-51 `_, "Yes" + `boost-my-check-52 `_, "Yes" + `boost-my-check-54 `_, "Yes" + `boost-my-check-565 `_, "Yes" + `boost-my-check-57 `_, "Yes" + `boost-my-check-58 `_, "Yes" + `boost-my-check-59 `_, "Yes" + `boost-my-check-6 `_, "Yes" + `boost-my-check-60 `_, "Yes" + `boost-my-check-61 `_, "Yes" + `boost-my-check-62 `_, "Yes" + `boost-my-check-63 `_, "Yes" + `boost-my-check-64 `_, "Yes" + `boost-my-check-66 `_, "Yes" + `boost-my-check-68 `_, "Yes" + `boost-my-check-69 `_, "Yes" + `boost-my-check-7 `_, "Yes" + `boost-my-check-8 `_, "Yes" + `boost-my-check-9 `_, "Yes" `boost-use-to-string `_, "Yes" `bugprone-argument-comment `_, "Yes" `bugprone-assert-side-effect `_, @@ -59,8 +127,8 @@ `bugprone-lambda-function-name `_, `bugprone-macro-parentheses `_, "Yes" `bugprone-macro-repeated-side-effects `_, - `bugprone-misplaced-operator-in-strlen-in-alloc `_, - `bugprone-misplaced-widening-cast `_, "Yes" + `bugprone-misplaced-operator-in-strlen-in-alloc `_, "Yes" + `bugprone-misplaced-widening-cast `_, `bugprone-move-forwarding-reference `_, "Yes" `bugprone-multiple-statement-macro `_, `bugprone-not-null-terminated-result `_, "Yes" @@ -150,19 +218,19 @@ `fuchsia-statically-constructed-objects `_, `fuchsia-trailing-return `_, `fuchsia-virtual-inheritance `_, - `google-build-explicit-make-pair `_, "Yes" + `google-build-explicit-make-pair `_, `google-build-namespaces `_, `google-build-using-namespace `_, `google-default-arguments `_, `google-explicit-constructor `_, "Yes" - `google-global-names-in-headers `_, "Yes" - `google-objc-avoid-nsobject-new `_, "Yes" + `google-global-names-in-headers `_, + `google-objc-avoid-nsobject-new `_, `google-objc-avoid-throwing-exception `_, - `google-objc-function-naming `_, "Yes" + `google-objc-function-naming `_, `google-objc-global-variable-declaration `_, `google-readability-avoid-underscore-in-googletest-name `_, - `google-readability-casting `_, "Yes" - `google-readability-todo `_, "Yes" + `google-readability-casting `_, + `google-readability-todo `_, `google-runtime-int `_, `google-runtime-operator `_, `google-runtime-references `_, @@ -173,6 +241,8 @@ `hicpp-no-assembler `_, `hicpp-signed-bitwise `_, `linuxkernel-must-use-errs `_, + `list.backup `_, + `list.test `_, `llvm-header-guard `_, `llvm-include-order `_, "Yes" `llvm-namespace-comment `_, @@ -198,8 +268,8 @@ `modernize-deprecated-headers `_, "Yes" `modernize-deprecated-ios-base-aliases `_, "Yes" `modernize-loop-convert `_, "Yes" - `modernize-make-shared `_, "Yes" - `modernize-make-unique `_, "Yes" + `modernize-make-shared `_, + `modernize-make-unique `_, `modernize-pass-by-value `_, "Yes" `modernize-raw-string-literal `_, "Yes" `modernize-redundant-void-arg `_, "Yes" @@ -211,6 +281,7 @@ `modernize-use-auto `_, "Yes" `modernize-use-bool-literals `_, "Yes" `modernize-use-default-member-init `_, "Yes" + ` <.html>`_, `modernize-use-emplace `_, "Yes" `modernize-use-equals-default `_, "Yes" `modernize-use-equals-delete `_, "Yes" @@ -233,29 +304,31 @@ `openmp-use-default-none `_, `performance-faster-string-find `_, "Yes" `performance-for-range-copy `_, "Yes" + ` <.html>`_, `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 `_, + `performance-move-constructor-init `_, "Yes" `performance-no-automatic-move `_, `performance-noexcept-move-constructor `_, "Yes" `performance-trivially-destructible `_, "Yes" `performance-type-promotion-in-math-fn `_, "Yes" - `performance-unnecessary-copy-initialization `_, "Yes" + `performance-unnecessary-copy-initialization `_, `performance-unnecessary-value-param `_, "Yes" `portability-simd-intrinsics `_, - `readability-avoid-const-params-in-decls `_, "Yes" + `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 `_, "Yes" + `readability-convert-member-functions-to-static `_, `readability-delete-null-pointer `_, "Yes" `readability-deleted-default `_, `readability-else-after-return `_, "Yes" `readability-function-size `_, `readability-identifier-naming `_, "Yes" + ` <.html>`_, `readability-implicit-bool-conversion `_, "Yes" `readability-inconsistent-declaration-parameter-name `_, "Yes" `readability-isolate-declaration `_, "Yes" @@ -272,23 +345,19 @@ `readability-redundant-member-init `_, "Yes" `readability-redundant-preprocessor `_, `readability-redundant-smartptr-get `_, "Yes" - `readability-redundant-string-cstr `_, "Yes" + `readability-redundant-string-cstr `_, `readability-redundant-string-init `_, "Yes" `readability-simplify-boolean-expr `_, "Yes" `readability-simplify-subscript-expr `_, "Yes" `readability-static-accessed-through-instance `_, "Yes" - `readability-static-definitioreadability `_, "Yes" + `readability-static-definition-in-anonymous-namespace `_, "Yes" `readability-string-compare `_, "Yes" `readability-uniqueptr-delete-release `_, "Yes" `readability-uppercase-literal-suffix `_, "Yes" `zircon-temporary-objects `_, - - - .. csv-table:: Aliases.. :header: "Name", "Redirect", "Offers fixes" :widths: 50, 50, 10 - `cert-dcl03-c `_, `misc-static-assert `_, "Yes" `cert-dcl16-c `_, `readability-uppercase-literal-suffix `_, "Yes" `cert-dcl54-cpp `_, `misc-new-delete-overloads `_, @@ -298,7 +367,7 @@ `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 `_, + `cert-oop11-cpp `_, `performance-move-constructor-init `_, "Yes" `cert-oop54-cpp `_, `bugprone-unhandled-self-assignment `_, `cert-pos44-c `_, `bugprone-bad-signal-to-kill-thread `_, `clang-analyzer-core.CallAndMessage `_, `Clang Static Analyzer `_, @@ -368,7 +437,7 @@ `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 `_, + `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" @@ -386,7 +455,7 @@ `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 `_, `misc-noexcept-moveconstructor `_, "Yes" + `hicpp-noexcept-move `_, `misc-noexcept-moveconstructor `_, `hicpp-special-member-functions `_, `cppcoreguidelines-special-member-functions `_, `hicpp-static-assert `_, `misc-static-assert `_, "Yes" `hicpp-undelegated-constructor `_, `bugprone-undelegated-constructor `_, @@ -399,9 +468,3 @@ `hicpp-use-nullptr `_, `modernize-use-nullptr `_, "Yes" `hicpp-use-override `_, `modernize-use-override `_, "Yes" `hicpp-vararg `_, `cppcoreguidelines-pro-type-vararg `_, - -.. toctree:: - :glob: - :hidden: - - *