1 | // 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 |
2 | |
3 | void clang_analyzer_eval(bool); |
4 | void clang_analyzer_warnOnDeadSymbol(int); |
5 | |
6 | typedef __typeof__(sizeof(int)) size_t; |
7 | |
8 | int conjure(); |
9 | void exit(int); |
10 | |
11 | struct S { |
12 | S() {} |
13 | ~S() {} |
14 | |
15 | static S buffer[1000]; |
16 | |
17 | // This operator allocates stuff within the buffer. Additionally, it never |
18 | // places anything at the beginning of the buffer. |
19 | void *operator new(size_t size) { |
20 | int i = conjure(); |
21 | if (i == 0) |
22 | exit(1); |
23 | // Let's see if the symbol dies before new-expression is evaluated. |
24 | // It shouldn't. |
25 | clang_analyzer_warnOnDeadSymbol(i); |
26 | return buffer + i; |
27 | } |
28 | }; |
29 | |
30 | void testIndexLiveness() { |
31 | S *s = new S(); |
32 | clang_analyzer_eval(s == S::buffer); // expected-warning{{FALSE}} |
33 | } // expected-warning{{SYMBOL DEAD}} |
34 | |