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:
Paolo Carlini 2008-09-17 22:58:38 +00:00 committed by Paolo Carlini
parent 0b4e2af765
commit 116a365bd4
13 changed files with 179 additions and 36 deletions

View File

@ -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:

View File

@ -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

View File

@ -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 =

View File

@ -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

View File

@ -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;
}

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;
}

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;
}

View File

@ -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);
} }

View File

@ -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);
} }