xref: /llvm-project/clang/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp (revision a393e68b27fcc8b78256407c99c6179acea056fe)
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 Rose void testBifurcation(A *a) {
115132aaebSJordan Rose   clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}}
125132aaebSJordan Rose }
135132aaebSJordan Rose 
testKnown()145132aaebSJordan Rose void testKnown() {
155132aaebSJordan Rose   A a;
165132aaebSJordan Rose   clang_analyzer_eval(a.get() == 0); // expected-warning{{TRUE}}
175132aaebSJordan Rose }
182010d437SJordan Rose 
testNew()193437669cSJordan Rose void 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