vsavchenko added a comment.

In D102213#2755963 <https://reviews.llvm.org/D102213#2755963>, @NoQ wrote:

> I totally agree that changing forFunction() to work correctly is the right 
> solution but backwards compatibility breakage is very real because 
> forFunction() accepts a Matcher<FunctionDecl> whereas forCallable() accepts 
> Matcher<Decl>

Yeah, I see now, it's not that straightforward.
Parameter type difference can be combated even keeping backward compatibility 
(so to speak). You can do `AST_MATCHER_P_OVERLOAD` (like it's done for 
`hasPrefix`, for example) to have two overloads of `forFunction`: one for 
`Matcher<FunctionDecl>` (aka old implementation) and one for `Matcher<Decl>` 
for new implementation.  I didn't check it, but it probably should work.  It is 
not elegant though and I'm not pushing it.

> The breakage is loud; the code will no longer compile when the intermediate 
> decl() (or namedDecl(), or whatever) is not present. The more annoying part 
> is that when you add namedDecl() back (or if you had it spelled out this way 
> from the start, which doesn't make much sense but is valid and shorter than 
> spelling out functionDecl()), your Node.get<FunctionDecl>() in the match 
> callback will silently start returning null (on anything that isn't a 
> functionDecl()) which may lead to unexpected crashes (previously there was no 
> match at all, now there's a match but the node isn't of the expected type). 
> So a relatively distant piece of code will require manual audit in order to 
> address the potential breakage.

The breakage example has a bit weird precondition IMO.  In that scenario, the 
user had to use `decl` or `namedDecl` where they actually meant `functionDecl` 
AND they should run their matchers on code with blocks.  And even if it does 
happen to someone, I think it's not going to be very painful because a simple 
dump of the node will show what's going on.

> Additionally, forCallable(functionDecl()) is not equivalent to forFunction() 
> (the former silently matches less stuff).

I'm not sure I understand this one.  Can you please show an example where one 
matches something that the other doesn't?


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

https://reviews.llvm.org/D102213

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

Reply via email to