From 407a82fb22acad58be27f096748e74c83a295c40 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 6 Dec 2012 19:09:30 +0000 Subject: [PATCH] Add move semantics to PartialDiagnostic, which can be very expensive to copy. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169535 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/PartialDiagnostic.h | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/include/clang/Basic/PartialDiagnostic.h b/include/clang/Basic/PartialDiagnostic.h index 3f4626ec0a..63363a9e93 100644 --- a/include/clang/Basic/PartialDiagnostic.h +++ b/include/clang/Basic/PartialDiagnostic.h @@ -19,6 +19,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include @@ -200,6 +201,14 @@ public: } } +#if LLVM_HAS_RVALUE_REFERENCES + PartialDiagnostic(PartialDiagnostic &&Other) + : DiagID(Other.DiagID), DiagStorage(Other.DiagStorage), + Allocator(Other.Allocator) { + Other.DiagStorage = 0; + } +#endif + PartialDiagnostic(const PartialDiagnostic &Other, Storage *DiagStorage) : DiagID(Other.DiagID), DiagStorage(DiagStorage), Allocator(reinterpret_cast(~uintptr_t(0))) @@ -242,6 +251,23 @@ public: return *this; } +#if LLVM_HAS_RVALUE_REFERENCES + PartialDiagnostic &operator=(PartialDiagnostic &&Other) { + if (this != &Other) { + if (DiagStorage) + freeStorage(); + + DiagID = Other.DiagID; + DiagStorage = Other.DiagStorage; + Allocator = Other.Allocator; + + Other.DiagStorage = 0; + } + + return *this; + } +#endif + ~PartialDiagnostic() { freeStorage(); } -- 2.50.1