Add -Wclass-conversion.
authorMarek Polacek <polacek@redhat.com>
Thu, 20 Sep 2018 01:56:58 +0000 (01:56 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 20 Sep 2018 01:56:58 +0000 (01:56 +0000)
* c.opt (Wclass-conversion): New.

* decl.c (grok_op_properties): Change a warning from -Wconversion to
-Wclass-conversion.  Make it print the types.

* doc/invoke.texi: Document -Wclass-conversion.

* g++.dg/conversion/op4.C: Add dg-warning.
* g++.dg/warn/Wclass-conversion1.C: New test.
* g++.dg/warn/Wclass-conversion2.C: New test.
* g++.dg/warn/Wconversion5.C: Remove file.
* g++.dg/warn/conversion-function-1.C: Use -Wno-class-converison.
* g++.old-deja/g++.bugs/900215_01.C: Adjust dg-warning.
* g++.old-deja/g++.jason/conversion5.C: Likewise.

From-SVN: r264438

14 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/conversion/op4.C
gcc/testsuite/g++.dg/warn/Wclass-conversion1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wclass-conversion2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wconversion5.C [deleted file]
gcc/testsuite/g++.dg/warn/conversion-function-1.C
gcc/testsuite/g++.old-deja/g++.bugs/900215_01.C
gcc/testsuite/g++.old-deja/g++.jason/conversion5.C

index 729fb57fe855cc56333ca252b156427250378c6b..728799d70a669dcc0205c5104b77699ae485dc4b 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       * doc/invoke.texi: Document -Wclass-conversion.
+
 2018-09-19  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (pa_adjust_priority): Delete.
index f2ec39424162a12b2ee0ce86a5071e2736936c76..8fc773cac2ed8504cd711d1615db35f235520e33 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       * c.opt (Wclass-conversion): New.
+
 2018-09-17  David Malcolm  <dmalcolm@redhat.com>
 
        * c-format.c (range_label_for_format_type_mismatch::get_text):
index 092ec940d860b35f895e07b96b3662c3cbe9ab7d..43d1d27ac00d496af6384a9b2b4cbdfdcf3933d9 100644 (file)
@@ -850,6 +850,10 @@ Wnon-template-friend
 C++ ObjC++ Var(warn_nontemplate_friend) Init(1) Warning
 Warn when non-templatized friend functions are declared within a template.
 
+Wclass-conversion
+C++ ObjC++ Var(warn_class_conversion) Init(1) Warning
+Warn when a conversion function will never be called due to the type it converts to.
+
 Wclass-memaccess
 C++ ObjC++ Var(warn_class_memaccess) Warning LangEnabledBy(C++ ObjC++, Wall)
 Warn for unsafe raw memory writes to objects of class types.
index 546943c9a0eb5380ac9d71cbd629bc157816550e..75286d53fdba361d43849aaf643e7409b1f78958 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       Add -Wclass-conversion.
+       * decl.c (grok_op_properties): Change a warning from -Wconversion to
+       -Wclass-conversion.  Make it print the types.
+
 2018-09-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/87324
index 503b433cbd1a0930c9da1bebd7b269a88d60f0bb..2d9d56ef6e1090dd043959bb66f1cb2efb3696f6 100644 (file)
@@ -13544,7 +13544,7 @@ grok_op_properties (tree decl, bool complain)
   /* Warn about conversion operators that will never be used.  */
   if (IDENTIFIER_CONV_OP_P (name)
       && ! DECL_TEMPLATE_INFO (decl)
-      && warn_conversion)
+      && warn_class_conversion)
     {
       tree t = TREE_TYPE (name);
       int ref = TYPE_REF_P (t);
@@ -13553,27 +13553,29 @@ grok_op_properties (tree decl, bool complain)
        t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
 
       if (VOID_TYPE_P (t))
-       warning_at (loc, OPT_Wconversion, "conversion to void "
-                   "will never use a type conversion operator");
+       warning_at (loc, OPT_Wclass_conversion, "converting %qT to %<void%> "
+                   "will never use a type conversion operator", class_type);
       else if (class_type)
        {
          if (same_type_ignoring_top_level_qualifiers_p (t, class_type))
-           warning_at (loc, OPT_Wconversion,
+           warning_at (loc, OPT_Wclass_conversion,
                        ref
-                       ? G_("conversion to a reference to the same type "
+                       ? G_("converting %qT to a reference to the same type "
                             "will never use a type conversion operator")
-                       : G_("conversion to the same type "
-                            "will never use a type conversion operator"));
+                       : G_("converting %qT to the same type "
+                            "will never use a type conversion operator"),
+                       class_type);
          /* Don't force t to be complete here.  */
          else if (MAYBE_CLASS_TYPE_P (t)
                   && COMPLETE_TYPE_P (t)
                   && DERIVED_FROM_P (t, class_type))
-           warning_at (loc, OPT_Wconversion,
+           warning_at (loc, OPT_Wclass_conversion,
                        ref
-                       ? G_("conversion to a reference to a base class "
-                            "will never use a type conversion operator")
-                       : G_("conversion to a base class "
-                            "will never use a type conversion operator"));
+                       ? G_("converting %qT to a reference to a base class "
+                            "%qT will never use a type conversion operator")
+                       : G_("converting %qT to a base class %qT "
+                            "will never use a type conversion operator"),
+                       class_type, t);
        }
     }
 
index 685c211e176d13809078cf0fd595d49763adef25..aab5fcec35ae98daa5bffdddb8842ad41549fe96 100644 (file)
@@ -237,6 +237,7 @@ in the following sections.
 -Weffc++  -Wstrict-null-sentinel  -Wtemplates @gol
 -Wno-non-template-friend  -Wold-style-cast @gol
 -Woverloaded-virtual  -Wno-pmf-conversions @gol
+-Wno-class-conversion  -Wno-terminate @gol
 -Wsign-promo  -Wvirtual-inheritance}
 
 @item Objective-C and Objective-C++ Language Options
