From: Ted Kremenek Date: Sat, 22 Oct 2011 02:37:33 +0000 (+0000) Subject: Only emit implicit constant conversion truncation warnings in reachable code. Appare... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e745da03df27ac620b0a5cc280d0d1757cfbac1;p=clang Only emit implicit constant conversion truncation warnings in reachable code. Apparently this is what GCC does, and some code depends on this. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142716 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index f080a618b7..daab1cd487 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -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; } diff --git a/test/Sema/constant-conversion.c b/test/Sema/constant-conversion.c index 7c6b9b81bd..a2c48d3549 100644 --- a/test/Sema/constant-conversion.c +++ b/test/Sema/constant-conversion.c @@ -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}} +} + diff --git a/test/Sema/conversion.c b/test/Sema/conversion.c index 842641bf10..a591ac0eef 100644 --- a/test/Sema/conversion.c +++ b/test/Sema/conversion.c @@ -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; }