+2013-10-01 Tim Shen <timshen91@gmail.com>
+
+ PR libstdc++/58576
+ * include/bits/regex_automaton.tcc (_NFA<>::_M_eliminate_dummy)
+ (_StateSeq<>::_M_clone): Add _S_opcode_subexpr_lookahead branch.
+ * testsuite/28_regex/algorithms/regex_match/ecma/char/58576.cc: New.
+
2013-09-30 Paolo Carlini <paolo.carlini@oracle.com>
* include/parallel/algo.h (__find_switch): Use __binder2nd.
while (__it._M_next >= 0 && (*this)[__it._M_next]._M_opcode
== _S_opcode_dummy)
__it._M_next = (*this)[__it._M_next]._M_next;
- if (__it._M_opcode == _S_opcode_alternative)
+ if (__it._M_opcode == _S_opcode_alternative
+ || __it._M_opcode == _S_opcode_subexpr_lookahead)
while (__it._M_alt >= 0 && (*this)[__it._M_alt]._M_opcode
== _S_opcode_dummy)
__it._M_alt = (*this)[__it._M_alt]._M_next;
continue;
if (__m.count(__dup._M_next) == 0)
__stack.push(__dup._M_next);
- if (__dup._M_opcode == _S_opcode_alternative)
+ if (__dup._M_opcode == _S_opcode_alternative
+ || __dup._M_opcode == _S_opcode_subexpr_lookahead)
if (__m.count(__dup._M_alt) == 0)
__stack.push(__dup._M_alt);
}
_GLIBCXX_DEBUG_ASSERT(__m.count(__ref._M_next));
__ref._M_next = __m[__ref._M_next];
}
- if (__ref._M_opcode == _S_opcode_alternative)
+ if (__ref._M_opcode == _S_opcode_alternative
+ || __ref._M_opcode == _S_opcode_subexpr_lookahead)
if (__ref._M_alt != -1)
{
_GLIBCXX_DEBUG_ASSERT(__m.count(__ref._M_alt));
--- /dev/null
+// { dg-options "-std=gnu++11" }
+
+//
+// 2013-10-01 Tim Shen <timshen91@gmail.com>
+//
+// Copyright (C) 2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 28.11.2 regex_match
+
+#include <regex>
+#include <testsuite_hooks.h>
+
+// libstdc++/58576
+void
+test01()
+{
+ using namespace std;
+
+ bool test __attribute__((unused)) = true;
+
+ string domain_name = "valid.hostname.org";
+ /**
+ * based on http://stackoverflow.com/questions/1418423/the-hostname-regex
+ */
+ regex fqdn_regex
+ (
+ "^"
+ "(?=.{1,255}$)"
+ "[[:alnum:]]"
+ "("
+ "(([[:alnum:]]|-)"
+ "{0,61})"
+ "[[:alnum:]]"
+ ")?"
+ "("
+ "\\."
+ "[[:alnum:]]"
+ "("
+ "(([[:alnum:]]|-)"
+ "{0,61})"
+ "[[:alnum:]]"
+ ")?"
+ ")*"
+ "\\.?"
+ "$"
+ );
+
+ smatch m;
+ const char* sol[] =
+ {
+ "valid.hostname.org",
+ "alid",
+ "ali",
+ "i",
+ ".org",
+ "rg",
+ "r",
+ "r",
+ };
+ try
+ {
+ VERIFY(regex_match( domain_name, m, fqdn_regex ));
+ VERIFY(m.size() == sizeof(sol) / sizeof(*sol));
+ for (int i = 0; i < (int)m.size(); i++) {
+ string s(m[i].first, m[i].second);
+ VERIFY(s == sol[i]);
+ }
+ }
+ catch ( const regex_error& ex )
+ {
+ if ( ex.code() == regex_constants::error_brack )
+ {
+ throw;
+ }
+ }
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}