LWG 2510, make the default constructors of library tag types explicit.
2015-11-10 Ville Voutilainen <ville.voutilainen@gmail.com> LWG 2510, make the default constructors of library tag types explicit. * include/bits/mutex.h (defer_lock_t, try_lock_t, adopt_lock_t): Add an explicit default constructor. * include/bits/stl_pair.h (piecewise_construct_t): Likewise. * include/bits/uses_allocator.h (allocator_arg_t): Likewise. * libsupc++/new (nothrow_t): Likewise. * testsuite/17_intro/tag_type_explicit_ctor.cc: New. From-SVN: r230175
This commit is contained in:
parent
e78bede6f7
commit
269fa2a91b
@ -1,3 +1,14 @@
|
||||
2015-11-10 Ville Voutilainen <ville.voutilainen@gmail.com>
|
||||
|
||||
LWG 2510, make the default constructors of library tag types
|
||||
explicit.
|
||||
* include/bits/mutex.h (defer_lock_t, try_lock_t,
|
||||
adopt_lock_t): Add an explicit default constructor.
|
||||
* include/bits/stl_pair.h (piecewise_construct_t): Likewise.
|
||||
* include/bits/uses_allocator.h (allocator_arg_t): Likewise.
|
||||
* libsupc++/new (nothrow_t): Likewise.
|
||||
* testsuite/17_intro/tag_type_explicit_ctor.cc: New.
|
||||
|
||||
2015-11-11 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
PR libstdc++/64651
|
||||
|
@ -129,14 +129,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
#endif // _GLIBCXX_HAS_GTHREADS
|
||||
|
||||
/// Do not acquire ownership of the mutex.
|
||||
struct defer_lock_t { };
|
||||
struct defer_lock_t { explicit defer_lock_t() = default; };
|
||||
|
||||
/// Try to acquire ownership of the mutex without blocking.
|
||||
struct try_to_lock_t { };
|
||||
struct try_to_lock_t { explicit try_to_lock_t() = default; };
|
||||
|
||||
/// Assume the calling thread has already obtained mutex ownership
|
||||
/// and manage it.
|
||||
struct adopt_lock_t { };
|
||||
struct adopt_lock_t { explicit adopt_lock_t() = default; };
|
||||
|
||||
constexpr defer_lock_t defer_lock { };
|
||||
constexpr try_to_lock_t try_to_lock { };
|
||||
|
@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
/// piecewise_construct_t
|
||||
struct piecewise_construct_t { };
|
||||
struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
|
||||
|
||||
/// piecewise_construct
|
||||
constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
|
||||
|
@ -36,7 +36,7 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
/// [allocator.tag]
|
||||
struct allocator_arg_t { };
|
||||
struct allocator_arg_t { explicit allocator_arg_t() = default; };
|
||||
|
||||
constexpr allocator_arg_t allocator_arg = allocator_arg_t();
|
||||
|
||||
|
@ -79,7 +79,12 @@ namespace std
|
||||
};
|
||||
#endif
|
||||
|
||||
struct nothrow_t { };
|
||||
struct nothrow_t
|
||||
{
|
||||
#if __cplusplus >= 201103L
|
||||
explicit nothrow_t() = default;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern const nothrow_t nothrow;
|
||||
|
||||
|
60
libstdc++-v3/testsuite/17_intro/tag_type_explicit_ctor.cc
Normal file
60
libstdc++-v3/testsuite/17_intro/tag_type_explicit_ctor.cc
Normal file
@ -0,0 +1,60 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-std=gnu++11" }
|
||||
|
||||
// Copyright (C) 2015 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 <new>
|
||||
#include <utility>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
void f1(std::nothrow_t);
|
||||
void f2(std::piecewise_construct_t);
|
||||
void f3(std::allocator_arg_t);
|
||||
void f4(std::defer_lock_t);
|
||||
void f5(std::try_to_lock_t);
|
||||
void f6(std::adopt_lock_t);
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
std::nothrow_t v1;
|
||||
std::piecewise_construct_t v2;
|
||||
std::allocator_arg_t v3;
|
||||
std::defer_lock_t v4;
|
||||
std::try_to_lock_t v5;
|
||||
std::try_to_lock_t v6;
|
||||
std::nothrow_t v7 = {}; // { dg-error "explicit" }
|
||||
std::piecewise_construct_t v8 = {}; // { dg-error "explicit" }
|
||||
std::allocator_arg_t v9 = {}; // { dg-error "explicit" }
|
||||
std::defer_lock_t v10 = {}; // { dg-error "explicit" }
|
||||
std::try_to_lock_t v11 = {}; // { dg-error "explicit" }
|
||||
std::try_to_lock_t v12 = {}; // { dg-error "explicit" }
|
||||
f1(std::nothrow_t{});
|
||||
f2(std::piecewise_construct_t{});
|
||||
f3(std::allocator_arg_t{});
|
||||
f4(std::defer_lock_t{});
|
||||
f5(std::try_to_lock_t{});
|
||||
f6(std::adopt_lock_t{});
|
||||
f1({}); // { dg-error "explicit" }
|
||||
f2({}); // { dg-error "explicit" }
|
||||
f3({}); // { dg-error "explicit" }
|
||||
f4({}); // { dg-error "explicit" }
|
||||
f5({}); // { dg-error "explicit" }
|
||||
f6({}); // { dg-error "explicit" }
|
||||
}
|
Loading…
Reference in New Issue
Block a user