From 459a2e4ccf9aadfba9819facba1c9be5297c1625 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 1 Apr 2018 09:33:13 -0600 Subject: [PATCH] Change streq to return bool I wanted to use streq with std::unique in another (upcoming) patch in this seres, so I changed it to return bool. To my surprise, this lead to regressions. The cause turned out to be that streq was used as an htab callback -- by casting it to the correct function type. This sort of cast is invalid, so this patch adds a variant which is directly suitable for use by htab. (Note that I did not add an overload, as I could not get that to work with template deduction in the other patch.) ChangeLog 2018-04-05 Tom Tromey * completer.c (completion_tracker::completion_tracker): Remove cast. (completion_tracker::discard_completions): Likewise. * breakpoint.c (ambiguous_names_p): Remove cast. * ada-lang.c (_initialize_ada_language): Remove cast. * utils.h (streq): Update. (streq_hash): Add new declaration. * utils.c (streq): Return bool. (streq_hash): New function. --- gdb/ChangeLog | 12 ++++++++++++ gdb/ada-lang.c | 5 ++--- gdb/breakpoint.c | 6 ++---- gdb/completer.c | 4 ++-- gdb/utils.c | 13 +++++++++++-- gdb/utils.h | 9 ++++++++- 6 files changed, 37 insertions(+), 12 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b88f503b0c0..f670b9daffd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2018-04-05 Tom Tromey + + * completer.c (completion_tracker::completion_tracker): Remove + cast. + (completion_tracker::discard_completions): Likewise. + * breakpoint.c (ambiguous_names_p): Remove cast. + * ada-lang.c (_initialize_ada_language): Remove cast. + * utils.h (streq): Update. + (streq_hash): Add new declaration. + * utils.c (streq): Return bool. + (streq_hash): New function. + 2018-04-05 Tom Tromey * linespec.c (event_location_to_sals) : diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 11939d77986..de20c43bedd 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -14722,9 +14722,8 @@ When enabled, the debugger will stop using the DW_AT_GNAT_descriptive_type\n\ DWARF attribute."), NULL, NULL, &maint_set_ada_cmdlist, &maint_show_ada_cmdlist); - decoded_names_store = htab_create_alloc - (256, htab_hash_string, (int (*)(const void *, const void *)) streq, - NULL, xcalloc, xfree); + decoded_names_store = htab_create_alloc (256, htab_hash_string, streq_hash, + NULL, xcalloc, xfree); /* The ada-lang observers. */ gdb::observers::new_objfile.attach (ada_new_objfile_observer); diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 991c29c1e2d..f84fef2beaa 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -13384,10 +13384,8 @@ static int ambiguous_names_p (struct bp_location *loc) { struct bp_location *l; - htab_t htab = htab_create_alloc (13, htab_hash_string, - (int (*) (const void *, - const void *)) streq, - NULL, xcalloc, xfree); + htab_t htab = htab_create_alloc (13, htab_hash_string, streq_hash, NULL, + xcalloc, xfree); for (l = loc; l != NULL; l = l->next) { diff --git a/gdb/completer.c b/gdb/completer.c index 4de1bcff329..769dcf0eb63 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -1469,7 +1469,7 @@ int max_completions = 200; completion_tracker::completion_tracker () { m_entries_hash = htab_create_alloc (INITIAL_COMPLETION_HTAB_SIZE, - htab_hash_string, (htab_eq) streq, + htab_hash_string, streq_hash, NULL, xcalloc, xfree); } @@ -1487,7 +1487,7 @@ completion_tracker::discard_completions () htab_delete (m_entries_hash); m_entries_hash = htab_create_alloc (INITIAL_COMPLETION_HTAB_SIZE, - htab_hash_string, (htab_eq) streq, + htab_hash_string, streq_hash, NULL, xcalloc, xfree); } diff --git a/gdb/utils.c b/gdb/utils.c index ee19fed172c..bd7553e5f46 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2601,13 +2601,22 @@ strcmp_iw_ordered (const char *string1, const char *string2) } } -/* A simple comparison function with opposite semantics to strcmp. */ +/* See utils.h. */ -int +bool streq (const char *lhs, const char *rhs) { return !strcmp (lhs, rhs); } + +/* See utils.h. */ + +int +streq_hash (const void *lhs, const void *rhs) +{ + return streq ((const char *) lhs, (const char *) rhs); +} + /* diff --git a/gdb/utils.h b/gdb/utils.h index 0de0fe2baa7..d3b8871b582 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -89,7 +89,14 @@ extern int strcmp_iw (const char *string1, const char *string2); extern int strcmp_iw_ordered (const char *, const char *); -extern int streq (const char *, const char *); +/* Return true if the strings are equal. */ + +extern bool streq (const char *, const char *); + +/* A variant of streq that is suitable for use as an htab + callback. */ + +extern int streq_hash (const void *, const void *); extern int subset_compare (const char *, const char *); -- 2.30.2