Re: [google] Add new warning -Wreal-conversion (issue4436068)

2011-09-21 Thread Diego Novillo
On Tue, May 3, 2011 at 16:20, Jason Merrill ja...@redhat.com wrote:
 On 04/29/2011 10:59 AM, Diego Novillo wrote:

 This patch from Le-Chun Wu adds a new warning flag -Wreal-conversion
 that warns about implicit type conversions from real (double or float)
 values to integral values.

 Why do you want to use this flag rather than just use -Wconversion?

Because we've found it too noisy.  -Wconversion is a super-set of
-Wreal-conversion.  We added it in response to internal requests.
-Wconversion was warning benign cases so we could not enable it by
default in our builds.

Le-Chun, do you have some examples of -Wconversion being too spammy for us?


Diego.


Re: [google] Add new warning -Wreal-conversion (issue4436068)

2011-05-03 Thread Jason Merrill

On 04/29/2011 10:59 AM, Diego Novillo wrote:

This patch from Le-Chun Wu adds a new warning flag -Wreal-conversion
that warns about implicit type conversions from real (double or float)
values to integral values.


Why do you want to use this flag rather than just use -Wconversion?

Jason


[google] Add new warning -Wreal-conversion (issue4436068)

2011-04-29 Thread Diego Novillo
This patch from Le-Chun Wu adds a new warning flag -Wreal-conversion
that warns about implicit type conversions from real (double or float)
values to integral values.

OK for trunk?  Applied to google/main.

2011-04-27  Le-Chun Wu  l...@google.com

Google ref 39133

* c.opt (Wreal-conversion): New flag.
* c-common.c (conversion_warning): Use it.
* c-opts.c (c_common_post_options): Initialize it.
* doc/invoke.texi (Wreal-conversion): Document it.

testsuite/ChangeLog.google-main:
2011-04-27  Le-Chun Wu  l...@google.com

* g++.dg/warn/Wreal-conversion-1.C: New.
* gcc.dg/Wreal-conversion-1.c: New.

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 13f13a8..c6dc649 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -1941,7 +1941,7 @@ conversion_warning (tree type, tree expr)
   tree expr_type = TREE_TYPE (expr);
   location_t loc = EXPR_LOC_OR_HERE (expr);
 
-  if (!warn_conversion  !warn_sign_conversion)
+  if (!warn_conversion  !warn_sign_conversion  !warn_real_conversion)
 return;
 
   /* If any operand is artificial, then this expression was generated
@@ -1984,7 +1984,9 @@ conversion_warning (tree type, tree expr)
TREE_CODE (type) == INTEGER_TYPE)
 {
   if (!real_isinteger (TREE_REAL_CST_PTR (expr), TYPE_MODE 
(expr_type)))
-give_warning = true;
+warning (OPT_Wreal_conversion,
+ conversion to %qT from %qT may alter its value,
+ type, expr_type);
 }
   /* Warn for an integer constant that does not fit into integer type.  */
   else if (TREE_CODE (expr_type) == INTEGER_TYPE
@@ -2053,7 +2055,9 @@ conversion_warning (tree type, tree expr)
   /* Warn for real types converted to integer types.  */
   if (TREE_CODE (expr_type) == REAL_TYPE
TREE_CODE (type) == INTEGER_TYPE)
-give_warning = true;
+warning (OPT_Wreal_conversion,
+ conversion to %qT from %qT may alter its value,
+ type, expr_type);
 
   else if (TREE_CODE (expr_type) == INTEGER_TYPE
 TREE_CODE (type) == INTEGER_TYPE)
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index c3d1bbe..994bf90 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -939,6 +939,12 @@ c_common_post_options (const char **pfilename)
   if (warn_enum_compare == -1)
 warn_enum_compare = c_dialect_cxx () ? 1 : 0;
 
+  /* Enable warning for converting real values to integral values
+ when -Wconversion is specified (unless disabled through
+ -Wno-real-conversion).  */
+  if (warn_real_conversion == -1)
+warn_real_conversion = warn_conversion;
+
   /* -Wpacked-bitfield-compat is on by default for the C languages.  The
  warning is issued in stor-layout.c which is not part of the front-end so
  we need to selectively turn it on here.  */
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index af38a1f..ce742fa 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -323,6 +323,10 @@ Wself-assign-non-pod
 C++ ObjC++ Var(warn_self_assign_non_pod) Init(0) Warning
 Warn when a variable of a non-POD type is assigned to itself
 
+Wreal-conversion
+C ObjC C++ ObjC++ Var(warn_real_conversion) Init(-1) Warning
+Warn for implicit type conversions from real to integral values
+
 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/doc/invoke.texi b/gcc/doc/invoke.texi
index fa247b6..5f6d79d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -257,7 +257,7 @@ Objective-C and Objective-C++ Dialects}.
 -Woverlength-strings  -Wpacked  -Wpacked-bitfield-compat  -Wpadded @gol
 -Wparentheses  -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
 -Wpointer-arith  -Wno-pointer-to-int-cast @gol
--Wredundant-decls  -Wreturn-type -Wripa-opt-mismatch @gol
+-Wreal-conversion  -Wredundant-decls  -Wreturn-type -Wripa-opt-mismatch @gol
 -Wself-assign  -Wself-assign-non-pod  -Wsequence-point  -Wshadow @gol
 -Wshadow-compatible-local -Wshadow-local @gol
 -Wsign-compare  -Wsign-conversion  -Wstack-protector @gol
