aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-04-10 15:12:26 -0400
committerJason Merrill <jason@redhat.com>2024-04-12 15:34:29 -0400
commitdf7bfdb7dbf2d46aa5768a0280d4dcfcc868b7f9 (patch)
tree963ecde0b9cf6971d1cd577d9aacfc03ee3305a3 /gcc/cp
parentd435571b54b02946c97b5b24f20e5a7058fd96a1 (diff)
downloadgcc-df7bfdb7dbf2d46aa5768a0280d4dcfcc868b7f9.zip
gcc-df7bfdb7dbf2d46aa5768a0280d4dcfcc868b7f9.tar.gz
gcc-df7bfdb7dbf2d46aa5768a0280d4dcfcc868b7f9.tar.bz2
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>
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/call.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index 15b5647..dbdd7c2 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -2034,7 +2034,17 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags,
recalculate the second conversion sequence. */
for (conversion *t = conv; t; t = next_conversion (t))
if (t->kind == ck_user
- && DECL_CONV_FN_P (t->cand->fn))
+ && c_cast_p && !maybe_valid_p)
+ {
+ if (complain & tf_warning)
+ warning (OPT_Wcast_user_defined,
+ "casting %qT to %qT does not use %qD",
+ from, rto, t->cand->fn);
+ /* Don't let recalculation try to make this valid. */
+ break;
+ }
+ else if (t->kind == ck_user
+ && DECL_CONV_FN_P (t->cand->fn))
{
tree ftype = TREE_TYPE (TREE_TYPE (t->cand->fn));
/* A prvalue of non-class type is cv-unqualified. */