Commit 770acfc9 by Tim Shen Committed by Tim Shen

re PR libstdc++/64680 (basic_regex::operator= does not reset flags)

	PR libstdc++/64680
	* include/bits/regex.h (basic_regex<>::basic_regex,
	basic_regex<>::operator=, basic_regex<>::imbue): Conform to the
	standard interface.
	* testsuite/28_regex/basic_regex/assign/char/cstring.cc: New testcase.

From-SVN: r219987
parent 77033d26
2015-01-22 Tim Shen <timshen@google.com> 2015-01-22 Tim Shen <timshen@google.com>
PR libstdc++/64680
* include/bits/regex.h (basic_regex<>::basic_regex,
basic_regex<>::operator=, basic_regex<>::imbue): Conform to the
standard interface.
* testsuite/28_regex/basic_regex/assign/char/cstring.cc: New testcase.
2015-01-22 Tim Shen <timshen@google.com>
PR libstdc++/64649 PR libstdc++/64649
* include/bits/regex.tcc (regex_traits<>::lookup_collatename, * include/bits/regex.tcc (regex_traits<>::lookup_collatename,
regex_traits<>::lookup_classname): Correctly narrow input chars. regex_traits<>::lookup_classname): Correctly narrow input chars.
......
...@@ -442,7 +442,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 ...@@ -442,7 +442,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
*/ */
explicit explicit
basic_regex(const _Ch_type* __p, flag_type __f = ECMAScript) basic_regex(const _Ch_type* __p, flag_type __f = ECMAScript)
: basic_regex(__p, __p + _Rx_traits::length(__p), __f) : basic_regex(__p, __p + char_traits<_Ch_type>::length(__p), __f)
{ } { }
/** /**
...@@ -553,7 +553,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 ...@@ -553,7 +553,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
*/ */
basic_regex& basic_regex&
operator=(const _Ch_type* __p) operator=(const _Ch_type* __p)
{ return this->assign(__p, flags()); } { return this->assign(__p); }
/**
* @brief Replaces a regular expression with a new one constructed from
* an initializer list.
*
* @param __l The initializer list.
*
* @throws regex_error if @p __l is not a valid regular expression.
*/
basic_regex&
operator=(initializer_list<_Ch_type> __l)
{ return this->assign(__l.begin(), __l.end()); }
/** /**
* @brief Replaces a regular expression with a new one constructed from * @brief Replaces a regular expression with a new one constructed from
...@@ -564,7 +576,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 ...@@ -564,7 +576,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
template<typename _Ch_traits, typename _Alloc> template<typename _Ch_traits, typename _Alloc>
basic_regex& basic_regex&
operator=(const basic_string<_Ch_type, _Ch_traits, _Alloc>& __s) operator=(const basic_string<_Ch_type, _Ch_traits, _Alloc>& __s)
{ return this->assign(__s, flags()); } { return this->assign(__s); }
// [7.8.3] assign // [7.8.3] assign
/** /**
...@@ -644,7 +656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 ...@@ -644,7 +656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
flag_type __flags = ECMAScript) flag_type __flags = ECMAScript)
{ {
return this->assign(basic_regex(__s.data(), __s.data() + __s.size(), return this->assign(basic_regex(__s.data(), __s.data() + __s.size(),
_M_loc, _M_flags)); _M_loc, __flags));
} }
/** /**
...@@ -712,7 +724,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 ...@@ -712,7 +724,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
imbue(locale_type __loc) imbue(locale_type __loc)
{ {
std::swap(__loc, _M_loc); std::swap(__loc, _M_loc);
_M_automaton = nullptr; _M_automaton.reset();
return __loc; return __loc;
} }
......
// { dg-do compile } // { dg-options "-std=c++11" }
// { dg-options "-std=gnu++11" }
// 2009-06-05 Stephen M. Webb <stephen.webb@bregmasoft.ca> // 2009-06-05 Stephen M. Webb <stephen.webb@bregmasoft.ca>
// //
...@@ -36,9 +35,19 @@ void test01() ...@@ -36,9 +35,19 @@ void test01()
re.assign(cs); re.assign(cs);
} }
// basic_regex::operator=() resets flags. libstdc++/64680
void test02()
{
bool test __attribute__((unused)) = true;
std::regex re("[[:alnum:]]", std::regex_constants::basic);
re = "\\w+";
}
int int
main() main()
{ {
test01(); test01();
test02();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment