summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2017-05-05 17:33:49 +0000
committerAlexander Kornienko <alexfh@google.com>2017-05-05 17:33:49 +0000
commitb48986782b1bff5d2cb810dc492a45b1d7818f9b (patch)
tree08f254d38b4f6a7c26b63329a32d0a83e4ced96d
parentf88bf5acfe787ada12e330027cd49f033ae97355 (diff)
downloadbcm5719-llvm-b48986782b1bff5d2cb810dc492a45b1d7818f9b.tar.gz
bcm5719-llvm-b48986782b1bff5d2cb810dc492a45b1d7818f9b.zip
[clang-tidy] Fix misc-move-const-arg for move-only types.
Summary: Fix misc-move-const-arg false positives on move-only types. Reviewers: sbenza Reviewed By: sbenza Subscribers: xazax.hun, cfe-commits Differential Revision: https://reviews.llvm.org/D31160 llvm-svn: 302261
-rw-r--r--clang-tools-extra/clang-tidy/misc/MoveConstantArgumentCheck.cpp6
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp13
2 files changed, 19 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/MoveConstantArgumentCheck.cpp b/clang-tools-extra/clang-tidy/misc/MoveConstantArgumentCheck.cpp
index 058ad2b8b0b..c8ef94278e3 100644
--- a/clang-tools-extra/clang-tidy/misc/MoveConstantArgumentCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/MoveConstantArgumentCheck.cpp
@@ -73,6 +73,12 @@ void MoveConstantArgumentCheck::check(const MatchFinder::MatchResult &Result) {
Arg->getType().isTriviallyCopyableType(*Result.Context);
if (IsConstArg || IsTriviallyCopyable) {
+ if (const CXXRecordDecl *R = Arg->getType()->getAsCXXRecordDecl()) {
+ for (const auto *Ctor : R->ctors()) {
+ if (Ctor->isCopyConstructor() && Ctor->isDeleted())
+ return;
+ }
+ }
bool IsVariable = isa<DeclRefExpr>(Arg);
const auto *Var =
IsVariable ? dyn_cast<DeclRefExpr>(Arg)->getDecl() : nullptr;
diff --git a/clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp b/clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp
index 2db682015c1..096f2f9725c 100644
--- a/clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp
+++ b/clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp
@@ -158,3 +158,16 @@ void moveToConstReferenceNegatives() {
// a lambda that is, in turn, an argument to a macro.
CALL([no_move_semantics] { M3(NoMoveSemantics, no_move_semantics); });
}
+
+class MoveOnly {
+public:
+ MoveOnly(const MoveOnly &other) = delete;
+ MoveOnly &operator=(const MoveOnly &other) = delete;
+ MoveOnly(MoveOnly &&other) = default;
+ MoveOnly &operator=(MoveOnly &&other) = default;
+};
+template <class T>
+void Q(T);
+void moveOnlyNegatives(MoveOnly val) {
+ Q(std::move(val));
+}
OpenPOWER on IntegriCloud