This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/62096] unexpected warning overflow in implicit constant conversion


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62096

--- Comment #5 from Jason Merrill <jason at gcc dot gnu.org> ---
7.2/8: For an enumeration whose underlying type is fixed, the values of the
enumeration are the values of the underlying type. Otherwise, for an
enumeration where emin is the smallest enumerator and emax is the largest, the
values of the enumeration are the values in the range bmin to bmax, defined as
follows: Let K be 1 for a two’s complement representation and 0 for a ones’
complement or sign-magnitude representation. bmax is the smallest value greater
than or equal to max(|emin| − K, |emax|) and equal to 2M − 1, where M is a
non-negative integer. bmin is zero if emin is non-negative and −(bmax + K)
otherwise. The size of the smallest bit-field large enough to hold all the
values of the enumeration type is max(M, 1) if bmin is zero and M + 1
otherwise. It is possible to define an enumeration that has values not defined
by any of its enumerators. If the enumerator-list is empty, the values of the
enumeration are as if the enumeration had a single enumerator with value 0.

5.2.9/10: A value of integral or enumeration type can be explicitly converted
to a complete enumeration type. The value is unchanged if the original value is
within the range of the enumeration values (7.2). Otherwise, the behavior is
undefined.

Since the underlying type is not fixed, the values of the enumeration are 0 and
1 regardless of the underlying type.  Since ~1 is outside that range, the
behavior is undefined under DR 1766 (http://wg21.link/cwg1766).

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]