[PATCH] D116814: Accept string literal decay in conditional operator
Elvis Stansvik via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 7 09:07:16 PST 2022
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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D116814.398165.patch
Type: text/x-patch
Size: 2376 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220107/9a5a947d/attachment.bin>
More information about the cfe-commits
mailing list