diff options
Diffstat (limited to 'gcc/cp/cvt.c')
-rw-r--r-- | gcc/cp/cvt.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index c0d0a60..9ce094e 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -1834,12 +1834,27 @@ type_promotes_to (tree type) || type == char32_type_node || type == wchar_type_node) { + tree prom = type; + + if (TREE_CODE (type) == ENUMERAL_TYPE) + { + prom = ENUM_UNDERLYING_TYPE (prom); + if (!ENUM_IS_SCOPED (type) + && ENUM_FIXED_UNDERLYING_TYPE_P (type)) + { + /* ISO C++17, 7.6/4. A prvalue of an unscoped enumeration type + whose underlying type is fixed (10.2) can be converted to a + prvalue of its underlying type. Moreover, if integral promotion + can be applied to its underlying type, a prvalue of an unscoped + enumeration type whose underlying type is fixed can also be + converted to a prvalue of the promoted underlying type. */ + return type_promotes_to (prom); + } + } + int precision = MAX (TYPE_PRECISION (type), TYPE_PRECISION (integer_type_node)); tree totype = c_common_type_for_size (precision, 0); - tree prom = type; - if (TREE_CODE (prom) == ENUMERAL_TYPE) - prom = ENUM_UNDERLYING_TYPE (prom); if (TYPE_UNSIGNED (prom) && ! int_fits_type_p (TYPE_MAX_VALUE (prom), totype)) prom = c_common_type_for_size (precision, 1); |