diff options
| -rw-r--r-- | clang/lib/Sema/SemaExprMember.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Sema/vector_swizzle_length.c | 10 | ||||
| -rw-r--r-- | clang/test/SemaOpenCL/vector_swizzle_length.cl | 2 |
3 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index c3561f6400a..bf4cb53b7d8 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -384,7 +384,9 @@ CheckExtVectorComponent(Sema &S, QualType baseType, ExprValueKind &VK, } } - if (!HalvingSwizzle) { + // OpenCL mode requires swizzle length to be in accordance with accepted + // sizes. Clang however supports arbitrary lengths for other languages. + if (S.getLangOpts().OpenCL && !HalvingSwizzle) { unsigned SwizzleLength = CompName->getLength(); if (HexSwizzle) diff --git a/clang/test/Sema/vector_swizzle_length.c b/clang/test/Sema/vector_swizzle_length.c new file mode 100644 index 00000000000..5e6b1e7d67a --- /dev/null +++ b/clang/test/Sema/vector_swizzle_length.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -x c %s -verify -pedantic -fsyntax-only +// expected-no-diagnostics + +typedef float float8 __attribute__((ext_vector_type(8))); + +void foo() { + float8 f2 = (float8){0, 0, 0, 0, 0, 0, 0, 0}; + (void)f2.s01234; + (void)f2.xyzxy; +} diff --git a/clang/test/SemaOpenCL/vector_swizzle_length.cl b/clang/test/SemaOpenCL/vector_swizzle_length.cl index 94e3f654d5d..4dbb5bd76ee 100644 --- a/clang/test/SemaOpenCL/vector_swizzle_length.cl +++ b/clang/test/SemaOpenCL/vector_swizzle_length.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only +// RUN: %clang_cc1 -x cl %s -verify -pedantic -fsyntax-only typedef float float8 __attribute__((ext_vector_type(8))); |

