diff options
| author | Felix Berger <flx@google.com> | 2016-05-14 22:43:50 +0000 |
|---|---|---|
| committer | Felix Berger <flx@google.com> | 2016-05-14 22:43:50 +0000 |
| commit | 9435f5416765faf8b40552e064a7b1803fb95c1c (patch) | |
| tree | 8c3b1911424b5c0a15c9ef2d3ef3e442cede92a4 /clang-tools-extra/clang-tidy/utils | |
| parent | bf8d85a0f32686c859d2bd5e025bb19f681c97d4 (diff) | |
| download | bcm5719-llvm-9435f5416765faf8b40552e064a7b1803fb95c1c.tar.gz bcm5719-llvm-9435f5416765faf8b40552e064a7b1803fb95c1c.zip | |
[clang-tidy] TypeTraits - Type is not expensive to copy when it has a deleted copy constructor.
Reviewers: alexfh, sbenza
Subscribers: etienneb, aaron.ballman, cfe-commits
Differential Revision: http://reviews.llvm.org/D20170
llvm-svn: 269581
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils')
| -rw-r--r-- | clang-tools-extra/clang-tidy/utils/TypeTraits.cpp | 20 | ||||
| -rw-r--r-- | clang-tools-extra/clang-tidy/utils/TypeTraits.h | 3 |
2 files changed, 20 insertions, 3 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp b/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp index 15d3d095946..dfa8b67aeb2 100644 --- a/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp +++ b/clang-tools-extra/clang-tidy/utils/TypeTraits.cpp @@ -10,6 +10,7 @@ #include "TypeTraits.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclCXX.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" namespace clang { namespace tidy { @@ -17,19 +18,34 @@ namespace utils { namespace type_traits { namespace { + bool classHasTrivialCopyAndDestroy(QualType Type) { auto *Record = Type->getAsCXXRecordDecl(); return Record && Record->hasDefinition() && !Record->hasNonTrivialCopyConstructor() && !Record->hasNonTrivialDestructor(); } + +bool hasDeletedCopyConstructor(QualType Type) { + auto *Record = Type->getAsCXXRecordDecl(); + if (!Record || !Record->hasDefinition()) + return false; + for (const auto *Constructor : Record->ctors()) { + if (Constructor->isCopyConstructor() && Constructor->isDeleted()) + return true; + } + return false; +} + } // namespace -llvm::Optional<bool> isExpensiveToCopy(QualType Type, ASTContext &Context) { +llvm::Optional<bool> isExpensiveToCopy(QualType Type, + const ASTContext &Context) { if (Type->isDependentType()) return llvm::None; return !Type.isTriviallyCopyableType(Context) && - !classHasTrivialCopyAndDestroy(Type); + !classHasTrivialCopyAndDestroy(Type) && + !hasDeletedCopyConstructor(Type); } bool recordIsTriviallyDefaultConstructible(const RecordDecl &RecordDecl, diff --git a/clang-tools-extra/clang-tidy/utils/TypeTraits.h b/clang-tools-extra/clang-tidy/utils/TypeTraits.h index 4cf3ab25f86..8fde9d1a761 100644 --- a/clang-tools-extra/clang-tidy/utils/TypeTraits.h +++ b/clang-tools-extra/clang-tidy/utils/TypeTraits.h @@ -19,7 +19,8 @@ namespace utils { namespace type_traits { // \brief Returns true If \c Type is expensive to copy. -llvm::Optional<bool> isExpensiveToCopy(QualType Type, ASTContext &Context); +llvm::Optional<bool> isExpensiveToCopy(QualType Type, + const ASTContext &Context); // \brief Returns true If \c Type is trivially default constructible. bool isTriviallyDefaultConstructible(QualType Type, const ASTContext &Context); |

