// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-ipa=inlining -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; // FIXME: We should warn here, since we're creating the reference here. RefWrapper X(*p); // expected-warning@-12 {{Dereference of null pointer}} } extern "C" char *strdup(const char *); class StringWrapper { char *str; public: StringWrapper(const char *input) : str(strdup(input)) {} // no-warning };