Support C++20 consteval functions and C++2b if consteval for AST
Matchers.
Details
- Reviewers
aaron.ballman cor3ntin sammccall
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp | ||
---|---|---|
1807 | Actually if consteval is a C++23 feature, but there is no isCXX23orLater() method. The is consteval construction seems to be backported to C++20 in clang, as it compiles and just emits a warning warning: consteval if is a C++2b extension [-Wc++2b-extensions] |
Adding a few more reviewers in case there are differing opinions.
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5173–5174 | ||
5179 | It'd be good to show an example of: if ! consteval {} if ! consteval {} else {} as well so users know what to expect. Should there be a matcher so users can distinguish between if consteval and if ! consteval? Test cases for these sort of things would also be appreciated. | |
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp | ||
1794–1796 | ||
1807–1809 | Yes, we support if consteval as an extension in older language modes, so I think this is reasonable. |
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5179 | Thanks!
This is an interesting question. I wonder how intensively if ! consteval is ever going to be used in real life to make a unique matcher for it? I can't make up a hypothetical checker that would need it. Let's see what other fellow reviewers think about it =) |
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5179 | That's a good question. Until a need present itself, maybe one is enough |
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5179 |
That's not the salient question. I'm more worried that the current interface is confusing and not easy to extend. There's no motivation in the review for why this support is needed, and we tend to err on the side of being conservative with matcher interfaces (we only add them when they're necessary and generally useful, otherwise users can use local matchers). I think the matcher isn't well designed for IfStmt and we should drop support for that initially, and only focus on support for FunctionDecl where the behavior is more clear. Then we can decide what the correct interface is for IfStmt once we have a better picture of how the matcher is expected to be used and a more general design for it. |
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5179 | That's not the salient question. I'm more worried that the current interface is confusing and not easy to extend. There's no motivation in the review for why this support is needed, and we tend to err on the side of being conservative with matcher interfaces (we only add them when they're necessary and generally useful, otherwise users can use local matchers). Arguably, there is one for if constexpr and both of them should be symmetric. Introducing asymmetry for no good reason seems wrong. I assume that there was a motivation initially?
This was initially my gut feeling, however there is no separate matcher for if constexpr(false) and if constexpr (true), so I don't think that if ! consteval needs to be treated differently here. |
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5179 | You can match over the expression in if constexpr to determine whether it's true or false (at least in theory, we probably need some better matchers around constant expression value comparisons), but you cannot match over the syntax of if ! consteval vs if consteval, so I see them as being different cases in that regard. |
LGTM with a minor adjustment to the documentation.
clang/include/clang/ASTMatchers/ASTMatchers.h | ||
---|---|---|
5173 | Needs to be re-wrapped to 80-col, mostly wanting to call out the if ! consteval bit more explicitly. | |
5179 | I spoke with @cor3ntin off-list a bit about this and am now more comfortable. What was bothering me was that: if consteval { } if ! consteval { } are both matched by ifStmt(isConsteval()) and matching on the second case looks downright odd to me. However, that is the interface of our AST. We can add isNonNegatedConsteval() and isNegatedConsteval() as matchers when we need to distinguish between the cases. Thanks for bearing with me while I figured that out. :-) |
LGTM! Do you need someone to commit on your behalf? If so, what name and email address would you like used for patch attribution?
Sorry, I should have set the Author property of the commit! I would like to use name "Evgeny Shulgin" and email "izaronplatz@gmail.com". Thanks!
No worries! I've commit on your behalf in b80db150cdba17b3d4970389025f95b1c93482b8 (I also added a short release note, which I forgot to mention during the review). Thank you for the new matcher!
Needs to be re-wrapped to 80-col, mostly wanting to call out the if ! consteval bit more explicitly.