summaryrefslogtreecommitdiff
path: root/testsuite/tests/backtrace/backtrace_or_exception.ml
blob: 6f9fc0af448773f46d845345bc07e643e4658027 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
(* TEST_BELOW
(* Blank lines added here to preserve locations. *)

*)

exception Exn

let return_exn ?(raise_it_instead=false) () =
  if raise_it_instead then
    raise Exn
  else
    Exn
[@@inline never]

let without_reraise () =
  match return_exn () with
  | Exn as exn
  | exception (Exn as exn) ->
    raise exn
  | _ -> assert false

let with_reraise () =
  match return_exn ~raise_it_instead:true () with
  | Exn as exn
  | exception (Exn as exn) ->
    raise exn
  | _ -> assert false

let trickier () =
  try raise Not_found
  with e ->
    match return_exn () with
    | Exn as exn
    | exception (Exn as exn) ->
      raise exn
    | _ -> assert false

let run f =
  try f ()
  with exn ->
    Printf.printf "exception %s\n" (Printexc.to_string exn);
    Printexc.print_backtrace stdout;
    Printf.printf "---------------------------\n%!"

let _ =
  run without_reraise;
  run with_reraise;
  run trickier

(* TEST
 flags = "-g";
 ocamlrunparam += ",b=1";
*)