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'}} } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
