|  | // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=constructors -std=c++11 -verify %s | 
|  |  | 
|  | void clang_analyzer_eval(bool); | 
|  |  | 
|  | class A { | 
|  | int x; | 
|  | public: | 
|  | A(); | 
|  | }; | 
|  |  | 
|  | A::A() : x(0) { | 
|  | clang_analyzer_eval(x == 0); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  |  | 
|  | class DirectMember { | 
|  | int x; | 
|  | public: | 
|  | DirectMember(int value) : x(value) {} | 
|  |  | 
|  | int getX() { return x; } | 
|  | }; | 
|  |  | 
|  | void testDirectMember() { | 
|  | DirectMember obj(3); | 
|  | clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  |  | 
|  | class IndirectMember { | 
|  | struct { | 
|  | int x; | 
|  | }; | 
|  | public: | 
|  | IndirectMember(int value) : x(value) {} | 
|  |  | 
|  | int getX() { return x; } | 
|  | }; | 
|  |  | 
|  | void testIndirectMember() { | 
|  | IndirectMember obj(3); | 
|  | clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  |  | 
|  | struct DelegatingConstructor { | 
|  | int x; | 
|  | DelegatingConstructor(int y) { x = y; } | 
|  | DelegatingConstructor() : DelegatingConstructor(42) {} | 
|  | }; | 
|  |  | 
|  | void testDelegatingConstructor() { | 
|  | DelegatingConstructor obj; | 
|  | clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  |  | 
|  | struct RefWrapper { | 
|  | RefWrapper(int *p) : x(*p) {} | 
|  | RefWrapper(int &r) : x(r) {} | 
|  | int &x; | 
|  | }; | 
|  |  | 
|  | void testReferenceMember() { | 
|  | int *p = 0; | 
|  | RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}} | 
|  | } | 
|  |  | 
|  | void testReferenceMember2() { | 
|  | int *p = 0; | 
|  | RefWrapper X(*p); // expected-warning {{Forming reference to null pointer}} | 
|  | } | 
|  |  | 
|  |  | 
|  | extern "C" char *strdup(const char *); | 
|  |  | 
|  | class StringWrapper { | 
|  | char *str; | 
|  | public: | 
|  | StringWrapper(const char *input) : str(strdup(input)) {} // no-warning | 
|  | }; | 
|  |  | 
|  |  | 
|  | // PR15070 - Constructing a type containing a non-POD array mistakenly | 
|  | // tried to perform a bind instead of relying on the CXXConstructExpr, | 
|  | // which caused a cast<> failure in RegionStore. | 
|  | namespace DefaultConstructorWithCleanups { | 
|  | class Element { | 
|  | public: | 
|  | int value; | 
|  |  | 
|  | class Helper { | 
|  | public: | 
|  | ~Helper(); | 
|  | }; | 
|  | Element(Helper h = Helper()); | 
|  | }; | 
|  | class Wrapper { | 
|  | public: | 
|  | Element arr[2]; | 
|  |  | 
|  | Wrapper(); | 
|  | }; | 
|  |  | 
|  | Wrapper::Wrapper() /* initializers synthesized */ {} | 
|  |  | 
|  | int test() { | 
|  | Wrapper w; | 
|  | return w.arr[0].value; // no-warning | 
|  | } | 
|  | } |