public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [v3 PATCH] LWG 2510, make the default constructors of library tag types explicit.
@ 2015-11-10 20:01 Ville Voutilainen
  2015-11-11 14:17 ` Jonathan Wakely
  0 siblings, 1 reply; 9+ messages in thread
From: Ville Voutilainen @ 2015-11-10 20:01 UTC (permalink / raw)
  To: gcc-patches, libstdc++

[-- Attachment #1: Type: text/plain, Size: 503 bytes --]

Tested on Linux-X64.

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.

[-- Attachment #2: lwg2510.diff --]
[-- Type: text/plain, Size: 4607 bytes --]

diff --git a/libstdc++-v3/include/bits/mutex.h b/libstdc++-v3/include/bits/mutex.h
index 43f5b0b..dd27989 100644
--- a/libstdc++-v3/include/bits/mutex.h
+++ b/libstdc++-v3/include/bits/mutex.h
@@ -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 { };
diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h
index dfcd357..d6f6b86 100644
--- a/libstdc++-v3/include/bits/stl_pair.h
+++ b/libstdc++-v3/include/bits/stl_pair.h
@@ -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();
diff --git a/libstdc++-v3/include/bits/uses_allocator.h b/libstdc++-v3/include/bits/uses_allocator.h
index f9ea7d6..a0f084d 100644
--- a/libstdc++-v3/include/bits/uses_allocator.h
+++ b/libstdc++-v3/include/bits/uses_allocator.h
@@ -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();
 
diff --git a/libstdc++-v3/libsupc++/new b/libstdc++-v3/libsupc++/new
index 0f6a05a..8621f73 100644
--- a/libstdc++-v3/libsupc++/new
+++ b/libstdc++-v3/libsupc++/new
@@ -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;
 
diff --git a/libstdc++-v3/testsuite/17_intro/tag_type_explicit_ctor.cc b/libstdc++-v3/testsuite/17_intro/tag_type_explicit_ctor.cc
new file mode 100644
index 0000000..4b9d217
--- /dev/null
+++ b/libstdc++-v3/testsuite/17_intro/tag_type_explicit_ctor.cc
@@ -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" }
+}

^ permalink raw reply	[flat|nested] 9+ messages in thread
* Re: [v3 PATCH] LWG 2510, make the default constructors of library tag types explicit.
@ 2015-11-11 17:18 Dominique d'Humières
  2015-11-11 17:30 ` Jonathan Wakely
  0 siblings, 1 reply; 9+ messages in thread
From: Dominique d'Humières @ 2015-11-11 17:18 UTC (permalink / raw)
  To: ville.voutilainen; +Cc: gcc-patches, libstdc++

Revision r230175

> 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.

 breaks bootstrap

libtool: compile:  /opt/gcc/build_w/./gcc/xgcc -shared-libgcc -B/opt/gcc/build_w/./gcc -nostdinc++ -L/opt/gcc/build_w/x86_64-apple-darwin14.5.0/libstdc++-v3/src -L/opt/gcc/build_w/x86_64-apple-darwin14.5.0/libstdc++-v3/src/.libs -L/opt/gcc/build_w/x86_64-apple-darwin14.5.0/libstdc++-v3/libsupc++/.libs -B/opt/gcc/gcc6w/x86_64-apple-darwin14.5.0/bin/ -B/opt/gcc/gcc6w/x86_64-apple-darwin14.5.0/lib/ -isystem /opt/gcc/gcc6w/x86_64-apple-darwin14.5.0/include -isystem /opt/gcc/gcc6w/x86_64-apple-darwin14.5.0/sys-include -I/opt/gcc/work/libstdc++-v3/../libgcc -I/opt/gcc/build_w/x86_64-apple-darwin14.5.0/libstdc++-v3/include/x86_64-apple-darwin14.5.0 -I/opt/gcc/build_w/x86_64-apple-darwin14.5.0/libstdc++-v3/include -I/opt/gcc/work/libstdc++-v3/libsupc++ -D_GLIBCXX_SHARED -fno-implicit-templates -Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi -fdiagnostics-show-location=once -fvisibility-inlines-hidden -ffunction-sections -fdata-sections -frandom-seed=new_handler.lo -g -O2 -std=gnu++11 -c ../../../../work/libstdc++-v3/libsupc++/new_handler.cc  -fno-common -DPIC -D_GLIBCXX_SHARED -o new_handler.o
../../../../work/libstdc++-v3/libsupc++/new_handler.cc:37:39: error: converting to 'std::nothrow_t' from initializer list would use explicit constructor 'constexpr std::nothrow_t::nothrow_t()'
 const std::nothrow_t std::nothrow = { };
                                       ^
see https://gcc.gnu.org/ml/gcc-regression/2015-11/

Dominique

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-11-12 16:19 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-10 20:01 [v3 PATCH] LWG 2510, make the default constructors of library tag types explicit Ville Voutilainen
2015-11-11 14:17 ` Jonathan Wakely
2015-11-11 17:18 Dominique d'Humières
2015-11-11 17:30 ` Jonathan Wakely
2015-11-12 14:23   ` Gerald Pfeifer
2015-11-12 14:27     ` Ville Voutilainen
2015-11-12 14:36     ` Jonathan Wakely
2015-11-12 16:13       ` Jonathan Wakely
2015-11-12 16:19         ` Gerald Pfeifer

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).