Patchwork [v3] libstdc++/50441

login
register
mail settings
Submitter Paolo Carlini
Date Sept. 17, 2011, 11:54 p.m.
Message ID <4E753320.5000008@oracle.com>
Download mbox | patch
Permalink /patch/115176/
State New
Headers show

Comments

Paolo Carlini - Sept. 17, 2011, 11:54 p.m.
Hi,

tested x86_64-linux, committed to mainline.

Paolo.

///////////////////
2011-09-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/50441
	* acinclude.m4 ([GLIBCXX_ENABLE_INT128_FLOAT128]): Add.
	* configure.ac: Call it.
	* include/std/type_traits (__is_integral_helper<__int128_t>,
	__is_integral_helper<__uint128_t>,
	__is_floating_point_helper<__float128>,
	__make_unsigned<__int128_t>, __make_signed<__uint128_t>): Add.
	* testsuite/20_util/make_signed/requirements/typedefs-1.cc: Extend.
	* testsuite/20_util/make_signed/requirements/typedefs-2.cc: Likewise.
	* testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Likewise.
	* testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: Likewise.
	* testsuite/20_util/is_signed/value.cc: Likewise.
	* testsuite/20_util/is_unsigned/value.cc: Likewise.
	* testsuite/20_util/is_integral/value.cc: Likewise.
	* testsuite/20_util/is_floating_point/value.cc: New.
	* testsuite/20_util/is_floating_point/requirements/typedefs.cc:
	Likewise.
	* testsuite/20_util/is_floating_point/requirements/
	explicit_instantiation.cc: Likewise.
	* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Adjust
	dg-error line numbers.
	* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
	Likewise.
	* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
	* configure: Regenerate.
	* config.h.in: Likewise.
Marc Glisse - Sept. 18, 2011, 7:03 a.m.
On Sun, 18 Sep 2011, Paolo Carlini wrote:

> tested x86_64-linux, committed to mainline.

Hello,

bugzilla seems to be down, so let me write it here:

the testsuite uses #ifdef __SIZEOF_INT128__ to test for the availability 
of a 128 bit integer type. I haven't seen a similar define for float128, 
you might want to request it. In any case, a way to check for the 
availability of these types should be documented in the manual...
Paolo Carlini - Sept. 18, 2011, 8:58 a.m.
On 09/18/2011 09:03 AM, Marc Glisse wrote:
> the testsuite uses #ifdef __SIZEOF_INT128__ to test for the 
> availability of a 128 bit integer type. I haven't seen a similar 
> define for float128,
Thanks. For now I went for a configure test, consistently for int and 
float, which also allows to check whether the type is the same as an 
existing one (otherwise we risk bad errors due to duplicate 
specializations, well possible right now for __float128!).

Paolo.
Marc Glisse - Sept. 18, 2011, 9:07 a.m.
On Sun, 18 Sep 2011, Paolo Carlini wrote:

> On 09/18/2011 09:03 AM, Marc Glisse wrote:
>> the testsuite uses #ifdef __SIZEOF_INT128__ to test for the availability of 
>> a 128 bit integer type. I haven't seen a similar define for float128,
> Thanks. For now I went for a configure test, consistently for int and float, 
> which also allows to check whether the type is the same as an existing one 
> (otherwise we risk bad errors due to duplicate specializations, well possible 
> right now for __float128!).

