[v3 patch] Implement C++14 N3655 TransformationTraits Redux

Jonathan Wakely jwakely.gcc@gmail.com
Tue Nov 5 23:02:00 GMT 2013


Another C++14 library proposal.  std::aligned_union_t is missing
because we don't have std::aligned_union yet.

I also changed a few tests to use static_assert instead of VERIFY so
they only need to be compiled, not executed, saving a few milliseconds
when running the testsuite ;-)

2013-11-05  Jonathan Wakely  <jwakely.gcc@gmail.com>

        N3655 C++1y TransformationTraits Redux
        * include/std/type_traits (remove_const_t, remove_volatile_t,
        remove_cv_t, add_const_t, add_volatile_t, add_cv_t, remove_reference_t,
        add_lvalue_reference_t, add_rvalue_reference_t, make_signed_t,
        make_unsigned_t, remove_extent_t, remove_all_extents_t,
        remove_pointer_t, add_pointer_t, aligned_storage_t, decay_t,
        enable_if_t, conditional_t, common_type_t, underlying_type_t,
        result_of_t): Define.
        * doc/xml/manual/status_cxx2014.xml: Update.
        * testsuite/20_util/add_lvalue_reference/requirements/typedefs-3.cc:
        New.
        * testsuite/20_util/add_rvalue_reference/requirements/typedefs-3.cc:
        New.
        * testsuite/20_util/common_type/requirements/typedefs-3.cc: New.
        * testsuite/20_util/conditional/requirements/typedefs-2.cc: New.
        * testsuite/20_util/decay/requirements/typedefs-2.cc: New.
        * testsuite/20_util/enable_if/requirements/typedefs-2.cc: New.
        * testsuite/20_util/make_signed/requirements/typedefs-3.cc: New.
        * testsuite/20_util/make_unsigned/requirements/typedefs-3.cc: New.
        * testsuite/20_util/remove_reference/requirements/typedefs.cc: New.
        * testsuite/20_util/result_of/requirements/typedefs.cc: New.
        * testsuite/20_util/underlying_type/requirements/typedefs-3.cc: New.
        * testsuite/20_util/common_type/requirements/typedefs-2.cc: Change to
        compile-only test.
        * testsuite/20_util/decay/requirements/typedefs.cc: Likewise.
        * testsuite/20_util/make_signed/requirements/typedefs-1.cc: Likewise.
        * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error
        line number.
        * testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
        Likewise.
        * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
        Likewise.

Tested x86_64-linux, committed to trunk.
-------------- next part --------------
commit 50280a2de7a786f385a30417c336bf9417b2085a
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Tue Nov 5 17:56:58 2013 +0000

    	N3655 C++1y TransformationTraits Redux
    	* include/std/type_traits (remove_const_t, remove_volatile_t,
    	remove_cv_t, add_const_t, add_volatile_t, add_cv_t, remove_reference_t,
    	add_lvalue_reference_t, add_rvalue_reference_t, make_signed_t,
    	make_unsigned_t, remove_extent_t, remove_all_extents_t,
    	remove_pointer_t, add_pointer_t, aligned_storage_t, decay_t,
    	enable_if_t, conditional_t, common_type_t, underlying_type_t,
    	result_of_t): Define.
    	* doc/xml/manual/status_cxx2014.xml: Update.
    	* testsuite/20_util/add_lvalue_reference/requirements/typedefs-3.cc:
    	New.
    	* testsuite/20_util/add_rvalue_reference/requirements/typedefs-3.cc:
    	New.
    	* testsuite/20_util/common_type/requirements/typedefs-3.cc: New.
    	* testsuite/20_util/conditional/requirements/typedefs-2.cc: New.
    	* testsuite/20_util/decay/requirements/typedefs-2.cc: New.
    	* testsuite/20_util/enable_if/requirements/typedefs-2.cc: New.
    	* testsuite/20_util/make_signed/requirements/typedefs-3.cc: New.
    	* testsuite/20_util/make_unsigned/requirements/typedefs-3.cc: New.
    	* testsuite/20_util/remove_reference/requirements/typedefs.cc: New.
    	* testsuite/20_util/result_of/requirements/typedefs.cc: New.
    	* testsuite/20_util/underlying_type/requirements/typedefs-3.cc: New.
    	* testsuite/20_util/common_type/requirements/typedefs-2.cc: Change to
    	compile-only test.
    	* testsuite/20_util/decay/requirements/typedefs.cc: Likewise.
    	* testsuite/20_util/make_signed/requirements/typedefs-1.cc: Likewise.
    	* testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error
    	line number.
    	* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
    	Likewise.
    	* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
    	Likewise.

