mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-14 03:45:33 +00:00
[OpenCL] Added diagnostic for checking length of vector
Reviewers: Anastasia, cfe-commits Reviewed By: Anastasia Subscribers: bader, yaxunl Differential Revision: https://reviews.llvm.org/D30937 llvm-svn: 298369
This commit is contained in:
parent
fd4c410f4d
commit
392a507103
@ -8236,6 +8236,8 @@ def err_opencl_ptrptr_kernel_param : Error<
|
||||
def err_kernel_arg_address_space : Error<
|
||||
"pointer arguments to kernel functions must reside in '__global', "
|
||||
"'__constant' or '__local' address space">;
|
||||
def err_opencl_ext_vector_component_invalid_length : Error<
|
||||
"vector component access has invalid length %0. Supported: 1,2,3,4,8,16.">;
|
||||
def err_opencl_function_variable : Error<
|
||||
"%select{non-kernel function|function scope}0 variable cannot be declared in %1 address space">;
|
||||
def err_static_function_scope : Error<
|
||||
|
@ -284,6 +284,14 @@ IsRGBA(char c) {
|
||||
}
|
||||
}
|
||||
|
||||
// OpenCL v1.1, s6.1.7
|
||||
// The component swizzle length must be in accordance with the acceptable
|
||||
// vector sizes.
|
||||
static bool IsValidOpenCLComponentSwizzleLength(unsigned len)
|
||||
{
|
||||
return (len >= 1 && len <= 4) || len == 8 || len == 16;
|
||||
}
|
||||
|
||||
/// Check an ext-vector component access expression.
|
||||
///
|
||||
/// VK should be set in advance to the value kind of the base
|
||||
@ -376,6 +384,19 @@ CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK,
|
||||
}
|
||||
}
|
||||
|
||||
if (!HalvingSwizzle) {
|
||||
unsigned SwizzleLength = CompName->getLength();
|
||||
|
||||
if (HexSwizzle)
|
||||
SwizzleLength--;
|
||||
|
||||
if (IsValidOpenCLComponentSwizzleLength(SwizzleLength) == false) {
|
||||
S.Diag(OpLoc, diag::err_opencl_ext_vector_component_invalid_length)
|
||||
<< SwizzleLength << SourceRange(CompLoc);
|
||||
return QualType();
|
||||
}
|
||||
}
|
||||
|
||||
// The component accessor looks fine - now we need to compute the actual type.
|
||||
// The vector type is implied by the component accessor. For example,
|
||||
// vec4.b is a float, vec4.xy is a vec2, vec4.rgb is a vec3, etc.
|
||||
|
10
clang/test/SemaOpenCL/vector_swizzle_length.cl
Normal file
10
clang/test/SemaOpenCL/vector_swizzle_length.cl
Normal file
@ -0,0 +1,10 @@
|
||||
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
|
||||
|
||||
typedef float float8 __attribute__((ext_vector_type(8)));
|
||||
|
||||
void foo() {
|
||||
float8 f2 = (float8)(0, 0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
f2.s01234; // expected-error {{vector component access has invalid length 5. Supported: 1,2,3,4,8,16}}
|
||||
f2.xyzxy; // expected-error {{vector component access has invalid length 5. Supported: 1,2,3,4,8,16}}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user