]> granicus.if.org Git - clang/commitdiff
Only emit implicit constant conversion truncation warnings in reachable code. Appare...
authorTed Kremenek <kremenek@apple.com>
Sat, 22 Oct 2011 02:37:33 +0000 (02:37 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 22 Oct 2011 02:37:33 +0000 (02:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142716 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/Sema/constant-conversion.c
test/Sema/conversion.c

index f080a618b7acf65ee81dbe68f2c7fb61b03e4bf4..daab1cd487769054560af573a0676355d5a85cd6 100644 (file)
@@ -3536,9 +3536,11 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
       std::string PrettySourceValue = Value.toString(10);
       std::string PrettyTargetValue = PrettyPrintInRange(Value, TargetRange);
 
-      S.Diag(E->getExprLoc(), diag::warn_impcast_integer_precision_constant)
-        << PrettySourceValue << PrettyTargetValue
-        << E->getType() << T << E->getSourceRange() << clang::SourceRange(CC);
+      S.DiagRuntimeBehavior(E->getExprLoc(), E,
+        S.PDiag(diag::warn_impcast_integer_precision_constant)
+            << PrettySourceValue << PrettyTargetValue
+            << E->getType() << T << E->getSourceRange()
+            << clang::SourceRange(CC));
       return;
     }
 
index 7c6b9b81bd0fa1a3bcf93abdcd6fc69510f8283c..a2c48d3549c8b6b8832943ce54f2ea676eb53a60 100644 (file)
@@ -55,3 +55,10 @@ void test5() {
   // don't warn about it just because it's a bitfield.
   a.b = 100;
 }
+
+void test6() {
+  // Test that unreachable code doesn't trigger the truncation warning.
+  unsigned char x = 0 ? 65535 : 1; // no-warning
+  unsigned char y = 1 ? 65535 : 1; // expected-warning {{changes value}}
+}
+
index 842641bf105614f3946802e67f374ae86fa8db6b..a591ac0eef832c89fe8509aa442041e0c150c9ab 100644 (file)
@@ -61,53 +61,125 @@ void test0(char c, short s, int i, long l, long long ll) {
 
 char test1(long long ll) {
   return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+char test1_a(long long ll) {
   return (long) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+char test1_b(long long ll) {
   return (int) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+char test1_c(long long ll) {
   return (short) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+char test1_d(long long ll) {
   return (char) ll;
+}
+char test1_e(long long ll) {
   return (long long) BIG; // expected-warning {{implicit conversion from 'long long' to 'char' changes value}}
+}
+char test1_f(long long ll) {
   return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'char' changes value}}
+}
+char test1_g(long long ll) {
   return (int) BIG; // expected-warning {{implicit conversion from 'int' to 'char' changes value}}
+}
+char test1_h(long long ll) {
   return (short) BIG; // expected-warning {{implicit conversion from 'short' to 'char' changes value}}
+}
+char test1_i(long long ll) {
   return (char) BIG;
 }
 
 short test2(long long ll) {
   return (long long) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+short test2_a(long long ll) {
   return (long) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+short test2_b(long long ll) {
   return (int) ll; // expected-warning {{implicit conversion loses integer precision}}
+}
+short test2_c(long long ll) {
   return (short) ll;
+}
+short test2_d(long long ll) {
   return (char) ll;
+}
+short test2_e(long long ll) {
   return (long long) BIG;  // expected-warning {{implicit conversion from 'long long' to 'short' changes value}}
+}
+short test2_f(long long ll) {
   return (long) BIG;  // expected-warning {{implicit conversion from 'long' to 'short' changes value}}
+}
+short test2_g(long long ll) {
   return (int) BIG;  // expected-warning {{implicit conversion from 'int' to 'short' changes value}}
+}
+short test2_h(long long ll) {
   return (short) BIG;
+}
+short test2_i(long long ll) {
   return (char) BIG;
 }
 
 int test3(long long ll) {
   return (long long) ll;  // expected-warning {{implicit conversion loses integer precision}}
+}
+int test3_b(long long ll) {
   return (long) ll;  // expected-warning {{implicit conversion loses integer precision}}
+}
+int test3_c(long long ll) {
   return (int) ll;
+}
+int test3_d(long long ll) {
   return (short) ll;
+}
+int test3_e(long long ll) {
   return (char) ll;
+}
+int test3_f(long long ll) {
   return (long long) BIG;  // expected-warning {{implicit conversion from 'long long' to 'int' changes value}}
+}
+int test3_g(long long ll) {
   return (long) BIG; // expected-warning {{implicit conversion from 'long' to 'int' changes value}}
+}
+int test3_h(long long ll) {
   return (int) BIG;
+}
+int test3_i(long long ll) {
   return (short) BIG;
+}
+int test3_j(long long ll) {
   return (char) BIG;
 }
 
 long test4(long long ll) {
   return (long long) ll;
+}
+long test4_a(long long ll) {
   return (long) ll;
+}
+long test4_b(long long ll) {
   return (int) ll;
+}
+long test4_c(long long ll) {
   return (short) ll;
+}
+long test4_d(long long ll) {
   return (char) ll;
+}
+long test4_e(long long ll) {
   return (long long) BIG;
+}
+long test4_f(long long ll) {
   return (long) BIG;
+}
+long test4_g(long long ll) {
   return (int) BIG;
+}
+long test4_h(long long ll) {
   return (short) BIG;
+}
+long test4_i(long long ll) {
   return (char) BIG;
 }