Indeed!
The documentation is not clear on whether __int128 and __float128 may be 
the same types as say long long and long double, or they are different 
types even if they have the same size (the doc was written for C, where it 
doesn't matter as much).
Paolo Carlini - Sept. 18, 2011, 12:22 p.m.
On 09/18/2011 11:07 AM, Marc Glisse wrote:
> Indeed!
> The documentation is not clear on whether __int128 and __float128 may 
> be the same types as say long long and long double, or they are 
> different types even if they have the same size (the doc was written 
> for C, where it doesn't matter as much).
For sure __float80 is just long double on x86. And by the way, given the 
infrastructure in place, it would be easy to safely add the former too, 
if somebody asks for it (I think it's currently supported only for 
targets where it actually just boils down to long double, though)

Paolo.
Joseph S. Myers - Sept. 18, 2011, 6:36 p.m.
On Sun, 18 Sep 2011, Marc Glisse wrote:

> On Sun, 18 Sep 2011, Paolo Carlini wrote:
> 
> > On 09/18/2011 09:03 AM, Marc Glisse wrote:
> > > the testsuite uses #ifdef __SIZEOF_INT128__ to test for the availability
> > > of a 128 bit integer type. I haven't seen a similar define for float128,
> > Thanks. For now I went for a configure test, consistently for int and float,
> > which also allows to check whether the type is the same as an existing one
> > (otherwise we risk bad errors due to duplicate specializations, well
> > possible right now for __float128!).
> 
> Indeed!
> The documentation is not clear on whether __int128 and __float128 may be the
> same types as say long long and long double, or they are different types even
> if they have the same size (the doc was written for C, where it doesn't matter
> as much).

__int128 and unsigned __int128 are currently separate types, just like 
long and long long are always distinct.  I'm not sure you should rely on 
them being distinct on any hypothetical future target where long long is 
128-bit; if we added __int64 I'm not sure having it a distinct type would 
be the most useful implementation.

__int128_t and __uint128_t are legacy typedefs for __int128 and unsigned 
__int128.

__float128 and __float80 are typedefs.  It appears (without testing) that 
IA64 __float80 is always a distinct type but otherwise those names will be 
typedefs for long double if they have the same representation and 
alignment as long double.
Paolo Carlini - Sept. 18, 2011, 6:58 p.m.
On 09/18/2011 08:36 PM, Joseph S. Myers wrote:
> __int128_t and __uint128_t are legacy typedefs for __int128 and 
> unsigned __int128.
I didn't realize this. Thus I guess, for 50441 and also for 40856 (which 
I'm about to do) better doing everything in terms of __int128 and 
unsigned __int128.

Paolo.
Paolo Carlini - Sept. 18, 2011, 10:29 p.m.
On 09/18/2011 08:58 PM, Paolo Carlini wrote:
> On 09/18/2011 08:36 PM, Joseph S. Myers wrote:
>> __int128_t and __uint128_t are legacy typedefs for __int128 and 
>> unsigned __int128.
> I didn't realize this. Thus I guess, for 50441 and also for 40856 
> (which I'm about to do) better doing everything in terms of __int128 
> and unsigned __int128.
I'm currently blocked by the following issue. If I try to compile, with 
-std=gnu++98 (the default for C++) and -pedantic-errors:

template<typename T>
struct limits;

template<>
struct limits<__int128> { };

template<>
struct limits<unsigned __int128> { };

I get:

a.cc:8:26: error: ISO C++ does not support ‘__int128’ for ‘type name’ 
[-pedantic]
a.cc:8:10: error: redefinition of ‘struct limits<__int128>’
a.cc:5:10: error: previous definition of ‘struct limits<__int128>’

this of course does *not* happen with __int128_t and __uint128_t. 
Apparently I can suppress such -pedantic and -pedantic-errors issues in 
pragma system_header headers, but then resurface when using PCHs. Please 
let me know if the above is supposed to work in a gnu++98 (or gnu++0x) 
system header also together with any -pedantic options, or I should 
really use __int128_t and __uint128_t for the time being, I would be 
certainly ok with the latter.

Thanks!
Paolo.
Paolo Carlini - Sept. 19, 2011, 12:59 a.m.
Hi again,

just little more details:
> I'm currently blocked by the following issue. If I try to compile, 
> with -std=gnu++98 (the default for C++) and -pedantic-errors:
>
> template<typename T>
> struct limits;
>
> template<>
> struct limits<__int128> { };
>
> template<>
> struct limits<unsigned __int128> { };
>
> I get:
>
> a.cc:8:26: error: ISO C++ does not support ‘__int128’ for ‘type name’ 
> [-pedantic]
> a.cc:8:10: error: redefinition of ‘struct limits<__int128>’
> a.cc:5:10: error: previous definition of ‘struct limits<__int128>’
If I remove the second specialization:

template<typename T>
struct limits;

template<>
struct limits<__int128> { };

then it compiles just fine, with -pedantic and -pedantic-errors too. 
Thus, it looks like something is definitely wrong here. Well, the first 
and second line of the error message above - wrongly talking about 
__int128 instead of unsigned __int128, should also be an hint...

Thanks again,
Paolo.

Patch

Index: configure.ac
===================================================================
--- configure.ac	(revision 178930)
+++ configure.ac	(working copy)
@@ -114,6 +114,7 @@ 
 GLIBCXX_ENABLE_THREADS
 GLIBCXX_ENABLE_ATOMIC_BUILTINS
 GLIBCXX_ENABLE_DECIMAL_FLOAT
+GLIBCXX_ENABLE_INT128_FLOAT128
 
 # Checks for compiler support that doesn't require linking.
 GLIBCXX_CHECK_COMPILER_FEATURES
Index: include/std/type_traits
===================================================================
--- include/std/type_traits	(revision 178930)
+++ include/std/type_traits	(working copy)
@@ -213,6 +213,16 @@ 
     struct __is_integral_helper<unsigned long long>
     : public true_type { };
 
+#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
+  template<>
+    struct __is_integral_helper<__int128_t>
+    : public true_type { };
+
+  template<>
+    struct __is_integral_helper<__uint128_t>
+    : public true_type { };
+#endif
+
   /// is_integral
   template<typename _Tp>
     struct is_integral
@@ -236,6 +246,12 @@ 
     struct __is_floating_point_helper<long double>
     : public true_type { };
 
+#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+  template<>
+    struct __is_floating_point_helper<__float128>
+    : public true_type { };
+#endif
+
   /// is_floating_point
   template<typename _Tp>
     struct is_floating_point
@@ -1398,6 +1414,12 @@ 
     struct __make_unsigned<long long>
     { typedef unsigned long long __type; };
 
+#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
+  template<>
+    struct __make_unsigned<__int128_t>
+    { typedef __uint128_t __type; };
+#endif
+
   // Select between integral and enum: not possible to be both.
   template<typename _Tp, 
 	   bool _IsInt = is_integral<_Tp>::value,
@@ -1474,6 +1496,12 @@ 
     struct __make_signed<unsigned long long>
     { typedef signed long long __type; };
 
+#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
+  template<>
+    struct __make_signed<__uint128_t>
+    { typedef __int128_t __type; };
+#endif
+
   // Select between integral and enum: not possible to be both.
   template<typename _Tp, 
 	   bool _IsInt = is_integral<_Tp>::value,
Index: testsuite/20_util/make_signed/requirements/typedefs_neg.cc
===================================================================
--- testsuite/20_util/make_signed/requirements/typedefs_neg.cc	(revision 178931)
+++ testsuite/20_util/make_signed/requirements/typedefs_neg.cc	(working copy)
@@ -48,5 +48,5 @@ 
 // { dg-error "required from here" "" { target *-*-* } 40 }
 // { dg-error "required from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1517 }
-// { dg-error "declaration of" "" { target *-*-* } 1481 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1545 }
+// { dg-error "declaration of" "" { target *-*-* } 1509 }
Index: testsuite/20_util/make_signed/requirements/typedefs-1.cc
===================================================================
--- testsuite/20_util/make_signed/requirements/typedefs-1.cc	(revision 178931)
+++ testsuite/20_util/make_signed/requirements/typedefs-1.cc	(working copy)
@@ -2,7 +2,7 @@ 
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 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
@@ -53,9 +53,18 @@ 
 #endif
 
   // Chapter 48, chapter 20. Smallest rank such that new signed type same size.
-  typedef make_signed<test_enum>::type  	test25_type;
-  VERIFY( is_signed<test25_type>::value );
-  VERIFY( sizeof(test25_type) == sizeof(test_enum) );
+  typedef make_signed<test_enum>::type  	test24_type;
+  VERIFY( is_signed<test24_type>::value );
+  VERIFY( sizeof(test24_type) == sizeof(test_enum) );
+
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  typedef make_signed<__uint128_t>::type  	test25_type;
+  VERIFY( (is_same<test25_type, __int128_t>::value) );
+
+  typedef make_signed<__int128_t>::type  	test26_type;
+  VERIFY( (is_same<test26_type, __int128_t>::value) );
+#endif
 }
 
 int main()
Index: testsuite/20_util/make_signed/requirements/typedefs-2.cc
===================================================================
--- testsuite/20_util/make_signed/requirements/typedefs-2.cc	(revision 178931)
+++ testsuite/20_util/make_signed/requirements/typedefs-2.cc	(working copy)
@@ -3,7 +3,7 @@ 
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
-// Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2009, 2010, 2011 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
@@ -53,8 +53,17 @@ 
   VERIFY( (is_same<test23_type, volatile signed wchar_t>::value) );
 #endif
 
-  typedef make_signed<test_enum>::type  	test25_type;
-  VERIFY( (is_same<test25_type, short>::value) );
+  typedef make_signed<test_enum>::type  	test24_type;
+  VERIFY( (is_same<test24_type, short>::value) );
+
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  typedef make_signed<__uint128_t>::type  	test25_type;
+  VERIFY( (is_same<test25_type, __int128_t>::value) );
+
+  typedef make_signed<__int128_t>::type  	test26_type;
+  VERIFY( (is_same<test26_type, __int128_t>::value) );
+#endif
 }
 
 int main()
Index: testsuite/20_util/is_floating_point/value.cc
===================================================================
--- testsuite/20_util/is_floating_point/value.cc	(revision 0)
+++ testsuite/20_util/is_floating_point/value.cc	(revision 0)
@@ -0,0 +1,68 @@ 
+// { dg-options "-std=gnu++0x" }
+//
+// Copyright (C) 2011 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 <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using std::is_floating_point;
+  using namespace __gnu_test;
+
+  VERIFY( (test_category<is_floating_point, void>(false)) );
+  VERIFY( (test_category<is_floating_point, char>(false)) );
+  VERIFY( (test_category<is_floating_point, signed char>(false)) );
+  VERIFY( (test_category<is_floating_point, unsigned char>(false)) );
+#ifdef _GLIBCXX_USE_WCHAR_T
+  VERIFY( (test_category<is_floating_point, wchar_t>(false)) );
+#endif
+  VERIFY( (test_category<is_floating_point, short>(false)) );
+  VERIFY( (test_category<is_floating_point, unsigned short>(false)) );
+  VERIFY( (test_category<is_floating_point, int>(false)) );
+  VERIFY( (test_category<is_floating_point, unsigned int>(false)) );
+  VERIFY( (test_category<is_floating_point, long>(false)) );
+  VERIFY( (test_category<is_floating_point, unsigned long>(false)) );
+  VERIFY( (test_category<is_floating_point, long long>(false)) );
+  VERIFY( (test_category<is_floating_point, unsigned long long>(false)) );
+
+  VERIFY( (test_category<is_floating_point, float>(true)) );
+  VERIFY( (test_category<is_floating_point, double>(true)) );
+  VERIFY( (test_category<is_floating_point, long double>(true)) );
+
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_FLOAT128
+  VERIFY( (test_category<is_floating_point, __float128>(true)) );
+#endif
+
+#ifdef _GLIBCXX_USE_INT128
+  VERIFY( (test_category<is_floating_point, __int128_t>(false)) );
+  VERIFY( (test_category<is_floating_point, __uint128_t>(false)) );
+#endif
+
+  // Sanity check.
+  VERIFY( (test_category<is_floating_point, ClassType>(false)) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/20_util/is_floating_point/requirements/typedefs.cc
===================================================================
--- testsuite/20_util/is_floating_point/requirements/typedefs.cc	(revision 0)
+++ testsuite/20_util/is_floating_point/requirements/typedefs.cc	(revision 0)
@@ -0,0 +1,35 @@ 
+// { dg-options "-std=gnu++0x" }
+//
+// Copyright (C) 2011 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>
+
+// { dg-do compile }
+
+void test01()
+{
+  // Check for required typedefs
+  typedef std::is_floating_point<int>         test_type;
+  typedef test_type::value_type               value_type;
+  typedef test_type::type                     type;
+  typedef test_type::type::value_type         type_value_type;
+  typedef test_type::type::type               type_type;
+}
Index: testsuite/20_util/is_floating_point/requirements/explicit_instantiation.cc
===================================================================
--- testsuite/20_util/is_floating_point/requirements/explicit_instantiation.cc	(revision 0)
+++ testsuite/20_util/is_floating_point/requirements/explicit_instantiation.cc	(revision 0)
@@ -0,0 +1,29 @@ 
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// Copyright (C) 2011 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>
+
+namespace std
+{
+  typedef short test_type;
+  template struct is_floating_point<test_type>;
+}
Index: testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
===================================================================
--- testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc	(revision 178931)
+++ testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc	(working copy)
@@ -48,5 +48,5 @@ 
 // { dg-error "required from here" "" { target *-*-* } 40 }
 // { dg-error "required from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1441 }
-// { dg-error "declaration of" "" { target *-*-* } 1405 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1463 }
+// { dg-error "declaration of" "" { target *-*-* } 1427 }
Index: testsuite/20_util/make_unsigned/requirements/typedefs-1.cc
===================================================================
--- testsuite/20_util/make_unsigned/requirements/typedefs-1.cc	(revision 178931)
+++ testsuite/20_util/make_unsigned/requirements/typedefs-1.cc	(working copy)
@@ -2,7 +2,7 @@ 
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 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
@@ -54,9 +54,18 @@ 
 
   // Chapter 48, chapter 20. Smallest rank such that new unsigned type
   // same size.
-  typedef make_unsigned<test_enum>::type  	test25_type;
-  VERIFY( is_unsigned<test25_type>::value );
-  VERIFY( sizeof(test25_type) == sizeof(test_enum) );
+  typedef make_unsigned<test_enum>::type  	test24_type;
+  VERIFY( is_unsigned<test24_type>::value );
+  VERIFY( sizeof(test24_type) == sizeof(test_enum) );
+
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  typedef make_unsigned<__uint128_t>::type  	test25_type;
+  VERIFY( (is_same<test25_type, __uint128_t>::value) );
+
+  typedef make_unsigned<__int128_t>::type  	test26_type;
+  VERIFY( (is_same<test26_type, __uint128_t>::value) );
+#endif
 }
 
 int main()
Index: testsuite/20_util/make_unsigned/requirements/typedefs-2.cc
===================================================================
--- testsuite/20_util/make_unsigned/requirements/typedefs-2.cc	(revision 178931)
+++ testsuite/20_util/make_unsigned/requirements/typedefs-2.cc	(working copy)
@@ -3,7 +3,7 @@ 
 
 // 2007-05-03  Benjamin Kosnik  <bkoz@redhat.com>
 //
-// Copyright (C) 2007, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2009, 2010, 2011 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
@@ -53,8 +53,17 @@ 
   VERIFY( (is_same<test23_type, volatile wchar_t>::value) );
 #endif
 
-  typedef make_unsigned<test_enum>::type  	test25_type;
-  VERIFY( (is_same<test25_type, unsigned short>::value) );
+  typedef make_unsigned<test_enum>::type  	test24_type;
+  VERIFY( (is_same<test24_type, unsigned short>::value) );
+
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  typedef make_unsigned<__uint128_t>::type  	test25_type;
+  VERIFY( (is_same<test25_type, __uint128_t>::value) );
+
+  typedef make_unsigned<__int128_t>::type  	test26_type;
+  VERIFY( (is_same<test26_type, __uint128_t>::value) );
+#endif
 }
 
 int main()
