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