]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: reference cast, conversion fn [PR113141]
authorJason Merrill <jason@redhat.com>
Wed, 10 Apr 2024 19:12:26 +0000 (15:12 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 12 Apr 2024 19:34:29 +0000 (15:34 -0400)
commitdf7bfdb7dbf2d46aa5768a0280d4dcfcc868b7f9
tree963ecde0b9cf6971d1cd577d9aacfc03ee3305a3
parentd435571b54b02946c97b5b24f20e5a7058fd96a1
c++: reference cast, conversion fn [PR113141]

The second testcase in 113141 is a separate issue: we first decide that the
conversion is ill-formed, but then when recalculating the special c_cast_p
handling makes us think it's OK.  We don't want that, it should continue to
fall back to the reinterpret_cast interpretation.  And while we're here,
let's warn that we're not using the conversion function.

Note that the standard seems to say that in this case we should
treat (Matrix &) as const_cast<Matrix &>(static_cast<const Matrix &>(X)),
which would use the conversion operator, but that doesn't match existing
practice, so let's resolve that another day.  I've raised this issue with
CWG; at the moment I lean toward never binding a temporary in a C-style cast
to reference type, which would also be a change from existing practice.

PR c++/113141

gcc/c-family/ChangeLog:

* c.opt: Add -Wcast-user-defined.

gcc/ChangeLog:

* doc/invoke.texi: Document -Wcast-user-defined.

gcc/cp/ChangeLog:

* call.cc (reference_binding): For an invalid cast, warn and don't
recalculate.

gcc/testsuite/ChangeLog:

* g++.dg/conversion/ref12.C: New test.

Co-authored-by: Patrick Palka <ppalka@redhat.com>
gcc/c-family/c.opt
gcc/cp/call.cc
gcc/doc/invoke.texi
gcc/testsuite/g++.dg/conversion/ref12.C [new file with mode: 0644]