Skip to content

Commit f294a8a

Browse files
authored
Add clang patch 'Diagnose invalid conversion from pointer to vector' (intel#644)
Backports upstream LLVM patch: llvm/llvm-project@fbad717b9a09 For intel/compute-runtime#888
1 parent 2ce8d3f commit f294a8a

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
From aca76d6c29c96ba1f64dd50dadc010d01d19c83c Mon Sep 17 00:00:00 2001
2+
From: Wenju He <wenju.he@intel.com>
3+
Date: Fri, 13 Feb 2026 14:09:49 +0100
4+
Subject: [PATCH] [OpenCL] Diagnose invalid conversion from pointer to vector
5+
(#180318)
6+
7+
Fix crash in clang PrepareScalarCast when compiling OpenCL source: void
8+
foo() {
9+
int a[3] = {1, 2, 3};
10+
int3 b = (int3)(a);
11+
}
12+
13+
PrepareScalarCast requires scalar src, but the provided src is a
14+
pointer.
15+
16+
Resolves https://github.com/intel/compute-runtime/issues/888
17+
---
18+
clang/lib/Sema/SemaExpr.cpp | 7 +++++++
19+
clang/test/SemaOpenCL/invalid-vector-literals.cl | 4 ++++
20+
2 files changed, 11 insertions(+)
21+
22+
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
23+
index 687b1be94592..73ffd76ae80c 100644
24+
--- a/clang/lib/Sema/SemaExpr.cpp
25+
+++ b/clang/lib/Sema/SemaExpr.cpp
26+
@@ -7796,6 +7796,13 @@ ExprResult Sema::BuildVectorLiteral(SourceLocation LParenLoc,
27+
// it will be replicated to all components of the vector.
28+
if (getLangOpts().OpenCL && VTy->getVectorKind() == VectorKind::Generic &&
29+
numExprs == 1) {
30+
+ QualType SrcTy = exprs[0]->getType();
31+
+ if (!SrcTy->isArithmeticType()) {
32+
+ Diag(exprs[0]->getBeginLoc(), diag::err_typecheck_convert_incompatible)
33+
+ << Ty << SrcTy << AssignmentAction::AA_Initializing << /*elidable=*/0
34+
+ << /*c_style=*/0 << /*cast_kind=*/"" << exprs[0]->getSourceRange();
35+
+ return ExprError();
36+
+ }
37+
QualType ElemTy = VTy->getElementType();
38+
ExprResult Literal = DefaultLvalueConversion(exprs[0]);
39+
if (Literal.isInvalid())
40+
diff --git a/clang/test/SemaOpenCL/invalid-vector-literals.cl b/clang/test/SemaOpenCL/invalid-vector-literals.cl
41+
index 1d82fedf29de..0595256ef82f 100644
42+
--- a/clang/test/SemaOpenCL/invalid-vector-literals.cl
43+
+++ b/clang/test/SemaOpenCL/invalid-vector-literals.cl
44+
@@ -10,4 +10,8 @@ void vector_literals_invalid()
45+
int4 b = (int4)(1,2,3,4,5); // expected-error{{excess elements in vector}}
46+
int8 d = (int8)(a,(float4)(1)); // expected-error{{initializing 'int' with an expression of incompatible type 'float4'}}
47+
((int4)(0)).x = 8; // expected-error{{expression is not assignable}}
48+
+ int arr[4];
49+
+ int4 e = (int4)(arr); // expected-error{{initializing 'int4' (vector of 4 'int' values) with an expression of incompatible type '__private int[4]'}}
50+
+ int *p = arr;
51+
+ int4 f = (int4)(p); // expected-error{{initializing 'int4' (vector of 4 'int' values) with an expression of incompatible type '__private int *__private'}}
52+
}
53+
--
54+
2.39.1
55+

0 commit comments

Comments
 (0)