The following patch replaces some of the functionality of Wconversion in g++ by using the code developed for Wcoercion project. In particular, it checks for coercions from real to integer.
The proposed implementation has two advantages over the existing one: * The code is shared by both C and C++ front ends in the function "coercion_warning" which is called through the existing function "convert_and_check". * The proposed implementation warns for int i = 1.1 but not for int i = 1.0 while the previous code warns for both cases. The patch must be applied after the ones given in http://gcc.gnu.org/ml/gcc-patches/2006-07/msg00098.html Bootstrapped and tested in trunk revision 115112 Comments and suggestions are very welcome.
diff -pEbaur --unidirectional-new-file --exclude='*svn*' --exclude='*~' pristine/gcc/cp/call.c wcoercion/gcc/cp/call.c --- pristine/gcc/cp/call.c 2006-07-07 22:58:38.000000000 +0100 +++ wcoercion/gcc/cp/call.c 2006-07-09 19:21:13.000000000 +0100 @@ -4255,12 +4255,11 @@ convert_like_real (conversion *convs, tr if (TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE && TREE_CODE (t) == INTEGER_TYPE) { - if (fn) - warning (OPT_Wconversion, "passing %qT for argument %P to %qD", - TREE_TYPE (expr), argnum, fn); - else - warning (OPT_Wconversion, "converting to %qT from %qT", t, TREE_TYPE (expr)); + convert_and_check (t, expr); + /* There is another call to convert_and_check below, we just + warn once. */ + issue_conversion_warnings = false; } } diff -pEbaur --unidirectional-new-file --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/g++.dg/warn/conv2.C wcoercion/gcc/testsuite/g++.dg/warn/conv2.C --- pristine/gcc/testsuite/g++.dg/warn/conv2.C 2006-07-07 23:00:25.000000000 +0100 +++ wcoercion/gcc/testsuite/g++.dg/warn/conv2.C 2006-07-09 19:21:13.000000000 +0100 @@ -1,4 +1,5 @@ // PR c++/13932 -// { dg-options "-Wconversion" } +// { dg-options "-Wcoercion" } -int i = 1.; // { dg-warning "converting" } +int i = 1.; +int j = 1.1; // { dg-warning "coercion" } diff -pEbaur --unidirectional-new-file --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/g++.old-deja/g++.warn/impint2.C wcoercion/gcc/testsuite/g++.old-deja/g++.warn/impint2.C --- pristine/gcc/testsuite/g++.old-deja/g++.warn/impint2.C 2006-07-07 23:22:57.000000000 +0100 +++ wcoercion/gcc/testsuite/g++.old-deja/g++.warn/impint2.C 2006-07-09 19:21:13.000000000 +0100 @@ -1,8 +1,9 @@ // { dg-do assemble } -// { dg-options "-Wconversion" } +// { dg-options "-Wcoercion" } // Copyright (C) 2000 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 6 Mar 2000 <[EMAIL PROTECTED]> +// Modified by Manuel Lopez-Ibanez 7 Jul 2006 <[EMAIL PROTECTED]> // initialization to 'int' from to 'double' We expect consistent warnings // whenever a float is implicitly truncated to int, make sure references diff -pEbaur --unidirectional-new-file --exclude='*svn*' --exclude='*~' pristine/gcc/testsuite/g++.old-deja/g++.warn/impint.C wcoercion/gcc/testsuite/g++.old-deja/g++.warn/impint.C --- pristine/gcc/testsuite/g++.old-deja/g++.warn/impint.C 2006-07-07 23:25:01.000000000 +0100 +++ wcoercion/gcc/testsuite/g++.old-deja/g++.warn/impint.C 2006-07-09 19:21:13.000000000 +0100 @@ -1,7 +1,9 @@ // { dg-do assemble } -// { dg-options "-Wconversion" } +// { dg-options "-Wcoercion" } + // Copyright (C) 2000 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 24 Feb 2000 <[EMAIL PROTECTED]> +// Modified by Manuel Lopez-Ibanez 7 Jul 2006 <[EMAIL PROTECTED]> // derived from a bug report by Johan Kuipers <[EMAIL PROTECTED]> // initialization to 'int' from to 'double' We expect consistent warnings