Use unsigned as base type for some enums

-fsanitize=undefined complains about using operator~ on various enum
types that are used with DEF_ENUM_FLAGS_TYPE.  This patch fixes these
problems by explicitly setting the base type for these enums to
unsigned.  It also adds a static assert to enum_flags to ensure that
future enums used this way have an unsigned underlying type.

gdb/ChangeLog
2018-10-03  Tom Tromey  <tom@tromey.com>

	* common/enum-flags.h (enum_flags::operator~): Add static assert.
	* symfile-add-flags.h (enum symfile_add_flag): Use unsigned as
	base type.
	* objfile-flags.h (enum objfile_flag): Use unsigned as base type.
	* gdbtypes.h (enum type_instance_flag_value): Use unsigned as base
	type.
	* c-lang.h (enum c_string_type_values): Use unsigned as base
	type.
	* btrace.h (enum btrace_thread_flag): Use unsigned as base type.
This commit is contained in:
Tom Tromey
2018-07-26 19:52:47 -06:00
parent 780942fc24
commit ad69edbb4b
7 changed files with 23 additions and 5 deletions

View File

@ -1,3 +1,15 @@
2018-10-03 Tom Tromey <tom@tromey.com>
* common/enum-flags.h (enum_flags::operator~): Add static assert.
* symfile-add-flags.h (enum symfile_add_flag): Use unsigned as
base type.
* objfile-flags.h (enum objfile_flag): Use unsigned as base type.
* gdbtypes.h (enum type_instance_flag_value): Use unsigned as base
type.
* c-lang.h (enum c_string_type_values): Use unsigned as base
type.
* btrace.h (enum btrace_thread_flag): Use unsigned as base type.
2018-10-03 Tom Tromey <tom@tromey.com> 2018-10-03 Tom Tromey <tom@tromey.com>
* dwarf2-frame.h (dwarf2_frame_state_reg_info) * dwarf2-frame.h (dwarf2_frame_state_reg_info)

View File

@ -228,7 +228,7 @@ struct btrace_call_history
}; };
/* Branch trace thread flags. */ /* Branch trace thread flags. */
enum btrace_thread_flag enum btrace_thread_flag : unsigned
{ {
/* The thread is to be stepped forwards. */ /* The thread is to be stepped forwards. */
BTHR_STEP = (1 << 0), BTHR_STEP = (1 << 0),

View File

@ -35,7 +35,7 @@ struct parser_state;
/* The various kinds of C string and character. Note that these /* The various kinds of C string and character. Note that these
values are chosen so that they may be or'd together in certain values are chosen so that they may be or'd together in certain
ways. */ ways. */
enum c_string_type_values enum c_string_type_values : unsigned
{ {
/* An ordinary string: "value". */ /* An ordinary string: "value". */
C_STRING = 0, C_STRING = 0,

View File

@ -164,6 +164,12 @@ public:
} }
enum_flags operator~ () const enum_flags operator~ () const
{ {
// We only the underlying type to be unsigned when actually using
// operator~ -- if it were not unsigned, undefined behavior could
// result. However, asserting this in the class itself would
// require too many unnecessary changes to otherwise ok enum
// types.
gdb_static_assert (std::is_unsigned<underlying_type>::value);
return (enum_type) ~underlying_value (); return (enum_type) ~underlying_value ();
} }

View File

@ -193,7 +193,7 @@ enum type_code
/* * Some bits for the type's instance_flags word. See the macros /* * Some bits for the type's instance_flags word. See the macros
below for documentation on each bit. */ below for documentation on each bit. */
enum type_instance_flag_value enum type_instance_flag_value : unsigned
{ {
TYPE_INSTANCE_FLAG_CONST = (1 << 0), TYPE_INSTANCE_FLAG_CONST = (1 << 0),
TYPE_INSTANCE_FLAG_VOLATILE = (1 << 1), TYPE_INSTANCE_FLAG_VOLATILE = (1 << 1),

View File

@ -25,7 +25,7 @@
/* Defines for the objfile flags field. Defined in a separate file to /* Defines for the objfile flags field. Defined in a separate file to
break circular header dependencies. */ break circular header dependencies. */
enum objfile_flag enum objfile_flag : unsigned
{ {
/* When an object file has its functions reordered (currently /* When an object file has its functions reordered (currently
Irix-5.2 shared libraries exhibit this behaviour), we will need Irix-5.2 shared libraries exhibit this behaviour), we will need

View File

@ -26,7 +26,7 @@
symbol_file_add, etc. Defined in a separate file to break circular symbol_file_add, etc. Defined in a separate file to break circular
header dependencies. */ header dependencies. */
enum symfile_add_flag enum symfile_add_flag : unsigned
{ {
/* Be chatty about what you are doing. */ /* Be chatty about what you are doing. */
SYMFILE_VERBOSE = 1 << 1, SYMFILE_VERBOSE = 1 << 1,