commit 2acef920cedca8440b70b38bf098be29d2231499 Author: tim Date: Thu Sep 26 14:18:31 2013 -0400 2013-09-26 Tim Shen * regex_error.h: Remove _S_error_last to follow the stanard. * regex_scanner.tcc: (_Scanner<_FwdIter>::_M_scan_in_brace): Change error_brace to error_badbrace. (_Scanner<>::_M_eat_escape_posix): Extended doesn't support back-reference. * testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc: Move here from ../../extended. * testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc: Likewise. diff --git a/libstdc++-v3/include/bits/regex_error.h b/libstdc++-v3/include/bits/regex_error.h index 7f06727..a39a8ea 100644 --- a/libstdc++-v3/include/bits/regex_error.h +++ b/libstdc++-v3/include/bits/regex_error.h @@ -61,7 +61,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _S_error_badrepeat, _S_error_complexity, _S_error_stack, - _S_error_last }; /** The expression contained an invalid collating element name. */ diff --git a/libstdc++-v3/include/bits/regex_scanner.tcc b/libstdc++-v3/include/bits/regex_scanner.tcc index abdbcc6..e0dff90 100644 --- a/libstdc++-v3/include/bits/regex_scanner.tcc +++ b/libstdc++-v3/include/bits/regex_scanner.tcc @@ -345,7 +345,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ++_M_current; } else - __throw_regex_error(regex_constants::error_brace); + __throw_regex_error(regex_constants::error_badbrace); } else if (__c == '}') { @@ -353,7 +353,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_token = _S_token_interval_end; } else - __throw_regex_error(regex_constants::error_brace); + __throw_regex_error(regex_constants::error_badbrace); } template @@ -428,6 +428,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } + // Differences between styles: + // 1) Extended doesn't support backref, but basic does. template void _Scanner<_FwdIter>:: @@ -449,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_eat_escape_awk(); return; } - else if (_M_ctype.is(_CtypeT::digit, __c) && __c != '0') + else if (_M_is_basic() && _M_ctype.is(_CtypeT::digit, __c) && __c != '0') { _M_token = _S_token_backref; _M_value.assign(1, __c); diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc new file mode 100644 index 0000000..5f4b1d1 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/53622.cc @@ -0,0 +1,66 @@ +// { dg-options "-std=gnu++11" } + +// +// 2013-07-23 Tim Shen +// +// 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 +// . + +// 28.11.2 regex_match + +#include +#include + +// libstdc++/53622 +void +test01() +{ + bool test __attribute__((unused)) = true; + + { + std::regex re("zxcv/(one.*)abc", std::regex::ECMAScript); + std::string target("zxcv/onetwoabc"); + std::smatch m; + + VERIFY( std::regex_match(target, m, re) ); + VERIFY( m.size() == 2 ); + VERIFY( m[0].matched == true ); + VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); + VERIFY( m[1].matched == true ); + VERIFY( std::string(m[1].first, m[1].second) == "onetwo" ); + } + + { + std::regex re("zxcv/(one.*)abc()\\2", std::regex::ECMAScript); + std::string target("zxcv/onetwoabc"); + std::smatch m; + + VERIFY( std::regex_match(target, m, re) ); + VERIFY( m.size() == 3 ); + VERIFY( m[0].matched == true ); + VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); + VERIFY( m[1].matched == true ); + VERIFY( std::string(m[1].first, m[1].second) == "onetwo" ); + } +} + +int +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc new file mode 100644 index 0000000..b9a72c9 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/57173.cc @@ -0,0 +1,60 @@ +// { dg-options "-std=gnu++11" } + +// +// 2013-07-23 Tim Shen +// +// 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 +// . + +// 28.11.2 regex_match + +#include +#include +#include + +// libstdc++/57173 +void +test01() +{ + bool test __attribute__((unused)) = true; + + { + std::regex re("/asdf(/.*)", std::regex::ECMAScript); + std::string target("/asdf/qwerty"); + std::smatch m; + + VERIFY( std::regex_match(target, m, re) ); + VERIFY( m.size() == 2 ); + VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); + } + { + std::regex re("/asdf(/.*)()\\2", std::regex::ECMAScript); + std::string target("/asdf/qwerty"); + std::smatch m; + + VERIFY( std::regex_match(target, m, re) ); + VERIFY( m.size() == 3 ); + VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); + } +} + +int +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/53622.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/53622.cc deleted file mode 100644 index aee1dbe..0000000 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/53622.cc +++ /dev/null @@ -1,67 +0,0 @@ -// { dg-options "-std=gnu++11" } - -// -// 2013-07-23 Tim Shen -// -// 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 -// . - -// 28.11.2 regex_match -// Tests Extended grouping against a std::string target. - -#include -#include - -// libstdc++/53622 -void -test01() -{ - bool test __attribute__((unused)) = true; - - { - std::regex re("zxcv/(one.*)abc", std::regex::extended); - std::string target("zxcv/onetwoabc"); - std::smatch m; - - VERIFY( std::regex_match(target, m, re) ); - VERIFY( m.size() == 2 ); - VERIFY( m[0].matched == true ); - VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); - VERIFY( m[1].matched == true ); - VERIFY( std::string(m[1].first, m[1].second) == "onetwo" ); - } - - { - std::regex re("zxcv/(one.*)abc()\\2", std::regex::extended); - std::string target("zxcv/onetwoabc"); - std::smatch m; - - VERIFY( std::regex_match(target, m, re) ); - VERIFY( m.size() == 3 ); - VERIFY( m[0].matched == true ); - VERIFY( std::string(m[0].first, m[0].second) == "zxcv/onetwoabc" ); - VERIFY( m[1].matched == true ); - VERIFY( std::string(m[1].first, m[1].second) == "onetwo" ); - } -} - -int -main() -{ - test01(); - return 0; -} diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/57173.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/57173.cc deleted file mode 100644 index cb3a54f..0000000 --- a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/extended/57173.cc +++ /dev/null @@ -1,61 +0,0 @@ -// { dg-options "-std=gnu++11" } - -// -// 2013-07-23 Tim Shen -// -// 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 -// . - -// 28.11.3 regex_search -// Tests Extended against a std::string target. - -#include -#include -#include - -// libstdc++/57173 -void -test01() -{ - bool test __attribute__((unused)) = true; - - { - std::regex re("/asdf(/.*)", std::regex::extended); - std::string target("/asdf/qwerty"); - std::smatch m; - - VERIFY( std::regex_match(target, m, re) ); - VERIFY( m.size() == 2 ); - VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); - } - { - std::regex re("/asdf(/.*)()\\2", std::regex::extended); - std::string target("/asdf/qwerty"); - std::smatch m; - - VERIFY( std::regex_match(target, m, re) ); - VERIFY( m.size() == 3 ); - VERIFY( std::string(m[1].first, m[1].second) == "/qwerty"); - } -} - -int -main() -{ - test01(); - return 0; -}