summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/rvo.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-07-01 23:02:18 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-07-01 23:02:18 +0000
commitceb639dbeea97c901b2642ebe296eb358d27b2f6 (patch)
treea8a86d4fe063869ad50940409ed31bb73f952923 /clang/test/Analysis/rvo.cpp
parent512f4838c47c5bab13d8bb0eabc01d64222825ae (diff)
downloadbcm5719-llvm-ceb639dbeea97c901b2642ebe296eb358d27b2f6.tar.gz
bcm5719-llvm-ceb639dbeea97c901b2642ebe296eb358d27b2f6.zip
[analyzer] Fix invalidation when returning into a ctor initializer.
Due to RVO the target region of a function that returns an object by value isn't necessarily a temporary object region; it may be an arbitrary memory region. In particular, it may be a field of a bigger object. Make sure we don't invalidate the bigger object when said function is evaluated conservatively. Differential Revision: https://reviews.llvm.org/D63968 llvm-svn: 364870
Diffstat (limited to 'clang/test/Analysis/rvo.cpp')
-rw-r--r--clang/test/Analysis/rvo.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/Analysis/rvo.cpp b/clang/test/Analysis/rvo.cpp
new file mode 100644
index 00000000000..cf06a9570b3
--- /dev/null
+++ b/clang/test/Analysis/rvo.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker core,cplusplus \
+// RUN: -analyzer-checker debug.ExprInspection -verify %s
+
+void clang_analyzer_eval(bool);
+
+struct A {
+ int x;
+};
+
+A getA();
+
+struct B {
+ int *p;
+ A a;
+
+ B(int *p) : p(p), a(getA()) {}
+};
+
+void foo() {
+ B b1(nullptr);
+ clang_analyzer_eval(b1.p == nullptr); // expected-warning{{TRUE}}
+ B b2(new int); // No leak yet!
+ clang_analyzer_eval(b2.p == nullptr); // expected-warning{{FALSE}}
+ // expected-warning@-1{{Potential leak of memory pointed to by 'b2.p'}}
+}
OpenPOWER on IntegriCloud