public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Giuliano Belinassi <giulianob@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc(refs/users/giulianob/heads/autopar_rebase2)] libstdc++: Add static assertions to futures and promises [LWG 3458] Date: Tue, 18 Aug 2020 01:05:16 +0000 (GMT) [thread overview] Message-ID: <20200818010516.9CFB538618A8@sourceware.org> (raw) https://gcc.gnu.org/g:f2023827def031f7f3316ed5a91e063916df4d99 commit f2023827def031f7f3316ed5a91e063916df4d99 Author: Jonathan Wakely <jwakely@redhat.com> Date: Wed Jul 22 20:10:38 2020 +0100 libstdc++: Add static assertions to futures and promises [LWG 3458] LWG recently decided it should be ill-formed to instantiate std::future and std::shared_future for types that can't be returned from a function. This adds static assertions to enforce it (std::future already failed, but this makes the error more understandable). LWG 3466 extends that to std::promise. The actual constraint is that t.~T() is well-formed for the primary template, but rejecting arrays and functions as done for futures matches that condition. libstdc++-v3/ChangeLog: * include/std/future (future, shared_future, promise): Add static assertions to the primary template to reject array and function types. * testsuite/30_threads/future/requirements/lwg3458.cc: New test. * testsuite/30_threads/promise/requirements/lwg3466.cc: New test. * testsuite/30_threads/shared_future/requirements/lwg3458.cc: New test. Diff: --- libstdc++-v3/include/std/future | 15 ++++++++++ .../30_threads/future/requirements/lwg3458.cc | 34 ++++++++++++++++++++++ .../30_threads/promise/requirements/lwg3466.cc | 34 ++++++++++++++++++++++ .../shared_future/requirements/lwg3458.cc | 32 ++++++++++++++++++++ 4 files changed, 115 insertions(+) diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 6eef6864f4d..bdf4a75d694 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -763,6 +763,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Res> class future : public __basic_future<_Res> { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3458. Is shared_future intended to work with arrays or function types? + static_assert(!is_array<_Res>{}, "result type is not an array"); + static_assert(!is_function<_Res>{}, "result type is not a function"); + friend class promise<_Res>; template<typename> friend class packaged_task; template<typename _Fn, typename... _Args> @@ -893,6 +898,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Res> class shared_future : public __basic_future<_Res> { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3458. Is shared_future intended to work with arrays or function types? + static_assert(!is_array<_Res>{}, "result type is not an array"); + static_assert(!is_function<_Res>{}, "result type is not a function"); + typedef __basic_future<_Res> _Base_type; public: @@ -1045,6 +1055,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Res> class promise { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3466: Specify the requirements for promise/future/[...] consistently + static_assert(!is_array<_Res>{}, "result type is not an array"); + static_assert(!is_function<_Res>{}, "result type is not a function"); + typedef __future_base::_State_base _State; typedef __future_base::_Result<_Res> _Res_type; typedef __future_base::_Ptr<_Res_type> _Ptr_type; diff --git a/libstdc++-v3/testsuite/30_threads/future/requirements/lwg3458.cc b/libstdc++-v3/testsuite/30_threads/future/requirements/lwg3458.cc new file mode 100644 index 00000000000..2bc206c9450 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/future/requirements/lwg3458.cc @@ -0,0 +1,34 @@ +// Copyright (C) 2020 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/>. + +// { dg-do compile { target c++11 } } + +// LWG 3458 +// Is shared_future intended to work with arrays or function types? + +#include <future> + +std::future<int(&)[1]> good; +std::future<int(&)()> good2; + +std::future<int[1]> bad; // { dg-error "here" } +// { dg-error "result type is not an array" "" { target *-*-* } 0 } +// { dg-prune-output "function returning an array" } + +std::future<int()> bad2; // { dg-error "here" } +// { dg-error "result type is not a function" "" { target *-*-* } 0 } +// { dg-prune-output "function returning a function" } diff --git a/libstdc++-v3/testsuite/30_threads/promise/requirements/lwg3466.cc b/libstdc++-v3/testsuite/30_threads/promise/requirements/lwg3466.cc new file mode 100644 index 00000000000..124c86c0392 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/promise/requirements/lwg3466.cc @@ -0,0 +1,34 @@ +// Copyright (C) 2020 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/>. + +// { dg-do compile { target c++11 } } + +// LWG 3466 +// Specify the requirements for promise/future/shared_future consistently + +#include <future> + +std::promise<int(&)[1]> good; +std::promise<int(&)()> good2; + +std::promise<int[1]> bad; // { dg-error "here" } +// { dg-error "result type is not an array" "" { target *-*-* } 0 } +// { dg-prune-output {request for member '~int \[1\]'} } + +std::promise<int()> bad2; // { dg-error "here" } +// { dg-error "result type is not a function" "" { target *-*-* } 0 } +// { dg-prune-output {'sizeof \(int\(\)\)'} } diff --git a/libstdc++-v3/testsuite/30_threads/shared_future/requirements/lwg3458.cc b/libstdc++-v3/testsuite/30_threads/shared_future/requirements/lwg3458.cc new file mode 100644 index 00000000000..df5bfd2b976 --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/shared_future/requirements/lwg3458.cc @@ -0,0 +1,32 @@ +// Copyright (C) 2020 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/>. + +// { dg-do compile { target c++11 } } + +// LWG 3458 +// Is shared_future intended to work with arrays or function types? + +#include <future> + +std::shared_future<int(&)[1]> good; +std::shared_future<int(&)()> good2; + +std::shared_future<int[1]> bad; // { dg-error "here" } +// { dg-error "result type is not an array" "" { target *-*-* } 0 } + +std::shared_future<int()> bad2; // { dg-error "here" } +// { dg-error "result type is not a function" "" { target *-*-* } 0 }
reply other threads:[~2020-08-18 1:05 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200818010516.9CFB538618A8@sourceware.org \ --to=giulianob@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).