[clang] [OpenCL] Diagnose error for zero-length array (PR #193163)

Wenju He via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 21 02:31:06 PDT 2026


https://github.com/wenju-he created https://github.com/llvm/llvm-project/pull/193163

OpenCL C is based on C99 and C11, which don't support zero-length array.

>From 6a4ca2f1f857426383e446b58ea26fe8fbc2bda3 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Tue, 21 Apr 2026 11:29:54 +0200
Subject: [PATCH] [OpenCL] Diagnose error for zero-length array

OpenCL C is based on C99 and C11, which don't support zero-length array.
---
 .../clang/Basic/DiagnosticSemaKinds.td        |  2 +-
 clang/lib/Sema/SemaType.cpp                   |  6 +++++
 clang/test/Misc/languageOptsOpenCL.cl         | 24 +++++++++----------
 clang/test/SemaOpenCL/zero-length-array.cl    | 14 +++++++++++
 4 files changed, 33 insertions(+), 13 deletions(-)
 create mode 100644 clang/test/SemaOpenCL/zero-length-array.cl

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}}
+}



More information about the cfe-commits mailing list