<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/54570>54570</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Spurious -Wnull-pointer-subtraction inside macros / unreachable code
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          anarazel
      </td>
    </tr>
</table>

<pre>
    Hi,

Compiling postgres with clang 13 or newer triggers a host of -Wnull-pointer-subtraction warnings (discovered because the warning is part of -Wextra). To us it looks like the warnings are spurious.

Simplified reproducer (also at https://godbolt.org/z/ErfEc6Ezz):
compiling
```C
#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);
}
```
with just clang -Wnull-pointer-subtraction yields:
```
<source>:19:5: warning: performing pointer subtraction with a null pointer has undefined behavior [-Wnull-pointer-subtraction]
    relptr_store(base, *rp, NULL);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:4:60: note: expanded from macro 'relptr_store'
         ((rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
                                                 ~~~~~~~~~~~~~~~~ ^
1 warning generated.
```

The way I read the standard legalese it's the *evaluation* that'd produce undefined behavior, but it never is evaluated here.

@jamieschmeiser, looks like this came in with your 9cb00b9ecbe74d19389a5818d61ddee328afe031 / https://reviews.llvm.org/D98798?

Regards,

Andres
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVktv4zYQ_jXyZWBDD8uyDjp4YxstsOihu0WPAUWOLGYpUSApZ51f3yEtO3aQTbEtigq0xOfMNy9-rrU4Vb_IKH2I4m0Ub87vB90NUsn-AIO27mDQwrN0LXDFaC7JQBvo8RkNOCMPBzQWGLS0FXQD8z_7Uan5oGXv0MztWDvDuJO6h2dmepJqIUrXQlquj2hQQI2cjRbBtXjZAtLCwMwkEL-TiCgtF_BVw2hBOlBaf7Og5Le7Y4TDINhhNFKPdnFr0xfZDUo2kvQZHIwWIyf8BIQpq4E5aJ0bbJRtonRP7aBFrZVbaHOg0Qv9dqbZ8dXuhfql3xak8ounJlWr-Nwu7kwz2XM1CoQoe7BOCGwWbZTtbpHRJpqWPRIwNTjzaJ02SMhqZunzAGbw7yNTpBmi_Bqq0sOn5tfLxXRYNw3p2k5Ll0PZ1s_99sfnz9TfQ0zvzbSFt8z7YRP2XU74wRyuGMqp3aB2pwEJNoy9j2xUfALrzMgdNFp7cRMcvy3KaFG-4KODV5B-Miq20wyNboUftRTnHkWqVtg99to9DpSI2DtvcTgU1ATfXGy4oD2LKiaZQM89ODISLg65qvbbXns_iMVV5eSnK-5i-7EB_wb832EJZrwL5pKP52Eo4qeR6vRcyR-U6kmiEvaa528E-WTWo-HoUznbJL4gcp9SUx367oCm0aY73yJBAdzdBR4LAw_gut4yS_l0LgZ_LbTsKOmqifJPP0Ya5dt_7qgQ8nwXFf9Be89RS_qRD8k7lM_ov_h9YGSxgMboDjrGjU_Q4t6Q4hVteP6XsoeffX7WYyESQVVypYED9miYQ7F4Pw_D-2sggBP8SvFnIvCBdeRVZgQoPDBFlUecQX60YZGsRrJ3ZCF_0g1NMr8qYOKFd5LQZ089Ok89PRJteYKahNCulnjsjm2iZfzEOomWtx1Ki-H8HWfRec46wjWVwonSBEpex3FdIq-xWIqkzNYly9fJWqwSog7MiK0ajLOETNi_ISyDR4nPdqHUsZtYa1uui3JNgb9F9js5xFBl3zP-phd0P81ElYkyK9nMSaew-jIR6UcXheytJHoLmWsDrrGnMFB60bUHXAucjUZVb9iVLB7rBbEnDTzi6TOnADwhp2DspbUjEsx9vsyLeNZWRc3iPM6LpMzTYr0ipyQpF5yVywaLbFXPFKtR2YpuiyhN6e8JBBHUpytiJqs0TtM4S-lgvKa6SVYlWyYib5o4RcyRIoYdk-rqwJmpAqR6PFhaVNK6V-_OmLXy0CMGdSSfja7VpmI9M-wF1SzorgL2vwBjfcn-">