[clang-tools-extra] 2ce765e - [clang-tidy] Don't split \r\n in modernize-use-std-print check
Piotr Zegar via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 11 12:22:59 PDT 2023
Author: Mike Crowe
Date: 2023-07-11T19:22:31Z
New Revision: 2ce765eb2f4feb7555d1416842c542743990b004
URL: https://github.com/llvm/llvm-project/commit/2ce765eb2f4feb7555d1416842c542743990b004
DIFF: https://github.com/llvm/llvm-project/commit/2ce765eb2f4feb7555d1416842c542743990b004.diff
LOG: [clang-tidy] Don't split \r\n in modernize-use-std-print check
When given:
printf("Hello\r\n");
it's clearer to leave the CRLF intact and convert this to:
std::print("Hello\r\n");
than to remove the trailing newline and convert it to:
std::println("Hello\r");
Update the documentation to match, and clarify the situations for using
println vs print which weren't previously explained.
Reviewed By: PiotrZSL
Differential Revision: https://reviews.llvm.org/D154788
Added:
Modified:
clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp b/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
index 3e6442c5fd63c1..951e0acf79b1ae 100644
--- a/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
+++ b/clang-tools-extra/clang-tidy/utils/FormatStringConverter.cpp
@@ -623,8 +623,11 @@ void FormatStringConverter::finalizeFormatText() {
PrintfFormatString.size() - PrintfFormatStringPos));
PrintfFormatStringPos = PrintfFormatString.size();
+ // It's clearer to convert printf("Hello\r\n"); to std::print("Hello\r\n")
+ // than to std::println("Hello\r");
if (StringRef(StandardFormatString).ends_with("\\n") &&
- !StringRef(StandardFormatString).ends_with("\\\\n")) {
+ !StringRef(StandardFormatString).ends_with("\\\\n") &&
+ !StringRef(StandardFormatString).ends_with("\\r\\n")) {
UsePrintNewlineFunction = true;
FormatStringNeededRewriting = true;
StandardFormatString.erase(StandardFormatString.end() - 2,
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
index ec17b6fbd48f20..378caccf611bb8 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
@@ -70,8 +70,10 @@ If the call is deemed suitable for conversion then:
`FprintfLikeFunctions` are replaced with the function specified by the
`ReplacementPrintlnFunction` option if the format string ends with ``\n``
or `ReplacementPrintFunction` otherwise.
-- the format string is rewritten to use the ``std::formatter`` language and
- a ``\n`` is removed from the end.
+- the format string is rewritten to use the ``std::formatter`` language. If
+ a ``\n`` is found at the end of the format string not preceded by ``r``
+ then it is removed and `ReplacementPrintlnFunction` is used rather than
+ `ReplacementPrintFunction`.
- any arguments that corresponded to ``%p`` specifiers that
``std::formatter`` wouldn't accept are wrapped in a ``static_cast``
to ``const void *``.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp
index 4d6bcef3161ac4..321baeec7a6b09 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp
@@ -44,6 +44,16 @@ void printf_deceptive_newline() {
// CHECK-FIXES: std::println("Hello");
}
+void printf_crlf_newline() {
+ printf("Hello\r\n");
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: use 'std::print' instead of 'printf' [modernize-use-std-print]
+ // CHECK-FIXES: std::print("Hello\r\n");
+
+ printf("Hello\r\\n");
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: use 'std::print' instead of 'printf' [modernize-use-std-print]
+ // CHECK-FIXES: std::print("Hello\r\\n");
+}
+
// std::print returns nothing, so any callers that use the return
// value cannot be automatically translated.
int printf_uses_return_value(int choice) {
More information about the cfe-commits
mailing list