diff --git a/include/llvm/Support/Regex.h b/include/llvm/Support/Regex.h index afabaaff05e..83db80359ee 100644 --- a/include/llvm/Support/Regex.h +++ b/include/llvm/Support/Regex.h @@ -52,11 +52,7 @@ namespace llvm { std::swap(error, regex.error); return *this; } - Regex(Regex &®ex) { - preg = regex.preg; - error = regex.error; - regex.preg = nullptr; - } + Regex(Regex &®ex); ~Regex(); /// isValid - returns the error encountered during regex compilation, or diff --git a/lib/Support/Regex.cpp b/lib/Support/Regex.cpp index 35641f3b7cb..68ba79e1176 100644 --- a/lib/Support/Regex.cpp +++ b/lib/Support/Regex.cpp @@ -34,6 +34,13 @@ Regex::Regex(StringRef regex, unsigned Flags) { error = llvm_regcomp(preg, regex.data(), flags|REG_PEND); } +Regex::Regex(Regex &®ex) { + preg = regex.preg; + error = regex.error; + regex.preg = nullptr; + regex.error = REG_BADPAT; +} + Regex::~Regex() { if (preg) { llvm_regfree(preg); @@ -59,6 +66,9 @@ unsigned Regex::getNumMatches() const { } bool Regex::match(StringRef String, SmallVectorImpl *Matches){ + if (error) + return false; + unsigned nmatch = Matches ? preg->re_nsub+1 : 0; // pmatch needs to have at least one element. diff --git a/unittests/Support/RegexTest.cpp b/unittests/Support/RegexTest.cpp index 7b61a03dd9b..5e3ce39f005 100644 --- a/unittests/Support/RegexTest.cpp +++ b/unittests/Support/RegexTest.cpp @@ -151,6 +151,8 @@ TEST_F(RegexTest, MoveAssign) { Regex r2("abc"); r2 = std::move(r1); EXPECT_TRUE(r2.match("916")); + std::string Error; + EXPECT_FALSE(r1.isValid(Error)); } TEST_F(RegexTest, NoArgConstructor) { @@ -162,4 +164,11 @@ TEST_F(RegexTest, NoArgConstructor) { EXPECT_TRUE(r1.isValid(Error)); } +TEST_F(RegexTest, MatchInvalid) { + Regex r1; + std::string Error; + EXPECT_FALSE(r1.isValid(Error)); + EXPECT_FALSE(r1.match("X")); +} + }