From 1f7f19c46a9fa0c1be528bfb9fa54196d8ca0e4b Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Wed, 14 Mar 2007 23:17:03 +0000 Subject: [PATCH] re PR c++/30860 (Should warn about boolean constant false used in pointer context) 2007-03-15 Dirk Mueller PR c++/30860 * call.c (convert_conversion_warnings): New.. (convert_like_real): .. factored out from here. (convert_conversion_warnings): Add warning about false being converted to NULL in argument passing. * g++.dg/warn/Wconversion2.C: New. From-SVN: r122934 --- gcc/cp/ChangeLog | 8 ++++ gcc/cp/call.c | 60 ++++++++++++++---------- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/g++.dg/warn/Wconversion2.C | 4 ++ 4 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wconversion2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1409d2b974a..2142ac4082b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2007-03-15 Dirk Mueller + + PR c++/30860 + * call.c (convert_conversion_warnings): New.. + (convert_like_real): .. factored out from here. + (convert_conversion_warnings): Add warning about + false being converted to NULL in argument passing. + 2007-03-14 Dirk Mueller * cp/semantics.c (c_finish_if_stmt): Call empty_if_body_warning. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 00e0c063e86..53129bb881a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4245,6 +4245,41 @@ build_temp (tree expr, tree type, int flags, return expr; } +/* Perform warnings about conversion of EXPR to type TOTYPE. + FN and ARGNUM are used for diagnostics. */ + +static void +convert_conversion_warnings (tree totype, tree expr, tree fn, int argnum) +{ + tree t = non_reference (totype); + + /* Issue warnings about peculiar, but valid, uses of NULL. */ + if (expr == null_node && TREE_CODE (t) != BOOLEAN_TYPE && ARITHMETIC_TYPE_P (t)) + { + if (fn) + warning (OPT_Wconversion, "passing NULL to non-pointer argument %P of %qD", + argnum, fn); + else + warning (OPT_Wconversion, "converting to non-pointer type %qT from NULL", t); + } + + /* Warn about assigning a floating-point type to an integer type. */ + 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)); + } + + /* Issue warnings if "false" is converted to a NULL pointer */ + if (expr == boolean_false_node && fn && POINTER_TYPE_P (t)) + warning (OPT_Wconversion, + "converting % to pointer type for argument %P of %qD", + argnum, fn); +} /* Perform the conversions in CONVS on the expression EXPR. FN and ARGNUM are used for diagnostics. ARGNUM is zero based, -1 @@ -4293,30 +4328,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, } if (issue_conversion_warnings) - { - tree t = non_reference (totype); - - /* Issue warnings about peculiar, but valid, uses of NULL. */ - if (expr == null_node && TREE_CODE (t) != BOOLEAN_TYPE && ARITHMETIC_TYPE_P (t)) - { - if (fn) - warning (OPT_Wconversion, "passing NULL to non-pointer argument %P of %qD", - argnum, fn); - else - warning (OPT_Wconversion, "converting to non-pointer type %qT from NULL", t); - } - - /* Warn about assigning a floating-point type to an integer type. */ - 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_conversion_warnings (totype, expr, fn, argnum); switch (convs->kind) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f36b876834..27974a93a51 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-03-15 Dirk Mueller + + * g++.dg/warn/Wconversion2.C: New. + 2007-03-14 Eric Christopher * gcc.dg/ssp-1.c: New. diff --git a/gcc/testsuite/g++.dg/warn/Wconversion2.C b/gcc/testsuite/g++.dg/warn/Wconversion2.C new file mode 100644 index 00000000000..d77407aedc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion2.C @@ -0,0 +1,4 @@ +// { dg-options "-Wconversion" } + +void foo(const char *); +void bar() { foo(false); } // { dg-warning "pointer type argument" } -- 2.30.2