public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, libstdc++/63775] Fix regex bracket expression parsing
@ 2014-11-09 18:17 Tim Shen
  2014-11-10 18:34 ` Jonathan Wakely
  0 siblings, 1 reply; 6+ messages in thread
From: Tim Shen @ 2014-11-09 18:17 UTC (permalink / raw)
  To: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 58 bytes --]

Bootstrapped and tested.

Thanks!


-- 
Regards,
Tim Shen

[-- Attachment #2: a.diff --]
[-- Type: text/plain, Size: 11477 bytes --]

commit 1cb5f4e018e52d94e4902bd2424b8d5e75d917c2
Author: timshen <timshen@google.com>
Date:   Sat Nov 8 18:19:56 2014 -0800

    	PR libstdc++/63775
    	* include/bits/regex_compiler.h (_Compiler<>::_M_expression_term,
    	_BracketMatcher<>::_M_make_range): Throw regex_erorr on invalid range
    	like [z-a]. Change _M_expression_term interface.
    	* include/bits/regex_compiler.tcc (
    	_Compiler<>::_M_insert_bracket_matcher,
    	_Compiler<>::_M_expression_term): Rewrite bracket expression parsing.
    	* testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc:
    	Add testcases and move file out of extended.

diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h
index 1bbc09d..d8880cc 100644
--- a/libstdc++-v3/include/bits/regex_compiler.h
+++ b/libstdc++-v3/include/bits/regex_compiler.h
@@ -118,7 +118,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       template<bool __icase, bool __collate>
 	void
-	_M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>&
+	_M_expression_term(pair<bool, _CharT>& __last_char,
+			   _BracketMatcher<_TraitsT, __icase, __collate>&
 			   __matcher);
 
       int
@@ -390,6 +391,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       void
       _M_make_range(_CharT __l, _CharT __r)
       {
+	if (__l > __r)
+	  __throw_regex_error(regex_constants::error_range);
 	_M_range_set.push_back(make_pair(_M_translator._M_transform(__l),
 					 _M_translator._M_transform(__r)));
 #ifdef _GLIBCXX_DEBUG
diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc
index 349d92a..b9da491 100644
--- a/libstdc++-v3/include/bits/regex_compiler.tcc
+++ b/libstdc++-v3/include/bits/regex_compiler.tcc
@@ -415,8 +415,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     _M_insert_bracket_matcher(bool __neg)
     {
       _BracketMatcher<_TraitsT, __icase, __collate> __matcher(__neg, _M_traits);
+      pair<bool, _CharT> __last_char; // Optional<_CharT>
+      __last_char.first = false;
+      if (!(_M_flags & regex_constants::ECMAScript))
+	if (_M_try_char())
+	  {
+	    __matcher._M_add_char(_M_value[0]);
+	    __last_char.first = true;
+	    __last_char.second = _M_value[0];
+	  }
       while (!_M_match_token(_ScannerT::_S_token_bracket_end))
-	_M_expression_term(__matcher);
+	_M_expression_term(__last_char, __matcher);
       __matcher._M_ready();
       _M_stack.push(_StateSeqT(
 		      *_M_nfa,
@@ -427,7 +436,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<bool __icase, bool __collate>
     void
     _Compiler<_TraitsT>::
-    _M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>& __matcher)
+    _M_expression_term(pair<bool, _CharT>& __last_char,
+		       _BracketMatcher<_TraitsT, __icase, __collate>& __matcher)
     {
       if (_M_match_token(_ScannerT::_S_token_collsymbol))
 	__matcher._M_add_collating_element(_M_value);
@@ -435,27 +445,50 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	__matcher._M_add_equivalence_class(_M_value);
       else if (_M_match_token(_ScannerT::_S_token_char_class_name))
 	__matcher._M_add_character_class(_M_value, false);
-      else if (_M_try_char()) // [a
+      // POSIX doesn't permit '-' as a start-range char (say [a-z--0]),
+      // except that the '-' is the first character in the bracket expression
+      // ([--0]). ECMAScript treats all '-' after a range as a normal character.
+      // Also see above, where _M_expression_term gets called.
+      //
+      // As a result, POSIX rejects [-----], but ECMAScript doesn't.
+      // Boost (1.57.0) always uses POSIX style even in its ECMAScript syntax.
+      // Clang (3.5) always uses ECMAScript style even in its POSIX syntax.
+      //
+      // It turns out that no one reads BNFs ;)
+      else if (_M_try_char())
 	{
-	  auto __ch = _M_value[0];
-	  if (_M_try_char())
+	  if (!__last_char.first)
+	    {
+	      if (_M_value[0] == '-'
+		  && !(_M_flags & regex_constants::ECMAScript))
+		__throw_regex_error(regex_constants::error_range);
+	      __matcher._M_add_char(_M_value[0]);
+	      __last_char.first = true;
+	      __last_char.second = _M_value[0];
+	    }
+	  else
 	    {
-	      if (_M_value[0] == '-') // [a-
+	      if (_M_value[0] == '-')
 		{
-		  if (_M_try_char()) // [a-z]
+		  if (_M_try_char())
 		    {
-		      __matcher._M_make_range(__ch, _M_value[0]);
-		      return;
+		      __matcher._M_make_range(__last_char.second , _M_value[0]);
+		      __last_char.first = false;
+		    }
+		  else
+		    {
+		      if (_M_scanner._M_get_token()
+			  != _ScannerT::_S_token_bracket_end)
+			__throw_regex_error(regex_constants::error_range);
+		      __matcher._M_add_char(_M_value[0]);
 		    }
-		  // If the dash is the last character in the bracket
-		  // expression, it is not special.
-		  if (_M_scanner._M_get_token()
-		      != _ScannerT::_S_token_bracket_end)
-		    __throw_regex_error(regex_constants::error_range);
 		}
-	      __matcher._M_add_char(_M_value[0]);
+	      else
+		{
+		  __matcher._M_add_char(_M_value[0]);
+		  __last_char.second = _M_value[0];
+		}
 	    }
-	  __matcher._M_add_char(__ch);
 	}
       else if (_M_match_token(_ScannerT::_S_token_quoted_class))
 	__matcher._M_add_character_class(_M_value,
diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc
new file mode 100644
index 0000000..88dc83c
--- /dev/null
+++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc
@@ -0,0 +1,124 @@
+// { dg-options "-std=gnu++11" }
+
+//
+// 2013-08-01  Tim Shen <timshen91@gmail.com>
+//
+// Copyright (C) 2013-2014 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
+// Tests Extended bracket expression against a C-string.
+
+#include <regex>
+#include <testsuite_hooks.h>
+#include <testsuite_regex.h>
+
+using namespace __gnu_test;
+using namespace std;
+
+void
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  {
+    std::regex  re("pre/[za-x]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/z", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( !regex_match_debug("pre/y", re) );
+  }
+  {
+    std::regex  re("pre/[[:uPPer:]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/Z", re) );
+    VERIFY( !regex_match_debug("pre/_", re) );
+    VERIFY( !regex_match_debug("pre/a", re) );
+    VERIFY( !regex_match_debug("pre/0", re) );
+  }
+  {
+    std::regex  re("pre/[[:lOWer:]]", std::regex::extended | std::regex::icase);
+    VERIFY( regex_match_debug("pre/Z", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+  }
+  {
+    std::regex  re("pre/[[:w:][.tilde.]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/~", re) );
+    VERIFY( regex_match_debug("pre/_", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( regex_match_debug("pre/0", re) );
+  }
+  {
+    std::regex  re("pre/[[=a=]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( regex_match_debug("pre/A", re) );
+  }
+}
+
+void
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  try
+  {
+    std::regex re("[-----]", std::regex::extended);
+  }
+  catch (const std::regex_error& e)
+  {
+    VERIFY(e.code() == std::regex_constants::error_range);
+  }
+  std::regex re("[-----]", std::regex::ECMAScript);
+}
+
+void
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  try
+  {
+    std::regex re("[z-a]", std::regex::extended);
+  }
+  catch (const std::regex_error& e)
+  {
+    VERIFY(e.code() == std::regex_constants::error_range);
+  }
+}
+
+void
+test04()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::regex re("[-0-9a-z]");
+  VERIFY(regex_match_debug("-", re));
+  VERIFY(regex_match_debug("1", re));
+  VERIFY(regex_match_debug("w", re));
+  re.assign("[-0-9a-z]", regex_constants::basic);
+  VERIFY(regex_match_debug("-", re));
+  VERIFY(regex_match_debug("1", re));
+  VERIFY(regex_match_debug("w", re));
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc
deleted file mode 100644
index ca2a5f5..0000000
--- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// { dg-options "-std=gnu++11" }
-
-//
-// 2013-08-01  Tim Shen <timshen91@gmail.com>
-//
-// Copyright (C) 2013-2014 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
-// Tests Extended bracket expression against a C-string.
-
-#include <regex>
-#include <testsuite_hooks.h>
-#include <testsuite_regex.h>
-
-using namespace __gnu_test;
-using namespace std;
-
-void
-test01()
-{
-  bool test __attribute__((unused)) = true;
-
-  {
-    std::regex  re("pre/[za-x]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/z", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( !regex_match_debug("pre/y", re) );
-  }
-  {
-    std::regex  re("pre/[[:uPPer:]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/Z", re) );
-    VERIFY( !regex_match_debug("pre/_", re) );
-    VERIFY( !regex_match_debug("pre/a", re) );
-    VERIFY( !regex_match_debug("pre/0", re) );
-  }
-  {
-    std::regex  re("pre/[[:lOWer:]]", std::regex::extended | std::regex::icase);
-    VERIFY( regex_match_debug("pre/Z", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-  }
-  {
-    std::regex  re("pre/[[:w:][.tilde.]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/~", re) );
-    VERIFY( regex_match_debug("pre/_", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( regex_match_debug("pre/0", re) );
-  }
-  {
-    std::regex  re("pre/[[=a=]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( regex_match_debug("pre/A", re) );
-  }
-}
-
-int
-main()
-{
-  test01();
-  return 0;
-}

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch, libstdc++/63775] Fix regex bracket expression parsing
  2014-11-09 18:17 [Patch, libstdc++/63775] Fix regex bracket expression parsing Tim Shen
@ 2014-11-10 18:34 ` Jonathan Wakely
  2014-11-13  7:49   ` Tim Shen
  0 siblings, 1 reply; 6+ messages in thread
From: Jonathan Wakely @ 2014-11-10 18:34 UTC (permalink / raw)
  To: Tim Shen; +Cc: libstdc++, gcc-patches

On 09/11/14 10:17 -0800, Tim Shen wrote:
> 	__matcher._M_add_equivalence_class(_M_value);
>       else if (_M_match_token(_ScannerT::_S_token_char_class_name))
> 	__matcher._M_add_character_class(_M_value, false);
>-      else if (_M_try_char()) // [a
>+      // POSIX doesn't permit '-' as a start-range char (say [a-z--0]),
>+      // except that the '-' is the first character in the bracket expression

Should be "except when" in this comment

>+      // ([--0]). ECMAScript treats all '-' after a range as a normal character.
>+      // Also see above, where _M_expression_term gets called.
>+      //
>+      // As a result, POSIX rejects [-----], but ECMAScript doesn't.
>+      // Boost (1.57.0) always uses POSIX style even in its ECMAScript syntax.
>+      // Clang (3.5) always uses ECMAScript style even in its POSIX syntax.
>+      //
>+      // It turns out that no one reads BNFs ;)

Ha :-)

OK for trunk with the small change above - thanks!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch, libstdc++/63775] Fix regex bracket expression parsing
  2014-11-10 18:34 ` Jonathan Wakely
