CJ-Johnson updated this revision to Diff 392157.
CJ-Johnson added a comment.

Switch to using empty string edits everywhere except equality comparison


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115121/new/

https://reviews.llvm.org/D115121

Files:
  clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp
  clang-tools-extra/test/clang-tidy/checkers/bugprone-stringview-nullptr.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-stringview-nullptr.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/bugprone-stringview-nullptr.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-stringview-nullptr.cpp
@@ -88,132 +88,179 @@
 
 } // namespace std
 
-void function(std::string_view);
-void function(std::string_view, std::string_view);
+void sv_function(std::string_view);
+void sv_function(std::string_view, std::string_view);
+class ImplicitClass {
+public:
+  ImplicitClass() = delete;
+  explicit ImplicitClass(std::string_view);
+  ImplicitClass(std::string_view, std::string_view);
+};
+class ExplicitClass {
+public:
+  ExplicitClass() = delete;
+  explicit ExplicitClass(std::string_view);
+  ExplicitClass(std::string_view, std::string_view);
+};
+struct Struct {
+  std::string_view first = {};
+  std::string_view second = {};
+};
 
 void temporary_construction() /* a */ {
   // Functional Cast
   {
     (void)(std::string_view(nullptr)) /* a1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing basic_string_view from null is undefined; replace with the default constructor
-    // CHECK-FIXES: {{^}}    (void)(std::string_view()) /* a1 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing basic_string_view from null is undefined; replace with the empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view("")) /* a1 */;
 
     (void)(std::string_view((nullptr))) /* a2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view()) /* a2 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view("")) /* a2 */;
 
     (void)(std::string_view({nullptr})) /* a3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view()) /* a3 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view("")) /* a3 */;
 
     (void)(std::string_view({(nullptr)})) /* a4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view()) /* a4 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view("")) /* a4 */;
 
     (void)(std::string_view({})) /* a5 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view()) /* a5 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view("")) /* a5 */;
   }
 
   // Temporary Object
   {
     (void)(std::string_view{nullptr}) /* a6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view{}) /* a6 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view{""}) /* a6 */;
 
     (void)(std::string_view{(nullptr)}) /* a7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view{}) /* a7 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view{""}) /* a7 */;
 
     (void)(std::string_view{{nullptr}}) /* a8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view{}) /* a8 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view{""}) /* a8 */;
 
     (void)(std::string_view{{(nullptr)}}) /* a9 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view{}) /* a9 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view{""}) /* a9 */;
 
     (void)(std::string_view{{}}) /* a10 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(std::string_view{}) /* a10 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(std::string_view{""}) /* a10 */;
   }
 
   // C-Style Cast && Compound Literal
   {
     (void)((std::string_view) nullptr) /* a11 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view) {}) /* a11 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view) "") /* a11 */;
 
     (void)((std::string_view)(nullptr)) /* a12 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a12 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view)"") /* a12 */;
 
     (void)((std::string_view){nullptr}) /* a13 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a13 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view){""}) /* a13 */;
 
     (void)((std::string_view){(nullptr)}) /* a14 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a14 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view){""}) /* a14 */;
 
     (void)((std::string_view){{nullptr}}) /* a15 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a15 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view){""}) /* a15 */;
 
     (void)((std::string_view){{(nullptr)}}) /* a16 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a16 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view){""}) /* a16 */;
 
     (void)((std::string_view){{}}) /* a17 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((std::string_view){}) /* a17 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((std::string_view){""}) /* a17 */;
 
     (void)((const std::string_view) nullptr) /* a18 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view) {}) /* a18 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view) "") /* a18 */;
 
     (void)((const std::string_view)(nullptr)) /* a19 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a19 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view)"") /* a19 */;
 
     (void)((const std::string_view){nullptr}) /* a20 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a20 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view){""}) /* a20 */;
 
     (void)((const std::string_view){(nullptr)}) /* a21 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a21 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view){""}) /* a21 */;
 
     (void)((const std::string_view){{nullptr}}) /* a22 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a22 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view){""}) /* a22 */;
 
     (void)((const std::string_view){{(nullptr)}}) /* a23 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a23 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view){""}) /* a23 */;
 
     (void)((const std::string_view){{}}) /* a24 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)((const std::string_view){}) /* a24 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)((const std::string_view){""}) /* a24 */;
+  }
+
+  // Return Value
+  {
+    (void)([] -> std::string_view { return nullptr; }) /* a25 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return ""; }) /* a25 */;
+
+    (void)([] -> std::string_view { return (nullptr); }) /* a26 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return ""; }) /* a26 */;
+
+    (void)([] -> std::string_view { return {nullptr}; }) /* a27 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return {""}; }) /* a27 */;
+
+    (void)([] -> std::string_view { return {(nullptr)}; }) /* a28 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return {""}; }) /* a28 */;
+
+    (void)([] -> std::string_view { return {{nullptr}}; }) /* a29 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return {""}; }) /* a29 */;
+
+    (void)([] -> std::string_view { return {{(nullptr)}}; }) /* a30 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return {""}; }) /* a30 */;
+
+    (void)([] -> std::string_view { return {{}}; }) /* a31 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)([] -> std::string_view { return {""}; }) /* a31 */;
   }
 
   // Static Cast
   {
-    (void)(static_cast<std::string_view>(nullptr)) /* a25 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(static_cast<std::string_view>("")) /* a25 */;
+    (void)(static_cast<std::string_view>(nullptr)) /* a32 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: constructing basic_string_view from null is undefined; replace with the empty string
+    // CHECK-FIXES: {{^}}    (void)(static_cast<std::string_view>("")) /* a32 */;
 
-    (void)(static_cast<std::string_view>((nullptr))) /* a26 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(static_cast<std::string_view>("")) /* a26 */;
+    (void)(static_cast<std::string_view>((nullptr))) /* a33 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(static_cast<std::string_view>("")) /* a33 */;
 
-    (void)(static_cast<const std::string_view>(nullptr)) /* a27 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(static_cast<const std::string_view>("")) /* a27 */;
+    (void)(static_cast<const std::string_view>(nullptr)) /* a34 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(static_cast<const std::string_view>("")) /* a34 */;
 
-    (void)(static_cast<const std::string_view>((nullptr))) /* a28 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(static_cast<const std::string_view>("")) /* a28 */;
+    (void)(static_cast<const std::string_view>((nullptr))) /* a35 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(static_cast<const std::string_view>("")) /* a35 */;
   }
 }
 
