diff options
| author | Alexander Kornienko <alexfh@google.com> | 2017-05-05 17:33:49 +0000 |
|---|---|---|
| committer | Alexander Kornienko <alexfh@google.com> | 2017-05-05 17:33:49 +0000 |
| commit | b48986782b1bff5d2cb810dc492a45b1d7818f9b (patch) | |
| tree | 08f254d38b4f6a7c26b63329a32d0a83e4ced96d | |
| parent | f88bf5acfe787ada12e330027cd49f033ae97355 (diff) | |
| download | bcm5719-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.cpp | 6 | ||||
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-move-const-arg.cpp | 13 |
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)); +} |

