[clang-tidy] Add portability-std-allocator-const check
authorFangrui Song <i@maskray.me>
Thu, 14 Apr 2022 05:35:11 +0000 (22:35 -0700)
committerFangrui Song <i@maskray.me>
Thu, 14 Apr 2022 05:35:11 +0000 (22:35 -0700)
commit73da7eed8fac84c9005518740f12d58389998d95
tree200794ff27d643a9dfdcb50ebd9fc3a438fcdffa
parent1e01f95057a702658a88879223586fde0122f038
[clang-tidy] Add portability-std-allocator-const check

Report use of ``std::vector<const T>`` (and similar containers of const
elements). These are now allowed in standard C++ due to undefined
``std::allocator<const T>``. They do not compile with libstdc++ or MSVC.
Future libc++ will remove the extension (D120996).
See docs/clang-tidy/checks/portability-std-allocator-const.rst for detail.

I have attempted clean-up in a large code base. Here are some statistics:

* 98% are related to the container `std::vector`, among `deque/forward_list/list/multiset/queue/set/stack/vector`.
* 24% are related to `std::vector<const std::string>`.
* Both `std::vector<const absl::string_view>` and `std::vector<const int>` contribute 2%. The other contributors spread over various class types.

The check can be useful to other large code bases and may serve as an example
for future libc++ strictness improvement.

Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D123655
clang-tools-extra/clang-tidy/portability/CMakeLists.txt
clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
clang-tools-extra/clang-tidy/portability/StdAllocatorConstCheck.cpp [new file with mode: 0644]
clang-tools-extra/clang-tidy/portability/StdAllocatorConstCheck.h [new file with mode: 0644]
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/list.rst
clang-tools-extra/docs/clang-tidy/checks/portability-std-allocator-const.rst [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/portability-std-allocator-const.cpp [new file with mode: 0644]