@@ -4232,6 +4232,12 @@ unsigned integers are disabled by default in C++ unless
 Do not warn for conversions between @code{NULL} and non-pointer
 types. @option{-Wconversion-null} is enabled by default.
 
+@item -Wreal-conversion
+@opindex Wreal-conversion
+@opindex Wno-real-conversion
+Warn for implicit type conversions from real (@code{double} or @code{float})
+to integral values.
+
 @item -Wempty-body
 @opindex Wempty-body
 @opindex Wno-empty-body
diff --git a/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C 
b/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C
new file mode 100644
index 000..d96fe50
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options -Wreal-conversion }
+
+#include 

Re: [google] Add new warning -Wreal-conversion (issue4436068)

2011-04-29 Thread Nathan Froyd
On Fri, Apr 29, 2011 at 10:59:31AM -0400, Diego Novillo wrote:
   * g++.dg/warn/Wreal-conversion-1.C: New.
   * gcc.dg/Wreal-conversion-1.c: New.

Could a single copy of the test be placed in c-c++-common, instead?

-Nathan


Re: [google] Add new warning -Wreal-conversion (issue4436068)

2011-04-29 Thread Diego Novillo
On Fri, Apr 29, 2011 at 11:02, Nathan Froyd froy...@codesourcery.com wrote:
 On Fri, Apr 29, 2011 at 10:59:31AM -0400, Diego Novillo wrote:
       * g++.dg/warn/Wreal-conversion-1.C: New.
       * gcc.dg/Wreal-conversion-1.c: New.

 Could a single copy of the test be placed in c-c++-common, instead?

Good point.  Will fix.


Diego.


Re: [google] Add new warning -Wreal-conversion (issue4436068)

2011-04-29 Thread Diego Novillo

On 04/29/2011 11:02 AM, Nathan Froyd wrote:

On Fri, Apr 29, 2011 at 10:59:31AM -0400, Diego Novillo wrote:

* g++.dg/warn/Wreal-conversion-1.C: New.
* gcc.dg/Wreal-conversion-1.c: New.


Could a single copy of the test be placed in c-c++-common, instead?

-Nathan


Committed to google/main

2011-04-29  Diego Novillo  dnovi...@google.com

* c-c++-common/Wreal-conversion-1.c: Move from gcc.dg.
* g++.dg/warn/Wreal-conversion-1.C: Remove.

diff --git a/gcc/testsuite/c-c++-common/Wreal-conversion-1.c 
b/gcc/testsuite/c-c++-common/Wreal-conversion-1.c

new file mode 100644
index 000..84e7293
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wreal-conversion-1.c
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options -Wreal-conversion }
+
+#include stddef.h
+
+int
+func1 (int a)
+{
+  double f = a;
+  return f;// { dg-warning conversion to }
+}
+
+double func3 ();
+
+void
+func2 ()
+{
+  double g = 3.2;
+  float f;
+  int t = g;   // { dg-warning conversion to }
+  int p;
+  p = f;   // { dg-warning conversion to }
+  func1 (g);   // { dg-warning conversion to }
+  char c = f;  // { dg-warning conversion to }
+  size_t s;
+  p = s;
+  int q;
+  q = func3 ();// { dg-warning conversion to }
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C 
b/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C

deleted file mode 100644
index 2079486..000
--- a/gcc/testsuite/g++.dg/warn/Wreal-conversion-1.C
+++ /dev/null
@@ -1,30 +0,0 @@
-// { dg-do compile }
-// { dg-options -Wreal-conversion }
-
-#include stddef.h
-
-int
-func1 (int a)
-{
-  double f = a;
-  return f;// { dg-warning conversion to }
-}
-
-double func3 ();
-
-void
-func2 ()
-{
-  double g = 3.2;
-  float f;
-  int t = g;   // { dg-warning conversion to }
-  bool b = g;
-  int p;
-  p = f;   // { dg-warning conversion to }
-  func1 (g);   // { dg-warning conversion to }
-  char c = f;  // { dg-warning conversion to }
-  size_t s;
-  p = s;
-  int q;
-  q = func3 ();// { dg-warning conversion to }
-}
diff --git a/gcc/testsuite/gcc.dg/Wreal-conversion-1.c 
b/gcc/testsuite/gcc.dg/Wreal-conversion-1.c

deleted file mode 100644
index 84e7293..000
--- a/gcc/testsuite/gcc.dg/Wreal-conversion-1.c
+++ /dev/null
@@ -1,29 +0,0 @@
-// { dg-do compile }
-// { dg-options -Wreal-conversion }
-
-#include stddef.h
-
-int
-func1 (int a)
-{
-  double f = a;
-  return f;// { dg-warning conversion to }
-}
-
-double func3 ();
-
-void
-func2 ()
-{
-  double g = 3.2;
-  float f;
-  int t = g;   // { dg-warning conversion to }
-  int p;
-  p = f;   // { dg-warning conversion to }
-  func1 (g);   // { dg-warning conversion to }
-  char c = f;  // { dg-warning conversion to }
-  size_t s;
-  p = s;
-  int q;
-  q = func3 ();// { dg-warning conversion to }
-}