/* Check that gcov correctly reports line counts, branch percentages, * and call return percentages for functions that call longjmp. */ /* { dg-options "-fprofile-arcs -ftest-coverage" } */ /* { dg-do run { target native } } */ #include extern void abort (void); extern void exit (int); jmp_buf env; int val; int longjmp_taken; int bar_enter, bar_exit; int foo_enter, foo_exit; void bar (int i) { bar_enter++; /* count(3) */ /* branch(67) */ if (i == 0) { /* branch(end) */ longjmp_taken++; /* count(1) */ longjmp (env, 1); } val += i+1; bar_exit++; /* count(2) */ } void foo (int i) { foo_enter++; /* count(3) */ /* branch(67) */ if (i == 1) { /* branch(end) */ longjmp_taken++; /* count(1) */ longjmp (env, 2); } /* returns(50) */ bar (i); /* count(2) */ /* returns(100) */ bar (7); /* count(1) */ /* returns(end) */ val += 16; foo_exit++; /* count(1) */ } int passed () { return (val == 31 && longjmp_taken == 2 && foo_enter == 3 && foo_exit == 1 && bar_enter == 3 && bar_exit == 2); } void leave (int i) { if (i == 0) { abort (); } exit (0); } int main() { int retval; /* branch(33) */ if ((retval = setjmp (env))) { /* branch(end) */ val += retval; /* count(2) */ } /* returns(33) */ foo (val); /* count(3) */ /* returns(0) */ leave (passed()); /* count(1) */ /* returns(end) */ } /* { dg-final { run-gcov calls branches { -b gcov-7.c } } } */