From 1d4911bc994789169594be634ae158966fc41cfb Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Mon, 18 May 2015 19:54:08 +0000 Subject: [PATCH] Have -Wredundant-move ignore reference types. Don't give a warning when the type being moved is a reference type. Also uncomment two lines in the test case. llvm-svn: 237607 --- clang/lib/Sema/SemaInit.cpp | 3 +++ clang/test/SemaCXX/warn-redundant-move.cpp | 28 ++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 7dd93e8de589..610e0a9a0389 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -5831,6 +5831,9 @@ static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr, if (!VD || !VD->hasLocalStorage()) return; + if (!VD->getType()->isRecordType()) + return; + if (DiagID == 0) { DiagID = S.Context.hasSameUnqualifiedType(DestType, VD->getType()) ? diag::warn_pessimizing_move_on_return diff --git a/clang/test/SemaCXX/warn-redundant-move.cpp b/clang/test/SemaCXX/warn-redundant-move.cpp index 8469d4fa53da..feb9e6f408d9 100644 --- a/clang/test/SemaCXX/warn-redundant-move.cpp +++ b/clang/test/SemaCXX/warn-redundant-move.cpp @@ -17,8 +17,8 @@ struct B : public A {}; A test1(B b1) { B b2; - //return b1; - //return b2; + return b1; + return b2; return std::move(b1); // expected-warning@-1{{redundant move}} // expected-note@-2{{remove std::move call}} @@ -66,3 +66,27 @@ C test2(A a1, B b1) { // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:10-[[@LINE-3]]:20}:"" // CHECK: fix-it:"{{.*}}":{[[@LINE-4]]:22-[[@LINE-4]]:23}:"" } + +// Copy of tests above with types changed to reference types. +A test3(B& b1) { + B& b2 = b1; + return b1; + return b2; + return std::move(b1); + return std::move(b2); +} + +C test4(A& a1, B& b1) { + A& a2 = a1; + B& b2 = b1; + + return a1; + return a2; + return b1; + return b2; + + return std::move(a1); + return std::move(a2); + return std::move(b1); + return std::move(b2); +}