diff options
author | Tom Tromey <tom@tromey.com> | 2018-07-26 19:52:47 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-10-03 15:19:06 -0600 |
commit | ad69edbb4b230582ecd1863e68d0c2044f5ad901 (patch) | |
tree | bafe26e96f1575c3f21d221e569545b07c2e7ed2 /gdb | |
parent | 780942fc2422d80a49b748e484890f11db31f49e (diff) | |
download | gdb-ad69edbb4b230582ecd1863e68d0c2044f5ad901.zip gdb-ad69edbb4b230582ecd1863e68d0c2044f5ad901.tar.gz gdb-ad69edbb4b230582ecd1863e68d0c2044f5ad901.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/btrace.h | 2 | ||||
-rw-r--r-- | gdb/c-lang.h | 2 | ||||
-rw-r--r-- | gdb/common/enum-flags.h | 6 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 2 | ||||
-rw-r--r-- | gdb/objfile-flags.h | 2 | ||||
-rw-r--r-- | gdb/symfile-add-flags.h | 2 |
7 files changed, 23 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 07aecd5..36c4493 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 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> + * dwarf2-frame.h (dwarf2_frame_state_reg_info) <~dwarf2_frame_state_reg_info>: Update. <dwarf2_frame_state_reg_info>: Update. diff --git a/gdb/btrace.h b/gdb/btrace.h index bfb0b9f2..0448bd6 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -228,7 +228,7 @@ struct btrace_call_history }; /* Branch trace thread flags. */ -enum btrace_thread_flag +enum btrace_thread_flag : unsigned { /* The thread is to be stepped forwards. */ BTHR_STEP = (1 << 0), diff --git a/gdb/c-lang.h b/gdb/c-lang.h index ae17abd..f9eab04 100644 --- a/gdb/c-lang.h +++ b/gdb/c-lang.h @@ -35,7 +35,7 @@ struct parser_state; /* The various kinds of C string and character. Note that these values are chosen so that they may be or'd together in certain ways. */ -enum c_string_type_values +enum c_string_type_values : unsigned { /* An ordinary string: "value". */ C_STRING = 0, diff --git a/gdb/common/enum-flags.h b/gdb/common/enum-flags.h index 82568a5..f7ca8d8 100644 --- a/gdb/common/enum-flags.h +++ b/gdb/common/enum-flags.h @@ -164,6 +164,12 @@ public: } 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 (); } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 32b58dc..a115857 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -193,7 +193,7 @@ enum type_code /* * Some bits for the type's instance_flags word. See the macros 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_VOLATILE = (1 << 1), diff --git a/gdb/objfile-flags.h b/gdb/objfile-flags.h index aeaa8fb..6f5760d 100644 --- a/gdb/objfile-flags.h +++ b/gdb/objfile-flags.h @@ -25,7 +25,7 @@ /* Defines for the objfile flags field. Defined in a separate file to break circular header dependencies. */ -enum objfile_flag +enum objfile_flag : unsigned { /* When an object file has its functions reordered (currently Irix-5.2 shared libraries exhibit this behaviour), we will need diff --git a/gdb/symfile-add-flags.h b/gdb/symfile-add-flags.h index 3c07513..35241fe 100644 --- a/gdb/symfile-add-flags.h +++ b/gdb/symfile-add-flags.h @@ -26,7 +26,7 @@ symbol_file_add, etc. Defined in a separate file to break circular header dependencies. */ -enum symfile_add_flag +enum symfile_add_flag : unsigned { /* Be chatty about what you are doing. */ SYMFILE_VERBOSE = 1 << 1, |