AaronBallman wrote:

> > I can see WG21 solving this either by removing `unreachable` from `cstddef` 
> > or by requiring `utility` to guard against the macro via implementation 
> > magic (personally, I think `utility` should guard against it because of 
> > users including `stddef.h` directly) and it would be nice to know which 
> > direction the committee is leaning before we get too far into a solution.
> 
> I'm not sure whether you mean it, but I'd expect that it's handled like 
> `signbit` and friends - they are functions instead of macros. For libc++ that 
> would simply be `#undef unreachable`, `#include <__utility/unreachable.h>` 
> and `using std::unreachable`.

Yeah, that would one way to handle it, but it does still defy some user 
expectations (and perhaps that's fine):
```
#include <stddef.h>
// #include "whatever.h" // transitively includes <utility>

#ifndef unreachable
#error "oh no, my macro!"
#endif
```
Uncommenting `whatever.h` suddenly causes an error which may be a surprise 
because some C standard library things remain macros even in C++ (like 
`offsetof`, or `va_start` and friends). Any C standard library function can be 
implemented as a macro, so the potential for confusion always exists, but for 
things defined explicitly as a macro in C, they sometimes stay a macro in C++. 
I think `unreachable` is probably reasonable to turn into a real function 
though.

But another way WG21 could perhaps approach this is:
```
// In <utility>
#ifndef unreachable
void unreachable();
#endif
```
which retains the macro rather than the function.

https://github.com/llvm/llvm-project/pull/86748
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to