aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-01-12 09:47:46 +0100
committerJakub Jelinek <jakub@redhat.com>2022-01-12 09:47:46 +0100
commit6bba184ccbf47368eaea27ee2c1e7b850526640b (patch)
tree8fea1eaac85031e99470e88c42030a756b1ff7ed /gcc
parent7c3b9c17363bf30fcab9814252b9d5860711a10b (diff)
downloadgcc-6bba184ccbf47368eaea27ee2c1e7b850526640b.zip
gcc-6bba184ccbf47368eaea27ee2c1e7b850526640b.tar.gz
gcc-6bba184ccbf47368eaea27ee2c1e7b850526640b.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/testsuite/g++.dg/warn/Wuseless-cast2.C24
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index d0c6490..7f7de86 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1304,6 +1304,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 0000000..22e4039
--- /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> ();
+}