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/common | |
parent | 780942fc2422d80a49b748e484890f11db31f49e (diff) | |
download | binutils-ad69edbb4b230582ecd1863e68d0c2044f5ad901.zip binutils-ad69edbb4b230582ecd1863e68d0c2044f5ad901.tar.gz binutils-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/common')
-rw-r--r-- | gdb/common/enum-flags.h | 6 |
1 files changed, 6 insertions, 0 deletions
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 (); } |