diff options
author | Pedro Alves <palves@redhat.com> | 2016-11-04 02:02:39 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2016-11-04 03:38:44 +0000 |
commit | 1d71bdc242616819a8d4ace8d7a703fdbd90e602 (patch) | |
tree | a00acb1f49d09ebdd1f2939d7173cfa947b6ce27 /gdb/btrace.c | |
parent | 6f0f2be472d6e7dd37bf82841002674fa759b1b2 (diff) | |
download | binutils-gdb-palves/cxx-enum-flags.tar.gz |
enum_flags: Fix ternary operator and remove implicit convertion to raw enumpalves/cxx-enum-flags
The unit tests added by the previous patch revealed that this useful
use case doesn't work:
enum flag { FLAG1 = 1, FLAG2 = 2 };
enum_flags<flag> src = FLAG1;
enum_flags<flag> f1 = condition ? src : FLAG2;
It fails to compile because enum_flags<flag> and flag are convertible
to each other.
Turns out that making enum_flags be implicitly convertible to the
backing raw enum type was not a good idea.
If we make it convertible to the underlying type instead, we fix that
ternary operator use case, and, we find cases throughout the codebase
that should be using the enum_flags but were using the raw backing
enum instead. So it's a good change overall.
There's one case in compile/compile-c-types.c where we need to call a
function in a C API that expects the raw enum. To address cases like
that, this adds a "raw()" method to enum_flags. This way we can keep
using the safer enum_flags to construct the value, and then be
explicit when we need to get at the raw enum.
Tested with gcc 4.8, 4.9, 5.3, 7 (trunk) and clang 3.7.
gdb/ChangeLog:
yyyy-mm-dd Pedro Alves <palves@redhat.com>
* common/enum-flags.h (enum_flags::operator&=): Change parameter
type to enum_flags from enum_type and adjust.
(enum_flags::operator|=): Likewise.
(enum_flags::operator^=): Likewise.
(enum_flags::operator enum_type): Delete.
(enum_flags::raw): New method.
(ENUM_FLAGS_GEN_BINOP): Adjust operator functions.
* compile/compile-c-types.c (convert_qualified): Use
enum_flags::raw.
* enum-flags-selftests.c Adjust ternary operator CHECK_VALID
tests.
(selftests::enum_flags_tests::self_test): Add more ternary
operator tests.
* record-btrace.c (btrace_thread_flag_to_str): Change parameter's
type to btrace_thread_flags from btrace_thread_flag.
(record_btrace_cancel_resume, record_btrace_step_thread): Change
local's type to btrace_thread_flags from btrace_thread_flag. Add
cast in DEBUG call.
Diffstat (limited to 'gdb/btrace.c')
-rw-r--r-- | gdb/btrace.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/gdb/btrace.c b/gdb/btrace.c index 39d537c368d..2717ae2370c 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -229,7 +229,7 @@ ftrace_new_function (struct btrace_function *prev, static void ftrace_update_caller (struct btrace_function *bfun, struct btrace_function *caller, - enum btrace_function_flag flags) + btrace_function_flags flags) { if (bfun->up != NULL) ftrace_debug (bfun, "updating caller"); @@ -246,7 +246,7 @@ ftrace_update_caller (struct btrace_function *bfun, static void ftrace_fixup_caller (struct btrace_function *bfun, struct btrace_function *caller, - enum btrace_function_flag flags) + btrace_function_flags flags) { struct btrace_function *prev, *next; |