1/* Check that gcov correctly reports line counts, branch percentages,
2 * and call return percentages for functions that call longjmp. */
3
4/* { dg-options "-fprofile-arcs -ftest-coverage" } */
5/* { dg-do run { target native } } */
6
7#include <setjmp.h>
8
9jmp_buf env;
10int val;
11int longjmp_taken;
12int bar_enter, bar_exit;
13int foo_enter, foo_exit;
14
15void bar (int i)
16{
17  bar_enter++;				/* count(3) */
18					/* branch(67) */
19  if (i == 0) {
20    					/* branch(end) */
21      longjmp_taken++;			/* count(1) */
22      longjmp (env, 1);
23    }
24  val += i+1;
25  bar_exit++;				/* count(2) */
26}
27
28void foo (int i)
29{
30  foo_enter++;				/* count(3) */
31					/* branch(67) */
32  if (i == 1) {
33					/* branch(end) */
34      longjmp_taken++;			/* count(1) */
35      longjmp (env, 2);
36    }
37					/* returns(50) */
38  bar (i);				/* count(2) */
39					/* returns(100) */
40  bar (7);				/* count(1) */
41					/* returns(end) */
42  val += 16;
43  foo_exit++;				/* count(1) */
44}
45
46int
47passed ()
48{
49  return (val == 31 &&
50          longjmp_taken == 2 &&
51	  foo_enter == 3 &&
52	  foo_exit == 1 &&
53	  bar_enter == 3 &&
54	  bar_exit == 2);
55
56}
57
58void
59leave (int i)
60{
61  if (i == 0) {
62      abort ();
63    }
64  exit (0);
65}
66
67int
68main()
69{
70  int retval;
71
72					/* branch(33) */
73  if ((retval = setjmp (env))) {
74					/* branch(end) */
75      val += retval;			/* count(2) */
76    }
77					/* returns(33) */
78  foo (val);				/* count(3) */
79					/* returns(0) */
80  leave (passed());			/* count(1) */
81					/* returns(end) */
82}
83
84/* { dg-final { run-gcov -b gcov-7.c } } */
85