re PR libstdc++/37547 ([c++0x] minmax with initializer_list gives incorrect results)
2008-09-17 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/37547 * include/bits/stl_algo.h (min(initializer_list<>), min(initializer_list<>, Compare), max(initializer_list<>), max(initializer_list<>, Compare), minmax(initializer_list<>), minmax(initializer_list<>, Compare)): Fix return type. * include/bits/algorithmfwd.h: Adjust. * testsuite/25_algorithms/headers/algorithm/synopsis.cc: Likewise. * testsuite/25_algorithms/max/requirements/explicit_instantiation/3.cc: Likewise. * testsuite/25_algorithms/max/requirements/explicit_instantiation/ pod2.cc: Likewise. * testsuite/25_algorithms/min/requirements/explicit_instantiation/3.cc: Likewise. * testsuite/25_algorithms/min/requirements/explicit_instantiation/ pod2.cc: Likewise. * testsuite/25_algorithms/minmax/requirements/explicit_instantiation/ 3.cc: Likewise. * testsuite/25_algorithms/minmax/requirements/explicit_instantiation/ pod2.cc: Likewise. * testsuite/25_algorithms/max/37547.cc: New. * testsuite/25_algorithms/min/37547.cc: Likewise. * testsuite/25_algorithms/minmax/37547.cc: Likewise. From-SVN: r140435
This commit is contained in:
parent
0b4e2af765
commit
116a365bd4
|
@ -1,3 +1,28 @@
|
||||||
|
2008-09-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
PR libstdc++/37547
|
||||||
|
* include/bits/stl_algo.h (min(initializer_list<>),
|
||||||
|
min(initializer_list<>, Compare), max(initializer_list<>),
|
||||||
|
max(initializer_list<>, Compare), minmax(initializer_list<>),
|
||||||
|
minmax(initializer_list<>, Compare)): Fix return type.
|
||||||
|
* include/bits/algorithmfwd.h: Adjust.
|
||||||
|
* testsuite/25_algorithms/headers/algorithm/synopsis.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/max/requirements/explicit_instantiation/3.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/25_algorithms/max/requirements/explicit_instantiation/
|
||||||
|
pod2.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/min/requirements/explicit_instantiation/3.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/25_algorithms/min/requirements/explicit_instantiation/
|
||||||
|
pod2.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/minmax/requirements/explicit_instantiation/
|
||||||
|
3.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/minmax/requirements/explicit_instantiation/
|
||||||
|
pod2.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/max/37547.cc: New.
|
||||||
|
* testsuite/25_algorithms/min/37547.cc: Likewise.
|
||||||
|
* testsuite/25_algorithms/minmax/37547.cc: Likewise.
|
||||||
|
|
||||||
2008-09-16 Chris Fairles <chris.fairles@gmail.com>
|
2008-09-16 Chris Fairles <chris.fairles@gmail.com>
|
||||||
|
|
||||||
* testsuite/25_algorithms/min/requirements/explicit_instantiation/3.cc:
|
* testsuite/25_algorithms/min/requirements/explicit_instantiation/3.cc:
|
||||||
|
|
|
@ -319,27 +319,27 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
minmax_element(_FIter, _FIter, _Compare);
|
minmax_element(_FIter, _FIter, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
const _Tp&
|
_Tp
|
||||||
min(initializer_list<_Tp>);
|
min(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
const _Tp&
|
_Tp
|
||||||
min(initializer_list<_Tp>, _Compare);
|
min(initializer_list<_Tp>, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
const _Tp&
|
_Tp
|
||||||
max(initializer_list<_Tp>);
|
max(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
const _Tp&
|
_Tp
|
||||||
max(initializer_list<_Tp>, _Compare);
|
max(initializer_list<_Tp>, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
pair<const _Tp&, const _Tp&>
|
pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp>);
|
minmax(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
pair<const _Tp&, const _Tp&>
|
pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp>, _Compare);
|
minmax(initializer_list<_Tp>, _Compare);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -4094,38 +4094,38 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
return std::make_pair(__min, __max);
|
return std::make_pair(__min, __max);
|
||||||
}
|
}
|
||||||
|
|
||||||
// N2722.
|
// N2722 + fixes.
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
inline const _Tp&
|
inline _Tp
|
||||||
min(initializer_list<_Tp> __l)
|
min(initializer_list<_Tp> __l)
|
||||||
{ return *std::min_element(__l.begin(), __l.end()); }
|
{ return *std::min_element(__l.begin(), __l.end()); }
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
inline const _Tp&
|
inline _Tp
|
||||||
min(initializer_list<_Tp> __l, _Compare __comp)
|
min(initializer_list<_Tp> __l, _Compare __comp)
|
||||||
{ return *std::min_element(__l.begin(), __l.end(), __comp); }
|
{ return *std::min_element(__l.begin(), __l.end(), __comp); }
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
inline const _Tp&
|
inline _Tp
|
||||||
max(initializer_list<_Tp> __l)
|
max(initializer_list<_Tp> __l)
|
||||||
{ return *std::max_element(__l.begin(), __l.end()); }
|
{ return *std::max_element(__l.begin(), __l.end()); }
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
inline const _Tp&
|
inline _Tp
|
||||||
max(initializer_list<_Tp> __l, _Compare __comp)
|
max(initializer_list<_Tp> __l, _Compare __comp)
|
||||||
{ return *std::max_element(__l.begin(), __l.end(), __comp); }
|
{ return *std::max_element(__l.begin(), __l.end(), __comp); }
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
inline pair<const _Tp&, const _Tp&>
|
inline pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp> __l)
|
minmax(initializer_list<_Tp> __l)
|
||||||
{
|
{
|
||||||
pair<const _Tp*, const _Tp*> __p =
|
pair<const _Tp*, const _Tp*> __p =
|
||||||
std::minmax_element(__l.begin(), __l.end());
|
std::minmax_element(__l.begin(), __l.end());
|
||||||
return std::make_pair(*__p.first, *__p.second);
|
return std::pair<_Tp, _Tp>(*__p.first, *__p.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
inline pair<const _Tp&, const _Tp&>
|
inline pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp> __l, _Compare __comp)
|
minmax(initializer_list<_Tp> __l, _Compare __comp)
|
||||||
{
|
{
|
||||||
pair<const _Tp*, const _Tp*> __p =
|
pair<const _Tp*, const _Tp*> __p =
|
||||||
|
|
|
@ -533,27 +533,27 @@ namespace std
|
||||||
minmax_element(_FIter, _FIter, _Compare);
|
minmax_element(_FIter, _FIter, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
const _Tp&
|
_Tp
|
||||||
min(initializer_list<_Tp>);
|
min(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
const _Tp&
|
_Tp
|
||||||
min(initializer_list<_Tp>, _Compare);
|
min(initializer_list<_Tp>, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
const _Tp&
|
_Tp
|
||||||
max(initializer_list<_Tp>);
|
max(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
const _Tp&
|
_Tp
|
||||||
max(initializer_list<_Tp>, _Compare);
|
max(initializer_list<_Tp>, _Compare);
|
||||||
|
|
||||||
template<typename _Tp>
|
template<typename _Tp>
|
||||||
pair<const _Tp&, const _Tp&>
|
pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp>);
|
minmax(initializer_list<_Tp>);
|
||||||
|
|
||||||
template<typename _Tp, typename _Compare>
|
template<typename _Tp, typename _Compare>
|
||||||
pair<const _Tp&, const _Tp&>
|
pair<_Tp, _Tp>
|
||||||
minmax(initializer_list<_Tp>, _Compare);
|
minmax(initializer_list<_Tp>, _Compare);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
|
||||||
|
// Copyright (C) 2008 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 2, 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 COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
// USA.
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// libstdc++/37547
|
||||||
|
int test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
std::vector<int> v{1,2,3,4,5};
|
||||||
|
|
||||||
|
auto p = std::max({v});
|
||||||
|
VERIFY ( p == v );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -42,6 +42,6 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template const value_type& max(initializer_list<value_type>);
|
template value_type max(initializer_list<value_type>);
|
||||||
template const value_type& max(initializer_list<value_type>, compare_type);
|
template value_type max(initializer_list<value_type>, compare_type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,6 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template const value_type& max(initializer_list<value_type>);
|
template value_type max(initializer_list<value_type>);
|
||||||
template const value_type& max(initializer_list<value_type>, compare_type);
|
template value_type max(initializer_list<value_type>, compare_type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
|
||||||
|
// Copyright (C) 2008 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 2, 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 COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
// USA.
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// libstdc++/37547
|
||||||
|
int test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
std::vector<int> v{1,2,3,4,5};
|
||||||
|
|
||||||
|
auto p = std::min({v});
|
||||||
|
VERIFY ( p == v );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -42,6 +42,6 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template const value_type& min(initializer_list<value_type>);
|
template value_type min(initializer_list<value_type>);
|
||||||
template const value_type& min(initializer_list<value_type>, compare_type);
|
template value_type min(initializer_list<value_type>, compare_type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,6 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template const value_type& min(initializer_list<value_type>);
|
template value_type min(initializer_list<value_type>);
|
||||||
template const value_type& min(initializer_list<value_type>, compare_type);
|
template value_type min(initializer_list<value_type>, compare_type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
|
||||||
|
// Copyright (C) 2008 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 2, 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 COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
// USA.
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
// libstdc++/37547
|
||||||
|
int test01()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
std::vector<int> v{1,2,3,4,5};
|
||||||
|
|
||||||
|
auto p = std::minmax({v});
|
||||||
|
VERIFY ( p.first == v );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -42,8 +42,7 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template pair<const value_type&, const value_type&>
|
template pair<value_type, value_type> minmax(initializer_list<value_type>);
|
||||||
minmax(initializer_list<value_type>);
|
template pair<value_type, value_type> minmax(initializer_list<value_type>,
|
||||||
template pair<const value_type&, const value_type&>
|
compare_type);
|
||||||
minmax(initializer_list<value_type>, compare_type);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,7 @@ namespace std
|
||||||
typedef value_type* iterator_type;
|
typedef value_type* iterator_type;
|
||||||
typedef std::less<value_type> compare_type;
|
typedef std::less<value_type> compare_type;
|
||||||
|
|
||||||
template pair<const value_type&, const value_type&>
|
template pair<value_type, value_type> minmax(initializer_list<value_type>);
|
||||||
minmax(initializer_list<value_type>);
|
template pair<value_type, value_type> minmax(initializer_list<value_type>,
|
||||||
template pair<const value_type&, const value_type&>
|
compare_type);
|
||||||
minmax(initializer_list<value_type>, compare_type);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue