[clang] 6582efc - [Clang] Fix __is_array returning true for zero-sized arrays (#86652)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 20 00:36:50 PDT 2024
Author: Nikolas Klauser
Date: 2024-05-20T09:36:45+02:00
New Revision: 6582efc263c0df921b88b03bbdcd28a89daaa641
URL: https://github.com/llvm/llvm-project/commit/6582efc263c0df921b88b03bbdcd28a89daaa641
DIFF: https://github.com/llvm/llvm-project/commit/6582efc263c0df921b88b03bbdcd28a89daaa641.diff
LOG: [Clang] Fix __is_array returning true for zero-sized arrays (#86652)
Fixes #54705
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/type-traits.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7af5869d21768..5a123b0b86dda 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -586,6 +586,9 @@ Bug Fixes in This Version
- Clang now correctly disallows VLA type compound literals, e.g. ``(int[size]){}``,
as the C standard mandates. (#GH89835)
+- ``__is_array`` and ``__is_bounded_array`` no longer return ``true`` for
+ zero-sized arrays. Fixes (#GH54705).
+
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index e4601f7d6c47d..f543e006060d6 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5217,10 +5217,18 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT,
case UTT_IsFloatingPoint:
return T->isFloatingType();
case UTT_IsArray:
+ // Zero-sized arrays aren't considered arrays in partial specializations,
+ // so __is_array shouldn't consider them arrays either.
+ if (const auto *CAT = C.getAsConstantArrayType(T))
+ return CAT->getSize() != 0;
return T->isArrayType();
case UTT_IsBoundedArray:
if (DiagnoseVLAInCXXTypeTrait(Self, TInfo, tok::kw___is_bounded_array))
return false;
+ // Zero-sized arrays aren't considered arrays in partial specializations,
+ // so __is_bounded_array shouldn't consider them arrays either.
+ if (const auto *CAT = C.getAsConstantArrayType(T))
+ return CAT->getSize() != 0;
return T->isArrayType() && !T->isIncompleteArrayType();
case UTT_IsUnboundedArray:
if (DiagnoseVLAInCXXTypeTrait(Self, TInfo, tok::kw___is_unbounded_array))
diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp
index f2fd45762abf8..d40605f56f1ed 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -25,6 +25,7 @@ typedef Empty EmptyArMB[1][2];
typedef int Int;
typedef Int IntAr[10];
typedef Int IntArNB[];
+typedef Int IntArZero[0];
class Statics { static int priv; static NonPOD np; };
union EmptyUnion {};
union IncompleteUnion; // expected-note {{forward declaration of 'IncompleteUnion'}}
@@ -685,6 +686,7 @@ void is_array()
{
static_assert(__is_array(IntAr));
static_assert(__is_array(IntArNB));
+ static_assert(!__is_array(IntArZero));
static_assert(__is_array(UnionAr));
static_assert(!__is_array(void));
@@ -714,6 +716,7 @@ void is_array()
void is_bounded_array(int n) {
static_assert(__is_bounded_array(IntAr));
static_assert(!__is_bounded_array(IntArNB));
+ static_assert(!__is_bounded_array(IntArZero));
static_assert(__is_bounded_array(UnionAr));
static_assert(!__is_bounded_array(void));
@@ -746,6 +749,7 @@ void is_bounded_array(int n) {
void is_unbounded_array(int n) {
static_assert(!__is_unbounded_array(IntAr));
static_assert(__is_unbounded_array(IntArNB));
+ static_assert(!__is_unbounded_array(IntArZero));
static_assert(!__is_unbounded_array(UnionAr));
static_assert(!__is_unbounded_array(void));
More information about the cfe-commits
mailing list