On Thu, Apr 24, 2014 at 6:56 AM, Jonathan Wakely <jwakely....@gmail.com> wrote:
> Unless I'm doing something wrong the new tests you added already give
> the right results, do you have a testcase that fails with the current
> code?

This testcase fails before the patch. Sorry for that.


-- 
Regards,
Tim Shen
commit f3339263db7aad7cb78fc9232d8de7752a47e66d
Author: tim <timshe...@gmail.com>
Date:   Wed Apr 23 00:56:21 2014 -0400

    2014-04-24  Tim Shen  <timshe...@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..8243eea 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,6 @@ main()
 {
   regex re1("a++");
   regex re2("(a+)+");
+  VERIFY(regex_match_debug("aa", regex("(a)*{3}")));
   return 0;
 }

Reply via email to