1 // RUN: %clang_analyze_cc1 -w -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_warnIfReached(); 5 6 struct S { 7 int x; SS8 S() : x(1) {} ~SS9 ~S() {} 10 }; 11 checkConstructorInlining()12void checkConstructorInlining() { 13 S *s = new S; 14 clang_analyzer_eval(s->x == 1); // expected-warning{{TRUE}} 15 } 16 checkNewPOD()17void checkNewPOD() { 18 int *i = new int; 19 clang_analyzer_eval(*i == 0); // expected-warning{{UNKNOWN}} 20 int *j = new int(); 21 clang_analyzer_eval(*j == 0); // expected-warning{{TRUE}} 22 int *k = new int(5); 23 clang_analyzer_eval(*k == 5); // expected-warning{{TRUE}} 24 } 25 checkNewArray()26void checkNewArray() { 27 S *s = new S[10]; 28 29 // FIXME: Handle big array construction 30 clang_analyzer_eval(s[0].x == 1); // expected-warning{{UNKNOWN}} 31 clang_analyzer_eval(s[1].x == 1); // expected-warning{{UNKNOWN}} 32 33 s = new S[4]; 34 clang_analyzer_eval(s[0].x == 1); // expected-warning{{TRUE}} 35 clang_analyzer_eval(s[1].x == 1); // expected-warning{{TRUE}} 36 } 37 38 struct NullS { NullSNullS39 NullS() { 40 if (this) {} 41 } NullSNullS42 NullS(int x) { 43 if (!this) { 44 clang_analyzer_warnIfReached(); // no-warning 45 } 46 } 47 }; 48 checkNullThis()49void checkNullThis() { 50 NullS *nulls = new NullS(); // no-crash 51 NullS *nulls2 = new NullS(0); 52 } 53