Index: testsuite/20_util/declval/requirements/1_neg.cc
===================================================================
--- testsuite/20_util/declval/requirements/1_neg.cc	(revision 178930)
+++ testsuite/20_util/declval/requirements/1_neg.cc	(working copy)
@@ -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 *-*-* } 1731 }
+// { dg-error "static assertion failed" "" { target *-*-* } 1759 }
 
 #include <utility>
 
Index: testsuite/20_util/is_signed/value.cc
===================================================================
--- testsuite/20_util/is_signed/value.cc	(revision 178930)
+++ testsuite/20_util/is_signed/value.cc	(working copy)
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x" }
 // 2005-01-24  Paolo Carlini  <pcarlini@suse.de>
 //
-// Copyright (C) 2005, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2005, 2009, 2010, 2011 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
@@ -49,6 +49,16 @@ 
   VERIFY( (test_category<is_signed, double>(true)) );
   VERIFY( (test_category<is_signed, long double>(true)) );
 
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  VERIFY( (test_category<is_signed, __int128_t>(true)) );
+  VERIFY( (test_category<is_signed, __uint128_t>(false)) );
+#endif
+
+#ifdef _GLIBCXX_USE_FLOAT128
+  VERIFY( (test_category<is_signed, __float128>(true)) );
+#endif
+
   // Sanity check.
   VERIFY( (test_category<is_signed, ClassType>(false)) );
 }