@@ -3367,6 +3368,13 @@ use the STL.  One may also use using directives and qualified names.
 @opindex Wno-terminate
 Disable the warning about a throw-expression that will immediately
 result in a call to @code{terminate}.
+
+@item -Wno-class-conversion @r{(C++ and Objective-C++ only)}
+@opindex Wno-class-conversion
+@opindex Wclass-conversion
+Disable the warning about the case when a conversion function converts an
+object to the same type, to a base class of that type, or to void; such
+a conversion function will never be called.
 @end table
 
 @node Objective-C and Objective-C++ Dialect Options
index f3b55d157f8052b910c6e00795413b05fb65e29a..25f61d2f7f162ec0da3c6c39ac8a6fa73d1493f7 100644 (file)
@@ -1,3 +1,13 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       * g++.dg/conversion/op4.C: Add dg-warning.
+       * g++.dg/warn/Wclass-conversion1.C: New test.
+       * g++.dg/warn/Wclass-conversion2.C: New test.
+       * g++.dg/warn/Wconversion5.C: Remove file.
+       * g++.dg/warn/conversion-function-1.C: Use -Wno-class-converison.
+       * g++.old-deja/g++.bugs/900215_01.C: Adjust dg-warning.
+       * g++.old-deja/g++.jason/conversion5.C: Likewise.
+
 2018-09-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/87324
