aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2010-02-20 21:32:06 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2010-02-20 21:32:06 +0000
commit17251338deebd6575ef2a9e2c99c3f976561dc93 (patch)
tree80eb6bcb9ce16ee2cd887d93ee782806145b1486
parentc387e0676eb6949dfc49681d6ac1b09c3e11d2ca (diff)
downloadgcc-17251338deebd6575ef2a9e2c99c3f976561dc93.zip
gcc-17251338deebd6575ef2a9e2c99c3f976561dc93.tar.gz
gcc-17251338deebd6575ef2a9e2c99c3f976561dc93.tar.bz2
re PR c++/35669 (NULL (__null) not considered different from 0 with C++)
2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org> PR c++/35669 * c.opt (Wconversion-null): New option. * doc/invoke.texi (Wconversion-null): Document. cp/ * call.c (conversion_null_warnings): Replace -Wconversion with -Wconversion-null. * cvt.c (build_expr_type_conversion): Likewise. testsuite/ * g++.dg/warn/Wconversion2.C: Replace -Wconversion with -Wconversion-null. * g++.dg/warn/Wconversion-null.C: New test. * g++.old-deja/g++.other/null1.C: Move to... * g++.dg/warn/Wconversion-null-2.C: ... here. Remove -Wconversion. libstdc++-v3/ * testsuite/18_support/headers/cstddef/macros.cc: Add -Wno-conversion-null. From-SVN: r156928
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c.opt4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/call.c14
-rw-r--r--gcc/cp/cvt.c3
-rw-r--r--gcc/doc/invoke.texi19
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/g++.dg/warn/Wconversion-null-2.C (renamed from gcc/testsuite/g++.old-deja/g++.other/null1.C)2
-rw-r--r--gcc/testsuite/g++.dg/warn/Wconversion-null.C45
-rw-r--r--gcc/testsuite/g++.dg/warn/Wconversion2.C3
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/testsuite/18_support/headers/cstddef/macros.cc1
12 files changed, 102 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aa2d0fa..61e595e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+ PR c++/35669
+ * c.opt (Wconversion-null): New option.
+ * doc/invoke.texi (Wconversion-null): Document.
+
+2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
* common.opt (Wlarger-than-): Add Undocumented.
2010-02-19 Mike Stump <mikestump@comcast.net>
diff --git a/gcc/c.opt b/gcc/c.opt
index e30aef3..82dee8d 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -171,6 +171,10 @@ Wconversion
C ObjC C++ ObjC++ Var(warn_conversion) Warning
Warn for implicit type conversions that may change a value
+Wconversion-null
+C++ ObjC++ Var(warn_conversion_null) Init(1) Warning
+Warn for converting NULL from/to a non-pointer type
+
Wsign-conversion
C ObjC C++ ObjC++ Var(warn_sign_conversion) Init(-1)
Warn for implicit type conversions between signed and unsigned integers
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0f41c56..d71e2b4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/35669
+ * call.c (conversion_null_warnings): Replace -Wconversion with
+ -Wconversion-null.
+ * cvt.c (build_expr_type_conversion): Likewise.
+
2010-02-18 Jason Merrill <jason@redhat.com>
PR c++/42837
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 5e66c62..7a6e104 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -4804,17 +4804,19 @@ conversion_null_warnings (tree totype, tree expr, tree fn, int argnum)
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);
+ warning_at (input_location, OPT_Wconversion_null,
+ "passing NULL to non-pointer argument %P of %qD",
+ argnum, fn);
else
- warning (OPT_Wconversion, "converting to non-pointer type %qT from NULL", t);
+ warning_at (input_location, OPT_Wconversion_null,
+ "converting to non-pointer type %qT from NULL", t);
}
/* Issue warnings if "false" is converted to a NULL pointer */
else if (expr == boolean_false_node && fn && POINTER_TYPE_P (t))
- warning (OPT_Wconversion,
- "converting %<false%> to pointer type for argument %P of %qD",
- argnum, fn);
+ warning_at (input_location, OPT_Wconversion_null,
+ "converting %<false%> to pointer type for argument %P of %qD",
+ argnum, fn);
}
/* Perform the conversions in CONVS on the expression EXPR. FN and
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 344816c..6fcb1f0 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -1141,7 +1141,8 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
if (expr == null_node
&& (desires & WANT_INT)
&& !(desires & WANT_NULL))
- warning (OPT_Wconversion, "converting NULL to non-pointer type");
+ warning_at (input_location, OPT_Wconversion_null,
+ "converting NULL to non-pointer type");
basetype = TREE_TYPE (expr);
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index a81cc99..a7abd01 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -194,7 +194,7 @@ in the following sections.
-fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ @gol
-fno-default-inline -fvisibility-inlines-hidden @gol
-fvisibility-ms-compat @gol
--Wabi -Wctor-dtor-privacy @gol
+-Wabi -Wconversion-null -Wctor-dtor-privacy @gol
-Wnon-virtual-dtor -Wreorder @gol
-Weffc++ -Wstrict-null-sentinel @gol
-Wno-non-template-friend -Wold-style-cast @gol
@@ -3837,14 +3837,19 @@ changed by the conversion like in @code{abs (2.0)}. Warnings about
conversions between signed and unsigned integers can be disabled by
using @option{-Wno-sign-conversion}.
-For C++, also warn for conversions between @code{NULL} and non-pointer
-types; confusing overload resolution for user-defined conversions; and
-conversions that will never use a type conversion operator:
-conversions to @code{void}, the same type, a base class or a reference
-to them. Warnings about conversions between signed and unsigned
-integers are disabled by default in C++ unless
+For C++, also warn for confusing overload resolution for user-defined
+conversions; and conversions that will never use a type conversion
+operator: conversions to @code{void}, the same type, a base class or a
+reference to them. Warnings about conversions between signed and
+unsigned integers are disabled by default in C++ unless
@option{-Wsign-conversion} is explicitly enabled.
+@item -Wno-conversion-null @r{(C++)}
+@opindex Wconversion-null
+@opindex Wno-conversion-null
+Do not warn for conversions between @code{NULL} and non-pointer
+types. @option{-Wconversion-null} is enabled by default.
+
@item -Wempty-body
@opindex Wempty-body
@opindex Wno-empty-body
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 226c755..5555898 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/35669
+ * g++.dg/warn/Wconversion2.C: Replace -Wconversion with
+ -Wconversion-null.
+ * g++.dg/warn/Wconversion-null.C: New test.
+ * g++.old-deja/g++.other/null1.C: Move to...
+ * g++.dg/warn/Wconversion-null-2.C: ... here. Remove -Wconversion.
+
2010-02-20 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36932
diff --git a/gcc/testsuite/g++.old-deja/g++.other/null1.C b/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C
index 536f759..d5c230f 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/null1.C
+++ b/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C
@@ -1,5 +1,5 @@
// { dg-do link }
-// { dg-options "-Wconversion" }
+// { dg-options "" }
#include <cstddef>
diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-null.C b/gcc/testsuite/g++.dg/warn/Wconversion-null.C
new file mode 100644
index 0000000..205f5d2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wconversion-null.C
@@ -0,0 +1,45 @@
+// { dg-do link }
+// { dg-options "-Wconversion -Wno-conversion-null -Wno-pointer-arith" }
+
+#include <cstddef>
+
+void g(int) {}
+void g(long) {}
+extern void g(void*);
+
+template <int I>
+void h() {}
+
+void k(int) {}
+
+template <class T>
+void l(T);
+
+template <>
+void l(int) {}
+
+template <>
+void l(long) {}
+
+int main()
+{
+ int i = NULL; // converting NULL to non-pointer type
+ float z = NULL; // converting NULL to non-pointer type
+ int a[2];
+
+ i != NULL; // NULL used in arithmetic
+ NULL != z; // NULL used in arithmetic
+ k != NULL; // No warning: decay conversion
+ NULL != a; // Likewise.
+ -NULL; // converting NULL to non-pointer type
+ +NULL; // converting NULL to non-pointer type
+ ~NULL; // converting NULL to non-pointer type
+ a[NULL] = 3; // converting NULL to non-pointer-type
+ i = NULL; // converting NULL to non-pointer type
+ z = NULL; // converting NULL to non-pointer type
+ k(NULL); // converting NULL to int
+ g(NULL); // converting NULL to int
+ h<NULL>(); // No warning: NULL bound to integer template parameter
+ l(NULL); // converting NULL to int
+ NULL && NULL; // No warning: converting NULL to bool is OK
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wconversion2.C b/gcc/testsuite/g++.dg/warn/Wconversion2.C
index a71b410..226dd85 100644
--- a/gcc/testsuite/g++.dg/warn/Wconversion2.C
+++ b/gcc/testsuite/g++.dg/warn/Wconversion2.C
@@ -1,4 +1,3 @@
-// { dg-options "-Wconversion" }
-
+// { dg-options "-Wconversion-null" }
void foo(const char *);
void bar() { foo(false); } // { dg-warning "pointer type for argument" }
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f89d8bc..cf7aa9e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2010-02-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/35669
+ * testsuite/18_support/headers/cstddef/macros.cc: Add
+ -Wno-conversion-null.
+
2010-02-19 Paolo Carlini <paolo.carlini@oracle.com>
* include/tr1_impl/array (array): Add pointer and const_pointer
diff --git a/libstdc++-v3/testsuite/18_support/headers/cstddef/macros.cc b/libstdc++-v3/testsuite/18_support/headers/cstddef/macros.cc
index 1329e58..c17e86f 100644
--- a/libstdc++-v3/testsuite/18_support/headers/cstddef/macros.cc
+++ b/libstdc++-v3/testsuite/18_support/headers/cstddef/macros.cc
@@ -1,4 +1,5 @@
// { dg-do compile }
+// { dg-options "-Wno-conversion-null" }
// 2001-02-06 Benjamin Kosnik <bkoz@redhat.com>
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009