[clang-tools-extra] [clang-tidy] Speed up/rewrite `bugprone-stringview-nullptr` (PR #192889)

Victor Chernyakin via cfe-commits cfe-commits at lists.llvm.org
Sun Apr 19 21:33:07 PDT 2026


================
@@ -1328,295 +1328,217 @@ void pointer_greater_comparison(std::string_view *sv_ptr) /* l */ {
   // Without Equality
   {
     (void)(*sv_ptr > nullptr) /* l1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing
     // CHECK-FIXES: (void)(*sv_ptr > "") /* l1 */;
 
     (void)(*sv_ptr > (nullptr)) /* l2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing
     // CHECK-FIXES: (void)(*sv_ptr > "") /* l2 */;
 
     (void)(nullptr > *sv_ptr) /* l3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
     // CHECK-FIXES: (void)("" > *sv_ptr) /* l3 */;
 
     (void)((nullptr) > *sv_ptr) /* l4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
     // CHECK-FIXES: (void)("" > *sv_ptr) /* l4 */;
   }
 
   // With Equality
   {
     (void)(*sv_ptr >= nullptr) /* l5 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: constructing
     // CHECK-FIXES: (void)(*sv_ptr >= "") /* l5 */;
 
     (void)(*sv_ptr >= (nullptr)) /* l6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: constructing
     // CHECK-FIXES: (void)(*sv_ptr >= "") /* l6 */;
 
     (void)(nullptr >= *sv_ptr) /* l7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
     // CHECK-FIXES: (void)("" >= *sv_ptr) /* l7 */;
 
     (void)((nullptr) >= *sv_ptr) /* l8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
     // CHECK-FIXES: (void)("" >= *sv_ptr) /* l8 */;
   }
 }
 
 void relative_comparison_with_temporary(std::string_view sv) /* m */ {
   (void)(sv < std::string_view(nullptr)) /* m1 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
+  // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing
   // CHECK-FIXES: (void)(sv < std::string_view()) /* m1 */;
 
   (void)(sv < std::string_view{nullptr}) /* m2 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
+  // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing
   // CHECK-FIXES: (void)(sv < std::string_view{}) /* m2 */;
 
   (void)(sv < (std::string_view) nullptr) /* m3 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: constructing{{.*}}default
+  // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: constructing
   // CHECK-FIXES: (void)(sv < (std::string_view) {}) /* m3 */;
 
   (void)(sv < (std::string_view){nullptr}) /* m4 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: constructing{{.*}}default
+  // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: constructing
   // CHECK-FIXES: (void)(sv < (std::string_view){}) /* m4 */;
 
   (void)(sv < static_cast<SV>(nullptr)) /* m5 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: casting{{.*}}empty string
+  // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing
   // CHECK-FIXES: (void)(sv < static_cast<SV>("")) /* m5 */;
 }
 
 void equality_comparison(std::string_view sv) /* n */ {
   // Empty Without Parens
   {
     (void)(sv == nullptr) /* n1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing basic_string_view to null is undefined; replace with the emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n1 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing
+    // CHECK-FIXES: (void)(sv == "") /* n1 */;
 
     (void)(sv == (nullptr)) /* n2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n2 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing
+    // CHECK-FIXES: (void)(sv == "") /* n2 */;
 
     (void)(nullptr == sv) /* n3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n3 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" == sv) /* n3 */;
 
     (void)((nullptr) == sv) /* n4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n4 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" == sv) /* n4 */;
   }
 
   // Empty With Parens
   {
     (void)((sv) == nullptr) /* n5 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing basic_string_view to null is undefined; replace with the emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n5 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) == "") /* n5 */;
 
     (void)((sv) == (nullptr)) /* n6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n6 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) == "") /* n6 */;
 
     (void)(nullptr == (sv)) /* n7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n7 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" == (sv)) /* n7 */;
 
     (void)((nullptr) == (sv)) /* n8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv.empty()) /* n8 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" == (sv)) /* n8 */;
   }
 
   // Non-Empty Without Parens
   {
     (void)((sv) != nullptr) /* n9 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n9 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) != "") /* n9 */;
 
     (void)((sv) != (nullptr)) /* n10 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n10 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) != "") /* n10 */;
 
     (void)(nullptr != (sv)) /* n11 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n11 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" != (sv)) /* n11 */;
 
     (void)((nullptr) != (sv)) /* n12 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n12 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" != (sv)) /* n12 */;
   }
 
   // Non-Empty With Parens
   {
     (void)((sv) != nullptr) /* n13 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n13 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) != "") /* n13 */;
 
     (void)((sv) != (nullptr)) /* n14 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n14 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: constructing
+    // CHECK-FIXES: (void)((sv) != "") /* n14 */;
 
     (void)(nullptr != (sv)) /* n15 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n15 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing
+    // CHECK-FIXES: (void)("" != (sv)) /* n15 */;
 
     (void)((nullptr) != (sv)) /* n16 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(!sv.empty()) /* n16 */;
-  }
-}
-
-void pointer_equality_comparison(std::string_view *sv_ptr) /* o */ {
-  // Empty Without Parens
-  {
-    (void)(*sv_ptr == nullptr) /* o1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}emptiness query
-    // CHECK-FIXES: (void)(sv_ptr->empty()) /* o1 */;
----------------
localspook wrote:

I've removed this test case because, with the new code, `*sv_ptr == nullptr` exercises the same code paths as `sv == nullptr`.

https://github.com/llvm/llvm-project/pull/192889


More information about the cfe-commits mailing list