]> granicus.if.org Git - clang/commitdiff
Add move semantics to PartialDiagnostic, which can be very expensive to copy.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 6 Dec 2012 19:09:30 +0000 (19:09 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 6 Dec 2012 19:09:30 +0000 (19:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169535 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/PartialDiagnostic.h

index 3f4626ec0a7e60a87a59f61e54f5e212070fe7ec..63363a9e93fdbc3a8cfa6141837d69957e061310 100644 (file)
@@ -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 <cassert>
 
@@ -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<StorageAllocator *>(~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();
   }