* [v3 PATCH] PR libstdc++/77395
@ 2016-08-29 16:27 Ville Voutilainen
2016-08-29 18:25 ` Ville Voutilainen
0 siblings, 1 reply; 3+ messages in thread
From: Ville Voutilainen @ 2016-08-29 16:27 UTC (permalink / raw)
To: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 411 bytes --]
Tested for is_constructible and tuple on Linux-x64, finishing testing
the full suite on Linux-PPC64.
2016-08-29 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/is_constructible/77395.cc: New.
* testsuite/20_util/tuple/77395.cc: Likewise.
[-- Attachment #2: 77395.diff --]
[-- Type: text/plain, Size: 4424 bytes --]
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index baa4d1f..5085196 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -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;
};
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
index 0000000..b1fe8a0
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/77395.cc
@@ -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, "");
+}
diff --git a/libstdc++-v3/testsuite/20_util/tuple/77395.cc b/libstdc++-v3/testsuite/20_util/tuple/77395.cc
new file mode 100644
index 0000000..26501bf
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/tuple/77395.cc
@@ -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;
+}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [v3 PATCH] PR libstdc++/77395
2016-08-29 16:27 [v3 PATCH] PR libstdc++/77395 Ville Voutilainen
@ 2016-08-29 18:25 ` Ville Voutilainen
2016-08-30 10:26 ` Jonathan Wakely
0 siblings, 1 reply; 3+ messages in thread
From: Ville Voutilainen @ 2016-08-29 18:25 UTC (permalink / raw)
To: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 952 bytes --]
On 29 August 2016 at 19:27, Ville Voutilainen
<ville.voutilainen@gmail.com> wrote:
> Tested for is_constructible and tuple on Linux-x64, finishing testing
> the full suite on Linux-PPC64.
New patch, tested with the full suite on Linux-PPC64, tests adjusted
accordingly.
2016-08-29 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/pair/cons/explicit_construct.cc: Likewise.
* testsuite/20_util/tuple/77395.cc: New.
* testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc:
Adjust.
[-- Attachment #2: 77395_2.diff --]
[-- Type: text/plain, Size: 7689 bytes --]
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index baa4d1f..5085196 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -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;
};
diff --git a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
index 51aa6bb..2048e0d 100644
--- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
@@ -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
index 0000000..b1fe8a0
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/77395.cc
@@ -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, "");
+}
diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
index d22ac96..4f0720a 100644
--- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
@@ -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 }
diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
index 2c46dfa..8eea6b9 100644
--- a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
@@ -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/pair/cons/explicit_construct.cc b/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
index 1525fef..7543397 100644
--- a/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
+++ b/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
@@ -52,7 +52,7 @@ std::pair<int, int> v0{1,2};
std::pair<Explicit, Explicit> v1{1,2};
-std::pair<Explicit, Explicit> v2 = {1,2}; // { dg-error "explicit" }
+std::pair<Explicit, Explicit> v2 = {1,2}; // { dg-error "explicit" }
std::pair<Explicit, Explicit> v3{std::pair<int,int>{1,2}};
diff --git a/libstdc++-v3/testsuite/20_util/tuple/77395.cc b/libstdc++-v3/testsuite/20_util/tuple/77395.cc
new file mode 100644
index 0000000..26501bf
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/tuple/77395.cc
@@ -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;
+}
diff --git a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
index b15f83e..b86c0bf 100644
--- a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
+++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
@@ -34,5 +34,5 @@ test01()
iter_type(s, s, std::regex{}, il); // { dg-error "deleted" }
const int i[2] = { };
- iter_type(s, s, std::regex{}, i); // { dg-error "deleted" }
+ iter_type(s, s, std::regex{}, i); // { dg-error "deleted" }
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [v3 PATCH] PR libstdc++/77395
2016-08-29 18:25 ` Ville Voutilainen
@ 2016-08-30 10:26 ` Jonathan Wakely
0 siblings, 0 replies; 3+ messages in thread
From: Jonathan Wakely @ 2016-08-30 10:26 UTC (permalink / raw)
To: Ville Voutilainen; +Cc: libstdc++, gcc-patches
>diff --git a/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc b/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
>index 1525fef..7543397 100644
>--- a/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
>+++ b/libstdc++-v3/testsuite/20_util/pair/cons/explicit_construct.cc
>@@ -52,7 +52,7 @@ std::pair<int, int> v0{1,2};
>
> std::pair<Explicit, Explicit> v1{1,2};
>
>-std::pair<Explicit, Explicit> v2 = {1,2}; // { dg-error "explicit" }
>+std::pair<Explicit, Explicit> v2 = {1,2}; // { dg-error "explicit" }
>
> std::pair<Explicit, Explicit> v3{std::pair<int,int>{1,2}};
>
This, and ...
>diff --git a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
>index b15f83e..b86c0bf 100644
>--- a/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
>+++ b/libstdc++-v3/testsuite/28_regex/iterators/regex_token_iterator/ctors/char/dr2332_neg.cc
>@@ -34,5 +34,5 @@ test01()
> iter_type(s, s, std::regex{}, il); // { dg-error "deleted" }
>
> const int i[2] = { };
>- iter_type(s, s, std::regex{}, i); // { dg-error "deleted" }
>+ iter_type(s, s, std::regex{}, i); // { dg-error "deleted" }
> }
... this are not necessary.
A clean build will get -fno-show-column in scripts/testsuite_flags
which makes such voodoo unnecessary.
OK without those two whitespace changes.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-08-30 10:26 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-29 16:27 [v3 PATCH] PR libstdc++/77395 Ville Voutilainen
2016-08-29 18:25 ` Ville Voutilainen
2016-08-30 10:26 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).