blob: be43791512782ea5f440a9b8a4f36459a583da99 [file] [log] [blame]
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-allocator-inlining=true -std=c++11 -verify -analyzer-config eagerly-assume=false %s
void clang_analyzer_eval(bool);
void clang_analyzer_warnOnDeadSymbol(int);
typedef __typeof__(sizeof(int)) size_t;
int conjure();
void exit(int);
struct S {
S() {}
~S() {}
static S buffer[1000];
// This operator allocates stuff within the buffer. Additionally, it never
// places anything at the beginning of the buffer.
void *operator new(size_t size) {
int i = conjure();
if (i == 0)
exit(1);
// Let's see if the symbol dies before new-expression is evaluated.
// It shouldn't.
clang_analyzer_warnOnDeadSymbol(i);
return buffer + i;
}
};
void testIndexLiveness() {
S *s = new S();
clang_analyzer_eval(s == S::buffer); // expected-warning{{FALSE}}
} // expected-warning{{SYMBOL DEAD}}