1a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose// RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=debug.ExprInspection %s 2a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose 3a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rosevoid clang_analyzer_eval(bool); 4a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose 5a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Roseenum class Foo { 6a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose Zero 7a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose}; 8a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose 9a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rosebool pr15703(int x) { 10a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose return Foo::Zero == (Foo)x; // don't crash 11a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose} 12a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose 13a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rosevoid testCasting(int i) { 14a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose Foo f = static_cast<Foo>(i); 15a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose int j = static_cast<int>(f); 16a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose if (i == 0) 17a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose { 18a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose clang_analyzer_eval(f == Foo::Zero); // expected-warning{{TRUE}} 19a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose clang_analyzer_eval(j == 0); // expected-warning{{TRUE}} 20a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose } 21a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose else 22a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose { 23a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose clang_analyzer_eval(f == Foo::Zero); // expected-warning{{FALSE}} 24a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose clang_analyzer_eval(j == 0); // expected-warning{{FALSE}} 25a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose } 26a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose} 27