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