diff --git a/libstdc++-v3/doc/xml/manual/status_cxx2014.xml b/libstdc++-v3/doc/xml/manual/status_cxx2014.xml
index b368a81..0e0ac37 100644
--- a/libstdc++-v3/doc/xml/manual/status_cxx2014.xml
+++ b/libstdc++-v3/doc/xml/manual/status_cxx2014.xml
@@ -178,7 +178,6 @@ particular release.
 
 
     <row>
-      <?dbhtml bgcolor="#C8C8B0" ?>
       <entry>
 	<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3658.html">
 	  N3658
@@ -202,7 +201,6 @@ particular release.
 
 
     <row>
-      <?dbhtml bgcolor="#C8C8B0" ?>
       <entry>
 	<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2012/n3421.htm">
 	  N3421
@@ -227,26 +225,24 @@ particular release.
 
 
     <row>
-      <?dbhtml bgcolor="#C8B0B0" ?>
       <entry>
-	<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3672.html">
+	<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3793.html">
 	  N3672
 	</link>
       </entry>
       <entry>A proposal to add a utility class to represent optional objects</entry>
-      <entry>N</entry>
-      <entry/>
+      <entry>Y</entry>
+      <entry>Moved from C++14 to Library Fundamentals TS</entry>
     </row>
 
     <row>
-      <?dbhtml bgcolor="#C8B0B0" ?>
       <entry>
 	<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3655.pdf">
 	  N3655
 	</link>
       </entry>
       <entry>TransformationTraits Redux</entry>
-      <entry>N</entry>
+      <entry>Y</entry>
       <entry/>
     </row>
 
@@ -259,7 +255,7 @@ particular release.
       </entry>
       <entry>C++ Dynamic Arrays</entry>
       <entry>N</entry>
-      <entry/>
+      <entry>Moved from C++14 to Library Fundamentals TS</entry>
     </row>
 
     <row>
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index eef9df6..3239564 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -1438,6 +1438,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       add_const<typename add_volatile<_Tp>::type>::type     type;
     };
 
+#if __cplusplus > 201103L
+  /// Alias template for remove_const
+  template<typename _Tp>
+    using remove_const_t = typename remove_const<_Tp>::type;
+
+  /// Alias template for remove_volatile
+  template<typename _Tp>
+    using remove_volatile_t = typename remove_volatile<_Tp>::type;
+
+  /// Alias template for remove_cv
+  template<typename _Tp>
+    using remove_cv_t = typename remove_cv<_Tp>::type;
+
+  /// Alias template for add_const
+  template<typename _Tp>
+    using add_const_t = typename add_const<_Tp>::type;
+
+  /// Alias template for add_volatile
+  template<typename _Tp>
+    using add_volatile_t = typename add_volatile<_Tp>::type;
+
+  /// Alias template for add_cv
+  template<typename _Tp>
+    using add_cv_t = typename add_cv<_Tp>::type;
+#endif
 
   // Reference transformations.
 
@@ -1482,6 +1507,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     : public __add_rvalue_reference_helper<_Tp>
     { };
 
