From ef54251a84b976a17ce7a9cc8e55e644f090c6dc Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Sun, 22 May 2011 15:07:43 +0000 Subject: [PATCH] Fix const correctness bug in bind involving reference_wrapper found by Jonathan Sauer git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@131852 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/functional | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/include/functional b/include/functional index aa2b4924d..03e2c8162 100644 --- a/include/functional +++ b/include/functional @@ -1567,24 +1567,31 @@ __mu(_Ti& __ti, _Uj& __uj) return __ti; } -template +template struct ____mu_return; template -struct ____mu_return<_Ti, true, false, tuple<_Uj...> > +struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> > { typedef typename __invoke_of<_Ti&, _Uj...>::type type; }; template -struct ____mu_return<_Ti, false, true, _TupleUj> +struct ____mu_return<_Ti, false, false, true, _TupleUj> { typedef typename tuple_element::value - 1, _TupleUj>::type&& type; }; template -struct ____mu_return<_Ti, false, false, _TupleUj> +struct ____mu_return<_Ti, true, false, false, _TupleUj> +{ + typedef typename _Ti::type& type; +}; + +template +struct ____mu_return<_Ti, false, false, false, _TupleUj> { typedef _Ti& type; }; @@ -1592,18 +1599,13 @@ struct ____mu_return<_Ti, false, false, _TupleUj> template struct __mu_return : public ____mu_return<_Ti, + __is_reference_wrapper<_Ti>::value, is_bind_expression<_Ti>::value, 0 < is_placeholder<_Ti>::value, _TupleUj> { }; -template -struct __mu_return, _TupleUj> -{ - typedef _Ti& type; -}; - template struct __bind_return;