@ 2014-11-13  7:49   ` Tim Shen
  2014-11-25  9:24     ` Tim Shen
  0 siblings, 1 reply; 6+ messages in thread
From: Tim Shen @ 2014-11-13  7:49 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 272 bytes --]

On Mon, Nov 10, 2014 at 10:32 AM, Jonathan Wakely <jwakely@redhat.com> wrote:
> OK for trunk with the small change above - thanks!

Committed with comment fix and slight change on testcase
(VERIFY(false) at end of the try block ------ must throw).


-- 
Regards,
Tim Shen

[-- Attachment #2: a.diff --]
[-- Type: text/plain, Size: 11517 bytes --]

commit 63544c468fa784a354def7bc240b2cd93210f6d8
Author: timshen <timshen@google.com>
Date:   Sat Nov 8 18:19:56 2014 -0800

    	PR libstdc++/63775
    	* include/bits/regex_compiler.h (_Compiler<>::_M_expression_term,
    	_BracketMatcher<>::_M_make_range): Throw regex_erorr on invalid range
    	like [z-a]. Change _M_expression_term interface.
    	* include/bits/regex_compiler.tcc (
    	_Compiler<>::_M_insert_bracket_matcher,
    	_Compiler<>::_M_expression_term): Rewrite bracket expression parsing.
    	* testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc:
    	Add testcases and move file out of extended.

diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h
index 1bbc09d..d8880cc 100644
--- a/libstdc++-v3/include/bits/regex_compiler.h
+++ b/libstdc++-v3/include/bits/regex_compiler.h
@@ -118,7 +118,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       template<bool __icase, bool __collate>
 	void
-	_M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>&
+	_M_expression_term(pair<bool, _CharT>& __last_char,
+			   _BracketMatcher<_TraitsT, __icase, __collate>&
 			   __matcher);
 
       int
@@ -390,6 +391,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       void
       _M_make_range(_CharT __l, _CharT __r)
       {
+	if (__l > __r)
+	  __throw_regex_error(regex_constants::error_range);
 	_M_range_set.push_back(make_pair(_M_translator._M_transform(__l),
 					 _M_translator._M_transform(__r)));
 #ifdef _GLIBCXX_DEBUG
diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc
index 349d92a..f959884 100644
--- a/libstdc++-v3/include/bits/regex_compiler.tcc
+++ b/libstdc++-v3/include/bits/regex_compiler.tcc
@@ -415,8 +415,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     _M_insert_bracket_matcher(bool __neg)
     {
       _BracketMatcher<_TraitsT, __icase, __collate> __matcher(__neg, _M_traits);
+      pair<bool, _CharT> __last_char; // Optional<_CharT>
+      __last_char.first = false;
+      if (!(_M_flags & regex_constants::ECMAScript))
+	if (_M_try_char())
+	  {
+	    __matcher._M_add_char(_M_value[0]);
+	    __last_char.first = true;
+	    __last_char.second = _M_value[0];
+	  }
       while (!_M_match_token(_ScannerT::_S_token_bracket_end))
-	_M_expression_term(__matcher);
+	_M_expression_term(__last_char, __matcher);
       __matcher._M_ready();
       _M_stack.push(_StateSeqT(
 		      *_M_nfa,
@@ -427,7 +436,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<bool __icase, bool __collate>
     void
     _Compiler<_TraitsT>::
-    _M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>& __matcher)
+    _M_expression_term(pair<bool, _CharT>& __last_char,
+		       _BracketMatcher<_TraitsT, __icase, __collate>& __matcher)
     {
       if (_M_match_token(_ScannerT::_S_token_collsymbol))
 	__matcher._M_add_collating_element(_M_value);
@@ -435,27 +445,50 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	__matcher._M_add_equivalence_class(_M_value);
       else if (_M_match_token(_ScannerT::_S_token_char_class_name))
 	__matcher._M_add_character_class(_M_value, false);
-      else if (_M_try_char()) // [a
+      // POSIX doesn't permit '-' as a start-range char (say [a-z--0]),
+      // except when the '-' is the first character in the bracket expression
+      // ([--0]). ECMAScript treats all '-' after a range as a normal character.
+      // Also see above, where _M_expression_term gets called.
+      //
+      // As a result, POSIX rejects [-----], but ECMAScript doesn't.
+      // Boost (1.57.0) always uses POSIX style even in its ECMAScript syntax.
+      // Clang (3.5) always uses ECMAScript style even in its POSIX syntax.
+      //
+      // It turns out that no one reads BNFs ;)
+      else if (_M_try_char())
 	{
-	  auto __ch = _M_value[0];
-	  if (_M_try_char())
+	  if (!__last_char.first)
+	    {
+	      if (_M_value[0] == '-'
+		  && !(_M_flags & regex_constants::ECMAScript))
+		__throw_regex_error(regex_constants::error_range);
+	      __matcher._M_add_char(_M_value[0]);
+	      __last_char.first = true;
+	      __last_char.second = _M_value[0];
+	    }
+	  else
 	    {
-	      if (_M_value[0] == '-') // [a-
+	      if (_M_value[0] == '-')
 		{
-		  if (_M_try_char()) // [a-z]
+		  if (_M_try_char())
 		    {
-		      __matcher._M_make_range(__ch, _M_value[0]);
-		      return;
+		      __matcher._M_make_range(__last_char.second , _M_value[0]);
+		      __last_char.first = false;
+		    }
+		  else
+		    {
+		      if (_M_scanner._M_get_token()
+			  != _ScannerT::_S_token_bracket_end)
+			__throw_regex_error(regex_constants::error_range);
+		      __matcher._M_add_char(_M_value[0]);
 		    }
-		  // If the dash is the last character in the bracket
-		  // expression, it is not special.
-		  if (_M_scanner._M_get_token()
-		      != _ScannerT::_S_token_bracket_end)
-		    __throw_regex_error(regex_constants::error_range);
 		}
-	      __matcher._M_add_char(_M_value[0]);
+	      else
+		{
+		  __matcher._M_add_char(_M_value[0]);
+		  __last_char.second = _M_value[0];
+		}
 	    }
-	  __matcher._M_add_char(__ch);
 	}
       else if (_M_match_token(_ScannerT::_S_token_quoted_class))
 	__matcher._M_add_character_class(_M_value,
diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc
new file mode 100644
index 0000000..e5cffc7
--- /dev/null
+++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc
@@ -0,0 +1,126 @@
+// { dg-options "-std=gnu++11" }
+
+//
+// 2013-08-01  Tim Shen <timshen91@gmail.com>
+//
+// Copyright (C) 2013-2014 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
+// Tests Extended bracket expression against a C-string.
+
+#include <regex>
+#include <testsuite_hooks.h>
+#include <testsuite_regex.h>
+
+using namespace __gnu_test;
+using namespace std;
+
+void
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  {
+    std::regex  re("pre/[za-x]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/z", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( !regex_match_debug("pre/y", re) );
+  }
+  {
+    std::regex  re("pre/[[:uPPer:]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/Z", re) );
+    VERIFY( !regex_match_debug("pre/_", re) );
+    VERIFY( !regex_match_debug("pre/a", re) );
+    VERIFY( !regex_match_debug("pre/0", re) );
+  }
+  {
+    std::regex  re("pre/[[:lOWer:]]", std::regex::extended | std::regex::icase);
+    VERIFY( regex_match_debug("pre/Z", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+  }
+  {
+    std::regex  re("pre/[[:w:][.tilde.]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/~", re) );
+    VERIFY( regex_match_debug("pre/_", re) );
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( regex_match_debug("pre/0", re) );
+  }
+  {
+    std::regex  re("pre/[[=a=]]", std::regex::extended);
+    VERIFY( regex_match_debug("pre/a", re) );
+    VERIFY( regex_match_debug("pre/A", re) );
+  }
+}
+
+void
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  try
+  {
+    std::regex re("[-----]", std::regex::extended);
+    VERIFY(false);
+  }
+  catch (const std::regex_error& e)
+  {
+    VERIFY(e.code() == std::regex_constants::error_range);
+  }
+  std::regex re("[-----]", std::regex::ECMAScript);
+}
+
+void
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  try
+  {
+    std::regex re("[z-a]", std::regex::extended);
+    VERIFY(false);
+  }
+  catch (const std::regex_error& e)
+  {
+    VERIFY(e.code() == std::regex_constants::error_range);
+  }
+}
+
+void
+test04()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::regex re("[-0-9a-z]");
+  VERIFY(regex_match_debug("-", re));
+  VERIFY(regex_match_debug("1", re));
+  VERIFY(regex_match_debug("w", re));
+  re.assign("[-0-9a-z]", regex_constants::basic);
+  VERIFY(regex_match_debug("-", re));
+  VERIFY(regex_match_debug("1", re));
+  VERIFY(regex_match_debug("w", re));
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc
deleted file mode 100644
index ca2a5f5..0000000
--- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/cstring_bracket_01.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// { dg-options "-std=gnu++11" }
-
-//
-// 2013-08-01  Tim Shen <timshen91@gmail.com>
-//
-// Copyright (C) 2013-2014 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
-// Tests Extended bracket expression against a C-string.
-
-#include <regex>
-#include <testsuite_hooks.h>
-#include <testsuite_regex.h>
-
-using namespace __gnu_test;
-using namespace std;
-
-void
-test01()
-{
-  bool test __attribute__((unused)) = true;
-
-  {
-    std::regex  re("pre/[za-x]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/z", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( !regex_match_debug("pre/y", re) );
-  }
-  {
-    std::regex  re("pre/[[:uPPer:]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/Z", re) );
-    VERIFY( !regex_match_debug("pre/_", re) );
-    VERIFY( !regex_match_debug("pre/a", re) );
-    VERIFY( !regex_match_debug("pre/0", re) );
-  }
-  {
-    std::regex  re("pre/[[:lOWer:]]", std::regex::extended | std::regex::icase);
-    VERIFY( regex_match_debug("pre/Z", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-  }
-  {
-    std::regex  re("pre/[[:w:][.tilde.]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/~", re) );
-    VERIFY( regex_match_debug("pre/_", re) );
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( regex_match_debug("pre/0", re) );
-  }
-  {
-    std::regex  re("pre/[[=a=]]", std::regex::extended);
-    VERIFY( regex_match_debug("pre/a", re) );
-    VERIFY( regex_match_debug("pre/A", re) );
-  }
-}
-
-int
-main()
-{
-  test01();
-  return 0;
-}

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch, libstdc++/63775] Fix regex bracket expression parsing
  2014-11-13  7:49   ` Tim Shen
@ 2014-11-25  9:24     ` Tim Shen
  2015-06-02  3:56       ` Tim Shen
  0 siblings, 1 reply; 6+ messages in thread
From: Tim Shen @ 2014-11-25  9:24 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: libstdc++, gcc-patches

On Wed, Nov 12, 2014 at 11:45 PM, Tim Shen <timshen@google.com> wrote:
> Committed with comment fix and slight change on testcase
> (VERIFY(false) at end of the try block ------ must throw).

Is it possible to backport this patch to 4.9 branch? It's an important
fix, but I'm not sure if there's any binary compatibility problem. Is
it fine because it's only _Compiler class, which is an intermediate
class, that's modified?


-- 
Regards,
Tim Shen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch, libstdc++/63775] Fix regex bracket expression parsing
  2014-11-25  9:24     ` Tim Shen
@ 2015-06-02  3:56       ` Tim Shen
  2015-06-04 12:41         ` Jonathan Wakely
  0 siblings, 1 reply; 6+ messages in thread
From: Tim Shen @ 2015-06-02  3:56 UTC (permalink / raw)
  To: Jonathan Wakely; +Cc: libstdc++, gcc-patches

On Tue, Nov 25, 2014 at 12:46 AM, Tim Shen <timshen@google.com> wrote:
> On Wed, Nov 12, 2014 at 11:45 PM, Tim Shen <timshen@google.com> wrote:
>> Committed with comment fix and slight change on testcase
>> (VERIFY(false) at end of the try block ------ must throw).
>
> Is it possible to backport this patch to 4.9 branch? It's an important
> fix, but I'm not sure if there's any binary compatibility problem. Is
> it fine because it's only _Compiler class, which is an intermediate
> class, that's modified?

Ping ------ concerning libstdc++/66359.


-- 
Regards,
Tim Shen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch, libstdc++/63775] Fix regex bracket expression parsing
  2015-06-02  3:56       ` Tim Shen
@ 2015-06-04 12:41         ` Jonathan Wakely
  0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Wakely @ 2015-06-04 12:41 UTC (permalink / raw)
  To: Tim Shen; +Cc: libstdc++, gcc-patches

On 01/06/15 20:51 -0700, Tim Shen wrote:
>On Tue, Nov 25, 2014 at 12:46 AM, Tim Shen <timshen@google.com> wrote:
>> On Wed, Nov 12, 2014 at 11:45 PM, Tim Shen <timshen@google.com> wrote:
>>> Committed with comment fix and slight change on testcase
>>> (VERIFY(false) at end of the try block ------ must throw).
>>
>> Is it possible to backport this patch to 4.9 branch? It's an important
>> fix, but I'm not sure if there's any binary compatibility problem. Is
>> it fine because it's only _Compiler class, which is an intermediate
>> class, that's modified?
>
>Ping ------ concerning libstdc++/66359.

For the gcc-patches archive:

Approved in https://gcc.gnu.org/ml/libstdc++/2015-06/msg00014.html

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-06-04 12:29 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-09 18:17 [Patch, libstdc++/63775] Fix regex bracket expression parsing Tim Shen
2014-11-10 18:34 ` Jonathan Wakely
2014-11-13  7:49   ` Tim Shen
2014-11-25  9:24     ` Tim Shen
2015-06-02  3:56       ` Tim Shen
2015-06-04 12:41         ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).