// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=inlining -verify %s void clang_analyzer_eval(bool); class A { public: int getZero() { return 0; } virtual int getNum() { return 0; } }; void test(A &a) { clang_analyzer_eval(a.getZero() == 0); // expected-warning{{TRUE}} clang_analyzer_eval(a.getNum() == 0); // expected-warning{{UNKNOWN}} A copy(a); clang_analyzer_eval(copy.getZero() == 0); // expected-warning{{TRUE}} clang_analyzer_eval(copy.getNum() == 0); // expected-warning{{TRUE}} } class One : public A { public: virtual int getNum() { return 1; } }; void testPathSensitivity(int x) { A a; One b; A *ptr; switch (x) { case 0: ptr = &a; break; case 1: ptr = &b; break; default: return; } // This should be true on both branches. clang_analyzer_eval(ptr->getNum() == x); // expected-warning {{TRUE}} }