public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-9501] c++: Silence -Wuseless-cast warnings during move [PR103480]
@ 2022-01-24 9:21 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-01-24 9:21 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:cb4998fcdf2ad92fc6323fc4d9bc03299ca8a541
commit r11-9501-gcb4998fcdf2ad92fc6323fc4d9bc03299ca8a541
Author: Jakub Jelinek <jakub@redhat.com>
Date: Wed Jan 12 09:47:46 2022 +0100
c++: Silence -Wuseless-cast warnings during move [PR103480]
This is maybe just a shot in the dark, but IMHO we shouldn't be diagnosing
-Wuseless-cast on casts the compiler adds on its own when calling its move
function. We don't seem to warn when user calls std::move either.
We call move on elinit (*NON_LVALUE_EXPR <(struct C[2] &&) &D.2497->b>)[0]
so it is already an xvalue_p and try to static_cast it to struct C &&.
But we don't warn e.g. on std::move (std::move (whatever)).
Fixed by not doing the static cast and just returning expr from move
if expr is already an xvalue.
2022-01-11 Jakub Jelinek <jakub@redhat.com>
Jason Merrill <jason@redhat.com>
PR c++/103480
* tree.c (move): If expr is xvalue_p, just return expr without
build_static_cast.
* g++.dg/warn/Wuseless-cast2.C: New test.
(cherry picked from commit 6bba184ccbf47368eaea27ee2c1e7b850526640b)
Diff:
---
gcc/cp/tree.c | 2 ++
gcc/testsuite/g++.dg/warn/Wuseless-cast2.C | 24 ++++++++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 5c445b51e3f..306f61f719e 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1275,6 +1275,8 @@ move (tree expr)
{
tree type = TREE_TYPE (expr);
gcc_assert (!TYPE_REF_P (type));
+ if (xvalue_p (expr))
+ return expr;
type = cp_build_reference_type (type, /*rval*/true);
return build_static_cast (input_location, type, expr,
tf_warning_or_error);
diff --git a/gcc/testsuite/g++.dg/warn/Wuseless-cast2.C b/gcc/testsuite/g++.dg/warn/Wuseless-cast2.C
new file mode 100644
index 00000000000..22e403973e7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wuseless-cast2.C
@@ -0,0 +1,24 @@
+// PR c++/103480
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wuseless-cast" }
+
+template <typename T, int N>
+struct A { typedef T t[N]; };
+template <typename T, int N>
+struct B { typename A<T, N>::t b; };
+struct C {
+ constexpr C (C &&) {}
+ template <int N>
+ static auto bar ()
+ {
+ B<C, N> r;
+ return r; // { dg-bogus "useless cast to type" }
+ }
+ C () = default;
+};
+
+void
+foo ()
+{
+ C::bar<2> ();
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-01-24 9:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-24 9:21 [gcc r11-9501] c++: Silence -Wuseless-cast warnings during move [PR103480] Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).