Commit a0230468 by Mark Mitchell Committed by Mark Mitchell

type_traits (__make_unsigned_selector<>): Consider enums of size smaller than short.

	* 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
parent 26272ba2
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> 2008-08-31 Aaron W. LaFramboise <aaronavay62@aaronwl.com>
* acinclude.m4 <enable_symvers>: Don't use symvers on Windows. * acinclude.m4 <enable_symvers>: Don't use symvers on Windows.
......
...@@ -455,15 +455,18 @@ namespace std ...@@ -455,15 +455,18 @@ namespace std
struct __make_unsigned_selector<_Tp, false, true> struct __make_unsigned_selector<_Tp, false, true>
{ {
private: private:
// GNU enums start with sizeof short. // With -fshort-enums, an enum may be as small as a char.
typedef unsigned short __smallest; typedef unsigned char __smallest;
static const bool __b1 = sizeof(_Tp) <= sizeof(__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); static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int);
typedef conditional<__b2, unsigned int, unsigned long> __cond; typedef conditional<__b2, unsigned int, unsigned long> __cond2;
typedef typename __cond::type __cond_type; typedef typename __cond2::type __cond2_type;
typedef conditional<__b1, unsigned short, __cond2_type> __cond1;
typedef typename __cond1::type __cond1_type;
public: 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 // Given an integral/enum type, return the corresponding unsigned
...@@ -530,15 +533,18 @@ namespace std ...@@ -530,15 +533,18 @@ namespace std
struct __make_signed_selector<_Tp, false, true> struct __make_signed_selector<_Tp, false, true>
{ {
private: private:
// GNU enums start with sizeof short. // With -fshort-enums, an enum may be as small as a char.
typedef signed short __smallest; typedef signed char __smallest;
static const bool __b1 = sizeof(_Tp) <= sizeof(__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); static const bool __b2 = sizeof(_Tp) <= sizeof(signed int);
typedef conditional<__b2, signed int, signed long> __cond; typedef conditional<__b2, signed int, signed long> __cond2;
typedef typename __cond::type __cond_type; typedef typename __cond2::type __cond2_type;
typedef conditional<__b1, signed short, __cond2_type> __cond1;
typedef typename __cond1::type __cond1_type;
public: 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 // Given an integral/enum type, return the corresponding signed
......
...@@ -24,7 +24,8 @@ ...@@ -24,7 +24,8 @@
#include <type_traits> #include <type_traits>
#include <testsuite_hooks.h> #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() void test01()
{ {
......
...@@ -49,8 +49,8 @@ void test01() ...@@ -49,8 +49,8 @@ void test01()
// { dg-error "instantiated from here" "" { target *-*-* } 41 } // { dg-error "instantiated from here" "" { target *-*-* } 41 }
// { dg-error "instantiated from here" "" { target *-*-* } 43 } // { dg-error "instantiated from here" "" { target *-*-* } 43 }
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 549 } // { dg-error "invalid use of incomplete type" "" { target *-*-* } 555 }
// { dg-error "declaration of" "" { target *-*-* } 515 } // { dg-error "declaration of" "" { target *-*-* } 518 }
// { dg-excess-errors "At global scope" } // { dg-excess-errors "At global scope" }
// { dg-excess-errors "In instantiation of" } // { dg-excess-errors "In instantiation of" }
...@@ -24,7 +24,8 @@ ...@@ -24,7 +24,8 @@
#include <type_traits> #include <type_traits>
#include <testsuite_hooks.h> #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() void test01()
{ {
......
...@@ -49,7 +49,7 @@ void test01() ...@@ -49,7 +49,7 @@ void test01()
// { dg-error "instantiated from here" "" { target *-*-* } 41 } // { dg-error "instantiated from here" "" { target *-*-* } 41 }
// { dg-error "instantiated from here" "" { target *-*-* } 43 } // { 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-error "declaration of" "" { target *-*-* } 440 }
// { dg-excess-errors "At global scope" } // { dg-excess-errors "At global scope" }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment