style: clang-tidy: llvm-namespace-comment
diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000..798e676
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,8 @@
+FormatStyle: file
+
+Checks: '
+-*,
+llvm-namespace-comment,
+'
+
+HeaderFilterRegex: 'pybind11/.*h'
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index e83c315..4cdd7aa 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -164,6 +164,30 @@
pre-commit install
```
+### Clang-Tidy
+
+To run Clang tidy, the following recipe should work. Files will be modified in
+place, so you can use git to monitor the changes.
+
+```bash
+docker run --rm -v $PWD:/pybind11 -it silkeh/clang:10
+apt-get update && apt-get install python3-dev python3-pytest
+cmake -S pybind11/ -B build -DCMAKE_CXX_CLANG_TIDY="$(which clang-tidy);-fix"
+cmake --build build
+```
+
+### Include what you use
+
+To run include what you use, install (`brew install include-what-you-use` on
+macOS), then run:
+
+```bash
+cmake -S . -B build-iwyu -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=$(which include-what-you-use)
+cmake --build build
+```
+
+The report is sent to stderr; you can pip it into a file if you wish.
+
### Build recipes
This builds with the Intel compiler (assuming it is in your path, along with a
@@ -186,7 +210,6 @@
cmake --build build
```
-
[pre-commit]: https://pre-commit.com
[pybind11.readthedocs.org]: http://pybind11.readthedocs.org/en/latest
[issue tracker]: https://github.com/pybind/pybind11/issues
diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml
index e92f96e..1912193 100644
--- a/.github/workflows/format.yml
+++ b/.github/workflows/format.yml
@@ -17,3 +17,19 @@
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: pre-commit/action@v2.0.0
+
+ clang-tidy:
+ name: Clang-Tidy
+ runs-on: ubuntu-latest
+ container: silkeh/clang:10
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install requirements
+ run: apt-get update && apt-get install -y python3-dev python3-pytest
+
+ - name: Configure
+ run: cmake -S . -B build -DCMAKE_CXX_CLANG_TIDY="$(which clang-tidy);--warnings-as-errors=*"
+
+ - name: Build
+ run: cmake --build build -j 2
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index c588bd2..47a54af 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -1929,7 +1929,7 @@
String literal version of `arg`
\endrst */
constexpr arg operator"" _a(const char *name, size_t) { return arg(name); }
-}
+} // namespace literals
PYBIND11_NAMESPACE_BEGIN(detail)
diff --git a/include/pybind11/pytypes.h b/include/pybind11/pytypes.h
index c1219fc..8e05261 100644
--- a/include/pybind11/pytypes.h
+++ b/include/pybind11/pytypes.h
@@ -35,7 +35,7 @@
struct sequence_item;
struct list_item;
struct tuple_item;
-}
+} // namespace accessor_policies
using obj_attr_accessor = accessor<accessor_policies::obj_attr>;
using str_attr_accessor = accessor<accessor_policies::str_attr>;
using item_accessor = accessor<accessor_policies::generic_item>;
@@ -976,7 +976,7 @@
String literal version of `str`
\endrst */
inline str operator"" _s(const char *s, size_t size) { return {s, size}; }
-}
+} // namespace literals
/// \addtogroup pytypes
/// @{
diff --git a/tests/local_bindings.h b/tests/local_bindings.h
index b6afb80..22537b1 100644
--- a/tests/local_bindings.h
+++ b/tests/local_bindings.h
@@ -58,7 +58,7 @@
std::string name_;
const std::string &name() { return name_; }
};
-}
+} // namespace pets
struct MixGL { int i; MixGL(int i) : i{i} {} };
struct MixGL2 { int i; MixGL2(int i) : i{i} {} };
diff --git a/tests/test_constants_and_functions.cpp b/tests/test_constants_and_functions.cpp
index e8ec74b..f607795 100644
--- a/tests/test_constants_and_functions.cpp
+++ b/tests/test_constants_and_functions.cpp
@@ -74,7 +74,7 @@
# pragma GCC diagnostic pop
#endif
};
-}
+} // namespace test_exc_sp
TEST_SUBMODULE(constants_and_functions, m) {
diff --git a/tests/test_custom_type_casters.cpp b/tests/test_custom_type_casters.cpp
index 9485d3c..d565add 100644
--- a/tests/test_custom_type_casters.cpp
+++ b/tests/test_custom_type_casters.cpp
@@ -58,7 +58,8 @@
return py::none().release();
}
};
-}}
+} // namespace detail
+} // namespace pybind11
// test_custom_caster_destruction
class DestructionTester {
@@ -79,7 +80,8 @@
return py::bool_(true).release();
}
};
-}}
+} // namespace detail
+} // namespace pybind11
TEST_SUBMODULE(custom_type_casters, m) {
// test_custom_type_casters
diff --git a/tests/test_operator_overloading.cpp b/tests/test_operator_overloading.cpp
index d176c46..d554954 100644
--- a/tests/test_operator_overloading.cpp
+++ b/tests/test_operator_overloading.cpp
@@ -73,7 +73,7 @@
// Not a good hash function, but easy to test
size_t operator()(const Vector2 &) { return 4; }
};
-}
+} // namespace std
// Not a good abs function, but easy to test.
std::string abs(const Vector2&) {
diff --git a/tests/test_smart_ptr.cpp b/tests/test_smart_ptr.cpp
index bea9069..af7b86e 100644
--- a/tests/test_smart_ptr.cpp
+++ b/tests/test_smart_ptr.cpp
@@ -27,7 +27,8 @@
struct holder_helper<ref<T>> {
static const T *get(const ref<T> &p) { return p.get_ptr(); }
};
-}}
+} // namespace detail
+} // namespace pybind11
// The following is not required anymore for std::shared_ptr, but it should compile without error:
PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr<T>);
diff --git a/tests/test_stl.cpp b/tests/test_stl.cpp
index b230717..0590162 100644
--- a/tests/test_stl.cpp
+++ b/tests/test_stl.cpp
@@ -47,7 +47,7 @@
namespace std {
template <>
struct hash<TplCtorClass> { size_t operator()(const TplCtorClass &) const { return 0; } };
-}
+} // namespace std
template <template <typename> class OptionalImpl, typename T>
diff --git a/tests/test_tagbased_polymorphic.cpp b/tests/test_tagbased_polymorphic.cpp
index dcc0051..838a168 100644
--- a/tests/test_tagbased_polymorphic.cpp
+++ b/tests/test_tagbased_polymorphic.cpp
@@ -117,7 +117,7 @@
static const void *get(const itype *src, const std::type_info*& type)
{ type = src ? Animal::type_of_kind(src->kind) : nullptr; return src; }
};
-}
+} // namespace pybind11
TEST_SUBMODULE(tagbased_polymorphic, m) {
py::class_<Animal>(m, "Animal")