Hi, I'm running clang-tidy 7.0 (also tried 5.0) to modernise some aspects of Boost.GIL (https://github.com/boostorg/gil) source code.
I've noticed, clang-tidy 7.0 (also 5.0) does not apply fixes for some of modernize-use-* checks, especially modernize-use-using. I run it this way: ``` cd ${BOOST_ROOT}/libs/gil cmake -S . -B _build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. run-clang-tidy.py -p=_build -header-filter='boost\/gil\/.*' -checks='-*,modernize-use-using' -fix ``` Then, I see huge number of "The new replacement overlaps with an existing replacement." diagnostics. Below, I copied an extract that hopefully is useful to figure out what is happening and going wrong. Basically, there are two class templates and a bunch of tag types: 1. file_stream_device https://github.com/boostorg/gil/blob/e0288ece9ec50534e7d02166863d6799a5932e25/include/boost/gil/io/device.hpp#L49 2. get_write_device with partial specialisations, `enable_if`-ed https://github.com/boostorg/gil/blob/e0288ece9ec50534e7d02166863d6799a5932e25/include/boost/gil/io/get_write_device.hpp#L19-L59 The file_stream_device is specialised for a tag and final get_write_device specialisation is matched. And, clang-tidy tries to substitute this alias in get_write_device typedef detail::file_stream_device< FormatTag > type; not with using type = detail::file_stream_device< FormatTag > ; but with `using type` for each FormatTag-based specialisation ``` New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<bmp_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<bmp_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<jpeg_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<png_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<png_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<png_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<pnm_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<targa_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<targa_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<tiff_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. New replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<tiff_tag>" Existing replacement: /mnt/d/boost.wsl/libs/gil/include/boost/gil/io/get_write_device.hpp: 1885:+52:"using type = detail::file_stream_device<FormatTag>" The new replacement overlaps with an existing replacement. ``` Why clang-tidy tries to re-fix the typedef with new replacement instead of keeping the existing one, the generic one? i.e. using type = detail::file_stream_device<FormatTag> I've tried to prepare a minimal example, but I couldn't reproduce this issue. I observed, that if I manually prepare compile_database.json with single .cpp file that just `#include <boost/gil/io/device.hpp>`, that is the header with definition of the base templates and no definitions with higher level specialisations for format tags are included, then clang-tidy applies the expected fixes without any warnings. Could anyone share any insights about this issue? Best regards, -- Mateusz Loskot, http://mateusz.loskot.net _______________________________________________ cfe-users mailing list cfe-users@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users