+#if __cplusplus > 201103L
+  /// Alias template for remove_reference
+  template<typename _Tp>
+    using remove_reference_t = typename remove_reference<_Tp>::type;
+
+  /// Alias template for add_lvalue_reference
+  template<typename _Tp>
+    using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
+
+  /// Alias template for add_rvalue_reference
+  template<typename _Tp>
+    using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
+#endif
 
   // Sign modifications.
 
@@ -1679,6 +1717,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<>
     struct make_signed<bool>;
 
+#if __cplusplus > 201103L
+  /// Alias template for make_signed
+  template<typename _Tp>
+    using make_signed_t = typename make_signed<_Tp>::type;
+
+  /// Alias template for make_unsigned
+  template<typename _Tp>
+    using make_unsigned_t = typename make_unsigned<_Tp>::type;
+#endif
 
   // Array modifications.
 
@@ -1708,6 +1755,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct remove_all_extents<_Tp[]>
     { typedef typename remove_all_extents<_Tp>::type     type; };
 
+#if __cplusplus > 201103L
+  /// Alias template for remove_extent
+  template<typename _Tp>
+    using remove_extent_t = typename remove_extent<_Tp>::type;
+
+  /// Alias template for remove_all_extents
+  template<typename _Tp>
+    using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
+#endif
 
   // Pointer modifications.
 
@@ -1740,6 +1796,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     : public __add_pointer_helper<_Tp>
     { };
 
+#if __cplusplus > 201103L
+  /// Alias template for remove_pointer
+  template<typename _Tp>
+    using remove_pointer_t = typename remove_pointer<_Tp>::type;
+
+  /// Alias template for add_pointer
+  template<typename _Tp>
+    using add_pointer_t = typename add_pointer<_Tp>::type;
+#endif
 
   template<std::size_t _Len>
     struct __aligned_storage_msa
@@ -2102,6 +2167,37 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       >::type
     { };
 
