From d0d9cf0ebf69940ed0b95b7b3644553913126286 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 13 Feb 2013 12:56:16 -0500 Subject: [PATCH] re PR c++/56155 ([C++11] enumeration with fixed underlying type - enumerators have wrong type within enumerator-list) PR c++/56155 * decl.c (build_enumerator): Always convert the value to a fixed underlying type. From-SVN: r196022 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl.c | 13 ++++++------- gcc/testsuite/g++.dg/cpp0x/enum22.C | 12 ++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/enum22.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e3b927b..ddd0aa0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2013-02-13 Jason Merrill + PR c++/56155 + * decl.c (build_enumerator): Always convert the value to a + fixed underlying type. + PR c++/56135 * pt.c (tsubst_copy_and_build): Don't forget any new captures that arose from use of dependent names. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5a9ad2c..eb6c490 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12786,15 +12786,14 @@ incremented enumerator value is too large for %"); does not fit, the program is ill-formed [C++0x dcl.enum]. */ if (ENUM_UNDERLYING_TYPE (enumtype) && value - && TREE_CODE (value) == INTEGER_CST - && !int_fits_type_p (value, ENUM_UNDERLYING_TYPE (enumtype))) + && TREE_CODE (value) == INTEGER_CST) { - error ("enumerator value %E is too large for underlying type %<%T%>", - value, ENUM_UNDERLYING_TYPE (enumtype)); + if (!int_fits_type_p (value, ENUM_UNDERLYING_TYPE (enumtype))) + error ("enumerator value %E is too large for underlying type %<%T%>", + value, ENUM_UNDERLYING_TYPE (enumtype)); - /* Silently convert the value so that we can continue. */ - value = perform_implicit_conversion (ENUM_UNDERLYING_TYPE (enumtype), - value, tf_none); + /* Convert the value to the appropriate type. */ + value = convert (ENUM_UNDERLYING_TYPE (enumtype), value); } } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum22.C b/gcc/testsuite/g++.dg/cpp0x/enum22.C new file mode 100644 index 0000000..e87a31ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum22.C @@ -0,0 +1,12 @@ +// PR c++/56155 +// { dg-do compile { target c++11 } } + +enum e_ : unsigned char { Z_, E_=sizeof(Z_) }; +static_assert( E_ == 1, "E_ should be 1"); + +template +struct A { + enum e_ : unsigned char { Z_, E_=sizeof(Z_) }; +}; + +static_assert ( A::E_ == 1, "E_ should be 1"); -- 2.7.4