| Issue |
107975
|
| Summary |
Incorrect macro expansion post 79f87be6888d13a
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
ornata
|
Given clang >=18: https://godbolt.org/z/vGrv5P4Y8
Clang now sees this `elif` as true in c++14 mode:
```
#elif MY_HAS_STD_ATTRIBUTE(nodiscard) >= 201907L
#define MY_NODISCARD_WITH(...) [[nodiscard(__VA_ARGS__)]]
```
Code in-line for posterity:
```
#include <cstdio>
#if defined(__has_cpp_attribute)
#define MY_HAS_STD_ATTRIBUTE(...) __has_cpp_attribute(__VA_ARGS__)
#elif defined(__has_c_attribute)
#define MY_HAS_STD_ATTRIBUTE(...) __has_c_attribute(__VA_ARGS__)
#else
#define MY_HAS_STD_ATTRIBUTE(...) 0
#endif
#if defined(__clang__) && MY_HAS_STD_ATTRIBUTE(gnu::warn_unused_result)
#define MY_NODISCARD [[gnu::warn_unused_result]]
#elif MY_HAS_STD_ATTRIBUTE(nodiscard) >= 201603L
#define MY_NODISCARD [[nodiscard]]
#else
#define MY_NODISCARD
#endif
#if defined(__clang__) && MY_HAS_STD_ATTRIBUTE(gnu::warn_unused_result) >= 201907L
#define MY_NODISCARD_WITH(...) [[gnu::warn_unused_result(__VA_ARGS__)]]
#define MY_NODISCARD_WITH_IS "gnu::warn_unused_result(__VA_ARGS__)"
#elif MY_HAS_STD_ATTRIBUTE(nodiscard) >= 201907L
#define MY_NODISCARD_WITH(...) [[nodiscard(__VA_ARGS__)]]
#define MY_NODISCARD_WITH_IS "nodiscard(__VA_ARGS__) (got >=201907L)"
#else
#define MY_NODISCARD_WITH(...) MY_NODISCARD
#define MY_NODISCARD_WITH_IS "MY_NODISCARD"
#endif
MY_NODISCARD_WITH("boom")
int boom() noexcept { return 1; }
int main() {
printf("%s\n", MY_NODISCARD_WITH_IS);
return boom();
}
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs