Author: Elvis Stansvik Date: 2022-01-11T15:05:30-05:00 New Revision: 36af07334246a87a0f3fb9bbc85dedfca04b00d1
URL: https://github.com/llvm/llvm-project/commit/36af07334246a87a0f3fb9bbc85dedfca04b00d1 DIFF: https://github.com/llvm/llvm-project/commit/36af07334246a87a0f3fb9bbc85dedfca04b00d1.diff LOG: Accept string literal decay in conditional operator The cppcoreguidelines-pro-bounds-array-to-pointer-decay check currently accepts: const char *b = i ? "foo" : "foobar"; but not const char *a = i ? "foo" : "bar"; This is because the AST is slightly different in the latter case (see https://godbolt.org/z/MkHVvs). This eliminates the inconsistency by making it accept the latter form as well. Fixes https://github.com/llvm/llvm-project/issues/31155. Added: Modified: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp index 160d15e6c0e1f..ba9c64ec16a8d 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp @@ -54,13 +54,17 @@ void ProBoundsArrayToPointerDecayCheck::registerMatchers(MatchFinder *Finder) { // 2) inside a range-for over an array // 3) if it converts a string literal to a pointer Finder->addMatcher( - traverse(TK_AsIs, - implicitCastExpr( - unless(hasParent(arraySubscriptExpr())), - unless(hasParentIgnoringImpCasts(explicitCastExpr())), - unless(isInsideOfRangeBeginEndStmt()), - unless(hasSourceExpression(ignoringParens(stringLiteral())))) - .bind("cast")), + traverse( + TK_AsIs, + implicitCastExpr( + unless(hasParent(arraySubscriptExpr())), + unless(hasParentIgnoringImpCasts(explicitCastExpr())), + unless(isInsideOfRangeBeginEndStmt()), + unless(hasSourceExpression(ignoringParens(stringLiteral()))), + unless(hasSourceExpression(ignoringParens(conditionalOperator( + allOf(hasTrueExpression(stringLiteral()), + hasFalseExpression(stringLiteral()))))))) + .bind("cast")), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 03a52fa7c7aec..769eb2ba08038 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -67,6 +67,10 @@ The improvements are... Improvements to clang-tidy -------------------------- +- Make the `cppcoreguidelines-pro-bounds-array-to-pointer-decay` check accept + string literal to pointer decay in conditional operator even if operands are + of the same length. + - Ignore warnings from macros defined in system headers, if not using the `-system-headers` flag. diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp index 2287e48a4fe79..d41f54b4e77f2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp @@ -49,3 +49,14 @@ void bug25362() { void *a[2]; f2(static_cast<void *const*>(a)); // OK, explicit cast } + +void issue31155(int i) { + const char *a = i ? "foo" : "bar"; // OK, decay string literal to pointer + const char *b = i ? "foo" : "foobar"; // OK, decay string literal to pointer + + char arr[1]; + const char *c = i ? arr : "bar"; + // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: do not implicitly decay an array into a pointer + const char *d = i ? "foo" : arr; + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: do not implicitly decay an array into a pointer +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits