[clang-tools-extra] 43fa7ea - Revert "[clang-tidy] Fix modernize-use-std-print check when return value used"

Piotr Zegar via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 27 12:26:03 PDT 2023


Author: Piotr Zegar
Date: 2023-06-27T19:25:52Z
New Revision: 43fa7ea9df3a7b3bdc9d0129bcc3bed4db52dba0

URL: https://github.com/llvm/llvm-project/commit/43fa7ea9df3a7b3bdc9d0129bcc3bed4db52dba0
DIFF: https://github.com/llvm/llvm-project/commit/43fa7ea9df3a7b3bdc9d0129bcc3bed4db52dba0.diff

LOG: Revert "[clang-tidy] Fix modernize-use-std-print check when return value used"

This reverts commit 3e12b2e207cfa802937488a2c0b90d482eaf00a9.

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp
    clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-print.rst
    clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp
    clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp
    clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp
index b1e1189d4ed77..9b368f9a3e6c9 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStdPrintCheck.cpp
@@ -70,53 +70,27 @@ void UseStdPrintCheck::registerPPCallbacks(const SourceManager &SM,
   IncludeInserter.registerPreprocessor(PP);
 }
 
-static clang::ast_matchers::StatementMatcher
-unusedReturnValue(clang::ast_matchers::StatementMatcher MatchedCallExpr) {
-  auto UnusedInCompoundStmt =
-      compoundStmt(forEach(MatchedCallExpr),
-                   // The checker can't currently 
diff erentiate between the
-                   // return statement and other statements inside GNU statement
-                   // expressions, so disable the checker inside them to avoid
-                   // false positives.
-                   unless(hasParent(stmtExpr())));
-  auto UnusedInIfStmt =
-      ifStmt(eachOf(hasThen(MatchedCallExpr), hasElse(MatchedCallExpr)));
-  auto UnusedInWhileStmt = whileStmt(hasBody(MatchedCallExpr));
-  auto UnusedInDoStmt = doStmt(hasBody(MatchedCallExpr));
-  auto UnusedInForStmt =
-      forStmt(eachOf(hasLoopInit(MatchedCallExpr),
-                     hasIncrement(MatchedCallExpr), hasBody(MatchedCallExpr)));
-  auto UnusedInRangeForStmt = cxxForRangeStmt(hasBody(MatchedCallExpr));
-  auto UnusedInCaseStmt = switchCase(forEach(MatchedCallExpr));
-
-  return stmt(anyOf(UnusedInCompoundStmt, UnusedInIfStmt, UnusedInWhileStmt,
-                    UnusedInDoStmt, UnusedInForStmt, UnusedInRangeForStmt,
-                    UnusedInCaseStmt));
-}
-
 void UseStdPrintCheck::registerMatchers(MatchFinder *Finder) {
   if (!PrintfLikeFunctions.empty())
     Finder->addMatcher(
-        unusedReturnValue(
-            callExpr(argumentCountAtLeast(1),
-                     hasArgument(0, stringLiteral(isOrdinary())),
-                     callee(functionDecl(unless(cxxMethodDecl()),
-                                         matchers::matchesAnyListedName(
-                                             PrintfLikeFunctions))
-                                .bind("func_decl")))
-                .bind("printf")),
+        callExpr(argumentCountAtLeast(1),
+                 hasArgument(0, stringLiteral(isOrdinary())),
+                 callee(functionDecl(
+                            unless(cxxMethodDecl()),
+                            matchers::matchesAnyListedName(PrintfLikeFunctions))
+                            .bind("func_decl")))
+            .bind("printf"),
         this);
 
   if (!FprintfLikeFunctions.empty())
     Finder->addMatcher(
-        unusedReturnValue(
-            callExpr(argumentCountAtLeast(2),
-                     hasArgument(1, stringLiteral(isOrdinary())),
-                     callee(functionDecl(unless(cxxMethodDecl()),
-                                         matchers::matchesAnyListedName(
-                                             FprintfLikeFunctions))
-                                .bind("func_decl")))
-                .bind("fprintf")),
+        callExpr(argumentCountAtLeast(2),
+                 hasArgument(1, stringLiteral(isOrdinary())),
+                 callee(functionDecl(unless(cxxMethodDecl()),
+                                     matchers::matchesAnyListedName(
+                                         FprintfLikeFunctions))
+                            .bind("func_decl")))
+            .bind("fprintf"),
         this);
 }
 

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 8034238bea90e..385ee35c4f8f8 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
@@ -49,13 +49,6 @@ It doesn't do a bad job, but it's not perfect. In particular:
 
   - The glibc extension ``%m``.
 
