diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 47be1a9dbcd..c1bbc75ca43 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1121,11 +1121,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX17_CONSTEXPR move_iterator operator++(int) - { - move_iterator __tmp = *this; - ++_M_current; - return __tmp; - } + { return move_iterator(_M_current++); } _GLIBCXX17_CONSTEXPR move_iterator& operator--() @@ -1136,11 +1132,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX17_CONSTEXPR move_iterator operator--(int) - { - move_iterator __tmp = *this; - --_M_current; - return __tmp; - } + { return move_iterator(_M_current--); } _GLIBCXX17_CONSTEXPR move_iterator operator+(difference_type __n) const @@ -1197,51 +1189,59 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return !(__x == __y); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator<(const move_iterator<_IteratorL>& __x, const move_iterator<_IteratorR>& __y) + -> decltype( __x.base() < __y.base() ) { return __x.base() < __y.base(); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator<(const move_iterator<_Iterator>& __x, const move_iterator<_Iterator>& __y) + -> decltype( __x.base() < __y.base() ) { return __x.base() < __y.base(); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator<=(const move_iterator<_IteratorL>& __x, const move_iterator<_IteratorR>& __y) + -> decltype( __x.base() <= __y.base() ) { return !(__y < __x); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator<=(const move_iterator<_Iterator>& __x, const move_iterator<_Iterator>& __y) + -> decltype( __x.base() <= __y.base() ) { return !(__y < __x); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator>(const move_iterator<_IteratorL>& __x, const move_iterator<_IteratorR>& __y) + -> decltype( __x.base() > __y.base() ) { return __y < __x; } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator>(const move_iterator<_Iterator>& __x, const move_iterator<_Iterator>& __y) + -> decltype( __x.base() > __y.base() ) { return __y < __x; } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator>=(const move_iterator<_IteratorL>& __x, const move_iterator<_IteratorR>& __y) + -> decltype( __x.base() >= __y.base() ) { return !(__x < __y); } template - inline _GLIBCXX17_CONSTEXPR bool + inline _GLIBCXX17_CONSTEXPR auto operator>=(const move_iterator<_Iterator>& __x, const move_iterator<_Iterator>& __y) + -> decltype( __x.base() >= __y.base() ) { return !(__x < __y); } // DR 685. diff --git a/libstdc++-v3/testsuite/24_iterators/move_iterator/operator_neg.cc b/libstdc++-v3/testsuite/24_iterators/move_iterator/operator_neg.cc new file mode 100644 index 00000000000..7b09425358e --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/move_iterator/operator_neg.cc @@ -0,0 +1,73 @@ +// Copyright (C) 2019 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 xfail *-*-* } } + +#include + +using ite_t = + std::move_iterator::iterator>; +using const_ite_t = + std::move_iterator::const_iterator>; + +using lower_type = + decltype( std::declval() < std::declval() ); // { dg-error "no match for 'operator<'" } + +// { dg-error "no match for 'operator<'" "" { target *-*-* } 1195 } + +using heterogeneous_lower_type = + decltype( std::declval() < std::declval() ); // { dg-error "no match for 'operator<'" } + +// { dg-error "no match for 'operator<'" "" { target *-*-* } 1202 } + +using heterogeneous_lower_equal_type = + decltype( std::declval() <= std::declval() ); // { dg-error "no match for 'operator<='" } + +// { dg-error "no match for 'operator<='" "" { target *-*-* } 1209 } + +using lower_equal_type = + decltype( std::declval() <= std::declval() ); // { dg-error "no match for 'operator<='" } + +// { dg-error "no match for 'operator<='" "" { target *-*-* } 1216 } + +using heterogeneous_greater_type = + decltype( std::declval() > std::declval() ); // { dg-error "no match for 'operator>'" } + +// { dg-error "no match for 'operator>'" "" { target *-*-* } 1223 } + +using greater_type = + decltype( std::declval() > std::declval() ); // { dg-error "no match for 'operator>'" } + +// { dg-error "no match for 'operator>'" "" { target *-*-* } 1230 } + +using heterogeneous_greater_equal_type = + decltype( std::declval() >= std::declval() ); // { dg-error "no match for 'operator>='" } + +// { dg-error "no match for 'operator>='" "" { target *-*-* } 1237 } + +using greater_equal_type = + decltype( std::declval() >= std::declval() ); // { dg-error "no match for 'operator>='" } + +// { dg-error "no match for 'operator>='" "" { target *-*-* } 1244 } + +using diff_type = + decltype( std::declval() - std::declval() ); // { dg-error "no match for 'operator-'" } + +// { dg-error "no match for 'operator-'" "" { target *-*-* } 1252 } + +using integral_plus_ite_type = + decltype( 1 + std::declval() );