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