aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-07-26 19:52:47 -0600
committerTom Tromey <tom@tromey.com>2018-10-03 15:19:06 -0600
commitad69edbb4b230582ecd1863e68d0c2044f5ad901 (patch)
treebafe26e96f1575c3f21d221e569545b07c2e7ed2 /gdb
parent780942fc2422d80a49b748e484890f11db31f49e (diff)
downloadgdb-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/ChangeLog12
-rw-r--r--gdb/btrace.h2
-rw-r--r--gdb/c-lang.h2
-rw-r--r--gdb/common/enum-flags.h6
-rw-r--r--gdb/gdbtypes.h2
-rw-r--r--gdb/objfile-flags.h2
-rw-r--r--gdb/symfile-add-flags.h2
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 bfb0b9f..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,