CJ-Johnson created this revision. CJ-Johnson added a reviewer: ymandel. Herald added a subscriber: carlosgalvezp. CJ-Johnson requested review of this revision. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
bugprone-stringview-nullptr was not initially written with tests for return statements. After landing the check, the thought crossed my mind to add such tests. After writing them, I realized they needed additional handling in the matchers. Repository: rG LLVM Github Monorepo 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 @@ -215,6 +215,37 @@ // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}default // CHECK-FIXES: {{^}} (void)(static_cast<const std::string_view>("")) /* a28 */; } + + // Return Value + { + (void)([] -> std::string_view { return nullptr; }) /* a29 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a29 */; + + (void)([] -> std::string_view { return (nullptr); }) /* a30 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a30 */; + + (void)([] -> std::string_view { return {nullptr}; }) /* a31 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a31 */; + + (void)([] -> std::string_view { return {(nullptr)}; }) /* a32 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a32 */; + + (void)([] -> std::string_view { return {{nullptr}}; }) /* a33 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a33 */; + + (void)([] -> std::string_view { return {{(nullptr)}}; }) /* a34 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a34 */; + + (void)([] -> std::string_view { return {{}}; }) /* a35 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a35 */; + } } void stack_construction() /* b */ { 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 @@ -74,6 +74,11 @@ hasSourceExpression(StringViewConstructingFromNullExpr)), changeTo(node("null_argument_expr"), cat("\"\"")), construction_warning); + auto HandleTemporaryReturnValue = makeRule( + returnStmt( + hasReturnValue(ignoringImpCasts(StringViewConstructingFromNullExpr))), + changeTo(node("construct_expr"), cat("{}")), construction_warning); + auto HandleStackCopyInitialization = makeRule( varDecl(hasInitializer(implicitCastExpr( ignoringImpCasts(StringViewConstructingFromNullExpr)))), @@ -169,15 +174,23 @@ return applyFirst( {HandleTemporaryCXXFunctionalCastExpr, HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr, - HandleTemporaryCStyleCastExpr, HandleTemporaryCXXStaticCastExpr, - HandleStackCopyInitialization, HandleStackDirectInitialization, + HandleTemporaryCStyleCastExpr, + HandleTemporaryCXXStaticCastExpr, + HandleTemporaryReturnValue, + HandleStackCopyInitialization, + HandleStackDirectInitialization, HandleStackDirectListAndCopyListInitialization, - HandleFieldCopyInitialization, HandleFieldOtherInitialization, - HandleConstructorInitialization, HandleDefaultArgumentInitialization, - HandleDefaultArgumentListInitialization, HandleHeapInitialization, + HandleFieldCopyInitialization, + HandleFieldOtherInitialization, + HandleConstructorInitialization, + HandleDefaultArgumentInitialization, + HandleDefaultArgumentListInitialization, + HandleHeapInitialization, HandleFunctionArgumentInitialization, - HandleFunctionArgumentListInitialization, HandleAssignment, - HandleRelativeComparison, HandleEmptyEqualityComparison, + HandleFunctionArgumentListInitialization, + HandleAssignment, + HandleRelativeComparison, + HandleEmptyEqualityComparison, HandleNonEmptyEqualityComparison}); }
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 @@ -215,6 +215,37 @@ // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: constructing{{.*}}default // CHECK-FIXES: {{^}} (void)(static_cast<const std::string_view>("")) /* a28 */; } + + // Return Value + { + (void)([] -> std::string_view { return nullptr; }) /* a29 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a29 */; + + (void)([] -> std::string_view { return (nullptr); }) /* a30 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a30 */; + + (void)([] -> std::string_view { return {nullptr}; }) /* a31 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a31 */; + + (void)([] -> std::string_view { return {(nullptr)}; }) /* a32 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a32 */; + + (void)([] -> std::string_view { return {{nullptr}}; }) /* a33 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a33 */; + + (void)([] -> std::string_view { return {{(nullptr)}}; }) /* a34 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a34 */; + + (void)([] -> std::string_view { return {{}}; }) /* a35 */; + // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: constructing{{.*}}default + // CHECK-FIXES: {{^}} (void)([] -> std::string_view { return {}; }) /* a35 */; + } } void stack_construction() /* b */ { 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 @@ -74,6 +74,11 @@ hasSourceExpression(StringViewConstructingFromNullExpr)), changeTo(node("null_argument_expr"), cat("\"\"")), construction_warning); + auto HandleTemporaryReturnValue = makeRule( + returnStmt( + hasReturnValue(ignoringImpCasts(StringViewConstructingFromNullExpr))), + changeTo(node("construct_expr"), cat("{}")), construction_warning); + auto HandleStackCopyInitialization = makeRule( varDecl(hasInitializer(implicitCastExpr( ignoringImpCasts(StringViewConstructingFromNullExpr)))), @@ -169,15 +174,23 @@ return applyFirst( {HandleTemporaryCXXFunctionalCastExpr, HandleTemporaryCXXTemporaryObjectExprAndCompoundLiteralExpr, - HandleTemporaryCStyleCastExpr, HandleTemporaryCXXStaticCastExpr, - HandleStackCopyInitialization, HandleStackDirectInitialization, + HandleTemporaryCStyleCastExpr, + HandleTemporaryCXXStaticCastExpr, + HandleTemporaryReturnValue, + HandleStackCopyInitialization, + HandleStackDirectInitialization, HandleStackDirectListAndCopyListInitialization, - HandleFieldCopyInitialization, HandleFieldOtherInitialization, - HandleConstructorInitialization, HandleDefaultArgumentInitialization, - HandleDefaultArgumentListInitialization, HandleHeapInitialization, + HandleFieldCopyInitialization, + HandleFieldOtherInitialization, + HandleConstructorInitialization, + HandleDefaultArgumentInitialization, + HandleDefaultArgumentListInitialization, + HandleHeapInitialization, HandleFunctionArgumentInitialization, - HandleFunctionArgumentListInitialization, HandleAssignment, - HandleRelativeComparison, HandleEmptyEqualityComparison, + HandleFunctionArgumentListInitialization, + HandleAssignment, + HandleRelativeComparison, + HandleEmptyEqualityComparison, HandleNonEmptyEqualityComparison}); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits