Clang is correct -- you are dereferencing str, but are not using its value.
If all you want is to advance str, then next_position would boil down to:
#define next_position() str++
It would bring the question why you would want to hide that behind a macro, but that's a different issue.
As for getting warning from clang, but not gcc, they are different compilers. They are detecting overlapping but not identical set of potential issues with the code and they are pedantic in somewhat different ways. Even gcc itself produces different sets of warnings depending on optimization level and gcc version. The fact that one compiler produces a warning but another does not does not necessarily mean that there's a bug in the compiler. Nor does it say anything whether there's really a problem in your code. It's just an indication that something may be off.
next_position? Are you just writingnext_position();without using the expression result?clang, like any other C compiler, doesn't complain about macros themselves, only macro instantiations.next_position? If you aren't, then the warning makes perfect sense. It's not warning about*str++, but aboutnext_positionas a whole.(void)(bit ? *str++ : (*str++) & 0xff)would take care of it.