re PR libstdc++/77395 (std::is_constructible is false for type constructible via...
authorVille Voutilainen <ville.voutilainen@gmail.com>
Tue, 30 Aug 2016 18:46:11 +0000 (21:46 +0300)
committerVille Voutilainen <ville@gcc.gnu.org>
Tue, 30 Aug 2016 18:46:11 +0000 (21:46 +0300)
PR libstdc++/77395
* include/std/type_traits (is_constructible): Forward-declare...
(__is_base_to_derived_ref): ...and use here.
* testsuite/20_util/declval/requirements/1_neg.cc: Adjust.
* testsuite/20_util/is_constructible/77395.cc: New.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
Likewise.
* testsuite/20_util/tuple/77395.cc: New.

From-SVN: r239870

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits
libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
libstdc++-v3/testsuite/20_util/is_constructible/77395.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
libstdc++-v3/testsuite/20_util/tuple/77395.cc [new file with mode: 0644]

index adf2fc7f7863d1f45de4895d70170bf9b904870e..dc9ee9f5f1cdcaf9851ba9b68f5d09f07207cb7e 100644 (file)
@@ -1,3 +1,15 @@
+2016-08-30  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       PR libstdc++/77395
+       * include/std/type_traits (is_constructible): Forward-declare...
+       (__is_base_to_derived_ref): ...and use here.
+       * testsuite/20_util/declval/requirements/1_neg.cc: Adjust.
+       * testsuite/20_util/is_constructible/77395.cc: New.
+       * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust.
+       * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
+       Likewise.
+       * testsuite/20_util/tuple/77395.cc: New.
+
 2016-08-30  Uros Bizjak  <ubizjak@gmail.com>
 
        * testsuite/22_locale/time_get/get/char/2.cc: Move dg-do run
index baa4d1ffe9648b5cbf32880b2c5037da49636073..5085196f654d4ff918148874305f847402e79114 100644 (file)
@@ -1007,6 +1007,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                           is_function<_From>>>::value>
     struct __is_base_to_derived_ref;
 
+  template<typename _Tp, typename... _Args>
+    struct is_constructible;
+
   // Detect whether we have a downcast situation during
   // reference binding.
   template<typename _From, typename _To>
@@ -1017,7 +1020,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef typename remove_cv<typename remove_reference<_To
         >::type>::type __dst_t;
       typedef __and_<__not_<is_same<__src_t, __dst_t>>,
-                    is_base_of<__src_t, __dst_t>> type;
+                    is_base_of<__src_t, __dst_t>,
+                    __not_<is_constructible<__dst_t, _From>>> type;
       static constexpr bool value = type::value;
     };
 
index 51aa6bbacbc84bfcdbef63062c747b5bf6e9e1c3..2048e0d7cff54ab718cafa1a460825f6784ad84c 100644 (file)
@@ -18,7 +18,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-error "static assertion failed" "" { target *-*-* } 2255 }
+// { dg-error "static assertion failed" "" { target *-*-* } 2259 }
 
 #include <utility>
 
diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/77395.cc b/libstdc++-v3/testsuite/20_util/is_constructible/77395.cc
new file mode 100644 (file)
index 0000000..b1fe8a0
--- /dev/null
@@ -0,0 +1,54 @@
+// { dg-do compile { target c++11 } }
+
+// Copyright (C) 2016 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
+// <http://www.gnu.org/licenses/>.
+
+#include <type_traits>
+#include <utility>
+
+struct derived;
+struct base
+{
+  operator derived & () &;
+  operator derived const & () const &;
+  operator derived && () &&;
+};
+
+struct derived : base {};
+
+base::operator derived & () &
+{
+  return *static_cast<derived *>(this);
+}
+
+base::operator derived const & () const &
+{
+  return *static_cast<derived const *>(this);
+}
+
+base::operator derived && () &&
+{
+  return std::move(*static_cast<derived *>(this));
+}
+
+int main()
+{
+  base b;
+  derived&& d(static_cast<derived&&>(std::move(b)));
+  derived&& d2(std::move(b));
+  static_assert(std::is_constructible<derived&&, base&&>::value, "");
+}
index d22ac960654217c8e57be452b53b9088e90c2ed4..4f0720af4126c5f64dcec83a60077d96a2601003 100644 (file)
@@ -47,4 +47,4 @@ void test01()
 // { dg-error "required from here" "" { target *-*-* } 39 }
 // { dg-error "required from here" "" { target *-*-* } 41 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1920 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1924 }
index 2c46dfaaca0c6e047509916bf8ec9380ad47e64d..8eea6b967f37ce80dc06cc4bf3d745fb7f73f43d 100644 (file)
@@ -47,5 +47,5 @@ void test01()
 // { dg-error "required from here" "" { target *-*-* } 39 }
 // { dg-error "required from here" "" { target *-*-* } 41 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1816 }
-// { dg-error "declaration of" "" { target *-*-* } 1773 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1820 }
+// { dg-error "declaration of" "" { target *-*-* } 1777 }
diff --git a/libstdc++-v3/testsuite/20_util/tuple/77395.cc b/libstdc++-v3/testsuite/20_util/tuple/77395.cc
new file mode 100644 (file)
index 0000000..26501bf
--- /dev/null
@@ -0,0 +1,46 @@
+// { dg-do compile { target c++11 } }
+
+// Copyright (C) 2016 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
+// <http://www.gnu.org/licenses/>.
+
+#include <tuple>
+#include <utility>
+
+struct derived;
+struct base
+{
+    operator derived & () &;
+    operator derived const & () const &;
+    operator derived && () &&;
+};
+
+struct derived : base {};
+
+base::operator derived & () & { return *static_cast<derived *>(this); }
+base::operator derived const & () const & { return *static_cast<derived const *>(this); }
+base::operator derived && () && { return std::move(*static_cast<derived *>(this)); }
+
+std::tuple<derived &&> test(base && b)
+{
+    return std::tuple<derived &&>(std::move(b));
+}
+
+int main(int,char**)
+{
+    auto d = std::get<0>(test(derived{}));
+    return 0;
+}