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

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
