[clang] fbad717 - [OpenCL] Diagnose invalid conversion from pointer to vector (#180318)

via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 10 20:31:22 PST 2026


Author: Wenju He
Date: 2026-02-11T12:31:17+08:00
New Revision: fbad717b9a09af5abafbeba859646d1ab05213d5

URL: https://github.com/llvm/llvm-project/commit/fbad717b9a09af5abafbeba859646d1ab05213d5
DIFF: https://github.com/llvm/llvm-project/commit/fbad717b9a09af5abafbeba859646d1ab05213d5.diff

LOG: [OpenCL] Diagnose invalid conversion from pointer to vector (#180318)

Fix crash in clang PrepareScalarCast when compiling OpenCL source: void
foo() {
  int a[3] = {1, 2, 3};
  int3 b = (int3)(a);
}

PrepareScalarCast requires scalar src, but the provided src is a
pointer.

Resolves https://github.com/intel/compute-runtime/issues/888

Added: 
    

Modified: 
    clang/lib/Sema/SemaExpr.cpp
    clang/test/SemaOpenCL/invalid-vector-literals.cl

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 29b6129344ca5..60b5478371288 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -8113,6 +8113,13 @@ ExprResult Sema::BuildVectorLiteral(SourceLocation LParenLoc,
     // it will be replicated to all components of the vector.
     if (getLangOpts().OpenCL && VTy->getVectorKind() == VectorKind::Generic &&
         numExprs == 1) {
+      QualType SrcTy = exprs[0]->getType();
+      if (!SrcTy->isArithmeticType()) {
+        Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
+            << Ty << SrcTy << AssignmentAction::Initializing << /*elidable=*/0
+            << /*c_style=*/0 << /*cast_kind=*/"" << exprs[0]->getSourceRange();
+        return ExprError();
+      }
       QualType ElemTy = VTy->getElementType();
       ExprResult Literal = DefaultLvalueConversion(exprs[0]);
       if (Literal.isInvalid())

diff  --git a/clang/test/SemaOpenCL/invalid-vector-literals.cl b/clang/test/SemaOpenCL/invalid-vector-literals.cl
index 1d82fedf29de1..0595256ef82f2 100644
--- a/clang/test/SemaOpenCL/invalid-vector-literals.cl
+++ b/clang/test/SemaOpenCL/invalid-vector-literals.cl
@@ -10,4 +10,8 @@ void vector_literals_invalid()
   int4 b = (int4)(1,2,3,4,5); // expected-error{{excess elements in vector}}
   int8 d = (int8)(a,(float4)(1)); // expected-error{{initializing 'int' with an expression of incompatible type 'float4'}}
   ((int4)(0)).x = 8; // expected-error{{expression is not assignable}}
+  int arr[4];
+  int4 e = (int4)(arr); // expected-error{{initializing 'int4' (vector of 4 'int' values) with an expression of incompatible type '__private int[4]'}}
+  int *p = arr;
+  int4 f = (int4)(p); // expected-error{{initializing 'int4' (vector of 4 'int' values) with an expression of incompatible type '__private int *__private'}}
 }


        


More information about the cfe-commits mailing list