Make llvm::Regex non-copyable but movable.

Based on a patch by Maciej Piechotka.

llvm-svn: 198334
This commit is contained in:
David Blaikie 2014-01-02 19:04:59 +00:00
parent fd3279f27f
commit 7a2380486c
3 changed files with 33 additions and 2 deletions

View 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

View 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) {

View 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
}