[Patch] Fix a bug of consecutive range quantifiers in regex

Tim Shen timshen91@gmail.com
Thu Apr 24 03:23:00 GMT 2014


Booted and tested with -m32 and -m64.

Thanks!

-- 
Regards,
Tim Shen
-------------- next part --------------
commit 96bcfcaf910630a1daa51332ab94c75843716f29
Author: tim <timshen91@gmail.com>
Date:   Wed Apr 23 00:56:21 2014 -0400

    2014-04-24  Tim Shen  <timshen91@gmail.com>
    
    	* include/bits/regex_automaton.tcc (_StateSeq<>::_M_clone()):
    	Do _M_alt before _M_next.
    	* testsuite/28_regex/basic_regex/multiple_quantifiers.cc: Add testcases.

diff --git a/libstdc++-v3/include/bits/regex_automaton.tcc b/libstdc++-v3/include/bits/regex_automaton.tcc
index 759b053..1476ae2 100644
--- a/libstdc++-v3/include/bits/regex_automaton.tcc
+++ b/libstdc++-v3/include/bits/regex_automaton.tcc
@@ -197,20 +197,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  // _M_insert_state() never return -1
 	  auto __id = _M_nfa._M_insert_state(__dup);
 	  __m[__u] = __id;
-	  if (__u == _M_end)
-	    continue;
-	  if (__dup._M_next != _S_invalid_state_id && __m[__dup._M_next] == -1)
-	    __stack.push(__dup._M_next);
 	  if (__dup._M_opcode == _S_opcode_alternative
 	      || __dup._M_opcode == _S_opcode_subexpr_lookahead)
 	    if (__dup._M_alt != _S_invalid_state_id && __m[__dup._M_alt] == -1)
 	      __stack.push(__dup._M_alt);
+	  if (__u == _M_end)
+	    continue;
+	  if (__dup._M_next != _S_invalid_state_id && __m[__dup._M_next] == -1)
+	    __stack.push(__dup._M_next);
 	}
-      long __size = static_cast<long>(__m.size());
-      for (long __k = 0; __k < __size; __k++)
+      for (auto __v : __m)
 	{
-	  long __v;
-	  if ((__v = __m[__k]) == -1)
+	  if (__v == -1)
 	    continue;
 	  auto& __ref = _M_nfa[__v];
 	  if (__ref._M_next != _S_invalid_state_id)
diff --git a/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc b/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc
index 5670cbb..88dc102 100644
--- a/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc
+++ b/libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc
@@ -21,7 +21,10 @@
 // Tests multiple consecutive quantifiers
 
 #include <regex>
+#include <testsuite_hooks.h>
+#include <testsuite_regex.h>
 
+using namespace __gnu_test;
 using namespace std;
 
 int
@@ -29,5 +32,8 @@ main()
 {
   regex re1("a++");
   regex re2("(a+)+");
+  VERIFY(!regex_match_debug("aa", regex("(a)+{3}")));
+  VERIFY(regex_match_debug("aaa", regex("(a)+{3}")));
+  VERIFY(regex_match_debug("aaaa", regex("(a)+{3}")));
   return 0;
 }


More information about the Libstdc++ mailing list