estan created this revision. Herald added subscribers: carlosgalvezp, kbarton, nemanjai. estan edited the summary of this revision. estan edited the summary of this revision. estan edited the summary of this revision. estan edited the summary of this revision. estan updated this revision to Diff 398165. estan added a comment. estan added reviewers: aaron.ballman, alexfh, JonasToth, george.burgess.iv. estan published this revision for review. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
Format code with git-clang-format 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 fixes up the inconsistency by making it accept the latter form as well. Fixes https://github.com/llvm/llvm-project/issues/31155. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D116814 Files: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp +++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp @@ -49,3 +49,14 @@ 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 +} Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp +++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp @@ -54,13 +54,17 @@ // 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); }
Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp +++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-bounds-array-to-pointer-decay.cpp @@ -49,3 +49,14 @@ 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 +} Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp +++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsArrayToPointerDecayCheck.cpp @@ -54,13 +54,17 @@ // 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); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits