1*a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++17 -fexperimental-new-constant-interpreter -verify=expected,both %s 2*a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++17 -verify=ref,both %s 3*a07aba5dSTimm Baeder 4*a07aba5dSTimm Baeder constexpr bool isEven(int a) { 5*a07aba5dSTimm Baeder bool v = false; 6*a07aba5dSTimm Baeder switch(a) { 7*a07aba5dSTimm Baeder case 2: return true; 8*a07aba5dSTimm Baeder case 4: return true; 9*a07aba5dSTimm Baeder case 6: return true; 10*a07aba5dSTimm Baeder 11*a07aba5dSTimm Baeder case 8: 12*a07aba5dSTimm Baeder case 10: 13*a07aba5dSTimm Baeder case 12: 14*a07aba5dSTimm Baeder case 14: 15*a07aba5dSTimm Baeder case 16: 16*a07aba5dSTimm Baeder return true; 17*a07aba5dSTimm Baeder case 18: 18*a07aba5dSTimm Baeder v = true; 19*a07aba5dSTimm Baeder break; 20*a07aba5dSTimm Baeder 21*a07aba5dSTimm Baeder default: 22*a07aba5dSTimm Baeder switch(a) { 23*a07aba5dSTimm Baeder case 1: 24*a07aba5dSTimm Baeder break; 25*a07aba5dSTimm Baeder case 3: 26*a07aba5dSTimm Baeder return false; 27*a07aba5dSTimm Baeder default: 28*a07aba5dSTimm Baeder break; 29*a07aba5dSTimm Baeder } 30*a07aba5dSTimm Baeder } 31*a07aba5dSTimm Baeder 32*a07aba5dSTimm Baeder return v; 33*a07aba5dSTimm Baeder } 34*a07aba5dSTimm Baeder static_assert(isEven(2), ""); 35*a07aba5dSTimm Baeder static_assert(isEven(8), ""); 36*a07aba5dSTimm Baeder static_assert(isEven(10), ""); 37*a07aba5dSTimm Baeder static_assert(isEven(18), ""); 38*a07aba5dSTimm Baeder static_assert(!isEven(1), ""); 39*a07aba5dSTimm Baeder static_assert(!isEven(3), ""); 40*a07aba5dSTimm Baeder 41*a07aba5dSTimm Baeder 42*a07aba5dSTimm Baeder constexpr int withInit() { 43*a07aba5dSTimm Baeder switch(int a = 2; a) { 44*a07aba5dSTimm Baeder case 1: return -1; 45*a07aba5dSTimm Baeder case 2: return 2; 46*a07aba5dSTimm Baeder } 47*a07aba5dSTimm Baeder return -1; 48*a07aba5dSTimm Baeder } 49*a07aba5dSTimm Baeder static_assert(withInit() == 2, ""); 50*a07aba5dSTimm Baeder 51*a07aba5dSTimm Baeder constexpr int FT(int a) { 52*a07aba5dSTimm Baeder int m = 0; 53*a07aba5dSTimm Baeder switch(a) { 54*a07aba5dSTimm Baeder case 4: m++; 55*a07aba5dSTimm Baeder case 3: m++; 56*a07aba5dSTimm Baeder case 2: m++; 57*a07aba5dSTimm Baeder case 1: m++; 58*a07aba5dSTimm Baeder return m; 59*a07aba5dSTimm Baeder } 60*a07aba5dSTimm Baeder 61*a07aba5dSTimm Baeder return -1; 62*a07aba5dSTimm Baeder } 63*a07aba5dSTimm Baeder static_assert(FT(1) == 1, ""); 64*a07aba5dSTimm Baeder static_assert(FT(4) == 4, ""); 65*a07aba5dSTimm Baeder static_assert(FT(5) == -1, ""); 66*a07aba5dSTimm Baeder 67*a07aba5dSTimm Baeder 68*a07aba5dSTimm Baeder constexpr int good() { return 1; } 69*a07aba5dSTimm Baeder constexpr int test(int val) { 70*a07aba5dSTimm Baeder switch (val) { 71*a07aba5dSTimm Baeder case good(): return 100; 72*a07aba5dSTimm Baeder default: return -1; 73*a07aba5dSTimm Baeder } 74*a07aba5dSTimm Baeder return 0; 75*a07aba5dSTimm Baeder } 76*a07aba5dSTimm Baeder static_assert(test(1) == 100, ""); 77*a07aba5dSTimm Baeder 78*a07aba5dSTimm Baeder constexpr int bad(int val) { return val / 0; } // both-warning {{division by zero}} 79*a07aba5dSTimm Baeder constexpr int another_test(int val) { // both-note {{declared here}} 80*a07aba5dSTimm Baeder switch (val) { 81*a07aba5dSTimm Baeder case bad(val): return 100; // both-error {{case value is not a constant expression}} \ 82*a07aba5dSTimm Baeder // both-note {{cannot be used in a constant expression}} 83*a07aba5dSTimm Baeder default: return -1; 84*a07aba5dSTimm Baeder } 85*a07aba5dSTimm Baeder return 0; 86*a07aba5dSTimm Baeder } 87*a07aba5dSTimm Baeder static_assert(another_test(1) == 100, ""); // both-error {{static assertion failed}} \ 88*a07aba5dSTimm Baeder // both-note {{evaluates to}} 89