Make llvm::Regex non-copyable but movable.

Based on a patch by Maciej Piechotka.

llvm-svn: 198334
diff --git a/llvm/include/llvm/Support/Regex.h b/llvm/include/llvm/Support/Regex.h
index 21677dc..5f1031e 100644
--- a/llvm/include/llvm/Support/Regex.h
+++ b/llvm/include/llvm/Support/Regex.h
@@ -17,6 +17,7 @@
 #ifndef LLVM_SUPPORT_REGEX_H
 #define LLVM_SUPPORT_REGEX_H
 
+#include "llvm/Support/Compiler.h"
 #include <string>
 
 struct llvm_regex;
@@ -45,6 +46,19 @@
 
     /// Compiles the given regular expression \p Regex.
     Regex(StringRef Regex, unsigned Flags = NoFlags);
+    Regex(const Regex &) LLVM_DELETED_FUNCTION;
+    Regex &operator=(Regex regex) {
+      std::swap(preg, regex.preg);
+      std::swap(error, regex.error);
+      return *this;
+    }
+#if LLVM_HAS_RVALUE_REFERENCES
+    Regex(Regex &&regex) {
+      preg = regex.preg;
+      error = regex.error;
+      regex.preg = NULL;
+    }
+#endif
     ~Regex();
 
     /// isValid - returns the error encountered during regex compilation, or
diff --git a/llvm/lib/Support/Regex.cpp b/llvm/lib/Support/Regex.cpp
index eb94745..1115534 100644
--- a/llvm/lib/Support/Regex.cpp
+++ b/llvm/lib/Support/Regex.cpp
@@ -33,8 +33,10 @@
 }
 
 Regex::~Regex() {
-  llvm_regfree(preg);
-  delete preg;
+  if (preg) {
+    llvm_regfree(preg);
+    delete preg;
+  }
 }
 
 bool Regex::isValid(std::string &Error) {
diff --git a/llvm/unittests/Support/RegexTest.cpp b/llvm/unittests/Support/RegexTest.cpp
index 30ea2c5..c3a8085 100644
--- a/llvm/unittests/Support/RegexTest.cpp
+++ b/llvm/unittests/Support/RegexTest.cpp
@@ -140,4 +140,19 @@
   EXPECT_EQ("invalid character range", Error);
 }
 
+#if LLVM_HAS_RVALUE_REFERENCES
+TEST_F(RegexTest, MoveConstruct) {
+  Regex r1("^[0-9]+$");
+  Regex r2(std::move(r1));
+  EXPECT_TRUE(r2.match("916"));
+}
+
+TEST_F(RegexTest, MoveAssign) {
+  Regex r1("^[0-9]+$");
+  Regex r2("abc");
+  r2 = std::move(r1);
+  EXPECT_TRUE(r2.match("916"));
+}
+#endif
+
 }