aaron.ballman accepted this revision.
aaron.ballman added a comment.
This revision is now accepted and ready to land.

LGTM with a minor adjustment to the documentation.



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:5173
 
+/// Matches consteval function declarations and if consteval.
+///
----------------
Needs to be re-wrapped to 80-col, mostly wanting to call out the `if ! 
consteval` bit more explicitly.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:5179
+///   consteval int bar();
+///   void baz() { if consteval {} }
+/// \endcode
----------------
aaron.ballman wrote:
> cor3ntin wrote:
> > aaron.ballman wrote:
> > > cor3ntin wrote:
> > > > Izaron wrote:
> > > > > aaron.ballman wrote:
> > > > > > 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.
> > > > > Thanks!
> > > > > > Should there be a matcher so users can distinguish between `if 
> > > > > > consteval` and `if ! consteval`?
> > > > > 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 =)
> > > > That's a good question.
> > > > Maybe we can add it later if there is a need?
> > > > I suspect that if we need 2, we need 3, `hasConsteval`, 
> > > > `hasNegatedConsteval`, `hasNonNegatedConsteval`
> > > > 
> > > > Until a need present itself,  maybe one is enough
> > > > 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.
> > > 
> > > 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.
> > 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?
> >  
> > > 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.
> > 
> > 
> > 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.
> > Either way, i don't think adding one hurts
> > 
> > 
> > 
> > 
> 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.
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. :-)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D117613/new/

https://reviews.llvm.org/D117613

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to