+#if __cplusplus > 201103L
+  /// Alias template for aligned_storage
+  template<size_t _Len, size_t _Align =
+	    __alignof__(typename __aligned_storage_msa<_Len>::__type)>
+    using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
+
+  /// Alias template for decay
+  template<typename _Tp>
+    using decay_t = typename decay<_Tp>::type;
+
+  /// Alias template for enable_if
+  template<bool _Cond, typename _Tp = void>
+    using enable_if_t = typename enable_if<_Cond, _Tp>::type;
+
+  /// Alias template for conditional
+  template<bool _Cond, typename _Iftrue, typename _Iffalse>
+    using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;
+
+  /// Alias template for common_type
+  template<typename... _Tp>
+    using common_type_t = typename common_type<_Tp...>::type;
+
+  /// Alias template for underlying_type
+  template<typename _Tp>
+    using underlying_type_t = typename underlying_type<_Tp>::type;
+
+  /// Alias template for result_of
+  template<typename _Tp>
+    using result_of_t = typename result_of<_Tp>::type;
+#endif
+
   /// @} group metaprogramming
 	
   /**
diff --git a/libstdc++-v3/testsuite/20_util/add_lvalue_reference/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/add_lvalue_reference/requirements/typedefs.cc
new file mode 100644
index 0000000..24e73cc
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/add_lvalue_reference/requirements/typedefs.cc
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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/>.
+
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+using namespace std;
+
+static_assert( is_same<typename add_lvalue_reference<long>::type,
+                       add_lvalue_reference_t<long>>(),
+               "add_lvalue_reference_t" );
diff --git a/libstdc++-v3/testsuite/20_util/add_rvalue_reference/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/add_rvalue_reference/requirements/typedefs.cc
new file mode 100644
index 0000000..18a6964
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/add_rvalue_reference/requirements/typedefs.cc
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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/>.
+
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+using namespace std;
+
+static_assert( is_same<typename add_rvalue_reference<long>::type,
+                       add_rvalue_reference_t<long>>(),
+               "add_rvalue_reference_t" );
diff --git a/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-2.cc
index 07a694b..f662d32 100644
--- a/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-2.cc
+++ b/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-2.cc
@@ -1,4 +1,5 @@
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
 // 2009-11-12  Paolo Carlini  <paolo.carlini@oracle.com>
 //
 // Copyright (C) 2009-2013 Free Software Foundation, Inc.
@@ -19,53 +20,53 @@
 // <http://www.gnu.org/licenses/>.
 
 #include <type_traits>
-#include <testsuite_hooks.h>
 
 // DR 1255.
 void test01()
 {
-  bool test __attribute__((unused)) = true;
   using std::common_type;
   using std::is_same;
 
-  VERIFY( (is_same<common_type<void>::type, void>::value) );
-  VERIFY( (is_same<common_type<const void>::type, void>::value) );
-  VERIFY( (is_same<common_type<volatile void>::type, void>::value) );
-  VERIFY( (is_same<common_type<const volatile void>::type, void>::value) );
+  static_assert( is_same<common_type<void>::type, void>(),
+                 "common_type<void>" );
+  static_assert( is_same<common_type<const void>::type, void>(),
+                 "common_type<const void>" );
+  static_assert( is_same<common_type<volatile void>::type, void>(),
+                 "common_type<volatile void>" );
+  static_assert( is_same<common_type<const volatile void>::type, void>(),
+                 "common_type<const volatile void>" );
 
-  VERIFY( (is_same<common_type<void, void>::type, void>::value) );
-  VERIFY( (is_same<common_type<void, const void>::type, void>::value) );
-  VERIFY( (is_same<common_type<void, volatile void>::type, void>::value) );
-  VERIFY( (is_same<common_type<void, const volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const void, void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const void, const void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const void, volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const void, const volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<volatile void, void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<volatile void, volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<volatile void, const void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<volatile void, const volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const volatile void, void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const volatile void, const void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const volatile void, volatile void>::type,
-	           void>::value) );
-  VERIFY( (is_same<common_type<const volatile void, const volatile void>::type,
-	           void>::value) );
- }
-
-int main()
-{
-  test01();
-  return 0;
+  static_assert( is_same<common_type<void, void>::type, void>(),
+                 "common_type<void, void>" );
+  static_assert( is_same<common_type<void, const void>::type, void>(),
+                 "common_type<void, const void>" );
+  static_assert( is_same<common_type<void, volatile void>::type, void>(),
+                 "common_type<void, volatile void>" );
+  static_assert( is_same<common_type<void, const volatile void>::type, void>(),
+                 "common_type<void, const volatile void>" );
+  static_assert( is_same<common_type<const void, void>::type, void>(),
+                 "common_type<const void, void>" );
+  static_assert( is_same<common_type<const void, const void>::type, void>(),
+                 "common_type<const void, const void>" );
+  static_assert( is_same<common_type<const void, volatile void>::type, void>(),
+                 "common_type<const void, volatile void>" );
+  static_assert( is_same<common_type<const void, const volatile void>::type,
+	           void>(), "common_type<const void, const volatile void>" );
+  static_assert( is_same<common_type<volatile void, void>::type, void>(),
+                 "common_type<volatile void, void>" );
+  static_assert( is_same<common_type<volatile void, volatile void>::type,
+	           void>(), "common_type<volatile void, volatile void>" );
+  static_assert( is_same<common_type<volatile void, const void>::type,
+	           void>(), "common_type<volatile void, const void>" );
+  static_assert( is_same<common_type<volatile void, const volatile void>::type,
+	           void>(), "common_type<volatile void, const volatile void>" );
+  static_assert( is_same<common_type<const volatile void, void>::type, void>(),
+	         "common_type<const volatile void, const volatile void>" );
+  static_assert( is_same<common_type<const volatile void, const void>::type,
+	           void>(), "common_type<const volatile void, const void>" );
+  static_assert( is_same<common_type<const volatile void, volatile void>::type,
+	           void>(), "common_type<const volatile void, volatile void>" );
+  static_assert( is_same<common_type<const volatile void, const volatile void>::type,
+	           void>(),
+	         "common_type<const volatile void, const volatile void>" );
 }
diff --git a/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-3.cc b/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-3.cc
new file mode 100644
index 0000000..52852fc
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/common_type/requirements/typedefs-3.cc
@@ -0,0 +1,27 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+//
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+static_assert( is_same<common_type<int, long, char, unsigned>::type,
+                       common_type_t<int, long, char, unsigned>>(),
+               "common_type_t" );
diff --git a/libstdc++-v3/testsuite/20_util/conditional/requirements/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/conditional/requirements/typedefs-2.cc
new file mode 100644
index 0000000..94edeea
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/conditional/requirements/typedefs-2.cc
@@ -0,0 +1,33 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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/>.
+
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+using namespace std;
+
+static_assert( is_same<typename conditional<true, long, void>::type,
+                       conditional_t<true, long, void>>(),
+               "conditional_t<true, ...>" );
+static_assert( is_same<typename conditional<false, long, void>::type,
+                       conditional_t<false, long, void>>(),
+               "conditional_t<false, ...>" );
diff --git a/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs-2.cc
new file mode 100644
index 0000000..774e22e
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs-2.cc
@@ -0,0 +1,35 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+template<typename Trait, typename Result>
+  using test = is_same<typename Trait::type, Result>;
+
+static_assert( test<decay<bool>, decay_t<bool>>(), "decay<bool>" );
+static_assert( test<decay<const int>, decay_t<const int>>(),
+               "decay<const int>" );
+static_assert( test<decay<int[4]>, decay_t<int[4]>>(), "decay<int[4]>" );
+typedef void (fn_type) ();
+static_assert( test<decay<fn_type>, decay_t<fn_type>>(), "decay<fn_type>" );
+typedef void (cfn_type) () const;
+static_assert( test<decay<cfn_type>, decay_t<cfn_type>>(), "decay<cfn_type>" );
diff --git a/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc
index 51b2c5f..11589e4 100644
--- a/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc
+++ b/libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc
@@ -1,4 +1,5 @@
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
@@ -19,38 +20,31 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-#include <cstdlib>
 #include <type_traits>
-#include <testsuite_hooks.h>
 
 void test01()
 {
-  bool test __attribute__((unused)) = true;
   using std::decay;
   using std::is_same;
 
   // Positive tests.
   typedef decay<bool>::type     	test1_type;
-  VERIFY( (is_same<test1_type, bool>::value) );
+  static_assert( is_same<test1_type, bool>(), "decay<bool>" );
 
   // NB: DR 705.
   typedef decay<const int>::type  	test2_type;
-  VERIFY( (is_same<test2_type, int>::value) );
+  static_assert( is_same<test2_type, int>(), "decay<const int>" );
 
   typedef decay<int[4]>::type     	test3_type;
-  VERIFY( (is_same<test3_type, std::remove_extent<int[4]>::type*>::value) );
+  static_assert( is_same<test3_type, std::remove_extent<int[4]>::type*>(),
+                 "decay<int[4]>" );
 
   typedef void (fn_type) ();
   typedef decay<fn_type>::type  	test4_type;
-  VERIFY( (is_same<test4_type, std::add_pointer<fn_type>::type>::value) );
+  static_assert( is_same<test4_type, std::add_pointer<fn_type>::type>(),
+                 "decay<fn_type>" );
 
   typedef void (cfn_type) () const;
   typedef decay<cfn_type>::type  	test5_type;
-  VERIFY( (is_same<test5_type, cfn_type>::value) );
-}
-
-int main()
-{
-  test01();
-  return 0;
+  static_assert( is_same<test5_type, cfn_type>(), "decay<cfn_type>" );
 }
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 1aeba82..d01bdf3 100644
--- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
@@ -19,7 +19,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-error "static assertion failed" "" { target *-*-* } 1938 }
+// { dg-error "static assertion failed" "" { target *-*-* } 2003 }
 
 #include <utility>
 
diff --git a/libstdc++-v3/testsuite/20_util/enable_if/requirements/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/enable_if/requirements/typedefs-2.cc
new file mode 100644
index 0000000..42b7f4fe
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/enable_if/requirements/typedefs-2.cc
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++1y" }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+static_assert( is_same<enable_if<true>::type, enable_if_t<true>>(),
+               "enable_if_t<true>" );
+struct X;
+static_assert( is_same<enable_if<true, X>::type, enable_if_t<true, X>>(),
+               "enable_if_t<true, X>" );
diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc
index a0e70e6..18791c6 100644
--- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc
+++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc
@@ -1,4 +1,5 @@
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
@@ -20,55 +21,57 @@
 // <http://www.gnu.org/licenses/>.
 
 #include <type_traits>
-#include <testsuite_hooks.h>
 
 enum test_enum { first_selection };
 
 void test01()
 {
-  bool test __attribute__((unused)) = true;
   using std::make_signed;
   using std::is_same;
   using std::is_signed;
 
   // Positive tests.
   typedef make_signed<const int>::type  	test2_type;
-  VERIFY( (is_same<test2_type, const int>::value) );
+  static_assert( is_same<test2_type, const int>::value,
+                 "make_signed<const int>" );
 
   typedef make_signed<const unsigned int>::type  	test21c_type;
-  VERIFY( (is_same<test21c_type, const signed int>::value) );
+  static_assert( is_same<test21c_type, const signed int>::value,
+                 "make_signed<const unsigned int>" );
 
   typedef make_signed<volatile unsigned int>::type  	test21v_type;
-  VERIFY( (is_same<test21v_type, volatile signed int>::value) );
+  static_assert( is_same<test21v_type, volatile signed int>::value,
+                 "make_signed<volatile unsigned int>" );
 
   typedef make_signed<const volatile unsigned int>::type  	test21cv_type;
-  VERIFY( (is_same<test21cv_type, const volatile signed int>::value) );
+  static_assert( is_same<test21cv_type, const volatile signed int>::value,
+                 "make_signed<const volatile unsigned int>" );
 
   typedef make_signed<const char>::type  	test22_type;
-  VERIFY( (is_same<test22_type, const signed char>::value) );
+  static_assert( is_same<test22_type, const signed char>::value,
+                 "make_signed<const char>" );
 
 #ifdef _GLIBCXX_USE_WCHAR_T
   typedef make_signed<volatile wchar_t>::type  	test23_type;
-  VERIFY( (is_same<test23_type, volatile signed wchar_t>::value) );
+  static_assert( is_same<test23_type, volatile signed wchar_t>::value,
+                 "make_signed<volatile wchar_t>" );
 #endif
 
   // Chapter 48, chapter 20. Smallest rank such that new signed type same size.
   typedef make_signed<test_enum>::type  	test24_type;
-  VERIFY( is_signed<test24_type>::value );
-  VERIFY( sizeof(test24_type) == sizeof(test_enum) );
+  static_assert( is_signed<test24_type>::value,
+                 "make_signed<test_enum> makes signed type" );
+  static_assert( sizeof(test24_type) == sizeof(test_enum),
+                 "make_signed<test_enum> makes type of same size" );
 
   // GNU Extensions.
 #ifdef _GLIBCXX_USE_INT128
   typedef make_signed<unsigned __int128>::type  test25_type;
-  VERIFY( (is_same<test25_type, __int128>::value) );
+  static_assert( is_same<test25_type, __int128>::value,
+                 "make_signed<unsigned __int128>" );
 
   typedef make_signed<__int128>::type  	        test26_type;
-  VERIFY( (is_same<test26_type, __int128>::value) );
+  static_assert( is_same<test26_type, __int128>::value,
+                 "make_signed<__int128>" );
 #endif
 }
-
-int main()
-{
-  test01();
-  return 0;
-}
diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-3.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-3.cc
new file mode 100644
index 0000000..f769004
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-3.cc
@@ -0,0 +1,35 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+template<typename Trait, typename Result>
+  using test = is_same<typename Trait::type, Result>;
+
+static_assert( test<make_signed<const int>, make_signed_t<const int>>(),
+               "make_signed_t<const int>" );
+
+static_assert( test<make_signed<unsigned>, make_signed_t<unsigned>>(),
+               "make_signed_t<unsigned>" );
+
+static_assert( test<make_signed<char>, make_signed_t<char>>(),
+               "make_signed_t<char>" );
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 53090b3..30a19cf 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
@@ -48,5 +48,5 @@ void test01()
 // { dg-error "required from here" "" { target *-*-* } 40 }
 // { dg-error "required from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1676 }
-// { dg-error "declaration of" "" { target *-*-* } 1640 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1714 }
+// { dg-error "declaration of" "" { target *-*-* } 1678 }
diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-3.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-3.cc
new file mode 100644
index 0000000..4bcabe5
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-3.cc
@@ -0,0 +1,35 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+template<typename Trait, typename Result>
+  using test = is_same<typename Trait::type, Result>;
+
+static_assert( test<make_unsigned<const int>, make_unsigned_t<const int>>(),
+               "make_unsigned_t<const int>" );
+
+static_assert( test<make_unsigned<unsigned>, make_unsigned_t<unsigned>>(),
+               "make_unsigned_t<unsigned>" );
+
+static_assert( test<make_unsigned<char>, make_unsigned_t<char>>(),
+               "make_unsigned_t<char>" );
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 7b7e599..567908e 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
@@ -48,5 +48,5 @@ void test01()
 // { dg-error "required from here" "" { target *-*-* } 40 }
 // { dg-error "required from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1594 }
-// { dg-error "declaration of" "" { target *-*-* } 1558 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1632 }
+// { dg-error "declaration of" "" { target *-*-* } 1596 }
diff --git a/libstdc++-v3/testsuite/20_util/remove_reference/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/remove_reference/requirements/typedefs.cc
new file mode 100644
index 0000000..209cca4
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/remove_reference/requirements/typedefs.cc
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+static_assert( is_same<remove_reference<int>::type, remove_reference_t<int>>(),
+               "remove_reference_t<int>" );
+static_assert( is_same<remove_reference<int&>::type, remove_reference_t<int&>>(),
+               "remove_reference_t<int&>" );
+static_assert( is_same<remove_reference<int&&>::type, remove_reference_t<int&&>>(),
+               "remove_reference_t<int&&>" );
diff --git a/libstdc++-v3/testsuite/20_util/result_of/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/result_of/requirements/typedefs.cc
new file mode 100644
index 0000000..7c00704
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/result_of/requirements/typedefs.cc
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+
+// Copyright (C) 2013 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>
+
+using namespace std;
+
+using F1 = char(*)(char);
+static_assert( is_same<result_of<F1(int)>::type, result_of_t<F1(int)>>(),
+               "result_of_t<F1(int)>" );
+
+struct X { };
+using F2 = int X::*;
+static_assert( is_same<result_of<F2(X)>::type, result_of_t<F2(X)>>(),
+               "result_of_t<F2(X)>" );
diff --git a/libstdc++-v3/testsuite/20_util/underlying_type/requirements/typedefs-3.cc b/libstdc++-v3/testsuite/20_util/underlying_type/requirements/typedefs-3.cc
new file mode 100644
index 0000000..a4c5257
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/underlying_type/requirements/typedefs-3.cc
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++1y" }
+// { dg-do compile }
+//
+// Copyright (C) 2013 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/>.
+
+//
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+using namespace std;
+
+enum E : long { };
+
+static_assert( is_same<typename underlying_type<E>::type,
+                       underlying_type_t<E>>(),
+               "underlying_type_t" );


More information about the Libstdc++ mailing list