https://github.com/AmrDeveloper created 
https://github.com/llvm/llvm-project/pull/187954

Emitting an error message in case of implicit casting of a complex type to a 
built-in vector type in C

>From 66542e4e4e34d1eed0d63695adc0594506d7c09c Mon Sep 17 00:00:00 2001
From: Amr Hesham <[email protected]>
Date: Sun, 22 Mar 2026 20:09:20 +0100
Subject: [PATCH] [Clang][Sema] Prevent implicit casting Complex type to Vector

---
 clang/docs/ReleaseNotes.rst                       |  2 ++
 clang/include/clang/Basic/DiagnosticSemaKinds.td  |  2 ++
 clang/lib/Sema/SemaChecking.cpp                   |  3 +++
 clang/test/Sema/implicit-cast-complex-to-vector.c | 11 +++++++++++
 4 files changed, 18 insertions(+)
 create mode 100644 clang/test/Sema/implicit-cast-complex-to-vector.c

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b92f1ab34aa51..ce86c1de0ca2d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -309,6 +309,8 @@ Improvements to Clang's diagnostics
   (``-fimplicit-module-maps``). This does not affect module maps specified
   explicitly via ``-fmodule-map-file=``.
 
+- Clang now emits an error when implicitly casting a complex type to a 
built-in vector type. (#GH186805)
+
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d4d09a8ecef36..baa052128bf94 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -4481,6 +4481,8 @@ def warn_impcast_float_result_precision : Warning<
 def warn_impcast_double_promotion : Warning<
   "implicit conversion increases floating-point precision: %0 to %1">,
   InGroup<DoublePromotion>, DefaultIgnore;
+def err_impcast_incompatible_type : Error<
+  "implicit conversion from %0 to incompatible type %1">;
 def warn_impcast_integer_sign : Warning<
   "implicit conversion changes signedness: %0 to %1">,
   InGroup<SignConversion>, DefaultIgnore;
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 29add9d092e6b..c669a45a15024 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -13073,9 +13073,12 @@ void Sema::CheckImplicitConversion(Expr *E, QualType 
T, SourceLocation CC,
       if (SourceMgr.isInSystemMacro(CC) || Target->isBooleanType())
         return;
 
+      const Type *OriginalTargetTy = Context.getCanonicalType(T).getTypePtr();
       return DiagnoseImpCast(*this, E, T, CC,
                              getLangOpts().CPlusPlus
                                  ? diag::err_impcast_complex_scalar
+                             : OriginalTargetTy->isVectorType()
+                                 ? diag::err_impcast_incompatible_type
                                  : diag::warn_impcast_complex_scalar);
     }
 
diff --git a/clang/test/Sema/implicit-cast-complex-to-vector.c 
b/clang/test/Sema/implicit-cast-complex-to-vector.c
new file mode 100644
index 0000000000000..a30bfb2d9dbd8
--- /dev/null
+++ b/clang/test/Sema/implicit-cast-complex-to-vector.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+typedef char __attribute__((__vector_size__(64))) V;
+
+void implicit_cast_complex_to_vector() {
+  _Complex double x;
+  V y;
+  // expected-error@+1 {{implicit conversion from '_Complex double' to 
incompatible type 'V' (vector of 64 'char' values)}}
+  V z = x + y;
+}
+

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

Reply via email to