From 6789ccfa469492579bfb23dedd20218153cdcd04 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 10 Dec 2014 01:37:37 +0000 Subject: [PATCH] Implement LWG DR 2329 and DR 2332. * include/bits/regex.h (regex_match, regex_search): LWG DR 2329, add deleted overloads for rvalue strings. (regex_iterator, regex_token_iterator): LWG DR 2332, add deleted constructors for rvalue regexes. * testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc: New. * testsuite/28_regex/algorithms/regex_search/dr2329_neg.cc: New. * testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc: New. * testsuite/28_regex/iterators/regex_token_iterator/ctors/char/ dr2332_neg.cc: New. From-SVN: r218555 --- libstdc++-v3/ChangeLog | 11 ++++ libstdc++-v3/include/bits/regex.h | 51 +++++++++++++++++++ .../algorithms/regex_match/dr2329_neg.cc | 28 ++++++++++ .../algorithms/regex_search/dr2332_neg.cc | 28 ++++++++++ .../regex_iterator/ctors/char/dr2332_neg.cc | 29 +++++++++++ .../ctors/char/dr2332_neg.cc | 39 ++++++++++++++ 6 files changed, 186 insertions(+) create mode 100644 libstdc++-v3/testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc create mode 100644 libstdc++-v3/testsuite/28_regex/algorithms/regex_search/dr2332_neg.cc create mode 100644 libstdc++-v3/testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc create mode 100644 libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 48ba1ff96d7..ea6e3322a17 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -11,6 +11,17 @@ * include/std/future (__future_base::_Setter::operator(), __future_base::_Task_setter::operator()): Make call operators const. + * include/bits/regex.h (regex_match, regex_search): LWG DR 2329, + add deleted overloads for rvalue strings. + (regex_iterator, regex_token_iterator): LWG DR 2332, add deleted + constructors for rvalue regexes. + * testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc: New. + * testsuite/28_regex/algorithms/regex_search/dr2329_neg.cc: New. + * testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc: + New. + * testsuite/28_regex/iterators/regex_token_iterator/ctors/char/ + dr2332_neg.cc: New. + 2014-12-09 Jonathan Wakely PR libstdc++/64203 diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 6ff9a82bded..cb6bc93251a 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -2063,6 +2063,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = regex_constants::match_default) { return regex_match(__s.begin(), __s.end(), __m, __re, __flags); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2329. regex_match() with match_results should forbid temporary strings + /// Prevent unsafe attempts to get match_results from a temporary string. + template + bool + regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&, + match_results::const_iterator, _Alloc>&, + const basic_regex<_Ch_type, _Rx_traits>&, + regex_constants::match_flag_type + = regex_constants::match_default) = delete; + /** * @brief Indicates if there is a match between the regular expression @p e * and a C-style null-terminated string. @@ -2239,6 +2252,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = regex_constants::match_default) { return regex_search(__s.begin(), __s.end(), __m, __e, __f); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2329. regex_search() with match_results should forbid temporary strings + /// Prevent unsafe attempts to get match_results from a temporary string. + template + bool + regex_search(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>&&, + match_results::const_iterator, _Alloc>&, + const basic_regex<_Ch_type, _Rx_traits>&, + regex_constants::match_flag_type + = regex_constants::match_default) = delete; + // std [28.11.4] Function template regex_replace /** * @brief Search for a regular expression within a range for multiple times, @@ -2437,6 +2464,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION *this = regex_iterator(); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2332. regex_iterator should forbid temporary regexes + regex_iterator(_Bi_iter, _Bi_iter, const regex_type&&, + regex_constants::match_flag_type + = regex_constants::match_default) = delete; /** * Copy constructs a %regex_iterator. */ @@ -2618,6 +2650,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_subs(__submatches, *(&__submatches+1)), _M_n(0) { _M_init(__a, __b); } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2332. regex_token_iterator should forbid temporary regexes + regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, int = 0, + regex_constants::match_flag_type = + regex_constants::match_default) = delete; + regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, + const std::vector&, + regex_constants::match_flag_type = + regex_constants::match_default) = delete; + regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, + initializer_list, + regex_constants::match_flag_type = + regex_constants::match_default) = delete; + template + regex_token_iterator(_Bi_iter, _Bi_iter, const regex_type&&, + const int (&)[N], + regex_constants::match_flag_type = + regex_constants::match_default) = delete; + /** * @brief Copy constructs a %regex_token_iterator. * @param __rhs [IN] A %regex_token_iterator to copy. diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc new file mode 100644 index 00000000000..3070f930901 --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_match/dr2329_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 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 +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +void +test01() +{ + std::smatch m; + regex_match(std::string{}, m, std::regex{"."}); // { dg-error "deleted" } +} diff --git a/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/dr2332_neg.cc b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/dr2332_neg.cc new file mode 100644 index 00000000000..2381ddb2d6e --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/algorithms/regex_search/dr2332_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 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 +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +void +test01() +{ + std::smatch m; + regex_search(std::string{}, m, std::regex{"."}); // { dg-error "deleted" } +} diff --git a/libstdc++-v3/testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc b/libstdc++-v3/testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc new file mode 100644 index 00000000000..2a72b4f503e --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_iterator/ctors/char/dr2332_neg.cc @@ -0,0 +1,29 @@ +// Copyright (C) 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 +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +void +test01() +{ + using iter_type = std::regex_iterator; + const char* s = ""; + iter_type(s, s, std::regex{}); // { dg-error "deleted" } +} diff --git a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc new file mode 100644 index 00000000000..6ff5870a7db --- /dev/null +++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc @@ -0,0 +1,39 @@ +// Copyright (C) 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 +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +#include + +void +test01() +{ + using iter_type = std::regex_token_iterator; + const char* s = ""; + + iter_type(s, s, std::regex{}); // { dg-error "deleted" } + + std::vector v; + iter_type(s, s, std::regex{}, v); // { dg-error "deleted" } + + std::initializer_list il = {1}; + iter_type(s, s, std::regex{}, il); // { dg-error "deleted" } + + const int i[2] = { }; + iter_type(s, s, std::regex{}, i); // { dg-error "deleted" } +} -- 2.30.2