* [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).