xref: /llvm-project/clang/test/AST/ByteCode/switch.cpp (revision a07aba5d44204a7ca0d891a3da05af9960081e4c)
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