aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-04-15 11:09:17 +0200
committerRichard Biener <rguenther@suse.de>2024-04-15 13:35:15 +0200
commit9d573f71e80e9f6f4aac912fc8fc128aa2697e3a (patch)
tree803b797b276adf872f2b9c8c4c21be043366bca7
parenta3281dd0f4b46c16ec1192ad411c0a96e6d086eb (diff)
downloadgcc-9d573f71e80e9f6f4aac912fc8fc128aa2697e3a.zip
gcc-9d573f71e80e9f6f4aac912fc8fc128aa2697e3a.tar.gz
gcc-9d573f71e80e9f6f4aac912fc8fc128aa2697e3a.tar.bz2
gcov-profile/114715 - missing coverage for switch
The following avoids missing coverage for the line of a switch statement which happens when gimplification emits a BIND_EXPR wrapping the switch as that prevents us from setting locations on the containing statements via annotate_all_with_location. Instead set the location of the GIMPLE switch directly. PR gcov-profile/114715 * gimplify.cc (gimplify_switch_expr): Set the location of the GIMPLE switch. * gcc.misc-tests/gcov-24.c: New testcase.
-rw-r--r--gcc/gimplify.cc1
-rw-r--r--gcc/testsuite/gcc.misc-tests/gcov-24.c30
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 3b73152..457b33a 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -3013,6 +3013,7 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
switch_stmt = gimple_build_switch (SWITCH_COND (switch_expr),
default_case, labels);
+ gimple_set_location (switch_stmt, EXPR_LOCATION (switch_expr));
/* For the benefit of -Wimplicit-fallthrough, if switch_body_seq
ends with a GIMPLE_LABEL holding SWITCH_BREAK_LABEL_P LABEL_DECL,
wrap the GIMPLE_SWITCH up to that GIMPLE_LABEL into a GIMPLE_BIND,
diff --git a/gcc/testsuite/gcc.misc-tests/gcov-24.c b/gcc/testsuite/gcc.misc-tests/gcov-24.c
new file mode 100644
index 0000000..395099b
--- /dev/null
+++ b/gcc/testsuite/gcc.misc-tests/gcov-24.c
@@ -0,0 +1,30 @@
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+int main()
+{
+ int a = 1;
+ int b = 2;
+ int c = -3;
+ switch(a) /* count(1) */
+ {
+ case 1: /* count(1) */
+ c = 3;
+ switch(b) { /* count(1) */
+ case 1: /* count(#####) */
+ c = 4;
+ break;
+ case 2: /* count(1) */
+ c = 5;
+ break;
+ }
+ break;
+ case 2: /* count(#####) */
+ c = 6;
+ break;
+ default: /* count(#####) */
+ break;
+ }
+}
+
+/* { dg-final { run-gcov gcov-24.c } } */