]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
type_traits (__make_unsigned_selector<>): Consider enums of size smaller than short.
authorMark Mitchell <mark@codesourcery.com>
Mon, 1 Sep 2008 23:24:09 +0000 (23:24 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 1 Sep 2008 23:24:09 +0000 (23:24 +0000)
* include/std/type_traits (__make_unsigned_selector<>): Consider
enums of size smaller than short.
(__make_signed_selector<>): Likewise.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
Adjust line numbers.
* testsuite/20_util/make_usigned/requirements/typedefs_neg.cc:
Adjust line numbers.
* testsuite/20_util/make_signed/requirements/typedefs-2.cc:
Ensure test_enum is the same size as short.
* testsuite/20_util/make_unsigned/requirements/typedefs-2.cc:
Ensure test_enum is the same size as short.

From-SVN: r139875

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits
libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc
libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc
libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc

index 29adf70c41f2af0d4e0fcc0cfc27ffa2d9057579..0b2f5b94d637c028d8ed5ab463e48ad313d6d9c4 100644 (file)
@@ -1,3 +1,17 @@
+2008-09-01  Mark Mitchell  <mark@codesourcery.com>
+
+       * include/std/type_traits (__make_unsigned_selector<>): Consider
+       enums of size smaller than short.
+       (__make_signed_selector<>): Likewise.
+       * testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
+       Adjust line numbers.
+       * testsuite/20_util/make_usigned/requirements/typedefs_neg.cc:
+       Adjust line numbers.
+       * testsuite/20_util/make_signed/requirements/typedefs-2.cc:
+       Ensure test_enum is the same size as short.
+       * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc:
+       Ensure test_enum is the same size as short.
+
 2008-08-31  Aaron W. LaFramboise  <aaronavay62@aaronwl.com>
 
        * acinclude.m4 <enable_symvers>: Don't use symvers on Windows.
index 1a759187955ef4d3e21c2a99981c00c971839379..87fdff146bce230cef12804eafbbff862bed779b 100644 (file)
@@ -455,15 +455,18 @@ namespace std
     struct __make_unsigned_selector<_Tp, false, true>
     {
     private:
-      // GNU enums start with sizeof short.
-      typedef unsigned short __smallest;
-      static const bool __b1 = sizeof(_Tp) <= sizeof(__smallest);
+      // With -fshort-enums, an enum may be as small as a char.
+      typedef unsigned char __smallest;
+      static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
+      static const bool __b1 = sizeof(_Tp) <= sizeof(unsigned short);
       static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int);
-      typedef conditional<__b2, unsigned int, unsigned long> __cond;
-      typedef typename __cond::type __cond_type;
+      typedef conditional<__b2, unsigned int, unsigned long> __cond2;
+      typedef typename __cond2::type __cond2_type;
+      typedef conditional<__b1, unsigned short, __cond2_type> __cond1;
+      typedef typename __cond1::type __cond1_type;
 
     public:
-      typedef typename conditional<__b1, __smallest, __cond_type>::type __type;
+      typedef typename conditional<__b0, __smallest, __cond1_type>::type __type;
     };
 
   // Given an integral/enum type, return the corresponding unsigned
@@ -530,15 +533,18 @@ namespace std
     struct __make_signed_selector<_Tp, false, true>
     {
     private:
-      // GNU enums start with sizeof short.
-      typedef signed short __smallest;
-      static const bool __b1 = sizeof(_Tp) <= sizeof(__smallest);
+      // With -fshort-enums, an enum may be as small as a char.
+      typedef signed char __smallest;
+      static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
+      static const bool __b1 = sizeof(_Tp) <= sizeof(signed short);
       static const bool __b2 = sizeof(_Tp) <= sizeof(signed int);
-      typedef conditional<__b2, signed int, signed long> __cond;
-      typedef typename __cond::type __cond_type;
+      typedef conditional<__b2, signed int, signed long> __cond2;
+      typedef typename __cond2::type __cond2_type;
+      typedef conditional<__b1, signed short, __cond2_type> __cond1;
+      typedef typename __cond1::type __cond1_type;
 
     public:
-      typedef typename conditional<__b1, __smallest, __cond_type>::type __type;
+      typedef typename conditional<__b0, __smallest, __cond1_type>::type __type;
     };
 
   // Given an integral/enum type, return the corresponding signed
index ea4de372296521c23c693a23f9e1fd10dc75926d..b0f93b08293c3d69f67a77af54712599208fd0cd 100644 (file)
@@ -24,7 +24,8 @@
 #include <type_traits>
 #include <testsuite_hooks.h>
 
-enum test_enum { first_selection };
+// Ensure that this enum has "short" as its underlying type.
+enum test_enum { first_selection = ((unsigned char)-1) + 1 };
 
 void test01()
 {
index dc33931a6652364cb154642a6188abfc5fe3f5f5..59f679801c03c957fedf8a70e16b767a0b61e0fe 100644 (file)
@@ -49,8 +49,8 @@ void test01()
 // { dg-error "instantiated from here" "" { target *-*-* } 41 }
 // { dg-error "instantiated from here" "" { target *-*-* } 43 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 549 }
-// { dg-error "declaration of" "" { target *-*-* } 515 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 555 }
+// { dg-error "declaration of" "" { target *-*-* } 518 }
 
 // { dg-excess-errors "At global scope" }
 // { dg-excess-errors "In instantiation of" }
index ce318c8a4c26d23ce683d13eb8a1dadfc93089d2..4f6412090cac10732007c65d13491a4268212728 100644 (file)
@@ -24,7 +24,8 @@
 #include <type_traits>
 #include <testsuite_hooks.h>
 
-enum test_enum { first_selection };
+// Ensure that this enum has "short" as its underlying type.
+enum test_enum { first_selection = ((unsigned char)-1) + 1 };
 
 void test01()
 {
index 0b02e3345f6376a176e3551d0daa2aac3a6669e5..170183dd868c02109411c6c1098adb8df3e2dac0 100644 (file)
@@ -49,7 +49,7 @@ void test01()
 // { dg-error "instantiated from here" "" { target *-*-* } 41 }
 // { dg-error "instantiated from here" "" { target *-*-* } 43 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 474 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 477 }
 // { dg-error "declaration of" "" { target *-*-* } 440 }
 
 // { dg-excess-errors "At global scope" }