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.

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to