[clang] [OpenCL] Diagnose error for zero-length array (PR #193163)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 21 02:31:43 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Wenju He (wenju-he)
<details>
<summary>Changes</summary>
OpenCL C is based on C99 and C11, which don't support zero-length array.
---
Full diff: https://github.com/llvm/llvm-project/pull/193163.diff
4 Files Affected:
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+1-1)
- (modified) clang/lib/Sema/SemaType.cpp (+6)
- (modified) clang/test/Misc/languageOptsOpenCL.cl (+12-12)
- (added) clang/test/SemaOpenCL/zero-length-array.cl (+14)
``````````diff
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index cc82bb6a51e52..aac1b91149489 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6691,7 +6691,7 @@ def err_typecheck_invalid_restrict_invalid_pointee : Error<
def ext_typecheck_zero_array_size : Extension<
"zero size arrays are an extension">, InGroup<ZeroLengthArray>;
def err_typecheck_zero_array_size : Error<
- "zero-length arrays are not permitted in %select{C++|SYCL device code|HIP device code}0">;
+ "zero-length arrays are not permitted in %select{C++|SYCL device code|HIP device code|OpenCL}0">;
def err_array_size_non_int : Error<"size of array has non-integer type %0">;
def err_init_element_not_constant : Error<
"initializer element is not a compile-time constant">;
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 3dc8ceb70f3cd..a5fceb065fb88 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -2288,6 +2288,12 @@ QualType Sema::BuildArrayType(QualType T, ArraySizeModifier ASM,
return QualType();
}
if (ConstVal == 0 && !T.isWebAssemblyReferenceType()) {
+ if (getLangOpts().OpenCL) {
+ Diag(ArraySize->getBeginLoc(), diag::err_typecheck_zero_array_size)
+ << 3 << ArraySize->getSourceRange();
+ return QualType();
+ }
+
// GCC accepts zero sized static arrays. We allow them when
// we're not in a SFINAE context.
Diag(ArraySize->getBeginLoc(),
diff --git a/clang/test/Misc/languageOptsOpenCL.cl b/clang/test/Misc/languageOptsOpenCL.cl
index 9651f01a7dc59..0f5bd22c8e91e 100644
--- a/clang/test/Misc/languageOptsOpenCL.cl
+++ b/clang/test/Misc/languageOptsOpenCL.cl
@@ -4,18 +4,18 @@
// Test the forced language options for OpenCL are set correctly.
kernel void test() {
- int v0[(sizeof(int) == 4) - 1];
- int v1[(__alignof(int)== 4) - 1];
- int v2[(sizeof(long) == 8) - 1];
- int v3[(__alignof(long)== 8) - 1];
- int v4[(sizeof(long long) == 16) - 1];
- int v5[(__alignof(long long)== 16) - 1];
- int v6[(sizeof(float) == 4) - 1];
- int v7[(__alignof(float)== 4) - 1];
+ int v0[(sizeof(int) == 4) ? 1 : -1];
+ int v1[(__alignof(int)== 4) ? 1 : -1];
+ int v2[(sizeof(long) == 8) ? 1 : -1];
+ int v3[(__alignof(long)== 8) ? 1 : -1];
+ int v4[(sizeof(long long) == 16) ? 1 : -1];
+ int v5[(__alignof(long long)== 16) ? 1 : -1];
+ int v6[(sizeof(float) == 4) ? 1 : -1];
+ int v7[(__alignof(float)== 4) ? 1 : -1];
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
- int v8[(sizeof(double) == 8) - 1];
- int v9[(__alignof(double)== 8) - 1];
+ int v8[(sizeof(double) == 8) ? 1 : -1];
+ int v9[(__alignof(double)== 8) ? 1 : -1];
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
- int v10[(sizeof(half) == 2) - 1];
- int v11[(__alignof(half) == 2) - 1];
+ int v10[(sizeof(half) == 2) ? 1 : -1];
+ int v11[(__alignof(half) == 2) ? 1 : -1];
}
diff --git a/clang/test/SemaOpenCL/zero-length-array.cl b/clang/test/SemaOpenCL/zero-length-array.cl
new file mode 100644
index 0000000000000..802f59daea6f7
--- /dev/null
+++ b/clang/test/SemaOpenCL/zero-length-array.cl
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL1.2
+// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL3.0
+
+struct S {
+ int x;
+ int y[0]; // expected-error {{zero-length arrays are not permitted in OpenCL}}
+};
+
+global int g_zero_length_array[0]; // expected-error {{zero-length arrays are not permitted in OpenCL}}
+
+kernel void foo(void) {
+ int a[0]; // expected-error {{zero-length arrays are not permitted in OpenCL}}
+ local int b[0]; // expected-error {{zero-length arrays are not permitted in OpenCL}}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/193163
More information about the cfe-commits
mailing list