r205646 - Vector [Sema]. Vector "splats" which are truncated should have a warning

Fariborz Jahanian fjahanian at apple.com
Fri Apr 4 12:33:39 PDT 2014


Author: fjahanian
Date: Fri Apr  4 14:33:39 2014
New Revision: 205646

URL: http://llvm.org/viewvc/llvm-project?rev=205646&view=rev
Log:
Vector [Sema]. Vector "splats" which are truncated should have a warning
with -Wconversion. // rdar://16502418

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/conversion.c

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=205646&r1=205645&r2=205646&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Fri Apr  4 14:33:39 2014
@@ -6113,11 +6113,20 @@ void CheckConditionalOperator(Sema &S, C
 /// 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.

Modified: cfe/trunk/test/Sema/conversion.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/conversion.c?rev=205646&r1=205645&r2=205646&view=diff
==============================================================================
--- cfe/trunk/test/Sema/conversion.c (original)
+++ cfe/trunk/test/Sema/conversion.c Fri Apr  4 14:33:39 2014
@@ -417,3 +417,15 @@ void test26(int si, long sl) {
   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'}}
+}





More information about the cfe-commits mailing list