-- ``printf`` and similar functions return the number of characters printed.
-  ``std::print`` does not. This means that any invocations that use the
-  return value will not be converted. Unfortunately this currently includes
-  explicitly-casting to ``void``. Deficiencies in this check mean that any
-  invocations inside ``GCC`` compound statements cannot be converted even
-  if the resulting value is not used.
-
 If conversion would be incomplete or unsafe then the entire invocation will
 be left unchanged.
 

diff  --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp
index e35d79d1bef5e..5345380028309 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-absl.cpp
@@ -55,14 +55,6 @@ void printf_no_casts_in_strict_mode() {
   // CHECK-FIXES: std::println("Unsigned integer {} from short", s);
 }
 
-int printf_uses_return_value(int i) {
-  using namespace absl;
-
-  return PrintF("return value %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:10: warning: use 'std::println' instead of 'PrintF' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("return value {}", i);
-}
-
 void fprintf_simple(FILE *fp) {
   absl::FPrintF(fp, "Hello %s %d", "world", 42);
   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: use 'std::print' instead of 'FPrintF' [modernize-use-std-print]
@@ -93,11 +85,3 @@ void fprintf_no_casts_in_strict_mode(FILE *fp) {
   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: use 'std::println' instead of 'FPrintF' [modernize-use-std-print]
   // CHECK-FIXES: std::println(fp, "Unsigned integer {} from short", s);
 }
-
-int fprintf_uses_return_value(FILE *fp, int i) {
-  using namespace absl;
-
-  return FPrintF(fp, "return value %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:10: warning: use 'std::println' instead of 'FPrintF' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("return value {}", i);
-}

diff  --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp
index a8dda40651b7b..08779837c75e7 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-print-custom.cpp
@@ -48,12 +48,6 @@ void printf_newline() {
   printf("Hello %s %d\n", "world", 42);
 }
 
-int printf_uses_return_value(int i) {
-  return myprintf("return value %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:10: warning: use 'std::println' instead of 'myprintf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("return value {}", i);
-}
-
 void fprintf_simple(FILE *fp)
 {
   myfprintf(stderr, "Hello %s %d", "world", 42);
@@ -79,9 +73,3 @@ void fprintf_newline(FILE *fp)
   // When using custom options leave fprintf alone
   fprintf(stderr, "Hello %s %d\n", "world", 42);
 }
-
-int fprintf_uses_return_value(int i) {
-  return myfprintf(stderr, "return value %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:10: warning: use 'std::println' instead of 'myprintf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println(stderr, "return value {}", i);
-}

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 e75c2d4cc019f..a40eec922ab55 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,233 +44,6 @@ void printf_deceptive_newline() {
   // CHECK-FIXES: std::println("Hello");
 }
 
-// std::print returns nothing, so any callers that use the return
-// value cannot be automatically translated.
-int printf_uses_return_value(int choice) {
-  const int i = printf("Return value assigned to variable %d\n", 42);
-
-  if (choice == 0)
-    printf("if body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("if body {}", i);
-  else if (choice == 1)
-    printf("else if body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("else if body {}", i);
-  else
-    printf("else body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("else body {}", i);
-
-  if (printf("Return value used as boolean in if statement"))
-    if (printf("Return value used in expression if statement") == 44)
-      if (const int j = printf("Return value used in assignment in if statement"))
-        if (const int k = printf("Return value used with initializer in if statement"); k == 44)
-          ;
-
-  int d = 0;
-  while (printf("%d", d) < 2)
-    ++d;
-
-  while (true)
-    printf("while body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("while body {}", i);
-
-  do
-    printf("do body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("do body {}", i);
-  while (true);
-
-  for (;;)
-    printf("for body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("for body {}", i);
-
-  for (printf("for init statement %d\n", i);;)
-    // CHECK-MESSAGES: [[@LINE-1]]:8: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("for init statement {}", i);
-    ;;
-
-  for (int j = printf("for init statement %d\n", i);;)
-    ;;
-
-  for (; printf("for condition %d\n", i);)
-    ;;
-
-  for (;; printf("for expression %d\n", i))
-    // CHECK-MESSAGES: [[@LINE-1]]:11: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("for expression {}", i)
-    ;;
-
-  for (auto C : "foo")
-    printf("ranged-for body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("ranged-for body {}", i);
-
-  switch (1) {
-  case 1:
-    printf("switch case body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("switch case body {}", i);
-    break;
-  default:
-    printf("switch default body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("switch default body {}", i);
-    break;
-  }
-
-  try {
-    printf("try body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("try body {}", i);
-  } catch (int) {
-    printf("catch body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println("catch body {}", i);
-  }
-
-  (printf("Parenthesised expression %d\n", i));
-  // CHECK-MESSAGES: [[@LINE-1]]:4: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-  // CHECK-FIXES: (std::println("Parenthesised expression {}", i));
-
-  // Ideally we would convert these two, but the current check doesn't cope with
-  // that.
-  (void)printf("cast to void %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:9: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("cast to void {}", i);
-
-  static_cast<void>(printf("static_cast to void %d\n", i));
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:9: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("static cast to void {}", i);
-
-  const int x = ({ printf("GCC statement expression using return value immediately %d\n", i); });
-  const int y = ({ const int y = printf("GCC statement expression using return value immediately %d\n", i); y; });
-
-  // Ideally we would convert this one, but the current check doesn't cope with
-  // that.
-  ({ printf("GCC statement expression with unused result %d\n", i); });
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:6: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("GCC statement expression with unused result {}", i);
-
-  return printf("Return value used in return\n");
-}
-
-int fprintf_uses_return_value(int choice) {
-  const int i = fprintf(stderr, "Return value assigned to variable %d\n", 42);
-
-  if (choice == 0)
-    fprintf(stderr, "if body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "if body {}", i);
-  else if (choice == 1)
-    fprintf(stderr, "else if body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "else if body {}", i);
-  else
-    fprintf(stderr, "else body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "else body {}", i);
-
-  if (fprintf(stderr, "Return value used as boolean in if statement"))
-    if (fprintf(stderr, "Return value used in expression if statement") == 44)
-      if (const int j = fprintf(stderr, "Return value used in assignment in if statement"))
-        if (const int k = fprintf(stderr, "Return value used with initializer in if statement"); k == 44)
-          ;
-
-  int d = 0;
-  while (fprintf(stderr, "%d", d) < 2)
-    ++d;
-
-  while (true)
-    fprintf(stderr, "while body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "while body {}", i);
-
-  do
-    fprintf(stderr, "do body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "do body {}", i);
-  while (true);
-
-  for (;;)
-    fprintf(stderr, "for body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "for body {}", i);
-
-  for (fprintf(stderr, "for init statement %d\n", i);;)
-    // CHECK-MESSAGES: [[@LINE-1]]:8: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "for init statement {}", i);
-    ;;
-
-  for (int j = fprintf(stderr, "for init statement %d\n", i);;)
-    ;;
-
-  for (; fprintf(stderr, "for condition %d\n", i);)
-    ;;
-
-  for (;; fprintf(stderr, "for expression %d\n", i))
-    // CHECK-MESSAGES: [[@LINE-1]]:11: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "for expression {}", i)
-    ;;
-
-  for (auto C : "foo")
-    fprintf(stderr, "ranged-for body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "ranged-for body {}", i);
-
-  switch (1) {
-  case 1:
-    fprintf(stderr, "switch case body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "switch case body {}", i);
-    break;
-  default:
-    fprintf(stderr, "switch default body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "switch default body {}", i);
-    break;
-  }
-
-  try {
-    fprintf(stderr, "try body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "try body {}", i);
-  } catch (int) {
-    fprintf(stderr, "catch body %d\n", i);
-    // CHECK-MESSAGES: [[@LINE-1]]:5: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-    // CHECK-FIXES: std::println(stderr, "catch body {}", i);
-  }
-
-
-  (printf("Parenthesised expression %d\n", i));
-  // CHECK-MESSAGES: [[@LINE-1]]:4: warning: use 'std::println' instead of 'printf' [modernize-use-std-print]
-  // CHECK-FIXES: (std::println("Parenthesised expression {}", i));
-
-  // Ideally we would convert these two, but the current check doesn't cope with
-  // that.
-  (void)fprintf(stderr, "cast to void %d\n", i);
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:9: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println(stderr, "cast to void {}", i);
-
-  static_cast<void>(fprintf(stderr, "static_cast to void %d\n", i));
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:9: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println(stderr, "static cast to void {}", i);
-
-  const int x = ({ fprintf(stderr, "GCC statement expression using return value immediately %d\n", i); });
-  const int y = ({ const int y = fprintf(stderr, "GCC statement expression using return value immediately %d\n", i); y; });
-
-  // Ideally we would convert this one, but the current check doesn't cope with
-  // that.
-  ({ fprintf(stderr, "GCC statement expression with unused result %d\n", i); });
-  // CHECK-MESSAGES-NOT: [[@LINE-1]]:6: warning: use 'std::println' instead of 'fprintf' [modernize-use-std-print]
-  // CHECK-FIXES-NOT: std::println("GCC statement expression with unused result {}", i);
-
-  return fprintf(stderr, "Return value used in return\n");
-}
-
 void fprintf_simple() {
   fprintf(stderr, "Hello");
   // CHECK-MESSAGES: [[@LINE-1]]:3: warning: use 'std::print' instead of 'fprintf' [modernize-use-std-print]


        


More information about the cfe-commits mailing list