diff options
| author | Egor Churaev <egor.churaev@gmail.com> | 2017-03-21 13:20:57 +0000 |
|---|---|---|
| committer | Egor Churaev <egor.churaev@gmail.com> | 2017-03-21 13:20:57 +0000 |
| commit | 392a507103f32612bbcf72739ab82ba08faa8f05 (patch) | |
| tree | 30057161a671dd1f5c2f9dbe72c959683894b98f | |
| parent | fd4c410f4d6af5b57773174a26ed6fa8ea63306e (diff) | |
| download | bcm5719-llvm-392a507103f32612bbcf72739ab82ba08faa8f05.tar.gz bcm5719-llvm-392a507103f32612bbcf72739ab82ba08faa8f05.zip | |
[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
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprMember.cpp | 21 | ||||
| -rw-r--r-- | clang/test/SemaOpenCL/vector_swizzle_length.cl | 10 |
3 files changed, 33 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 74dabe7f3fa..fe40cb002d0 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index f08bdc5e9c8..542f10ba2da 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -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. diff --git a/clang/test/SemaOpenCL/vector_swizzle_length.cl b/clang/test/SemaOpenCL/vector_swizzle_length.cl new file mode 100644 index 00000000000..94e3f654d5d --- /dev/null +++ b/clang/test/SemaOpenCL/vector_swizzle_length.cl @@ -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}} +} |

