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
9extern void abort (void);
10extern void exit (int);
11
12jmp_buf env;
13int val;
14int longjmp_taken;
15int bar_enter, bar_exit;
16int foo_enter, foo_exit;
17
18void bar (int i)
19{
20  bar_enter++;				/* count(3) */
21					/* branch(67) */
22  if (i == 0) {
23    					/* branch(end) */
24      longjmp_taken++;			/* count(1) */
25      longjmp (env, 1);
26    }
27  val += i+1;
28  bar_exit++;				/* count(2) */
29}
30
31void foo (int i)
32{
33  foo_enter++;				/* count(3) */
34					/* branch(67) */
35  if (i == 1) {
36					/* branch(end) */
37      longjmp_taken++;			/* count(1) */
38      longjmp (env, 2);
39    }
40					/* returns(50) */
41  bar (i);				/* count(2) */
42					/* returns(100) */
43  bar (7);				/* count(1) */
44					/* returns(end) */
45  val += 16;
46  foo_exit++;				/* count(1) */
47}
48
49int
50passed ()
51{
52  return (val == 31 &&
53          longjmp_taken == 2 &&
54	  foo_enter == 3 &&
55	  foo_exit == 1 &&
56	  bar_enter == 3 &&
57	  bar_exit == 2);
58
59}
60
61void
62leave (int i)
63{
64  if (i == 0) {
65      abort ();
66    }
67  exit (0);
68}
69
70int
71main()
72{
73  int retval;
74
75					/* branch(33) */
76  if ((retval = setjmp (env))) {
77					/* branch(end) */
78      val += retval;			/* count(2) */
79    }
80					/* returns(33) */
81  foo (val);				/* count(3) */
82					/* returns(0) */
83  leave (passed());			/* count(1) */
84					/* returns(end) */
85}
86
87/* { dg-final { run-gcov calls branches { -b gcov-7.c } } } */
88