Boost logo

Boost :

Subject: [boost] Fwd: [run-clang-tidy] new replacement overlaps with an existing replacement
From: Mateusz Loskot (mateusz_at_[hidden])
Date: 2018-12-10 21:18:23


(I'm forwarding here my clang-tidy problem I posted to cfe-user mailing list,
since it touches Boost library, a highly templated library, and I'm hoping
we have experienced clang-tidy users among Boost developers.
Considering it a part of Boost library development, I hope it is not
off-topic here.)

---------- Forwarded message ---------
From: Mateusz Loskot <mateusz_at_[hidden]>
Date: Mon, 10 Dec 2018 at 22:14
Subject: [run-clang-tidy] new replacement overlaps with an existing replacement
To: <cfe-users_at_[hidden]>

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

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk