Hi,
On 2022-03-26 10:49:53 -0700, Andres Freund wrote:
> > It's hard to see how that isn't a flat-out compiler bug.
>
> It only happens if the NULL is directly passed as an argument to the macro,
> not if there's an intermediary variable. Argh.
>
>
> #include <stddef.h>
>
> #define relptr_store(base, rp, val) \
> ((rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
>
> typedef union { struct foo *relptr_type; size_t relptr_off; } relptr;
>
> void
> problem_not_present(relptr *rp, char *base)
> {
> struct foo *val = NULL;
>
> relptr_store(base, *rp, val);
> }
>
> void
> problem_present(relptr *rp, char *base)
> {
> relptr_store(base, *rp, NULL);
> }
>
>
> Looks like that warning is uttered whenever there's a subtraction from a
> pointer with NULL, even if the code isn't reachable. Which I guess makes
> *some* sense, outside of macros it's not something that'd ever be reasonable.
Reported as https://github.com/llvm/llvm-project/issues/54570
Greetings,
Andres Freund