From: Jonathan Wakely Date: Fri, 6 Jan 2017 14:04:26 +0000 (+0000) Subject: PR78991 make __gnu_cxx::__ops constructors explicit X-Git-Tag: releases/gcc-5.5.0~609 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bacb6e9152e9c2f2c3b9c5b2c2575b957758cdab;p=thirdparty%2Fgcc.git PR78991 make __gnu_cxx::__ops constructors explicit PR libstdc++/78991 * include/bits/predefined_ops.h (_Iter_comp_iter, _Iter_comp_val) (_Val_comp_iter, _Iter_equals_val, _Iter_pred, _Iter_comp_to_val) (_Iter_comp_to_iter, _Iter_negate): Make constructors explicit. * testsuite/25_algorithms/sort/78991.cc: New test. From-SVN: r244157 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c56ff11ba5bf..6e879a8f9a76 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2017-01-06 Jonathan Wakely + + PR libstdc++/78991 + * include/bits/predefined_ops.h (_Iter_comp_iter, _Iter_comp_val) + (_Val_comp_iter, _Iter_equals_val, _Iter_pred, _Iter_comp_to_val) + (_Iter_comp_to_iter, _Iter_negate): Make constructors explicit. + * testsuite/25_algorithms/sort/78991.cc: New test. + 2016-12-19 Ville Voutilainen Backport from mainline diff --git a/libstdc++-v3/include/bits/predefined_ops.h b/libstdc++-v3/include/bits/predefined_ops.h index 7178567c9e6e..5e0c780cdba0 100644 --- a/libstdc++-v3/include/bits/predefined_ops.h +++ b/libstdc++-v3/include/bits/predefined_ops.h @@ -42,6 +42,7 @@ namespace __ops operator()(_Iterator1 __it1, _Iterator2 __it2) const { return *__it1 < *__it2; } }; + _GLIBCXX14_CONSTEXPR inline _Iter_less_iter __iter_less_iter() @@ -53,7 +54,7 @@ namespace __ops bool operator()(_Iterator __it, _Value& __val) const { return *__it < __val; } - }; + }; inline _Iter_less_val __iter_less_val() @@ -69,7 +70,7 @@ namespace __ops bool operator()(_Value& __val, _Iterator __it) const { return __val < *__it; } - }; + }; inline _Val_less_iter __val_less_iter() @@ -85,7 +86,7 @@ namespace __ops bool operator()(_Iterator1 __it1, _Iterator2 __it2) const { return *__it1 == *__it2; } - }; + }; inline _Iter_equal_to_iter __iter_equal_to_iter() @@ -97,7 +98,7 @@ namespace __ops bool operator()(_Iterator __it, _Value& __val) const { return *__it == __val; } - }; + }; inline _Iter_equal_to_val __iter_equal_to_val() @@ -111,7 +112,8 @@ namespace __ops struct _Iter_comp_iter { _Compare _M_comp; - _GLIBCXX14_CONSTEXPR + + explicit _GLIBCXX14_CONSTEXPR _Iter_comp_iter(_Compare __comp) : _M_comp(__comp) { } @@ -134,6 +136,7 @@ namespace __ops { _Compare _M_comp; + explicit _Iter_comp_val(_Compare __comp) : _M_comp(__comp) { } @@ -159,6 +162,7 @@ namespace __ops { _Compare _M_comp; + explicit _Val_comp_iter(_Compare __comp) : _M_comp(__comp) { } @@ -184,6 +188,7 @@ namespace __ops { _Value& _M_value; + explicit _Iter_equals_val(_Value& __value) : _M_value(__value) { } @@ -204,6 +209,7 @@ namespace __ops { typename std::iterator_traits<_Iterator1>::reference _M_ref; + explicit _Iter_equals_iter(_Iterator1 __it1) : _M_ref(*__it1) { } @@ -224,6 +230,7 @@ namespace __ops { _Predicate _M_pred; + explicit _Iter_pred(_Predicate __pred) : _M_pred(__pred) { } @@ -286,6 +293,7 @@ namespace __ops { _Predicate _M_pred; + explicit _Iter_negate(_Predicate __pred) : _M_pred(__pred) { } diff --git a/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc b/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc new file mode 100644 index 000000000000..d94753822bc7 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/sort/78991.cc @@ -0,0 +1,40 @@ +// Copyright (C) 2017 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 } + +// PR 78991 +// This failed to compile with Clang because the result_of expression causes +// instantiation of _Iter_comp_iter::operator() outside the immediate context. + +#include + +struct function +{ + function() = default; + + template> + function(F) { } + + bool operator()(int x, int y) const { return x < y; } +}; + +int main() +{ + int a[2]{ 2, 1 }; + std::sort(a, a+2, function{}); +}