]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR 70564 disambiguate constructor for not_fn call wrapper
authorJonathan Wakely <jwakely@redhat.com>
Wed, 5 Oct 2016 13:51:03 +0000 (14:51 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 5 Oct 2016 13:51:03 +0000 (14:51 +0100)
PR libstdc++/70564
* include/experimental/functional (_Not_fn): Add second parameter to
disambiguate copying from initialization by not_fn.
(not_fn): Add second argument to initialization.
* testsuite/experimental/functional/not_fn.cc: Copy call wrapper using
direct-initialization. Test abstract class.

From-SVN: r240790

libstdc++-v3/ChangeLog
libstdc++-v3/include/experimental/functional
libstdc++-v3/testsuite/experimental/functional/not_fn.cc

index 4e54c0ca8dfd9d94234ebf376df6f8030c5d3f0d..4cc7444dfec0d44439197f2a26abfb4ed3a260da 100644 (file)
@@ -1,5 +1,12 @@
 2016-10-05  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/70564
+       * include/experimental/functional (_Not_fn): Add second parameter to
+       disambiguate copying from initialization by not_fn.
+       (not_fn): Add second argument to initialization.
+       * testsuite/experimental/functional/not_fn.cc: Copy call wrapper using
+       direct-initialization. Test abstract class.
+
        PR libstdc++/77864
        * include/bits/stl_map.h (map::map()): Use nothrow constructibility
        of comparison function in conditional noexcept.
index 8d19ad3a79a495cd07f1a332fbc06959fa10a9b4..0d0ab3713378616b462110d17c5915889af75292 100644 (file)
@@ -384,7 +384,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     public:
       template<typename _Fn2>
        explicit
-       _Not_fn(_Fn2&& __fn) : _M_fn(std::forward<_Fn2>(__fn)) { }
+       _Not_fn(_Fn2&& __fn, int) : _M_fn(std::forward<_Fn2>(__fn)) { }
 
       _Not_fn(const _Not_fn& __fn) = default;
       _Not_fn(_Not_fn&& __fn) = default;
@@ -428,7 +428,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     noexcept(std::is_nothrow_constructible<std::decay_t<_Fn>, _Fn&&>::value)
     {
       using __maybe_type = _Maybe_wrap_member_pointer<std::decay_t<_Fn>>;
-      return _Not_fn<typename __maybe_type::type>{std::forward<_Fn>(__fn)};
+      return _Not_fn<typename __maybe_type::type>{std::forward<_Fn>(__fn), 0};
     }
 
 _GLIBCXX_END_NAMESPACE_VERSION
index 4c137e85bea996dbeba5c0f5360ec25e1750310e..18ea24ee077b3e02c92ccf866e136ad1bf37ea1a 100644 (file)
@@ -76,10 +76,30 @@ test03()
   VERIFY( not_fn(&X::b)(x) );
 }
 
+void
+test04()
+{
+  struct abstract { virtual void f() = 0; };
+  struct derived : abstract { void f() { } };
+  struct F { bool operator()(abstract&) { return false; } };
+  F f;
+  derived d;
+  VERIFY( not_fn(f)(d) );
+}
+
+void
+test05()
+{
+  auto nf = std::experimental::not_fn([] { return false; });
+  auto copy(nf); // PR libstdc++/70564
+}
+
 int
 main()
 {
   test01();
   test02();
   test03();
+  test04();
+  test05();
 }