[clang] [clang] Report Diagnostic when builtin vector has negative size (PR #166055)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 2 03:28:56 PST 2025
https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/166055
Report a diagnostic in case vector_size or ext_vector_type attributes are used with a negative size. The same evaluation result can be used for other checks, for example, the too big a size.
Issue #165463
>From 8173191f053c4eb6d60c81a69682489fd50ff5d7 Mon Sep 17 00:00:00 2001
From: Amr Hesham <amr96 at programmer.net>
Date: Sun, 2 Nov 2025 12:00:40 +0100
Subject: [PATCH] [clang] Report Diagnostic when builtin vector has negative
size
---
clang/docs/ReleaseNotes.rst | 3 +++
.../clang/Basic/DiagnosticSemaKinds.td | 2 ++
clang/lib/Sema/SemaType.cpp | 24 ++++++++++++++++---
clang/test/SemaCXX/vector.cpp | 5 ++++
4 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 92fc9381a5868..f3a8367ad16e5 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -390,6 +390,9 @@ Improvements to Clang's diagnostics
that were previously incorrectly accepted in case of other irrelevant
conditions are now consistently diagnosed, identical to C++ mode.
+- Clang now emits a diagnostic in case `vector_size` or `ext_vector_type`
+ attributes are used with a negative size (#GH165463).
+
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 4e369be0bbb92..fa509536bf021 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3510,6 +3510,8 @@ def err_init_method_bad_return_type : Error<
"init methods must return an object pointer type, not %0">;
def err_attribute_invalid_size : Error<
"vector size not an integral multiple of component size">;
+def err_attribute_vec_negative_size
+ : Error<"vector must have non-negative size">;
def err_attribute_zero_size : Error<"zero %0 size">;
def err_attribute_size_too_large : Error<"%0 size too large">;
def err_typecheck_sve_rvv_ambiguous : Error<
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 280b3c92cce14..3345ed0dbbc0f 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -8285,10 +8285,20 @@ static void HandleVectorSizeAttr(QualType &CurType, const ParsedAttr &Attr,
Expr *SizeExpr = Attr.getArgAsExpr(0);
QualType T = S.BuildVectorType(CurType, SizeExpr, Attr.getLoc());
- if (!T.isNull())
- CurType = T;
- else
+ if (T.isNull()) {
+ Attr.setInvalid();
+ return;
+ }
+
+ std::optional<llvm::APSInt> VecSize =
+ SizeExpr->getIntegerConstantExpr(S.Context);
+ if (VecSize && VecSize->isNegative()) {
+ S.Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size);
Attr.setInvalid();
+ return;
+ }
+
+ CurType = T;
}
/// Process the OpenCL-like ext_vector_type attribute when it occurs on
@@ -8306,6 +8316,14 @@ static void HandleExtVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr,
QualType T = S.BuildExtVectorType(CurType, SizeExpr, Attr.getLoc());
if (!T.isNull())
CurType = T;
+
+ std::optional<llvm::APSInt> VecSize =
+ SizeExpr->getIntegerConstantExpr(S.Context);
+ if (VecSize && VecSize->isNegative()) {
+ S.Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size);
+ Attr.setInvalid();
+ return;
+ }
}
static bool isPermittedNeonBaseType(QualType &Ty, VectorKind VecKind, Sema &S) {
diff --git a/clang/test/SemaCXX/vector.cpp b/clang/test/SemaCXX/vector.cpp
index 808bdb679b09c..eea0b4756fae3 100644
--- a/clang/test/SemaCXX/vector.cpp
+++ b/clang/test/SemaCXX/vector.cpp
@@ -786,3 +786,8 @@ const long long e = *0; // expected-error {{indirection requires pointer operand
double f = a - e; // expected-error {{cannot initialize a variable of type 'double' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(double)))) double' (vector of 1 'double' value)}}
int h = c - e; // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(long)))) long' (vector of 1 'long' value)}}
}
+
+typedef int v_neg_size __attribute__((vector_size(-8))); // expected-error{{vector must have non-negative size}}
+typedef int v_neg_size_2 __attribute__((vector_size(-1 * 8))); // expected-error{{vector must have non-negative size}}
+typedef int v_ext_neg_size __attribute__((ext_vector_type(-8))); // expected-error{{vector must have non-negative size}}
+typedef int v_ext_neg_size2 __attribute__((ext_vector_type(-1 * 8))); // expected-error{{vector must have non-negative size}}
More information about the cfe-commits
mailing list