diff options
author | Richard Biener <rguenther@suse.de> | 2024-04-15 11:09:17 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-04-15 13:35:15 +0200 |
commit | 9d573f71e80e9f6f4aac912fc8fc128aa2697e3a (patch) | |
tree | 803b797b276adf872f2b9c8c4c21be043366bca7 | |
parent | a3281dd0f4b46c16ec1192ad411c0a96e6d086eb (diff) | |
download | gcc-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.cc | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.misc-tests/gcov-24.c | 30 |
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 } } */ |