diff --git a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp index 9ded699ba78e6..d55df3a6d7b74 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DanglingHandleCheck.cpp @@ -33,14 +33,20 @@ handleFrom(const ast_matchers::internal::Matcher &IsAHandle, ast_matchers::internal::Matcher handleFromTemporaryValue( const ast_matchers::internal::Matcher &IsAHandle) { + + const auto TemporaryExpr = anyOf( + cxxBindTemporaryExpr(), + cxxFunctionalCastExpr( + hasCastKind(CK_ConstructorConversion), + hasSourceExpression(ignoringParenImpCasts(cxxBindTemporaryExpr())))); // If a ternary operator returns a temporary value, then both branches hold a // temporary value. If one of them is not a temporary then it must be copied // into one to satisfy the type of the operator. const auto TemporaryTernary = conditionalOperator( - hasTrueExpression(ignoringParenImpCasts(cxxBindTemporaryExpr())), - hasFalseExpression(ignoringParenImpCasts(cxxBindTemporaryExpr()))); + hasTrueExpression(ignoringParenImpCasts(TemporaryExpr)), + hasFalseExpression(ignoringParenImpCasts(TemporaryExpr))); - return handleFrom(IsAHandle, anyOf(cxxBindTemporaryExpr(), TemporaryTernary)); + return handleFrom(IsAHandle, anyOf(TemporaryExpr, TemporaryTernary)); } ast_matchers::internal::Matcher isASequence() { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 6d1992e12130d..ac95afd782e1d 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -207,6 +207,11 @@ New check aliases Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:`bugprone-dangling-handle + ` check to support functional + casting during type conversions at variable initialization, now with improved + compatibility for C++17 and later versions. + - Improved :doc:`bugprone-lambda-function-name ` check by adding option `IgnoreMacros` to ignore warnings in macros. diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dangling-handle.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dangling-handle.cpp index 23cda53217643..96c812617038a 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dangling-handle.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dangling-handle.cpp @@ -108,6 +108,14 @@ void Positives() { std::string_view view4(ReturnsAString()); // CHECK-MESSAGES-CXX14: [[@LINE-1]]:20: warning: std::basic_string_view outlives // CHECK-MESSAGES-CXX17: [[@LINE-2]]:26: warning: std::basic_string_view outlives + + std::string_view view5 = std::string("test"); + // CHECK-MESSAGES-CXX14: [[@LINE-1]]:20: warning: std::basic_string_view outlives its value [bugprone-dangling-handle] + // CHECK-MESSAGES-CXX17: [[@LINE-2]]:28: warning: std::basic_string_view outlives its value [bugprone-dangling-handle] + + std::string_view view6 = std::string{"test"}; + // CHECK-MESSAGES-CXX14: [[@LINE-1]]:20: warning: std::basic_string_view outlives its value [bugprone-dangling-handle] + // CHECK-MESSAGES-CXX17: [[@LINE-2]]:28: warning: std::basic_string_view outlives its value [bugprone-dangling-handle] } void OtherTypes() {