On 30 May 2017 at 23:28, Martin Sebor <mse...@gmail.com> wrote: > On 05/29/2017 08:02 AM, Christophe Lyon wrote: >> >> On 25 May 2017 at 00:16, Martin Sebor <mse...@gmail.com> wrote: >>> >>> On 05/24/2017 11:08 AM, Joseph Myers wrote: >>>> >>>> >>>> On Wed, 17 May 2017, Martin Sebor wrote: >>>> >>>>> @@ -1036,31 +1079,76 @@ warnings_for_convert_and_check (location_t loc, >>>>> tree type, tree expr, >>>>> /* This detects cases like converting -129 or 256 to >>>>> unsigned char. */ >>>>> if (!int_fits_type_p (expr, c_common_signed_type (type))) >>>>> - warning_at (loc, OPT_Woverflow, >>>>> - "large integer implicitly truncated to unsigned >>>>> type"); >>>>> + { >>>>> + if (cst) >>>>> + warning_at (loc, OPT_Woverflow, >>>>> + (TYPE_UNSIGNED (exprtype) >>>>> + ? "conversion from %qT to %qT " >>>>> + "changes value from %qE to %qE" >>>>> + : "unsigned conversion from %qT to %qT " >>>>> + "changes value from %qE to %qE"), >>>>> + exprtype, type, expr, result); >>>>> + else >>>>> + warning_at (loc, OPT_Woverflow, >>>>> + (TYPE_UNSIGNED (exprtype) >>>>> + ? "conversion from %qT to %qT " >>>>> + "changes the value of %qE" >>>>> + : "unsigned conversion from %qT to %qT " >>>>> + "changes the value of %qE"), >>>>> + exprtype, type, expr); >>>>> + } >>>> >>>> >>>> >>>> You need to use G_() around both arguments to ?:, otherwise only one >>>> will >>>> get extracted for translation. >>>> >>>>> diff --git a/gcc/testsuite/c-c++-common/pr68657-1.c >>>>> b/gcc/testsuite/c-c++-common/pr68657-1.c >>>>> index 84f3e54..33fdf86 100644 >>>>> --- a/gcc/testsuite/c-c++-common/pr68657-1.c >>>>> +++ b/gcc/testsuite/c-c++-common/pr68657-1.c >>>>> @@ -5,14 +5,14 @@ >>>>> void >>>>> f1 (void) >>>>> { >>>>> - unsigned int a = -5; /* { dg-error "negative integer implicitly >>>>> converted to unsigned type" } */ >>>>> + unsigned int a = -5; /* { dg-error "unsigned conversion from .int. >>>>> to >>>>> .unsigned int. changes value from .-5. to .4294967291." } */ >>>> >>>> >>>> >>>> The more specific match would fail for targets with 16-bit int. You >>>> need >>>> to keep it less specific in this test (if you want to test the more >>>> specific text as well, another test could be added for that, restricted >>>> to >>>> the int32 effective-target). >>>> >>>> (The changes to Wconversion-real-integer-3.C and >>>> Wconversion-real-integer2.C are OK in that those tests are restricted to >>>> int32plus, although in theory 64-bit int would be an issue there.) >>>> >>>>> + /* According to 6.3.1.3 of C11: >>>>> + -3- Otherwise, the new type is signed and the value cannot be >>>>> + represented in it; either the result is >>>>> implementation-defined >>>>> + or an implementation-defined signal is raised. >>>>> + >>>>> + In GCC such conversios wrap and diagnosed by mentioning >>>>> "overflow" >>>>> + if the absolut value of the operand is in excess of the maximum >>>>> of >>>>> + the destination of type, and "conversion" otherwise, as follows: >>>>> */ >>>> >>>> >>>> >>>> s/conversios/conversions/; s/absolut/absolute/ >>>> >>>> OK with those changes. >>> >>> >>> >>> Thanks for the careful review! Done and committed in r248431. >>> >> >> Hi, >> >> I have noticed failures on arm*: >> Executed from: gcc.dg/fixed-point/fixed-point.exp >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 12) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 13) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 14) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 15) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 16) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 17) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 18) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 19) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 20) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 21) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 22) >> gcc.dg/fixed-point/int-warning.c (test for warnings, line 23) >> gcc.dg/fixed-point/int-warning.c (test for excess errors) >> >> Excess errors: >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:12:8: >> warning: overflow in conversion from '_Accum' to 'signed char' chages >> value from '5.0e+2' to '-12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:13:8: >> warning: overflow in conversion from '_Accum' to 'signed char' chages >> value from '-5.0e+2' to '12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:14:8: >> warning: overflow in conversion from 'long _Accum' to 'signed char' >> chages value from '5.0e+2' to '-12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:15:8: >> warning: overflow in conversion from 'long _Accum' to 'signed char' >> chages value from '-5.0e+2' to '12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:16:8: >> warning: overflow in conversion from 'long long _Accum' to 'signed >> char' chages value from '5.0e+2' to '-12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:17:8: >> warning: overflow in conversion from 'long long _Accum' to 'signed >> char' chages value from '-5.0e+2' to '12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:18:8: >> warning: overflow in conversion from '_Accum' to 'unsigned char' >> chages value from '5.0e+2' to '244' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:19:8: >> warning: overflow in conversion from '_Accum' to 'unsigned char' >> chages value from '-5.0e+2' to '12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:20:8: >> warning: overflow in conversion from 'long _Accum' to 'unsigned char' >> chages value from '5.0e+2' to '244' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:21:8: >> warning: overflow in conversion from 'long _Accum' to 'unsigned char' >> chages value from '-5.0e+2' to '12' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:22:8: >> warning: overflow in conversion from 'long long _Accum' to 'unsigned >> char' chages value from '5.0e+2' to '244' [-Woverflow] >> >> /aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/testsuite/gcc.dg/fixed-point/int-warning.c:23:8: >> warning: overflow in conversion from 'long long _Accum' to 'unsigned >> char' chages value from '-5.0e+2' to '12' [-Woverflow] >> >> Still present at r248552. > > > Both of these should be fixed by r248700.. > OK for me indeed, thanks.
Christophe > Martin >