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.
This commit is contained in:
Richard Biener 2024-04-15 11:09:17 +02:00
parent a3281dd0f4
commit 9d573f71e8
2 changed files with 31 additions and 0 deletions

View File

@ -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,

View File

@ -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 } } */