From 1dee803afab1afdd122f217680dbbd35826799a3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 Oct 2022 22:01:14 -0700 Subject: [PATCH] [SaveAndRestore] Upgrade this to support non-copyable types. This adds a constructor and upgrades the dtor to work with move-only types. Differential Revision: https://reviews.llvm.org/D135940 --- llvm/include/llvm/Support/SaveAndRestore.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/Support/SaveAndRestore.h b/llvm/include/llvm/Support/SaveAndRestore.h index 3c0333b..2f5dc04 100644 --- a/llvm/include/llvm/Support/SaveAndRestore.h +++ b/llvm/include/llvm/Support/SaveAndRestore.h @@ -20,11 +20,12 @@ namespace llvm { /// A utility class that uses RAII to save and restore the value of a variable. template struct SaveAndRestore { SaveAndRestore(T &X) : X(X), OldValue(X) {} - SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) { - X = NewValue; + SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) { X = NewValue; } + SaveAndRestore(T &X, T &&NewValue) : X(X), OldValue(std::move(X)) { + X = std::move(NewValue); } - ~SaveAndRestore() { X = OldValue; } - T get() { return OldValue; } + ~SaveAndRestore() { X = std::move(OldValue); } + const T &get() { return OldValue; } private: T &X; -- 2.7.4