chore: add an include-what-you-use preset and apply its findings - #6123
chore: add an include-what-you-use preset and apply its findings#6123henryiii wants to merge 4 commits into
Conversation
The iwyu preset runs include-what-you-use over the test build with tools/iwyu.sh, which asks IWYU to also check each pybind11 header. Two headers crash IWYU 0.26 and are skipped: pybind11.h and cast.h. The mapping file tools/iwyu.imp names <Python.h> for the CPython headers it includes, and the standard C++ header for libc++ detail headers and libstdc++ C headers. IWYU export pragmas on detail/common.h and conduit/wrap_include_python_h.h teach IWYU that detail/common.h is the project convention for <Python.h> and the namespace macros. Assisted-by: ClaudeCode:claude-fable-5
Apply the additions from the iwyu preset report: each header now names the pybind11 and standard headers it uses instead of taking them transitively, so no include is load-bearing by accident. One removal is included: detail/init.h does not use class.h, and pybind11.h includes class.h itself. The remaining reported removals are deferred. Removals of standard headers need agreement from a libstdc++ (Linux) run, and removals of pybind11.h from the feature headers (chrono, complex, operators, warnings, embed) would break the documented contract that one include is enough. Assisted-by: ClaudeCode:claude-fable-5
Apply the removals that the macOS (libc++) and Linux (libstdc++) IWYU runs both report, after a check of the preprocessor branches IWYU did not compile. Verified with the full test suite on macOS, a free-threaded (3.14t) build for the Py_GIL_DISABLED branches, and a g++ -Werror build on Debian. Rejected findings, kept for the record: - detail/internals.h <thread> and <limits>: used in the Py_GIL_DISABLED constructor branch. - detail/cpp_conduit.h internals.h: get_internals() is used in the PYPY_VERSION branch. - typing.h <algorithm>: std::copy_n is used in the C++20 branch. - The forward declarations of op_ (attr.h) and the collectors and arg_v (pytypes.h): they carry default template arguments that the definitions elsewhere do not repeat. - eigen/matrix.h <Eigen/SparseCore>: the sparse casters use it. - pybind11.h in the feature headers: the documented one-include contract. Assisted-by: ClaudeCode:claude-fable-5
|
I have to take this out of draft to run the full CI. (Edit: looks fine) |
|
The 1. finding below makes me wonder: could it be better to drop C++11 and C++14 support first? I think that will eliminate quite a few preprocessor branches. Findings (codex gpt-5.6-sol)
The export pragmas, shell quoting, standard-library mappings, and audited include removals otherwise look sound. I found no ABI or object-layout change. |
This is a pretty straightforward Claupy of CLIUtils/CLI11#1418. CI will have to test Windows and other variations of compilers and platforms, I did a linux and macOS locally.
iwyu crashes on one of our headers, and segfaults on another, by the way.
🤖 AI text below 🤖
Description
Adds an
iwyupreset and applies what it found, following CLIUtils/CLI11#1418.The preset runs include-what-you-use over the test build through
tools/iwyu.sh, which asks IWYU to also check each pybind11 header. Twoheaders crash IWYU 0.26 while it analyzes them and are skipped:
pybind11.h(assertion: "There should be a redecl specifying the default arg") and
cast.h(segmentation fault). Nothing enforces the result: the build alwayssucceeds and IWYU writes to stderr.
tools/iwyu.impkeeps the report readable. It maps each CPython header thatPython.hincludes back to<Python.h>(headers such as<datetime.h>thatPython.hdoes not include stay direct), libc++ detail headers and the Cheaders libstdc++ reports to the standard C++ header, and Eigen
src/internals to the module headers.
IWYU pragma: exportcomments ondetail/common.handconduit/wrap_include_python_h.hteach IWYU theconvention that
detail/common.his how a header gets<Python.h>.The second commit applies the additions, so each header names the pybind11
and standard headers it uses instead of taking them transitively. The third
applies the removals that macOS (libc++) and Debian (libstdc++) runs both
report, after checking the preprocessor branches IWYU did not compile; the
commit message records the rejected findings and why (
Py_GIL_DISABLEDandPYPY_VERSIONbranches, C++20 branches, forward declarations that carrydefault template arguments, and the one-include contract of the feature
headers).
Beyond CI, verified with the full test suite on macOS, a free-threaded 3.14t
build for the
Py_GIL_DISABLEDbranches, and a g++-Werrorbuild on Debiantrixie.
Suggested changelog entry:
iwyuCMake preset is available to keep them that way.