PR c++/56155
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Feb 2013 17:56:16 +0000 (17:56 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Feb 2013 17:56:16 +0000 (17:56 +0000)
* decl.c (build_enumerator): Always convert the value to a
fixed underlying type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196022 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/enum22.C [new file with mode: 0644]

index e3b927b..ddd0aa0 100644 (file)
@@ -1,5 +1,9 @@
 2013-02-13  Jason Merrill  <jason@redhat.com>
 
+       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.
index 5a9ad2c..eb6c490 100644 (file)
@@ -12786,15 +12786,14 @@ incremented enumerator value is too large for %<long%>");
          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 (file)
index 0000000..e87a31c
--- /dev/null
@@ -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 <class T>
+struct A {
+  enum e_ : unsigned char { Z_, E_=sizeof(Z_) };
+};
+
+static_assert ( A<double>::E_ == 1, "E_ should be 1");