[clang-tidy] Add modernize-printf-to-std-print check
authorMike Crowe <mac@mcrowe.com>
Mon, 26 Jun 2023 18:24:45 +0000 (18:24 +0000)
committerPiotr Zegar <me@piotrzegar.pl>
Mon, 26 Jun 2023 19:05:02 +0000 (19:05 +0000)
commit83f875dc94d7a5cc9b2da32e2a7b1502e3b0640c
tree2c44c5901105f89fa03f52c4020ac33e9a4dc278
parent80ea480d6c03d46a0903fa863547827e705710f9
[clang-tidy] Add modernize-printf-to-std-print check

Add FormatStringConverter utility class that is capable of converting
printf-style format strings into std::print-style format strings along
with recording a set of casts to wrap the arguments as required and
removing now-unnecessary calls to std::string::c_str() and
std::string::data()

Use FormatStringConverter to implement a new clang-tidy check that is
capable of converting calls to printf, fprintf, absl::PrintF,
absl::FPrintF, or any functions configured by an option to calls to
std::print and std::println, or other functions configured by options.

In other words, the check turns:

 fprintf(stderr, "The %s is %3d\n", description.c_str(), value);

into:

 std::println(stderr, "The {} is {:3}", description, value);

if it can.

std::print and std::println can do almost anything that standard printf
can, but the conversion has some some limitations that are described in
the documentation. If conversion is not possible then the call remains
unchanged.

Depends on D153716

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D149280
21 files changed:
clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp [new file with mode: 0644]
clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.h [new file with mode: 0644]
clang-tools-extra/clang-tidy/utils/CMakeLists.txt
clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp [new file with mode: 0644]
clang-tools-extra/clang-tidy/utils/FormatStringConverter.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/modernize/use-std-print.rst [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/cstddef [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/cstdint [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/cstdio [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/inttypes.h [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/stddef.h [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/stdio.h
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/string.h
clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-fmt.cpp [new file with mode: 0644]
clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp [new file with mode: 0644]