[cfe-dev] Reuse of expressions in synthesized functions.

Douglas Gregor dgregor at apple.com
Tue Aug 13 15:30:05 PDT 2013


On Aug 13, 2013, at 3:08 AM, Pavel Labath <labath at google.com> wrote:

> Greetings,
> 
> I have encountered a bug in the static analyzer <http://llvm.org/bugs/show_bug.cgi?id=16745>, which I have traced back to a problem with a synthesized operator=(). In short, the analyzer currently assumes that each expression object occurs in a function only once, and this breaks down for synthesized functions, as Sema happily reuses various Exprs there.
> 
> So, now the question is how to proceed. One possible solution (one that Jordan suggests) would be to have Sema not reuse any Exprs during synthesis of various functions. This should be fairly easy, but it will touch a larger amount of code (as the synthesis algorithm is recursive, I would need to pass some sort of expression factory objects instead of plain Expr *s back and forth). It would also make the code look less pretty and cause (probably only slight) memory increase.
> 
> Because of these downsides, I am not sure if a change like this would be accepted into the tree. Therefore, I wanted to ask you what do you think about this change before I invest time into carrying it out. Would you accept a patch like this? Or should i try to fix the problem from the analyzer side (right now I think it's doable, but it's quite possible i'll run into unexpected troubles)? Also, can you think of any other situations where sharing expression objects could cause troubles (template instantiations have been mentioned, but these should be fine as they don't produce nodes in the same function)?

I think it’s fine to teach Sema to build unique expressions within its synthesized assignment operators. It’s a cleaner model for the AST anyway.

	- Doug


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130813/4378043c/attachment.html>


More information about the cfe-dev mailing list