index cb99a380b43215dd1e9a9489a5699b831673c755..3fb850cb8256bb0436a28c63c4f3f7f14b8dd13e 100644 (file)
@@ -4,7 +4,7 @@
 struct X {
   int x;
   X (int i = 0) : x (i) {}
-  operator X& (void) const {
+  operator X& (void) const { // { dg-warning "will never use" }
     return *(new X);
   }
 };
diff --git a/gcc/testsuite/g++.dg/warn/Wclass-conversion1.C b/gcc/testsuite/g++.dg/warn/Wclass-conversion1.C
new file mode 100644 (file)
index 0000000..2599a53
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/87357
+// { dg-do compile }
+
+struct B { };
+
+struct X : public B {
+  operator X(); // { dg-warning "3:converting .X. to the same type will never use a type conversion operator" }
+  operator X&(); // { dg-warning "3:converting .X. to a reference to the same type will never use a type conversion operator" }
+  operator X() const; // { dg-warning "3:converting .X. to the same type will never use a type conversion operator" }
+  operator const X(); // { dg-warning "3:converting .X. to the same type will never use a type conversion operator" }
+
+  operator B(); // { dg-warning "3:converting .X. to a base class .B. will never use a type conversion operator" }
+  operator B&(); // { dg-warning "3:converting .X. to a reference to a base class .B. will never use a type conversion operator" }
+  operator B() const; // { dg-warning "3:converting .X. to a base class .B. will never use a type conversion operator" }
+  operator const B(); // { dg-warning "3:converting .X. to a base class .const B. will never use a type conversion operator" }
+
+  operator void(); // { dg-warning "3:converting .X. to .void. will never use a type conversion operator" }
+  operator void() const; // { dg-warning "3:converting .X. to .void. will never use a type conversion operator" }
+};
diff --git a/gcc/testsuite/g++.dg/warn/Wclass-conversion2.C b/gcc/testsuite/g++.dg/warn/Wclass-conversion2.C
new file mode 100644 (file)
index 0000000..b6919f0
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/87357
+// { dg-do compile }
+// { dg-options "-Wno-class-conversion" }
+
+struct B { };
+
+struct X : public B {
+  operator X(); // { dg-bogus "3:converting .X. to the same type will never use a type conversion operator" }
+  operator X&(); // { dg-bogus "3:converting .X. to a reference to the same type will never use a type conversion operator" }
+  operator X() const; // { dg-bogus "3:converting .X. to the same type will never use a type conversion operator" }
+  operator const X(); // { dg-bogus "3:converting .X. to the same type will never use a type conversion operator" }
+
+  operator B(); // { dg-bogus "3:converting .X. to a base class .B. will never use a type conversion operator" }
+  operator B&(); // { dg-bogus "3:converting .X. to a reference to a base class .B. will never use a type conversion operator" }
+  operator B() const; // { dg-bogus "3:converting .X. to a base class .B. will never use a type conversion operator" }
+  operator const B(); // { dg-bogus "3:converting .X. to a base class .const B. will never use a type conversion operator" }
+
+  operator void(); // { dg-bogus "3:converting .X. to .void. will never use a type conversion operator" }
+  operator void() const; // { dg-bogus "3:converting .X. to .void. will never use a type conversion operator" }
+};
diff --git a/gcc/testsuite/g++.dg/warn/Wconversion5.C b/gcc/testsuite/g++.dg/warn/Wconversion5.C
deleted file mode 100644 (file)
index 00b1dda..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// PR c++/87357
-// { dg-do compile }
-// { dg-options "-Wconversion" }
-
-struct B { };
-
-struct X : public B {
-  operator X(); // { dg-warning "3:conversion to the same type will never use a type conversion operator" }
-  operator X&(); // { dg-warning "3:conversion to a reference to the same type will never use a type conversion operator" }
-  operator X() const; // { dg-warning "3:conversion to the same type will never use a type conversion operator" }
-  operator const X(); // { dg-warning "3:conversion to the same type will never use a type conversion operator" }
-
-  operator B(); // { dg-warning "3:conversion to a base class will never use a type conversion operator" }
-  operator B&(); // { dg-warning "3:conversion to a reference to a base class will never use a type conversion operator" }
-  operator B() const; // { dg-warning "3:conversion to a base class will never use a type conversion operator" }
-  operator const B(); // { dg-warning "3:conversion to a base class will never use a type conversion operator" }
-
-  operator void(); // { dg-warning "3:conversion to void will never use a type conversion operator" }
-  operator void() const; // { dg-warning "3:conversion to void will never use a type conversion operator" }
-};
index 878011cf328f9b352193909d010bbe419803164b..890719b347705dc4d92853f0e77069437b6d5a8e 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (C) 2003 Free Software Foundation
 // Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
-// { dg-options "-Wno-conversion" }
+// { dg-options "-Wno-class-conversion" }
 
 struct A {
    operator A&();
index 0cd9b321e3e7d64d8fc04fc537a549d36b8cd292..fd075685cec5ceae47b78401c329eb140f8658db 100644 (file)
@@ -24,7 +24,7 @@
 
 struct struct0 {
 
-  operator void ();  // { dg-warning "3:conversion to void will never use a type conversion operator" }
+  operator void ();  // { dg-warning "3:converting .struct0. to .void. will never use a type conversion operator" }
 };
 
 int exit_status = 1;
index a9531a6d20916fec5e020cf849512d8b426dffef..7f04de48378a4b399f1c39701bf5eec856b4ee85 100644 (file)
@@ -3,7 +3,7 @@
 struct A { };
 struct B: public A {
   A a;
-  operator A () { return a; }  // { dg-warning "3:conversion to a base class will never use a type conversion operator" }
+  operator A () { return a; }  // { dg-warning "3:converting .B. to a base class .A. will never use a type conversion operator" }
 };
 void f (const A&);
 void g()