teak-llvm/clang/test/Sema/ext_vector_conversions.c
Stephen Canon ca8eefddb7 Prevent implicit re-interpret casts between ExtVector and Scalar types.
Previously, in certain cases lax vector conversions could occur between scalar floating-point values and ExtVector types; these conversions would be simple bitcasts.  We need to allow them with other vector types to support some common headers, but we don't need them for ExtVector.  Preventing them here makes them behave like other operations involving scalars and ExtVectors.

llvm-svn: 247643
2015-09-15 00:21:56 +00:00

20 lines
838 B
C

// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -fsyntax-only -verify -Wconversion %s
typedef __attribute__((ext_vector_type(4))) char char4;
typedef __attribute__((ext_vector_type(4))) short short4;
typedef __attribute__((ext_vector_type(1))) float float1;
static void test() {
char4 vc4;
float f;
// Not allowed. There's no splatting conversion between float and int vector,
// and we don't want to bitcast f to vector-of-char (as would happen with the
// old-style vector types).
vc4 += f; // expected-error {{cannot convert between vector values of different size}}
short4 vs4;
long long ll;
// This one is OK; we don't re-interpret ll as short4, rather we splat its
// value, which should produce a warning about clamping.
vs4 += ll; // expected-warning {{implicit conversion loses integer precision}}
}