From d840779ff4ea300b162c4ab45ff6c81ea7303bce Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 7 Jun 2017 16:43:35 +0100 Subject: [PATCH] PR libstdc++/81002 fix std::basic_regex range constructor PR libstdc++/81002 * include/bits/regex.h (basic_regex): Adjust call to __compile_nfa so iterator type is deduced. * include/bits/regex_compiler.h (__compile_nfa): Reorder template parameters to allow iterator type to be deduced. * testsuite/28_regex/basic_regex/ctors/basic/iter.cc: New. From-SVN: r248989 --- libstdc++-v3/ChangeLog | 7 +++++ libstdc++-v3/include/bits/regex.h | 2 +- libstdc++-v3/include/bits/regex_compiler.h | 10 +++---- .../28_regex/basic_regex/ctors/basic/iter.cc | 30 +++++++++++++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 libstdc++-v3/testsuite/28_regex/basic_regex/ctors/basic/iter.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 19bab89c8e7..d7d6979da6f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2017-06-07 Jonathan Wakely + PR libstdc++/81002 + * include/bits/regex.h (basic_regex): Adjust call to __compile_nfa + so iterator type is deduced. + * include/bits/regex_compiler.h (__compile_nfa): Reorder template + parameters to allow iterator type to be deduced. + * testsuite/28_regex/basic_regex/ctors/basic/iter.cc: New. + * include/bits/alloc_traits.h (__is_allocator, _RequireAllocator): New trait and alias for detecting Allocator-like types. * include/bits/basic_string.h (basic_string): Add deduction guide diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 15f0d08c8da..1710db90e74 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -765,7 +765,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 : _M_flags((__f & (ECMAScript | basic | extended | awk | grep | egrep)) ? __f : (__f | ECMAScript)), _M_loc(std::move(__loc)), - _M_automaton(__detail::__compile_nfa<_FwdIter, _Rx_traits>( + _M_automaton(__detail::__compile_nfa<_Rx_traits>( std::move(__first), std::move(__last), _M_loc, _M_flags)) { } diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h index 49c01840c99..2c00939f6f9 100644 --- a/libstdc++-v3/include/bits/regex_compiler.h +++ b/libstdc++-v3/include/bits/regex_compiler.h @@ -191,7 +191,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = typename enable_if< !__is_contiguous_normal_iter<_Iter>::value, std::shared_ptr> >::type; - template + template inline __enable_if_contiguous_normal_iter<_FwdIter, _TraitsT> __compile_nfa(_FwdIter __first, _FwdIter __last, const typename _TraitsT::locale_type& __loc, @@ -203,15 +203,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return _Cmplr(__cfirst, __cfirst + __len, __loc, __flags)._M_get_nfa(); } - template + template inline __disable_if_contiguous_normal_iter<_FwdIter, _TraitsT> __compile_nfa(_FwdIter __first, _FwdIter __last, const typename _TraitsT::locale_type& __loc, regex_constants::syntax_option_type __flags) { - basic_string __str(__first, __last); - return __compile_nfa(__str.data(), __str.data() + __str.size(), __loc, - __flags); + const basic_string __str(__first, __last); + return __compile_nfa<_TraitsT>(__str.data(), __str.data() + __str.size(), + __loc, __flags); } // [28.13.14] diff --git a/libstdc++-v3/testsuite/28_regex/basic_regex/ctors/basic/iter.cc b/libstdc++-v3/testsuite/28_regex/basic_regex/ctors/basic/iter.cc new file mode 100644 index 00000000000..7776c5fd557 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/basic_regex/ctors/basic/iter.cc @@ -0,0 +1,30 @@ +// Copyright (C) 2017 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 +// . + +// { dg-do compile { target c++11 } } + +#include +#include + +void +test01() +{ + char s[] = ""; + __gnu_test::test_container c(s); + std::regex r1(c.begin(), c.end()); + std::regex r2(c.begin(), c.end(), std::regex_constants::grep); +} -- 2.30.2