When determining whether a conversion from an unscoped enum is a
narrowing conversion, we check whether the values of the enum fit into
the target type. [dcl.enum] defines the values of an enum with
unspecified underlying type to be the values of the smallest bit-field
that could hold it, not all the values representable in the size of the
type. This patch fixes that check.
Tested x86_64-pc-linux-gnu, applying to trunk and 4.7.
commit 373e79aaea9c5b73cebeb1e8fd4fedbdfd553a35
Author: Jason Merrill <ja...@redhat.com>
Date: Fri Sep 14 09:48:48 2012 -0400
PR c++/53661
* typeck2.c (check_narrowing): Avoid false positives on conversion
from enumeral type.
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 6faebb5..58b2db6 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -787,6 +787,9 @@ check_narrowing (tree type, tree init)
else if (INTEGRAL_OR_ENUMERATION_TYPE_P (ftype)
&& CP_INTEGRAL_TYPE_P (type))
{
+ if (TREE_CODE (ftype) == ENUMERAL_TYPE)
+ /* Check for narrowing based on the values of the enumeration. */
+ ftype = ENUM_UNDERLYING_TYPE (ftype);
if ((tree_int_cst_lt (TYPE_MAX_VALUE (type),
TYPE_MAX_VALUE (ftype))
|| tree_int_cst_lt (TYPE_MIN_VALUE (ftype),
diff --git a/gcc/testsuite/g++.dg/init/aggr9.C b/gcc/testsuite/g++.dg/init/aggr9.C
new file mode 100644
index 0000000..67d8299
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/aggr9.C
@@ -0,0 +1,9 @@
+// PR c++/53661
+
+enum Code {
+ SUCCESS = 0
+};
+
+Code a;
+
+int r[] = {a};