| (* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_analysis.cmxa %s -o %t | 
 |  * RUN: %t | 
 |  * XFAIL: vg_leak | 
 |  *) | 
 |  | 
 | open Llvm | 
 | open Llvm_analysis | 
 |  | 
 | (* Note that this takes a moment to link, so it's best to keep the number of | 
 |    individual tests low. *) | 
 |  | 
 | let context = global_context () | 
 |  | 
 | let test x = if not x then exit 1 else () | 
 |  | 
 | let bomb msg = | 
 |   prerr_endline msg; | 
 |   exit 2 | 
 |  | 
 | let _ = | 
 |   let fty = function_type (void_type context) [| |] in | 
 |   let m = create_module context "valid_m" in | 
 |   let fn = define_function "valid_fn" fty m in | 
 |   let at_entry = builder_at_end context (entry_block fn) in | 
 |   ignore (build_ret_void at_entry); | 
 |    | 
 |    | 
 |   (* Test that valid constructs verify. *) | 
 |   begin match verify_module m with | 
 |     Some msg -> bomb "valid module failed verification!" | 
 |   | None -> () | 
 |   end; | 
 |    | 
 |   if not (verify_function fn) then bomb "valid function failed verification!"; | 
 |    | 
 |    | 
 |   (* Test that invalid constructs do not verify. | 
 |      A basic block can contain only one terminator instruction. *) | 
 |   ignore (build_ret_void at_entry); | 
 |    | 
 |   begin match verify_module m with | 
 |     Some msg -> () | 
 |   | None -> bomb "invalid module passed verification!" | 
 |   end; | 
 |    | 
 |   if verify_function fn then bomb "invalid function passed verification!"; | 
 |    | 
 |    | 
 |   dispose_module m | 
 |    | 
 |   (* Don't bother to test assert_valid_{module,function}. *) |