https://github.com/flash1729 updated 
https://github.com/llvm/llvm-project/pull/217465

>From 8327ea5bcdb241147a5aab97485381b8cc0921a6 Mon Sep 17 00:00:00 2001
From: flash1729 <[email protected]>
Date: Mon, 17 Aug 2026 06:20:57 +0530
Subject: [PATCH] [clang][Sema] Don't report pointer subtraction on a VLA as
 zero size

CheckSubtractionOperands warns when the pointee type has zero size,
because the subtraction divides by that size. A variably modified type
such as int[n] has no statically known size, and getTypeInfoImpl models
it as zero, so the check reported it as an empty type even though its
size is only determined at run time.

Exclude variably modified pointee types. Genuinely empty types keep
warning: int[0] and zero-sized structs are constant arrays and records,
not variably modified.

Fixes #28328
---
 clang/docs/ReleaseNotes.md        | 5 +++++
 clang/lib/Sema/SemaExpr.cpp       | 5 ++++-
 clang/test/Analysis/pointer-sub.c | 6 ++----
 clang/test/Sema/empty1.c          | 7 +++++++
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 3c6694f510952..8a5ed09e173ba 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -416,6 +416,11 @@ features cannot lower the translation-unit ABI level;
 - `-Wc++98-compat` now diagnoses explicit conversion functions in C++20 and
   later, matching the behavior in C++11 through C++17. (#GH161689)
 
+- `-Wpointer-arith` no longer reports subtraction of pointers to a variably
+  modified type, such as `int[n]`, as a subtraction of pointers to a type of
+  zero size. The size of such a type is not known statically and is modelled as
+  zero, which is not the same as the type being empty. (#GH28328)
+
 ### Improvements to Clang's time-trace
 
 ### Improvements to Coverage Mapping
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index da76bbf3c35f0..3977dc4932743 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -11916,7 +11916,10 @@ QualType Sema::CheckSubtractionOperands(ExprResult 
&LHS, ExprResult &RHS,
       // The pointee type may have zero size.  As an extension, a structure or
       // union may have zero size or an array may have zero length.  In this
       // case subtraction does not make sense.
-      if (!rpointee->isVoidType() && !rpointee->isFunctionType()) {
+      // A variably modified type has no statically known size; it is modelled
+      // as zero here, so exclude it rather than report it as empty.
+      if (!rpointee->isVoidType() && !rpointee->isFunctionType() &&
+          !rpointee->isVariablyModifiedType()) {
         CharUnits ElementSize = Context.getTypeSizeInChars(rpointee);
         if (ElementSize.isZero()) {
           Diag(Loc,diag::warn_sub_ptr_zero_size_types)
diff --git a/clang/test/Analysis/pointer-sub.c 
b/clang/test/Analysis/pointer-sub.c
index 25fb7f043d468..d2155e110ba54 100644
--- a/clang/test/Analysis/pointer-sub.c
+++ b/clang/test/Analysis/pointer-sub.c
@@ -65,11 +65,9 @@ void f4(void) {
   int (*p)[m] = a; // p == &a[0]
   p += 1; // p == &a[1]
 
-  // FIXME: This is a known problem with -Wpointer-arith 
(https://github.com/llvm/llvm-project/issues/28328)
-  int d = p - a; // d == 1 // expected-warning{{subtraction of pointers to 
type 'int[m]' of zero size has undefined behavior}}
+  int d = p - a; // d == 1
 
-  // FIXME: This is a known problem with -Wpointer-arith 
(https://github.com/llvm/llvm-project/issues/28328)
-  d = &(a[2]) - &(a[1]); // expected-warning{{subtraction of pointers to type 
'int[m]' of zero size has undefined behavior}}
+  d = &(a[2]) - &(a[1]);
 
   d = a[2] - a[1]; // expected-warning{{Subtraction of two pointers that}}
 }
diff --git a/clang/test/Sema/empty1.c b/clang/test/Sema/empty1.c
index 6c5fe76833f3f..0e18023b7d313 100644
--- a/clang/test/Sema/empty1.c
+++ b/clang/test/Sema/empty1.c
@@ -85,3 +85,10 @@ int func_9(struct emp_1 (*x)[], struct emp_1 (*y)[]) {
 int func_10(int (*x)[0], int (*y)[0]) {
   return x - y; // expected-warning {{subtraction of pointers to type 'int[0]' 
of zero size has undefined behavior}}
 }
+
+// A variably modified type is modelled as having zero size because its size is
+// not known statically. It is not an empty type, so it must not be diagnosed.
+int func_11(int n) {
+  int v[n];
+  return &v + 1 - &v;
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to