diff options
author | Howard Hinnant <hhinnant@apple.com> | 2013-06-30 19:48:15 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2013-06-30 19:48:15 +0000 |
commit | 9bf42533b7d8db7f7b0b44ad8ba28a4d0e15ab08 (patch) | |
tree | 7e944077dbd2f226dfe606151928bc9739c62f6b /libcxx | |
parent | 851b025e964097b58e46856d8b0f946cd54cb4a1 (diff) | |
download | bcm5719-llvm-9bf42533b7d8db7f7b0b44ad8ba28a4d0e15ab08.tar.gz bcm5719-llvm-9bf42533b7d8db7f7b0b44ad8ba28a4d0e15ab08.zip |
Fix bind by making _is_valid_bind_return more robust. It should return false instead of give a compile time error, always. The problem was down in ____mu_return, the version that handles nested bind objects. This fixes http://llvm.org/bugs/show_bug.cgi?id=16343
llvm-svn: 185289
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/functional | 14 | ||||
-rw-r--r-- | libcxx/test/utilities/function.objects/bind/func.bind/func.bind.bind/nested.pass.cpp | 51 |
2 files changed, 64 insertions, 1 deletions
diff --git a/libcxx/include/functional b/libcxx/include/functional index 995db564c1d..d9e6ee94bc9 100644 --- a/libcxx/include/functional +++ b/libcxx/include/functional @@ -1594,12 +1594,24 @@ template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh, class _TupleUj> struct ____mu_return; +template <bool _Invokable, class _Ti, class ..._Uj> +struct ____mu_return_invokable // false +{ + typedef __nat type; +}; + template <class _Ti, class ..._Uj> -struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> > +struct ____mu_return_invokable<true, _Ti, _Uj...> { typedef typename __invoke_of<_Ti&, _Uj...>::type type; }; +template <class _Ti, class ..._Uj> +struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> > + : public ____mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...> +{ +}; + template <class _Ti, class _TupleUj> struct ____mu_return<_Ti, false, false, true, _TupleUj> { diff --git a/libcxx/test/utilities/function.objects/bind/func.bind/func.bind.bind/nested.pass.cpp b/libcxx/test/utilities/function.objects/bind/func.bind/func.bind.bind/nested.pass.cpp new file mode 100644 index 00000000000..12720f7b550 --- /dev/null +++ b/libcxx/test/utilities/function.objects/bind/func.bind/func.bind.bind/nested.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <functional> + +// template<CopyConstructible Fn, CopyConstructible... Types> +// unspecified bind(Fn, Types...); +// template<Returnable R, CopyConstructible Fn, CopyConstructible... Types> +// unspecified bind(Fn, Types...); + +// http://llvm.org/bugs/show_bug.cgi?id=16343 + +#include <cmath> +#include <functional> +#include <cassert> + +struct power +{ + template <typename T> + T + operator()(T a, T b) + { + return std::pow(a, b); + } +}; + +struct plus_one +{ + template <typename T> + T + operator()(T a) + { + return a + 1; + } +}; + +int +main() +{ + using std::placeholders::_1; + + auto g = std::bind(power(), 2, _1); + assert(g(5) == 32); + assert(std::bind(plus_one(), g)(5) == 33); +} |