(* TEST

include dynlink

files = "abstract.mli abstract.ml static.ml client.ml main.ml"

set src_sub = "${test_source_directory}/sub"

libraries = ""

* shared-libraries
** setup-ocamlc.byte-build-env
*** script
script = "mkdir sub"
**** script
script = "cp ${src_sub}/abstract.mli ${src_sub}/abstract.ml sub"
***** cd
cwd = "sub"
****** ocamlc.byte
module = "abstract.mli"
******* ocamlc.byte
module = "abstract.ml"
******** cd
cwd = ".."
********* ocamlc.byte
module = "abstract.mli"
********** ocamlc.byte
module = "abstract.ml"
*********** ocamlc.byte
module = "static.ml"
************ ocamlc.byte
module = "client.ml"
************* ocamlc.byte
module = "main.ml"
************** ocamlc.byte
program = "${test_build_directory}/main"
libraries = "dynlink"
module = ""
all_modules = "abstract.cmo static.cmo main.cmo"
*************** run
exit_status = "2"
**************** check-program-output

** native-dynlink
*** setup-ocamlopt.byte-build-env
**** script
script = "mkdir sub"
***** script
script = "cp ${src_sub}/abstract.mli ${src_sub}/abstract.ml sub"
****** cd
cwd = "sub"
******* ocamlopt.byte
module = "abstract.mli"
******** ocamlopt.byte
program = "abstract.cmxs"
flags = "-shared"
module = ""
all_modules = "abstract.ml"
********* cd
cwd = ".."
********** ocamlopt.byte
flags = ""
module = "abstract.mli"
*********** ocamlopt.byte
module = "abstract.ml"
************ ocamlopt.byte
module = "static.ml"
************* ocamlopt.byte
program = "client.cmxs"
flags = "-shared"
module = ""
all_modules = "client.ml"
************* ocamlopt.byte
module = "main.ml"
************** ocamlopt.byte
program = "${test_build_directory}/main_native"
libraries = "dynlink"
module = ""
all_modules = "abstract.cmx static.cmx main.cmx"
*************** run
exit_status = "2"
**************** check-program-output
*)

(* PR#4229 *)

let () =
  let suffix =
    match Sys.backend_type with
    | Native -> "cmxs"
    | Bytecode -> "cmo"
    | Other _ -> assert false
  in
  try
    (* Dynlink.init (); *)  (* this function has been removed from the API *)
    Dynlink.loadfile ("client."^suffix); (* utilise abstract.suffix *)
    Dynlink.loadfile ("sub/abstract."^suffix);
    Dynlink.loadfile ("client."^suffix) (* utilise sub/abstract.suffix *)
  with
  | Dynlink.Error (Dynlink.Module_already_loaded "Abstract") -> exit 2