Index: testsuite/20_util/is_unsigned/value.cc
===================================================================
--- testsuite/20_util/is_unsigned/value.cc	(revision 178930)
+++ testsuite/20_util/is_unsigned/value.cc	(working copy)
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x" }
 // 2005-01-24  Paolo Carlini  <pcarlini@suse.de>
 //
-// Copyright (C) 2005, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2005, 2009, 2010, 2011 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
@@ -49,6 +49,16 @@ 
   VERIFY( (test_category<is_unsigned, double>(false)) );
   VERIFY( (test_category<is_unsigned, long double>(false)) );
 
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  VERIFY( (test_category<is_unsigned, __uint128_t>(true)) );
+  VERIFY( (test_category<is_unsigned, __int128_t>(false)) );
+#endif
+
+#ifdef _GLIBCXX_USE_FLOAT128
+  VERIFY( (test_category<is_unsigned, __float128>(false)) );
+#endif
+
   // Sanity check.
   VERIFY( (test_category<is_unsigned, ClassType>(false)) );
 }
Index: testsuite/20_util/is_integral/value.cc
===================================================================
--- testsuite/20_util/is_integral/value.cc	(revision 178930)
+++ testsuite/20_util/is_integral/value.cc	(working copy)
@@ -1,7 +1,7 @@ 
 // { dg-options "-std=gnu++0x" }
 // 2008-05-20  Paolo Carlini  <paolo.carlini@oracle.com>
 //
-// Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2008, 2009, 2010, 2011 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
@@ -51,6 +51,16 @@ 
   VERIFY( (test_category<is_integral, double>(false)) );
   VERIFY( (test_category<is_integral, long double>(false)) );
 
+  // GNU Extensions.
+#ifdef _GLIBCXX_USE_INT128
+  VERIFY( (test_category<is_integral, __int128_t>(true)) );
+  VERIFY( (test_category<is_integral, __uint128_t>(true)) );
+#endif
+
+#ifdef _GLIBCXX_USE_FLOAT128
+  VERIFY( (test_category<is_integral, __float128>(false)) );
+#endif
+
   // Sanity check.
   VERIFY( (test_category<is_integral, ClassType>(false)) );
 }
Index: acinclude.m4
===================================================================
--- acinclude.m4	(revision 178930)
+++ acinclude.m4	(working copy)
@@ -2419,6 +2419,82 @@ 
 ])
 
 dnl
+dnl Check for GNU 128-bit integer and floating point types.
+dnl
+dnl Note: also checks that the types aren't standard types.
+dnl
+dnl Defines:
+dnl  _GLIBCXX_USE_INT128
+dnl  _GLIBCXX_USE_FLOAT128
+dnl
+AC_DEFUN([GLIBCXX_ENABLE_INT128_FLOAT128], [
+
+  AC_LANG_SAVE
+  AC_LANG_CPLUSPLUS
+
+  # Fake what AC_TRY_COMPILE does, without linking as this is
+  # unnecessary for this test.
+
+    cat > conftest.$ac_ext << EOF
+[#]line __oline__ "configure"
+template<typename T1, typename T2>
+  struct same
+  { typedef T2 type; };
+
+template<typename T>
+  struct same<T, T>;
+
+int main()
+{
+  typename same<long, __int128_t>::type                i1;
+  typename same<unsigned long, __uint128_t>::type      u1;
+  typename same<long long, __int128_t>::type           i2;
+  typename same<unsigned long long, __uint128_t>::type u2;
+}
+EOF
+
+    AC_MSG_CHECKING([for __int128_t and __uint128_t])
+    if AC_TRY_EVAL(ac_compile); then
+      AC_DEFINE(_GLIBCXX_USE_INT128, 1,
+      [Define if __int128_t and __uint128_t types are supported on this host.])
+      enable_int128=yes
+    else
+      enable_int128=no
+    fi
+    AC_MSG_RESULT($enable_int128)
+    rm -f conftest*
+
+    cat > conftest.$ac_ext << EOF
+[#]line __oline__ "configure"
+template<typename T1, typename T2>
+  struct same
+  { typedef T2 type; };
+
+template<typename T>
+  struct same<T, T>;
+
+int main()
+{
+  typename same<double, __float128>::type      f1;	
+  typename same<long double, __float128>::type f2;
+}
+EOF
+
+    AC_MSG_CHECKING([for __float128])
+    if AC_TRY_EVAL(ac_compile); then
+      AC_DEFINE(_GLIBCXX_USE_FLOAT128, 1,
+      [Define if __float128 is supported on this host.])
+      enable_float128=yes
+    else
+      enable_float128=no
+    fi
+    AC_MSG_RESULT($enable_float128)
+    rm -f conftest*
+
+  AC_LANG_RESTORE
+])
+
+dnl
 dnl Check for template specializations for the 'wchar_t' type.
 dnl
 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T