[llvm] r198334 - Make llvm::Regex non-copyable but movable.
David Blaikie
dblaikie at gmail.com
Thu Jan 2 11:05:00 PST 2014
Author: dblaikie
Date: Thu Jan 2 13:04:59 2014
New Revision: 198334
URL: http://llvm.org/viewvc/llvm-project?rev=198334&view=rev
Log:
Make llvm::Regex non-copyable but movable.
Based on a patch by Maciej Piechotka.
Modified:
llvm/trunk/include/llvm/Support/Regex.h
llvm/trunk/lib/Support/Regex.cpp
llvm/trunk/unittests/Support/RegexTest.cpp
Modified: llvm/trunk/include/llvm/Support/Regex.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Regex.h?rev=198334&r1=198333&r2=198334&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Regex.h (original)
+++ llvm/trunk/include/llvm/Support/Regex.h Thu Jan 2 13:04:59 2014
@@ -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 &®ex) {
+ preg = regex.preg;
+ error = regex.error;
+ regex.preg = NULL;
+ }
+#endif
~Regex();
/// isValid - returns the error encountered during regex compilation, or
Modified: llvm/trunk/lib/Support/Regex.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Regex.cpp?rev=198334&r1=198333&r2=198334&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Regex.cpp (original)
+++ llvm/trunk/lib/Support/Regex.cpp Thu Jan 2 13:04:59 2014
@@ -33,8 +33,10 @@ Regex::Regex(StringRef regex, unsigned F
}
Regex::~Regex() {
- llvm_regfree(preg);
- delete preg;
+ if (preg) {
+ llvm_regfree(preg);
+ delete preg;
+ }
}
bool Regex::isValid(std::string &Error) {
Modified: llvm/trunk/unittests/Support/RegexTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/RegexTest.cpp?rev=198334&r1=198333&r2=198334&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/RegexTest.cpp (original)
+++ llvm/trunk/unittests/Support/RegexTest.cpp Thu Jan 2 13:04:59 2014
@@ -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
+
}
More information about the llvm-commits
mailing list