12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // Copyright (C) 2020-2022 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/>.
- // { dg-do run { target c++11 } }
- // { dg-timeout-factor 2 }
- #include <regex>
- #include <testsuite_hooks.h>
- struct iterator
- {
- using value_type = char;
- using difference_type = std::ptrdiff_t;
- using reference = char&;
- using pointer = char*;
- using iterator_category = std::bidirectional_iterator_tag;
- iterator() : ptr() { }
- explicit iterator(pointer p) : ptr(p) { }
- iterator& operator++() { if (bang) throw 1; ++ptr; return *this; }
- iterator operator++(int) { auto copy = *this; ++*this; return copy; }
- iterator& operator--() { if (bang) throw 1; --ptr; return *this; }
- iterator operator--(int) { auto copy = *this; --*this; return copy; }
- reference operator*() const noexcept { return *ptr; }
- pointer operator->() const noexcept { return ptr; }
- bool operator==(iterator rhs) const noexcept { return ptr == rhs.ptr; }
- bool operator!=(iterator rhs) const noexcept { return ptr != rhs.ptr; }
- static bool bang;
- private:
- pointer ptr;
- };
- bool iterator::bang = false;
- int main()
- {
- char str[] = "abc";
- std::regex r(str);
- std::match_results<iterator> m;
- std::regex_match(iterator(str), iterator(str+3), m, r);
- iterator::bang = true;
- bool caught = false;
- try {
- (void) (m == m);
- } catch (int) {
- caught = true;
- }
- VERIFY( caught );
- caught = false;
- try {
- (void) (m != m);
- } catch (int) {
- caught = true;
- }
- VERIFY( caught );
- }
|