1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config ipa=dynamic-bifurcate -verify -Wno-reinterpret-base-class %s 2b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose 3b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rosevoid clang_analyzer_eval(bool); 4b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose 5b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Roseclass A { 6b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rosepublic: 7b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose virtual int get() { return 0; } 8b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose}; 9b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose 10b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rosevoid testBifurcation(A *a) { 11b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} 12b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose} 13b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose 14b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rosevoid testKnown() { 15b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose A a; 16b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose clang_analyzer_eval(a.get() == 0); // expected-warning{{TRUE}} 17b763ede873c23c8651bd18eba0c62e929b496ba5Jordan Rose} 183225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose 19fbc4444eb2675934b44f3720ef9a5f368ecbeb0aJordan Rosevoid testNew() { 20fbc4444eb2675934b44f3720ef9a5f368ecbeb0aJordan Rose A *a = new A(); 21fbc4444eb2675934b44f3720ef9a5f368ecbeb0aJordan Rose clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} 22fbc4444eb2675934b44f3720ef9a5f368ecbeb0aJordan Rose} 23fbc4444eb2675934b44f3720ef9a5f368ecbeb0aJordan Rose 243225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose 253225d072a348658cb67c45cdb46a981b09d1f562Jordan Rosenamespace ReinterpretDisruptsDynamicTypeInfo { 263225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose class Parent {}; 273225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose 283225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose class Child : public Parent { 293225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose public: 303225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose virtual int foo() { return 42; } 313225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose }; 323225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose 333225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose void test(Parent *a) { 343225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose Child *b = reinterpret_cast<Child *>(a); 353225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose if (!b) return; 363225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose clang_analyzer_eval(b->foo() == 42); // expected-warning{{UNKNOWN}} 373225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose } 383225d072a348658cb67c45cdb46a981b09d1f562Jordan Rose} 39