xref: /minix3/external/bsd/llvm/dist/clang/test/Analysis/enum.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -analyze -std=c++11 -analyzer-checker=debug.ExprInspection %s
2*f4a2713aSLionel Sambuc 
3*f4a2713aSLionel Sambuc void clang_analyzer_eval(bool);
4*f4a2713aSLionel Sambuc 
5*f4a2713aSLionel Sambuc enum class Foo {
6*f4a2713aSLionel Sambuc   Zero
7*f4a2713aSLionel Sambuc };
8*f4a2713aSLionel Sambuc 
pr15703(int x)9*f4a2713aSLionel Sambuc bool pr15703(int x) {
10*f4a2713aSLionel Sambuc   return Foo::Zero == (Foo)x; // don't crash
11*f4a2713aSLionel Sambuc }
12*f4a2713aSLionel Sambuc 
testCasting(int i)13*f4a2713aSLionel Sambuc void testCasting(int i) {
14*f4a2713aSLionel Sambuc   Foo f = static_cast<Foo>(i);
15*f4a2713aSLionel Sambuc   int j = static_cast<int>(f);
16*f4a2713aSLionel Sambuc   if (i == 0)
17*f4a2713aSLionel Sambuc   {
18*f4a2713aSLionel Sambuc     clang_analyzer_eval(f == Foo::Zero); // expected-warning{{TRUE}}
19*f4a2713aSLionel Sambuc     clang_analyzer_eval(j == 0); // expected-warning{{TRUE}}
20*f4a2713aSLionel Sambuc   }
21*f4a2713aSLionel Sambuc   else
22*f4a2713aSLionel Sambuc   {
23*f4a2713aSLionel Sambuc     clang_analyzer_eval(f == Foo::Zero); // expected-warning{{FALSE}}
24*f4a2713aSLionel Sambuc     clang_analyzer_eval(j == 0); // expected-warning{{FALSE}}
25*f4a2713aSLionel Sambuc   }
26*f4a2713aSLionel Sambuc }
27