diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-02-21 01:34:51 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-02-21 01:34:51 +0000 |
commit | 11f0cae4bf4f62dcc706d33c1f795d460cd64816 (patch) | |
tree | 7053818473975fee08a29ee0724bbbcac315c481 /test/Analysis/derived-to-base.cpp | |
parent | 943f909ba72a1c9351dd421cac1413d303a719f1 (diff) | |
download | clang-11f0cae4bf4f62dcc706d33c1f795d460cd64816.tar.gz |
[analyzer] Tighten up safety in the use of lazy bindings.
- When deciding if we can reuse a lazy binding, make sure to check if there
are additional bindings in the sub-region.
- When reading from a lazy binding, don't accidentally strip off casts or
base object regions. This slows down lazy binding reading a bit but is
necessary for type sanity when treating one class as another.
A bit of minor refactoring allowed these two checks to be unified in a nice
early-return-using helper function.
<rdar://problem/13239840>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175703 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis/derived-to-base.cpp')
-rw-r--r-- | test/Analysis/derived-to-base.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/test/Analysis/derived-to-base.cpp b/test/Analysis/derived-to-base.cpp index 80dbc178c4..6e4a3fa87a 100644 --- a/test/Analysis/derived-to-base.cpp +++ b/test/Analysis/derived-to-base.cpp @@ -303,4 +303,33 @@ namespace LazyBindings { } #endif } + +#if CONSTRUCTORS + namespace Nested { + struct NonTrivialCopy { + int padding; + NonTrivialCopy() {} + NonTrivialCopy(const NonTrivialCopy &) {} + }; + + struct FullyDerived : private NonTrivialCopy, public Derived { + int z; + }; + + struct Wrapper { + FullyDerived d; + int zz; + + Wrapper(const FullyDerived &d) : d(d), zz(0) {} + }; + + void test5() { + Wrapper w((FullyDerived())); + w.d.x = 1; + + Wrapper w2(w); + clang_analyzer_eval(getX(w2.d) == 1); // expected-warning{{TRUE}} + } + } +#endif } |