@@ -23,19 +23,49 @@ void foo() { // CHECK-NEXT: Gap,File 0, [[@LINE+1]]:21 -> [[@
23
23
} // CHECK-NEXT: [[@LINE-2]]:9 -> [[@LINE-1]]:5 = #1
24
24
// CHECK-NEXT: [[@LINE-2]]:5 -> [[@LINE-2]]:8 = #1
25
25
26
- // FIXME: Do not generate coverage for discarded branches in if consteval and if constexpr statements
27
- constexpr int check_consteval (int i) {
28
- if consteval {
29
- i++;
30
- }
31
- if !consteval {
32
- i++;
33
- }
34
- if consteval {
35
- return 42 ;
36
- } else {
37
- return i;
38
- }
26
+ // FIXME: Do not generate coverage for discarded branches in if constexpr
27
+ // CHECK-LABEL: _Z30check_constexpr_true_with_elsei:
28
+ int check_constexpr_true_with_else (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
29
+ // CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+2]]:20 = #0
30
+ // CHECK-NEXT: Branch,File 0, [[@LINE+1]]:16 -> [[@LINE+1]]:20 = 0, 0
31
+ if constexpr (true ) { // CHECK-NEXT: Gap,File 0, [[@LINE]]:21 -> [[@LINE]]:22 = #1
32
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:22 -> [[@LINE+1]]:4 = #1
33
+ } else { // CHECK-NEXT: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10 = (#0 - #1)
34
+ i *= 5 ; // CHECK-NEXT: [[@LINE-1]]:10 -> [[@LINE+1]]:4 = (#0 - #1)
35
+ }
36
+ return i;
37
+ }
38
+
39
+ // CHECK-LABEL: _Z33check_constexpr_true_without_elsei:
40
+ int check_constexpr_true_without_else (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
41
+ // CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+2]]:20 = #0
42
+ // CHECK-NEXT: Branch,File 0, [[@LINE+1]]:16 -> [[@LINE+1]]:20 = 0, 0
43
+ if constexpr (true ) { // CHECK-NEXT: Gap,File 0, [[@LINE]]:21 -> [[@LINE]]:22 = #1
44
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:22 -> [[@LINE+1]]:4 = #1
45
+ }
46
+ return i;
47
+ }
48
+
49
+ // CHECK-LABEL: _Z31check_constexpr_false_with_elsei:
50
+ int check_constexpr_false_with_else (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
51
+ // CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+2]]:21 = #0
52
+ // CHECK-NEXT: Branch,File 0, [[@LINE+1]]:16 -> [[@LINE+1]]:21 = 0, 0
53
+ if constexpr (false ) { // CHECK-NEXT: Gap,File 0, [[@LINE]]:22 -> [[@LINE]]:23 = #1
54
+ i *= 3 ; // CHECK-NEXT: File 0, [[@LINE-1]]:23 -> [[@LINE+1]]:4 = #1
55
+ } else { // CHECK-NEXT: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10 = (#0 - #1)
56
+ i *= 5 ; // CHECK-NEXT: File 0, [[@LINE-1]]:10 -> [[@LINE+1]]:4 = (#0 - #1)
57
+ }
58
+ return i;
59
+ }
60
+
61
+ // CHECK-LABEL: _Z34check_constexpr_false_without_elsei:
62
+ int check_constexpr_false_without_else (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
63
+ // CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+2]]:21 = #0
64
+ // CHECK-NEXT: Branch,File 0, [[@LINE+1]]:16 -> [[@LINE+1]]:21 = 0, 0
65
+ if constexpr (false ) { // CHECK-NEXT: Gap,File 0, [[@LINE]]:22 -> [[@LINE]]:23 = #1
66
+ i *= 3 ; // CHECK-NEXT: File 0, [[@LINE-1]]:23 -> [[@LINE+1]]:4 = #1
67
+ }
68
+ return i;
39
69
}
40
70
41
71
// CHECK-LABEL: main:
@@ -75,10 +105,6 @@ int main() { // CHECK: File 0, [[@LINE]]:12 -> {{[0-9]+}}:2 =
75
105
// CHECK-NEXT: File 0, [[@LINE+1]]:14 -> [[@LINE+1]]:20 = #6
76
106
i = i == 0 ?i + 12 :i + 10 ; // CHECK-NEXT: File 0, [[@LINE]]:21 -> [[@LINE]]:27 = (#0 - #6)
77
107
78
- // GH-57377
79
- constexpr int c_i = check_consteval (0 );
80
- check_consteval (i);
81
-
82
108
// GH-45481
83
109
S s;
84
110
s.the_prop = 0 ? 1 : 2 ; // CHECK-NEXT: File 0, [[@LINE]]:16 -> [[@LINE]]:17 = #0
@@ -98,3 +124,51 @@ int main() { // CHECK: File 0, [[@LINE]]:12 -> {{[0-9]+}}:2 =
98
124
void ternary () {
99
125
true ? FOO : FOO; // CHECK-NOT: Gap,{{.*}}, [[@LINE]]:8 ->
100
126
}
127
+
128
+ // GH-57377
129
+ // CHECK-LABEL: _Z40check_consteval_with_else_discarded_theni:
130
+ // FIXME: Do not generate coverage for discarded <then> branch in if consteval
131
+ constexpr int check_consteval_with_else_discarded_then (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
132
+ if consteval {
133
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:4 = #1
134
+ } else { // CHECK-NEXT: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10 = #0
135
+ i *= 5 ; // CHECK-NEXT: [[@LINE-1]]:10 -> [[@LINE+1]]:4 = #0
136
+ }
137
+ return i; // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE]]:11 = (#0 + #1)
138
+ }
139
+
140
+ // CHECK-LABEL: _Z43check_notconsteval_with_else_discarded_elsei:
141
+ // FIXME: Do not generate coverage for discarded <else> branch in if consteval
142
+ constexpr int check_notconsteval_with_else_discarded_else (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
143
+ if !consteval {
144
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:17 -> [[@LINE+1]]:4 = #0
145
+ } else { // CHECK-NEXT: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10 = 0
146
+ i *= 5 ; // CHECK-NEXT: [[@LINE-1]]:10 -> [[@LINE+1]]:4 = 0
147
+ }
148
+ return i;
149
+ }
150
+
151
+ // CHECK-LABEL: _Z32check_consteval_branch_discardedi:
152
+ // FIXME: Do not generate coverage for discarded <then> branch in if consteval
153
+ constexpr int check_consteval_branch_discarded (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
154
+ if consteval {
155
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:4 = #1
156
+ }
157
+ return i; // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE]]:11 = (#0 + #1)
158
+ }
159
+
160
+ // CHECK-LABEL: _Z30check_notconsteval_branch_kepti:
161
+ constexpr int check_notconsteval_branch_kept (int i) { // CHECK-NEXT: [[@LINE]]:{{[0-9]+}} -> {{[0-9]+}}:2 = #0
162
+ if !consteval {
163
+ i *= 3 ; // CHECK-NEXT: [[@LINE-1]]:17 -> [[@LINE+1]]:4 = #0
164
+ }
165
+ return i;
166
+ }
167
+
168
+ int instantiate_consteval (int i) {
169
+ i *= check_consteval_with_else_discarded_then (i);
170
+ i *= check_notconsteval_with_else_discarded_else (i);
171
+ i *= check_consteval_branch_discarded (i);
172
+ i *= check_notconsteval_branch_kept (i);
173
+ return i;
174
+ }
0 commit comments