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

Reply via email to