]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
Make llvm::Regex non-copyable but movable.
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 2 Jan 2014 19:04:59 +0000 (19:04 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 2 Jan 2014 19:04:59 +0000 (19:04 +0000)
Based on a patch by Maciej Piechotka.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198334 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Regex.h
lib/Support/Regex.cpp
unittests/Support/RegexTest.cpp

index 21677dcfa16c29b39586bd141c5ab27596574ea9..5f1031ef3614cd45b0772e249ca7d3ba2f293bee 100644 (file)
@@ -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 @@ namespace llvm {
 
     /// 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
index eb94745d9e36644279398c8a208d755fb85ca63c..1115534427cf0cd2977485aee65531a48d136ffa 100644 (file)
@@ -33,8 +33,10 @@ Regex::Regex(StringRef regex, unsigned Flags) {
 }
 
 Regex::~Regex() {
-  llvm_regfree(preg);
-  delete preg;
+  if (preg) {
+    llvm_regfree(preg);
+    delete preg;
+  }
 }
 
 bool Regex::isValid(std::string &Error) {
index 30ea2c5b274269d804118f54dd4feb8ed00b5964..c3a8085accde5d3ec9f89b1d2ae8802514291445 100644 (file)
@@ -140,4 +140,19 @@ TEST_F(RegexTest, IsValid) {
   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
+
 }