teak-llvm/clang/test/Analysis/rvo.cpp
Artem Dergachev ceb639dbee [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
2019-07-01 23:02:18 +00:00

26 lines
550 B
C++

// 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'}}
}