[PATCH] D47350: [analyzer] Track class member initializer constructors path-sensitively within their construction context.
Artem Dergachev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu May 24 16:45:18 PDT 2018
NoQ created this revision.
NoQ added reviewers: dcoughlin, xazax.hun, a.sidorin, george.karpenkov, szepet, rnkovacs.
Herald added subscribers: cfe-commits, baloghadamsoftware.
Same as https://reviews.llvm.org/D47305 but for `CXXCtorInitializer`-based constructors, based on the discussion in http://lists.llvm.org/pipermail/cfe-dev/2018-May/058055.html
Because these don't suffer from liveness bugs (member variables are born much earlier than their constructors are called and live much longer than stack locals), this is mostly a refactoring pass. It has minor observable side effects, but it will have way more visible effects when we enable C++17 construction contexts because finding the direct constructor would be much harder.
Currently the observable effect is that we can preserve direct bindings to the object more often and we need to fall back to binding the lazy compound value of the initializer expression less often. Direct bindings are modeled better by the store. In the provided test case the default binding produced by trivial-copying `s` to `t.s` would overwrite the existing default binding to `t`. But if we instead preserve direct bindings, only bindings that correspond to `t.s` will be overwritten and the binding for `t.w` will remain untouched. This only works for C++17 because in C++11 the member variable is still modeled as a trivial copy from the temporary object, because there semantically *is* a temporary object, while in C++17 it is elided.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 11899 bytes
Desc: not available
More information about the cfe-commits