r243463 - Do not give a -Wredundant-move warning when removing the move will result in an
Richard Trieu
rtrieu at google.com
Tue Jul 28 12:06:16 PDT 2015
Author: rtrieu
Date: Tue Jul 28 14:06:16 2015
New Revision: 243463
URL: http://llvm.org/viewvc/llvm-project?rev=243463&view=rev
Log:
Do not give a -Wredundant-move warning when removing the move will result in an
error.
If the object being moved has a move constructor and a deleted copy constructor,
std::move is required, otherwise Clang will give a deleted constructor error.
Modified:
cfe/trunk/lib/Sema/SemaInit.cpp
cfe/trunk/test/SemaCXX/warn-redundant-move.cpp
Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=243463&r1=243462&r2=243463&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Tue Jul 28 14:06:16 2015
@@ -5983,9 +5983,19 @@ static void CheckMoveOnConstruction(Sema
if (!VD || !VD->hasLocalStorage())
return;
- if (!VD->getType()->isRecordType())
+ QualType SourceType = VD->getType();
+ if (!SourceType->isRecordType())
return;
+ if (!S.Context.hasSameUnqualifiedType(DestType, SourceType)) {
+ if (CXXRecordDecl *RD = SourceType->getAsCXXRecordDecl()) {
+ for (auto* Construct : RD->ctors()) {
+ if (Construct->isCopyConstructor() && Construct->isDeleted())
+ return;
+ }
+ }
+ }
+
// If we're returning a function parameter, copy elision
// is not possible.
if (isa<ParmVarDecl>(VD))
Modified: cfe/trunk/test/SemaCXX/warn-redundant-move.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-redundant-move.cpp?rev=243463&r1=243462&r2=243463&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-redundant-move.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-redundant-move.cpp Tue Jul 28 14:06:16 2015
@@ -1,5 +1,5 @@
// RUN: %clang_cc1 -fsyntax-only -Wredundant-move -std=c++11 -verify %s
-// RUN: %clang_cc1 -fsyntax-only -Wredundant-move -std=c++11 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -fsyntax-only -Wredundant-move -std=c++11 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
// definitions for std::move
namespace std {
@@ -102,3 +102,39 @@ D test5(D d) {
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:10-[[@LINE-3]]:20}:""
// CHECK: fix-it:"{{.*}}":{[[@LINE-4]]:21-[[@LINE-4]]:22}:""
}
+
+// No more fix-its past here.
+// CHECK-NOT: fix-it
+
+// A deleted copy constructor will prevent moves without std::move
+struct E {
+ E(E &&e);
+ E(const E &e) = delete;
+ // expected-note at -1{{deleted here}}
+};
+
+struct F {
+ F(E);
+ // expected-note at -1{{passing argument to parameter here}}
+};
+
+F test6(E e) {
+ return e;
+ // expected-error at -1{{call to deleted constructor of 'E'}}
+ return std::move(e);
+}
+
+struct G {
+ G(G &&g);
+ // expected-note at -1{{copy constructor is implicitly deleted because 'G' has a user-declared move constructor}}
+};
+
+struct H {
+ H(G);
+ // expected-note at -1{{passing argument to parameter here}}
+};
+
+H test6(G g) {
+ return g; // expected-error{{call to implicitly-deleted copy constructor of 'G'}}
+ return std::move(g);
+}
More information about the cfe-commits
mailing list