c++: bogus warning with value init of const pmf [PR92752]

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>
This commit is contained in:
Patrick Palka 2022-01-28 15:41:15 -05:00
parent 3a5fdf986d
commit e971990cbd
2 changed files with 20 additions and 1 deletions

View 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);

View file

@ -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