PR c++/87357 - missing -Wconversion warning
authorMarek Polacek <polacek@redhat.com>
Wed, 19 Sep 2018 16:59:51 +0000 (16:59 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 19 Sep 2018 16:59:51 +0000 (16:59 +0000)
PR c++/87357 - missing -Wconversion warning
* decl.c (grok_op_properties): Remove diagnostic parts mentioning
a conversion to a reference to void.  Use
same_type_ignoring_top_level_qualifiers_p rather than comparing types
directly.

* g++.dg/warn/Wconversion5.C: New test.

From-SVN: r264425

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wconversion5.C [new file with mode: 0644]

index 7ea4b6d0f2ef3e6b25ea957eda6b33d9021a7fd2..7fcb34605c1190e32948821519976beef003e2ab 100644 (file)
@@ -1,3 +1,11 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/87357 - missing -Wconversion warning
+       * decl.c (grok_op_properties): Remove diagnostic parts mentioning
+       a conversion to a reference to void.  Use
+       same_type_ignoring_top_level_qualifiers_p rather than comparing types
+       directly.
+
 2018-09-18  Marek Polacek  <polacek@redhat.com>
 
        P1064R0 - Allowing Virtual Function Calls in Constant Expressions
index 827c172033539f7121d056b61f09a714cfd81bbe..503b433cbd1a0930c9da1bebd7b269a88d60f0bb 100644 (file)
@@ -13553,15 +13553,11 @@ grok_op_properties (tree decl, bool complain)
        t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
 
       if (VOID_TYPE_P (t))
-       warning_at (loc, OPT_Wconversion,
-                   ref
-                   ? G_("conversion to a reference to void "
-                        "will never use a type conversion operator")
-                   : G_("conversion to void "
-                        "will never use a type conversion operator"));
+       warning_at (loc, OPT_Wconversion, "conversion to void "
+                   "will never use a type conversion operator");
       else if (class_type)
        {
-         if (t == class_type)
+         if (same_type_ignoring_top_level_qualifiers_p (t, class_type))
            warning_at (loc, OPT_Wconversion,
                        ref
                        ? G_("conversion to a reference to the same type "
index c2739e8b7bbe4bcd96686a55cc0c46f813eb46ac..f52f37b6a1fa531d945302c45a70b355d8aef786 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-19  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/87357 - missing -Wconversion warning
+       * g++.dg/warn/Wconversion5.C: New test.
+
 2018-09-19  Matthew Malcomson  <matthew.malcomson@arm.com>
 
        * gcc.target/aarch64/atomic-store.c: New.
diff --git a/gcc/testsuite/g++.dg/warn/Wconversion5.C b/gcc/testsuite/g++.dg/warn/Wconversion5.C
new file mode 100644 (file)
index 0000000..00b1dda
--- /dev/null
@@ -0,0 +1,20 @@
+// 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" }
+};