[clang-tools-extra] 36af073 - Accept string literal decay in conditional operator
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 11 12:05:45 PST 2022
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
+}
More information about the cfe-commits
mailing list