xref: /llvm-project/clang/test/Analysis/enum.cpp (revision 59d10a4cbc511b257028cc7ec7520c31981c447b)
1184c6242SDominic Chen // RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=debug.ExprInspection %s
261e221f6SJordan Rose 
361e221f6SJordan Rose void clang_analyzer_eval(bool);
461e221f6SJordan Rose 
561e221f6SJordan Rose enum class Foo {
661e221f6SJordan Rose   Zero
761e221f6SJordan Rose };
861e221f6SJordan Rose 
pr15703(int x)961e221f6SJordan Rose bool pr15703(int x) {
1061e221f6SJordan Rose   return Foo::Zero == (Foo)x; // don't crash
1161e221f6SJordan Rose }
1261e221f6SJordan Rose 
testCasting(int i)1361e221f6SJordan Rose void testCasting(int i) {
1461e221f6SJordan Rose   Foo f = static_cast<Foo>(i);
1561e221f6SJordan Rose   int j = static_cast<int>(f);
1661e221f6SJordan Rose   if (i == 0)
1761e221f6SJordan Rose   {
1861e221f6SJordan Rose     clang_analyzer_eval(f == Foo::Zero); // expected-warning{{TRUE}}
1961e221f6SJordan Rose     clang_analyzer_eval(j == 0); // expected-warning{{TRUE}}
2061e221f6SJordan Rose   }
2161e221f6SJordan Rose   else
2261e221f6SJordan Rose   {
2361e221f6SJordan Rose     clang_analyzer_eval(f == Foo::Zero); // expected-warning{{FALSE}}
2461e221f6SJordan Rose     clang_analyzer_eval(j == 0); // expected-warning{{FALSE}}
2561e221f6SJordan Rose   }
2661e221f6SJordan Rose }
27015da353SAlexander Shaposhnikov 
28015da353SAlexander Shaposhnikov enum class EnumBool : bool {
29015da353SAlexander Shaposhnikov   F = false,
30015da353SAlexander Shaposhnikov   T = true
31015da353SAlexander Shaposhnikov };
32015da353SAlexander Shaposhnikov 
testNoCrashOnSwitchEnumBool(EnumBool E)33015da353SAlexander Shaposhnikov bool testNoCrashOnSwitchEnumBool(EnumBool E) {
34015da353SAlexander Shaposhnikov   switch (E) {
35015da353SAlexander Shaposhnikov   case EnumBool::F:
36015da353SAlexander Shaposhnikov     return false;
37015da353SAlexander Shaposhnikov   }
38015da353SAlexander Shaposhnikov   return true;
39015da353SAlexander Shaposhnikov }
40*59d10a4cSAlexander Shaposhnikov 
testNoCrashOnSwitchEnumBoolConstant()41*59d10a4cSAlexander Shaposhnikov bool testNoCrashOnSwitchEnumBoolConstant() {
42*59d10a4cSAlexander Shaposhnikov   EnumBool E = EnumBool::F;
43*59d10a4cSAlexander Shaposhnikov   switch (E) {
44*59d10a4cSAlexander Shaposhnikov     case EnumBool::F:
45*59d10a4cSAlexander Shaposhnikov       return false;
46*59d10a4cSAlexander Shaposhnikov   }
47*59d10a4cSAlexander Shaposhnikov   return true;
48*59d10a4cSAlexander Shaposhnikov }
49*59d10a4cSAlexander Shaposhnikov 
50*59d10a4cSAlexander Shaposhnikov typedef __INTPTR_TYPE__ intptr_t;
testNoCrashOnSwitchEnumBoolConstantCastedFromNullptr()51*59d10a4cSAlexander Shaposhnikov bool testNoCrashOnSwitchEnumBoolConstantCastedFromNullptr() {
52*59d10a4cSAlexander Shaposhnikov   EnumBool E = static_cast<EnumBool>((intptr_t)nullptr);
53*59d10a4cSAlexander Shaposhnikov   switch (E) {
54*59d10a4cSAlexander Shaposhnikov   case EnumBool::F:
55*59d10a4cSAlexander Shaposhnikov     return false;
56*59d10a4cSAlexander Shaposhnikov   }
57*59d10a4cSAlexander Shaposhnikov   return true;
58*59d10a4cSAlexander Shaposhnikov }
59*59d10a4cSAlexander Shaposhnikov 
testNoCrashOnSwitchEnumBoolConstantCastedFromPtr()60*59d10a4cSAlexander Shaposhnikov bool testNoCrashOnSwitchEnumBoolConstantCastedFromPtr() {
61*59d10a4cSAlexander Shaposhnikov   int X;
62*59d10a4cSAlexander Shaposhnikov   intptr_t P = (intptr_t)&X;
63*59d10a4cSAlexander Shaposhnikov   EnumBool E = static_cast<EnumBool>(P);
64*59d10a4cSAlexander Shaposhnikov   switch (E) {
65*59d10a4cSAlexander Shaposhnikov   case EnumBool::F:
66*59d10a4cSAlexander Shaposhnikov     return false;
67*59d10a4cSAlexander Shaposhnikov   }
68*59d10a4cSAlexander Shaposhnikov   return true;
69*59d10a4cSAlexander Shaposhnikov }
70