c++: bogus warning with value init of const pmf [PR92752]
authorPatrick Palka <ppalka@redhat.com>
Fri, 28 Jan 2022 20:41:15 +0000 (15:41 -0500)
committerPatrick Palka <ppalka@redhat.com>
Fri, 28 Jan 2022 20:41:15 +0000 (15:41 -0500)
Here we're emitting a -Wignored-qualifiers warning for an intermediate
compiler-generated cast of nullptr to 'method-type* const' as part of
value initialization of a const pmf.  This patch suppresses the warning
by instead casting to the corresponding unqualified type.

PR c++/92752

gcc/cp/ChangeLog:

* typeck.cc (build_ptrmemfunc): Cast a nullptr constant to the
unqualified pointer type not the qualified one.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wignored-qualifiers2.C: New test.

Co-authored-by: Jason Merrill <jason@redhat.com>
gcc/cp/typeck.cc
gcc/testsuite/g++.dg/warn/Wignored-qualifiers2.C [new file with mode: 0644]

index 11c9d8a..50d04c1 100644 (file)
@@ -9593,7 +9593,9 @@ build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p,
   /* Handle null pointer to member function conversions.  */
   if (null_ptr_cst_p (pfn))
     {
-      pfn = cp_build_c_cast (input_location, type, pfn, complain);
+      pfn = cp_build_c_cast (input_location,
+                            TYPE_PTRMEMFUNC_FN_TYPE_RAW (to_type),
+                            pfn, complain);
       return build_ptrmemfunc1 (to_type,
                                integer_zero_node,
                                pfn);
diff --git a/gcc/testsuite/g++.dg/warn/Wignored-qualifiers2.C b/gcc/testsuite/g++.dg/warn/Wignored-qualifiers2.C
new file mode 100644 (file)
index 0000000..c4c3754
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/92752
+// { dg-do compile }
+// { dg-additional-options "-Wignored-qualifiers" }
+
+struct X;
+
+template<class T>
+struct Wrap {
+  T data;
+  Wrap() : data() {}
+};
+
+typedef int (X::*type)();
+Wrap<const type> x;
+#if __cpp_initializer_lists
+const type t{};
+#endif