Junio C Hamano <[email protected]> wrote:
> Eric Wong <[email protected]> writes:
>
> > In the future, list iterator macros (e.g. list_for_each_entry)
> > may also be implemented using OFFSETOF_VAR to save hackers the
> > trouble of using container_of/list_entry macros and without
> > relying on non-portable `__typeof__'.
>
> Can we add something like this as a preliminary preparation step
> before the series?
>
> Subject: [PATCH] treewide: initialize pointers to hashmap entries
>
> There are not strictly necessary, but some compilers (e.g. clang
> 6.0.1) apparently have trouble in construct we will use in the
> OFFSETOF_VAR() macro, i.e.
>
> ((uintptr_t)&(ptr)->member - (uintptr_t)(ptr))
>
> when the ptr is uninitialized.
>
> Signed-off-by: Junio C Hamano <[email protected]>
> ---
> attr.c | 2 +-
> blame.c | 4 ++--
> builtin/describe.c | 2 +-
> builtin/difftool.c | 2 +-
> config.c | 2 +-
> merge-recursive.c | 6 +++---
> revision.c | 4 ++--
> submodule-config.c | 2 +-
> t/helper/test-hashmap.c | 2 +-
> t/helper/test-lazy-init-name-hash.c | 4 ++--
> 10 files changed, 15 insertions(+), 15 deletions(-)
That seems too tedious. I'm learning towards just initializing
var = NULL in the start of the for-loop:
@@ -449,7 +449,8 @@ static inline struct hashmap_entry
*hashmap_iter_first(struct hashmap *map,
* containing a @member which is a "struct hashmap_entry"
*/
#define hashmap_for_each_entry(map, iter, var, member) \
- for (var = hashmap_iter_first_entry_offset(map, iter, \
+ for (var = NULL /* squelch uninitialized warnings for OFFSETOF_VAR */, \
+ var = hashmap_iter_first_entry_offset(map, iter, \
OFFSETOF_VAR(var, member)); \
var; \
var = hashmap_iter_next_entry_offset(iter, \
(But I'm running on fumes all week, so not sure I trust it)