@@ -221,149 +268,149 @@
   // Copy Initialization
   {
     std::string_view b1 = nullptr;
-    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b1 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b1 = "";
 
     std::string_view b2 = (nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b2 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b2 = "";
 
     const std::string_view b3 = nullptr;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b3 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b3 = "";
 
     const std::string_view b4 = (nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b4 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b4 = "";
   }
 
   // Copy List Initialization
   {
     std::string_view b5 = {nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b5 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b5 = {""};
 
     std::string_view b6 = {(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b6 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b6 = {""};
 
     std::string_view b7 = {{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b7 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b7 = {""};
 
     std::string_view b8 = {{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b8 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b8 = {""};
 
     std::string_view b9 = {{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b9 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b9 = {""};
 
     const std::string_view b10 = {nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b10 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b10 = {""};
 
     const std::string_view b11 = {(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b11 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b11 = {""};
 
     const std::string_view b12 = {{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b12 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b12 = {""};
 
     const std::string_view b13 = {{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b13 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b13 = {""};
 
     const std::string_view b14 = {{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b14 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b14 = {""};
   }
 
   // Direct Initialization
   {
     std::string_view b15(nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b15;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b15("");
 
     std::string_view b16((nullptr));
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b16;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b16("");
 
     std::string_view b17({nullptr});
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b17;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b17("");
 
     std::string_view b18({(nullptr)});
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b18;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b18("");
 
     std::string_view b19({}); // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b19;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b19("");
 
     const std::string_view b20(nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b20;
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b20("");
 
     const std::string_view b21((nullptr));
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b21;
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b21("");
 
     const std::string_view b22({nullptr});
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b22;
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b22("");
 
     const std::string_view b23({(nullptr)});
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b23;
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b23("");
 
     const std::string_view b24({}); // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b24;
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b24("");
   }
 
   // Direct List Initialization
   {
     std::string_view b25{nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b25{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b25{""};
 
     std::string_view b26{(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b26{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b26{""};
 
     std::string_view b27{{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b27{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b27{""};
 
     std::string_view b28{{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b28{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b28{""};
 
     std::string_view b29{{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view b29{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view b29{""};
 
     const std::string_view b30{nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b30{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b30{""};
 
     const std::string_view b31{(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b31{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b31{""};
 
     const std::string_view b32{{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b32{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b32{""};
 
     const std::string_view b33{{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b33{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b33{""};
 
     const std::string_view b34{{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view b34{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view b34{""};
   }
 }
 
@@ -372,104 +419,104 @@
     void CopyInitialization();
 
     std::string_view c1 = nullptr;
-    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c1 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c1 = "";
 
     std::string_view c2 = (nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c2 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c2 = "";
 
     const std::string_view c3 = nullptr;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c3 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c3 = "";
 
     const std::string_view c4 = (nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c4 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c4 = "";
 
     void CopyListInitialization();
 
     std::string_view c5 = {nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c5 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c5 = {""};
 
     std::string_view c6 = {(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c6 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c6 = {""};
 
     std::string_view c7 = {{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c7 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c7 = {""};
 
     std::string_view c8 = {{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c8 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c8 = {""};
 
     std::string_view c9 = {{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c9 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c9 = {""};
 
     const std::string_view c10 = {nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c10 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c10 = {""};
 
     const std::string_view c11 = {(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c11 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c11 = {""};
 
     const std::string_view c12 = {{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c12 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c12 = {""};
 
     const std::string_view c13 = {{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c13 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c13 = {""};
 
     const std::string_view c14 = {{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c14 = {};
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c14 = {""};
 
     void DirectListInitialization();
 
     std::string_view c15{nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c15{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c15{""};
 
     std::string_view c16{(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c16{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c16{""};
 
     std::string_view c17{{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c17{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c17{""};
 
     std::string_view c18{{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c18{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c18{""};
 
     std::string_view c19{{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    std::string_view c19{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    std::string_view c19{""};
 
     const std::string_view c20{nullptr};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c20{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c20{""};
 
     const std::string_view c21{(nullptr)};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c21{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c21{""};
 
     const std::string_view c22{{nullptr}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c22{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c22{""};
 
     const std::string_view c23{{(nullptr)}};
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c23{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c23{""};
 
     const std::string_view c24{{}}; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    const std::string_view c24{};
+    // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    const std::string_view c24{""};
   };
 
   class ConstructorInitializers {
@@ -477,46 +524,46 @@
         : direct_initialization(),
 
           c25(nullptr),
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c25(),
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c25(""),
 
           c26((nullptr)),
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c26(),
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c26(""),
 
           c27({nullptr}),
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c27(),
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c27(""),
 
           c28({(nullptr)}),
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c28(),
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c28(""),
 
           c29({}), // Default `const CharT*`
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c29(),
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c29(""),
 
           direct_list_initialization(),
 
           c30{nullptr},
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c30{},
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c30{""},
 
           c31{(nullptr)},
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c31{},
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c31{""},
 
           c32{{nullptr}},
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c32{},
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c32{""},
 
           c33{{(nullptr)}},
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c33{},
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c33{""},
 
           c34{{}}, // Default `const CharT*`
-          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-          // CHECK-FIXES: {{^}}          c34{},
+          // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}empty string
+          // CHECK-FIXES: {{^}}          c34{""},
 
           end_of_list() {}
 
@@ -540,63 +587,63 @@
   // Copy Initialization
   {
     void d1(std::string_view sv = nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d1(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d1(std::string_view sv = "");
 
     void d2(std::string_view sv = (nullptr));
-    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d2(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d2(std::string_view sv = "");
 
     void d3(const std::string_view sv = nullptr);
-    // CHECK-MESSAGES: :[[@LINE-1]]:41: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d3(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:41: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d3(const std::string_view sv = "");
 
     void d4(const std::string_view sv = (nullptr));
-    // CHECK-MESSAGES: :[[@LINE-1]]:41: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d4(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:41: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d4(const std::string_view sv = "");
   }
 
   // Copy List Initialization
   {
     void d5(std::string_view sv = {nullptr});
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d5(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d5(std::string_view sv = {""});
 
     void d6(std::string_view sv = {(nullptr)});
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d6(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d6(std::string_view sv = {""});
 
     void d7(std::string_view sv = {{nullptr}});
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d7(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d7(std::string_view sv = {""});
 
     void d8(std::string_view sv = {{(nullptr)}});
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d8(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d8(std::string_view sv = {""});
 
     void d9(std::string_view sv = {{}}); // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d9(std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d9(std::string_view sv = {""});
 
     void d10(const std::string_view sv = {nullptr});
-    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d10(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d10(const std::string_view sv = {""});
 
     void d11(const std::string_view sv = {(nullptr)});
-    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d11(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d11(const std::string_view sv = {""});
 
     void d12(const std::string_view sv = {{nullptr}});
-    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d12(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d12(const std::string_view sv = {""});
 
     void d13(const std::string_view sv = {{(nullptr)}});
-    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d13(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d13(const std::string_view sv = {""});
 
     void d14(const std::string_view sv = {{}}); // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    void d14(const std::string_view sv = {});
+    // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    void d14(const std::string_view sv = {""});
   }
 }
 
@@ -604,223 +651,241 @@
   // Direct Initialization
   {
     (void)(new std::string_view(nullptr)) /* e1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view()) /* e1 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view("")) /* e1 */;
 
     (void)(new std::string_view((nullptr))) /* e2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view()) /* e2 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view("")) /* e2 */;
 
     (void)(new std::string_view({nullptr})) /* e3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view()) /* e3 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view("")) /* e3 */;
 
     (void)(new std::string_view({(nullptr)})) /* e4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view()) /* e4 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view("")) /* e4 */;
 
     (void)(new std::string_view({})) /* e5 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view()) /* e5 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view("")) /* e5 */;
 
     (void)(new const std::string_view(nullptr)) /* e6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view()) /* e6 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view("")) /* e6 */;
 
     (void)(new const std::string_view((nullptr))) /* e7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view()) /* e7 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view("")) /* e7 */;
 
     (void)(new const std::string_view({nullptr})) /* e8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view()) /* e8 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view("")) /* e8 */;
 
     (void)(new const std::string_view({(nullptr)})) /* e9 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view()) /* e9 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view("")) /* e9 */;
 
     (void)(new const std::string_view({})) /* e10 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view()) /* e10 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view("")) /* e10 */;
   }
 
   // Direct List Initialization
   {
     (void)(new std::string_view{nullptr}) /* e11 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view{}) /* e11 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view{""}) /* e11 */;
 
     (void)(new std::string_view{(nullptr)}) /* e12 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view{}) /* e12 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view{""}) /* e12 */;
 
     (void)(new std::string_view{{nullptr}}) /* e13 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view{}) /* e13 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view{""}) /* e13 */;
 
     (void)(new std::string_view{{(nullptr)}}) /* e14 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view{}) /* e14 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view{""}) /* e14 */;
 
     (void)(new std::string_view{{}}) /* e15 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new std::string_view{}) /* e15 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new std::string_view{""}) /* e15 */;
 
     (void)(new const std::string_view{nullptr}) /* e16 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{}) /* e16 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{""}) /* e16 */;
 
     (void)(new const std::string_view{(nullptr)}) /* e17 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{}) /* e17 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{""}) /* e17 */;
 
     (void)(new const std::string_view{{nullptr}}) /* e18 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{}) /* e18 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{""}) /* e18 */;
 
     (void)(new const std::string_view{{(nullptr)}}) /* e19 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{}) /* e19 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{""}) /* e19 */;
 
     (void)(new const std::string_view{{}}) /* e20 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{}) /* e20 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    (void)(new const std::string_view{""}) /* e20 */;
   }
 }
 
 void function_invocation() /* f */ {
-  // Single Argument
+  // Single Argument Function Invocation
   {
-    function(nullptr) /* f1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}) /* f1 */;
+    sv_function(nullptr) /* f1 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function("") /* f1 */;
 
-    function((nullptr)) /* f2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}) /* f2 */;
+    sv_function((nullptr)) /* f2 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function("") /* f2 */;
 
-    function({nullptr}) /* f3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}) /* f3 */;
+    sv_function({nullptr}) /* f3 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}) /* f3 */;
 
-    function({(nullptr)}) /* f4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}) /* f4 */;
+    sv_function({(nullptr)}) /* f4 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}) /* f4 */;
 
-    function({{}}) /* f5 */; // Default `const CharT*`
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}) /* f5 */;
+    sv_function({{nullptr}}) /* f5 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}) /* f5 */;
+
+    sv_function({{(nullptr)}}) /* f6 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}) /* f6 */;
+
+    sv_function({{}}) /* f7 */; // Default `const CharT*`
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}) /* f7 */;
   }
 
-  // Multiple Argument
+  // Multiple Argument Function Invocation
   {
-    function(nullptr, nullptr) /* f6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}default
-    // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}, {}) /* f6 */;
-
-    function((nullptr), (nullptr)) /* f7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}default
-    // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}, {}) /* f7 */;
-
-    function({nullptr}, {nullptr}) /* f8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}, {}) /* f8 */;
-
-    function({(nullptr)}, {(nullptr)}) /* f9 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-MESSAGES: :[[@LINE-2]]:28: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}, {}) /* f9 */;
-
-    function({{}}, {{}}) /* f10 */; // Default `const CharT*`s
-    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: constructing{{.*}}default
-    // CHECK-MESSAGES: :[[@LINE-2]]:21: warning: constructing{{.*}}default
-    // CHECK-FIXES: {{^}}    function({}, {}) /* f10 */;
+    sv_function(nullptr, nullptr) /* f8 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function("", "") /* f8 */;
+
+    sv_function((nullptr), (nullptr)) /* f9 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:28: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function("", "") /* f9 */;
+
+    sv_function({nullptr}, {nullptr}) /* f10 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}, {""}) /* f10 */;
+
+    sv_function({(nullptr)}, {(nullptr)}) /* f11 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}, {""}) /* f11 */;
+
+    sv_function({{nullptr}}, {{nullptr}}) /* f12 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}, {""}) /* f12 */;
+
+    sv_function({{(nullptr)}}, {{(nullptr)}}) /* f13 */;
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}, {""}) /* f13 */;
+
+    sv_function({{}}, {{}}) /* f14 */; // Default `const CharT*`s
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-2]]:24: warning: constructing{{.*}}empty string
+    // CHECK-FIXES: {{^}}    sv_function({""}, {""}) /* f14 */;
   }
 }
 
 void assignment(std::string_view sv) /* g */ {
   sv = nullptr /* g1 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: assignment to basic_string_view from null is undefined; replace with the default constructor
-  // CHECK-FIXES: {{^}}  sv = {} /* g1 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  sv = "" /* g1 */;
 
   sv = (nullptr) /* g2 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  sv = {} /* g2 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  sv = "" /* g2 */;
 
   sv = {nullptr} /* g3 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  sv = {} /* g3 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  sv = {""} /* g3 */;
 
   sv = {(nullptr)} /* g4 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  sv = {} /* g4 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  sv = {""} /* g4 */;
 
   sv = {{}} /* g5 */; // Default `const CharT*`
-  // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  sv = {} /* g5 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  sv = {""} /* g5 */;
 }
 
 void pointer_assignment(std::string_view *sv_ptr) /* h */ {
   *sv_ptr = nullptr /* h1 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  *sv_ptr = {} /* h1 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  *sv_ptr = "" /* h1 */;
 
   *sv_ptr = (nullptr) /* h2 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  *sv_ptr = {} /* h2 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  *sv_ptr = "" /* h2 */;
 
   *sv_ptr = {nullptr} /* h3 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  *sv_ptr = {} /* h3 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  *sv_ptr = {""} /* h3 */;
 
   *sv_ptr = {(nullptr)} /* h4 */;
-  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  *sv_ptr = {} /* h4 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  *sv_ptr = {""} /* h4 */;
 
   *sv_ptr = {{}} /* h5 */; // Default `const CharT*`
-  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: assignment{{.*}}default
-  // CHECK-FIXES: {{^}}  *sv_ptr = {} /* h5 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  *sv_ptr = {""} /* h5 */;
 }
 
 void lesser_comparison(std::string_view sv) /* i */ {
   // Without Equality
   {
     (void)(sv < nullptr) /* i1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: comparing basic_string_view to null is undefined; replace with the empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv < "") /* i1 */;
 
     (void)(sv < (nullptr)) /* i2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv < "") /* i2 */;
 
     (void)(nullptr < sv) /* i3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" < sv) /* i3 */;
 
     (void)((nullptr) < sv) /* i4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" < sv) /* i4 */;
   }
 
   // With Equality
   {
     (void)(sv <= nullptr) /* i5 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv <= "") /* i5 */;
 
     (void)(sv <= (nullptr)) /* i6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv <= "") /* i6 */;
 
     (void)(nullptr <= sv) /* i7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" <= sv) /* i7 */;
 
     (void)((nullptr) <= sv) /* i8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" <= sv) /* i8 */;
   }
 }
@@ -829,38 +894,38 @@
   // Without Equality
   {
     (void)(*sv_ptr < nullptr) /* j1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(*sv_ptr < "") /* j1 */;
 
     (void)(*sv_ptr < (nullptr)) /* j2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(*sv_ptr < "") /* j2 */;
 
     (void)(nullptr < *sv_ptr) /* j3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" < *sv_ptr) /* j3 */;
 
     (void)((nullptr) < *sv_ptr) /* j4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" < *sv_ptr) /* j4 */;
   }
 
   // With Equality
   {
     (void)(*sv_ptr <= nullptr) /* j5 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(*sv_ptr <= "") /* j5 */;
 
     (void)(*sv_ptr <= (nullptr)) /* j6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(*sv_ptr <= "") /* j6 */;
 
     (void)(nullptr <= *sv_ptr) /* j7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" <= *sv_ptr) /* j7 */;
 
     (void)((nullptr) <= *sv_ptr) /* j8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" <= *sv_ptr) /* j8 */;
   }
 }
@@ -869,38 +934,38 @@
   // Without Equality
   {
     (void)(sv > nullptr) /* k1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv > "") /* k1 */;
 
     (void)(sv > (nullptr)) /* k2 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv > "") /* k2 */;
 
     (void)(nullptr > sv) /* k3 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" > sv) /* k3 */;
 
     (void)((nullptr) > sv) /* k4 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" > sv) /* k4 */;
   }
 
   // With Equality
   {
     (void)(sv >= nullptr) /* k5 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv >= "") /* k5 */;
 
     (void)(sv >= (nullptr)) /* k6 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)(sv >= "") /* k6 */;
 
     (void)(nullptr >= sv) /* k7 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" >= sv) /* k7 */;
 
     (void)((nullptr) >= sv) /* k8 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: constructing{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" >= sv) /* k8 */;
   }
 }
@@ -909,38 +974,38 @@
   // Without Equality
   {
     (void)(*sv_ptr > nullptr) /* l1 */;
-    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: comparing{{.*}}empty string
+    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: constructing{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // 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{{.*}}empty string
     // CHECK-FIXES: {{^}}    (void)("" >= *sv_ptr) /* l8 */;
   }
 }
@@ -1100,3 +1165,21 @@
     // CHECK-FIXES: {{^}}    (void)(!sv_ptr->empty()) /* n16 */;
   }
 }
+
+// There is a large swath of cases having to do with constructors that accept
+// `std::string_view` arguments. Below is not exhaustive. Ideally, the
+// exhaustive list will be explored and accounted for explicitly.
+void additional_cases() /* o */ {
+  (void)(ImplicitClass(nullptr)) /* o1 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  (void)(ImplicitClass("")) /* o1 */;
+
+  (void)(ExplicitClass({{(nullptr)}})) /* o2 */;
+  // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  (void)(ExplicitClass({""})) /* o2 */;
+
+  (void)(Struct{nullptr, nullptr});
+  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: constructing{{.*}}empty string
+  // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: constructing{{.*}}empty string
+  // CHECK-FIXES: {{^}}  (void)(Struct{"", ""});
+}
Index: clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp
@@ -32,116 +32,29 @@
 RewriteRule StringviewNullptrCheckImpl() {
   auto construction_warning =
       cat("constructing basic_string_view from null is undefined; replace with "
-          "the default constructor");
-  auto assignment_warning =
-      cat("assignment to basic_string_view from null is undefined; replace "
-          "with the default constructor");
-  auto relative_comparison_warning =
-      cat("comparing basic_string_view to null is undefined; replace with the "
-          "empty string");
+          "the empty string");
   auto equality_comparison_warning =
       cat("comparing basic_string_view to null is undefined; replace with the "
           "emptiness query");
-  auto StringViewConstructingFromNullExpr =
+  auto StringViewConstructingFromNullExpr = cxxConstructExpr(
+      hasType(hasUnqualifiedDesugaredType(recordType(
+          hasDeclaration(cxxRecordDecl(hasName("::std::basic_string_view")))))),
+      argumentCountIs(1),
+      hasArgument(0,
+                  anyOf(ignoringParenImpCasts(cxxNullPtrLiteralExpr()),
+                        initListExpr(initCountIs(1),
+                                     hasInit(0, ignoringParenImpCasts(
+                                                    cxxNullPtrLiteralExpr()))),
+                        initListExpr(initCountIs(0)))),
+      has(expr().bind("null_argument_expr")));
+
+  auto HandleGeneralCase = makeRule(
       cxxConstructExpr(
-          hasType(hasUnqualifiedDesugaredType(recordType(hasDeclaration(
-              cxxRecordDecl(hasName("::std::basic_string_view")))))),
-          argumentCountIs(1),
-          hasArgument(
-              0, anyOf(ignoringParenImpCasts(cxxNullPtrLiteralExpr()),
-                       initListExpr(initCountIs(1),
-                                    hasInit(0, ignoringParenImpCasts(
-                                                   cxxNullPtrLiteralExpr()))),
-                       initListExpr(initCountIs(0)))),
-          has(expr().bind("null_argument_expr")))
-          .bind("construct_expr");
-
-  auto HandleTemporaryCXXFunctionalCastExpr =
-      makeRule(cxxFunctionalCastExpr(
-                   hasSourceExpression(StringViewConstructingFromNullExpr)),
-               remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr =
-      makeRule(cxxTemporaryObjectExpr(StringViewConstructingFromNullExpr),
-               remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleTemporaryCStyleCastExpr = makeRule(
-      cStyleCastExpr(hasSourceExpression(StringViewConstructingFromNullExpr)),
-      changeTo(node("null_argument_expr"), cat("{}")), construction_warning);
-
-  auto HandleTemporaryCXXStaticCastExpr = makeRule(
-      cxxStaticCastExpr(
-          hasSourceExpression(StringViewConstructingFromNullExpr)),
+          StringViewConstructingFromNullExpr,
+          unless(hasParent(implicitCastExpr(hasParent(cxxOperatorCallExpr(
+              hasAnyOverloadedOperatorName("==", "!="))))))),
       changeTo(node("null_argument_expr"), cat("\"\"")), construction_warning);
 
-  auto HandleStackCopyInitialization = makeRule(
-      varDecl(hasInitializer(implicitCastExpr(
-          ignoringImpCasts(StringViewConstructingFromNullExpr)))),
-      changeTo(node("null_argument_expr"), cat("{}")), construction_warning);
-
-  auto HandleStackDirectInitialization =
-      makeRule(varDecl(hasInitializer(
-                           cxxConstructExpr(StringViewConstructingFromNullExpr,
-                                            unless(isListInitialization()))))
-                   .bind("var_decl"),
-               changeTo(node("construct_expr"), cat(name("var_decl"))),
-               construction_warning);
-
-  auto HandleStackDirectListAndCopyListInitialization = makeRule(
-      varDecl(hasInitializer(cxxConstructExpr(
-          StringViewConstructingFromNullExpr, isListInitialization()))),
-      remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleFieldCopyInitialization = makeRule(
-      fieldDecl(hasInClassInitializer(implicitCastExpr(
-          ignoringImpCasts(StringViewConstructingFromNullExpr)))),
-      changeTo(node("null_argument_expr"), cat("{}")), construction_warning);
-
-  auto HandleFieldOtherInitialization = makeRule(
-      fieldDecl(hasInClassInitializer(StringViewConstructingFromNullExpr)),
-      remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleConstructorInitialization = makeRule(
-      cxxCtorInitializer(withInitializer(StringViewConstructingFromNullExpr)),
-      remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleDefaultArgumentInitialization = makeRule(
-      parmVarDecl(hasInitializer(implicitCastExpr(
-          hasSourceExpression(StringViewConstructingFromNullExpr)))),
-      changeTo(node("null_argument_expr"), cat("{}")), construction_warning);
-
-  auto HandleDefaultArgumentListInitialization =
-      makeRule(parmVarDecl(hasInitializer(StringViewConstructingFromNullExpr)),
-               remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleHeapInitialization = makeRule(
-      cxxNewExpr(unless(isArray()), has(StringViewConstructingFromNullExpr)),
-      remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleFunctionArgumentInitialization = makeRule(
-      implicitCastExpr(hasSourceExpression(StringViewConstructingFromNullExpr),
-                       hasParent(callExpr(unless(cxxOperatorCallExpr())))),
-      changeTo(node("null_argument_expr"), cat("{}")), construction_warning);
-
-  auto HandleFunctionArgumentListInitialization = makeRule(
-      cxxConstructExpr(StringViewConstructingFromNullExpr,
-                       hasParent(callExpr(unless(cxxOperatorCallExpr())))),
-      remove(node("null_argument_expr")), construction_warning);
-
-  auto HandleAssignment = makeRule(
-      materializeTemporaryExpr(
-          has(StringViewConstructingFromNullExpr),
-          hasParent(cxxOperatorCallExpr(hasOverloadedOperatorName("=")))),
-      changeTo(node("construct_expr"), cat("{}")), assignment_warning);
-
-  auto HandleRelativeComparison =
-      makeRule(implicitCastExpr(
-                   hasSourceExpression(StringViewConstructingFromNullExpr),
-                   hasParent(cxxOperatorCallExpr(
-                       hasAnyOverloadedOperatorName("<", "<=", ">", ">=")))),
-               changeTo(node("null_argument_expr"), cat("\"\"")),
-               relative_comparison_warning);
-
   auto HandleEmptyEqualityComparison = makeRule(
       cxxOperatorCallExpr(
           hasOverloadedOperatorName("=="),
@@ -166,19 +79,8 @@
                cat("!", access("string_view_instance", cat("empty")), "()")),
       equality_comparison_warning);
 
-  return applyFirst(
-      {HandleTemporaryCXXFunctionalCastExpr,
-       HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr,
-       HandleTemporaryCStyleCastExpr, HandleTemporaryCXXStaticCastExpr,
-       HandleStackCopyInitialization, HandleStackDirectInitialization,
-       HandleStackDirectListAndCopyListInitialization,
-       HandleFieldCopyInitialization, HandleFieldOtherInitialization,
-       HandleConstructorInitialization, HandleDefaultArgumentInitialization,
-       HandleDefaultArgumentListInitialization, HandleHeapInitialization,
-       HandleFunctionArgumentInitialization,
-       HandleFunctionArgumentListInitialization, HandleAssignment,
-       HandleRelativeComparison, HandleEmptyEqualityComparison,
-       HandleNonEmptyEqualityComparison});
+  return applyFirst({HandleGeneralCase, HandleEmptyEqualityComparison,
+                     HandleNonEmptyEqualityComparison});
 }
 
 StringviewNullptrCheck::StringviewNullptrCheck(StringRef Name,
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to