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 Rosebool pr15703(int x) { 1061e221f6SJordan Rose return Foo::Zero == (Foo)x; // don't crash 1161e221f6SJordan Rose } 1261e221f6SJordan Rose testCasting(int i)1361e221f6SJordan Rosevoid 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 Shaposhnikovbool 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 Shaposhnikovbool 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 Shaposhnikovbool 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 Shaposhnikovbool 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