[cfe-dev] RFC: Easier AST Matching by Default
Stephen Kelly via cfe-dev
cfe-dev at lists.llvm.org
Wed Jun 17 15:49:55 PDT 2020
On 17/06/2020 22:47, Richard Smith wrote:
> Consider the example from Yitzhak Mandelbaum -- the issue there is
> actually not whether we have a template or not; rather, it's a
> difference between one- and two-argument constructors:
> I hope you can agree that this change in behavior, for an example such
> as this, is a regression for the ability for beginners to understand
> how matchers work and effectively write them!
Yes, I see your point. The current state doesn't account well for this
case.
Would it resolve the problem if the CXXConstructExpr was not excluded in
this case (in the initializer of a VarDecl), assuming that can be
implemented?
I think it would remain better for newcomers not to see (and match on)
the CXXConstructExprs in https://godbolt.org/z/TvUTgy .
>> Perhaps as an alternative, we should not skip implicit nodes when
>> trying to match a node that might be implicit (analogous to how
>> Type::getAs steps over sugar nodes except when looking for that
>> type sugar node), and instead of hiding implicit nodes in the AST
>> dump we should dim them out but still show them?
>
>
> Color wouldn't be particularly distinctive, especially in godbolt
> for example, but it also would mean that the confusing stuff is
> still *there* in the output. It can be overwhelming when
> absolutely everything in the output is new and confusing.
>
> (I also note that newcomers to Matchers don't need to see the AST
> at all if the clang-query shows them the matchers they can use
> instead: http://ce.steveire.com/z/9EF8x0 see my other posts on the
> topic for more)
>
> Perhaps we should consider the AST dump to be an expert-level feature
> and not try to optimize it for beginner usage, especially if we have
> better output methods. I'm not sure, though; I think telling beginners
> to look at the AST dump and match what they see there has been
> somewhat effective.
Yes, I think it makes sense for newcomers to be able to get
non-overwhelming exposure to the AST but not have to be confronted with
it from the very beginning. That is where making clang-query output
matchers could be useful as a beginning point. That is not yet upstream
yet however.
> I think we should assume that we can ask the maintainers of compiler
> explorer to render the output nicely, if we find that's a problem.
> (They already apply some postprocessing to it, to remove pointer
> values and the like.)
The "AST Output" on Compiler Explorer filters out pointers, but the
clang-query tool does not. I have designs to have a way to make
clang-query omit them anyway (using enable output simple-ast instead of
detailed-ast - that is not upstream yet, but I think it means we don't
need to do that kind of filtering in Compiler Explorer).
I think colors in the output might already show up properly, but that
would still leave the problem of the things being *there*, even if they
are greyed out or surrounded in square brackets (which I would find even
more confusing and noisy).
> Nevertheless, this change in the direction that I consider easier
> hasn't been 100% popular among other clang developers (though I
> wonder how much of that is due to being experts?). At this point,
> if someone wishes to reverse the change of default I don't think I
> would attempt to oppose it. It's not clear to me whether my vision
> for making things easier for newcomers (which I set out in
> EuroLLVM and which included ignoring these nodes) is shared. It
> might be better at this point for others to decide.
>
> I think it's a good goal. But I think the implementation needs some
> refinement. Did you have any thoughts on my suggestion of how to fix
> this? (That is: try matching against implicit nodes, but skip them if
> they don't match.) I don't think you commented on it.
I think the best refinement for now would be to restore the
CXXConstructExpr in the case of a varDecl initializer, if that is
possible (may not be).
If I understand your suggestion, given
```
struct B
{
B(int);
};
B func1() {
return 42;
}
```
a matcher like `returnStmt(hasReturnValue(fooExpr()))`
would match for `fooExpr` as any of
* exprWithCleanups()
* cxxConstructExpr() (twice)
* materializeTemporaryExpr()
* implicitCastExpr()
* integerLiteral()
right?
and a matcher like `returnStmt(hasReturnValue(expr().bind("theReturnVal")))`
would bind "theReturnVal" to the `exprWithCleanups()` right?
Your suggestion may be that it should bind to the integerLiteral() in
that case. That may have more scope for confusion though?
Thanks,
Stephen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200617/c971d25e/attachment.html>
More information about the cfe-dev
mailing list