1*a393e68bSGeorge Karpenkov // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config ipa=dynamic-bifurcate -verify -Wno-reinterpret-base-class -analyzer-config eagerly-assume=false %s 25132aaebSJordan Rose 35132aaebSJordan Rose void clang_analyzer_eval(bool); 45132aaebSJordan Rose 55132aaebSJordan Rose class A { 65132aaebSJordan Rose public: get()75132aaebSJordan Rose virtual int get() { return 0; } 85132aaebSJordan Rose }; 95132aaebSJordan Rose testBifurcation(A * a)105132aaebSJordan Rosevoid testBifurcation(A *a) { 115132aaebSJordan Rose clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} 125132aaebSJordan Rose } 135132aaebSJordan Rose testKnown()145132aaebSJordan Rosevoid testKnown() { 155132aaebSJordan Rose A a; 165132aaebSJordan Rose clang_analyzer_eval(a.get() == 0); // expected-warning{{TRUE}} 175132aaebSJordan Rose } 182010d437SJordan Rose testNew()193437669cSJordan Rosevoid testNew() { 203437669cSJordan Rose A *a = new A(); 213437669cSJordan Rose clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} 223437669cSJordan Rose } 233437669cSJordan Rose 242010d437SJordan Rose 252010d437SJordan Rose namespace ReinterpretDisruptsDynamicTypeInfo { 262010d437SJordan Rose class Parent {}; 272010d437SJordan Rose 282010d437SJordan Rose class Child : public Parent { 292010d437SJordan Rose public: foo()302010d437SJordan Rose virtual int foo() { return 42; } 312010d437SJordan Rose }; 322010d437SJordan Rose test(Parent * a)332010d437SJordan Rose void test(Parent *a) { 342010d437SJordan Rose Child *b = reinterpret_cast<Child *>(a); 352010d437SJordan Rose if (!b) return; 362010d437SJordan Rose clang_analyzer_eval(b->foo() == 42); // expected-warning{{UNKNOWN}} 372010d437SJordan Rose } 382010d437SJordan Rose } 39