/// implicit conversions in the given expression. There are a couple
/// of competing diagnostics here, -Wconversion and -Wsign-compare.
void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) {
- QualType T = OrigE->getType();
Expr *E = OrigE->IgnoreParenImpCasts();
if (E->isTypeDependent() || E->isValueDependent())
return;
+
+ QualType T = OrigE->getType();
+ // Check for conversion from an arithmetic type to a vector of arithmetic
+ // type elements. Warn if this results in truncation of each vector element.
+ if (isa<ExtVectorElementExpr>(E)) {
+ if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(OrigE))
+ if ((ICE->getCastKind() == CK_VectorSplat) &&
+ !T.isNull() && T->isExtVectorType())
+ T = cast<ExtVectorType>(T.getCanonicalType())->getElementType();
+ }
// For conditional operators, we analyze the arguments as if they
// were being fed directly into the output.
si = si / sl;
si = sl / si; // expected-warning {{implicit conversion loses integer precision: 'long' to 'int'}}
}
+
+// rdar://16502418
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef __attribute__ ((ext_vector_type(16),__aligned__(32))) uint16_t ushort16;
+typedef __attribute__ ((ext_vector_type( 8),__aligned__( 32))) uint32_t uint8;
+
+void test27(ushort16 constants) {
+ uint8 pairedConstants = (uint8) constants;
+ ushort16 crCbScale = pairedConstants.s4; // expected-warning {{implicit conversion loses integer precision: 'uint32_t' (aka 'unsigned int') to 'unsigned short'}}
+ ushort16 brBias = pairedConstants.s6; // expected-warning {{implicit conversion loses integer precision: 'uint32_t' (aka 'unsigned int') to 'unsigned short'}}
+}