33a1e511b5
N3644 implies that operator- can be used on value-init iterators. We now return 0 if both iterators are value initialized. If only one is value initialized we keep the UB by returning the result of a normal computation which is a meaningless value. libstdc++-v3/ChangeLog: PR libstdc++/70303 * include/bits/stl_deque.h (std::deque<>::operator-(iterator, iterator)): Return 0 if both iterators are value-initialized. * testsuite/23_containers/deque/70303.cc: New test. * testsuite/23_containers/vector/70303.cc: New test.
68 lines
1.6 KiB
C++
68 lines
1.6 KiB
C++
// Copyright (C) 2021 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 }
|
|
|
|
#include <vector>
|
|
#include <testsuite_hooks.h>
|
|
|
|
// PR libstdc++/70303
|
|
|
|
void test01()
|
|
{
|
|
typedef typename std::vector<int>::iterator It;
|
|
It it = It();
|
|
VERIFY(it == it);
|
|
VERIFY(!(it != it));
|
|
VERIFY(it - it == 0);
|
|
VERIFY(!(it < it));
|
|
VERIFY(!(it > it));
|
|
VERIFY(it <= it);
|
|
VERIFY(it >= it);
|
|
|
|
typedef typename std::vector<int>::const_iterator CIt;
|
|
CIt cit = CIt();
|
|
VERIFY(cit == cit);
|
|
VERIFY(!(cit != cit));
|
|
VERIFY(cit - cit == 0);
|
|
VERIFY(!(cit < cit));
|
|
VERIFY(!(cit > cit));
|
|
VERIFY(cit <= cit);
|
|
VERIFY(cit >= cit);
|
|
|
|
VERIFY(it == cit);
|
|
VERIFY(!(it != cit));
|
|
VERIFY(cit == it);
|
|
VERIFY(!(cit != it));
|
|
VERIFY(it - cit == 0);
|
|
VERIFY(cit - it == 0);
|
|
VERIFY(!(it < cit));
|
|
VERIFY(!(it > cit));
|
|
VERIFY(it <= cit);
|
|
VERIFY(it >= cit);
|
|
VERIFY(!(cit < it));
|
|
VERIFY(!(cit > it));
|
|
VERIFY(cit <= it);
|
|
VERIFY(cit >= it);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
test01();
|
|
return 0;
|
|
}
|