dwango / fialyzer

[WIP] Faster Implementation of Dialyzer
https://dwango.github.io/fialyzer/
Apache License 2.0
56 stars 8 forks source link

[Bug] Build error for ppx_deriving.4.4 #267

Closed yoshihiro503 closed 5 years ago

yoshihiro503 commented 5 years ago

The project get a build error due to ppx_deriving.4.4 released at two days ago.

$ git clone https://github.com/dwango/fialyzer official_fialyzer
$ cd official_fialyzer
official_fialyzer$ opam pin add -y fialyzer .
[NOTE] Package fialyzer is currently pinned to git+file:///Users/yuuya_uezato/fialyzer_wks/forked_fialyzer#branch_for_issue255 (version ~dev).
[fialyzer.~dev] synchronised from git+file:///Users/yuuya_uezato/fialyzer_wks/official_fialyzer#master
fialyzer is now pinned to git+file:///Users/yuuya_uezato/fialyzer_wks/official_fialyzer#master (version ~dev)
...
...
#=== ERROR while compiling fialyzer.~dev ======================================#
# context     2.0.4 | macos/x86_64 | base-bigarray.base base-threads.base base-unix.base ocaml-system.4.07.1 | pinned(git+file:///Users/yuuya_uezato/fialyzer_wks/official_fialyzer#master#32d1dc7c)
# path        ~/.opam/system/.opam-switch/build/fialyzer.~dev
# command     ~/.opam/opam-init/hooks/sandbox.sh build dune build -p fialyzer -j 4
# exit-code   1
# env-file    ~/.opam/log/fialyzer-17485-d4902a.env
# output-file ~/.opam/log/fialyzer-17485-d4902a.out
### output ###
#       ocamlc lib/.fialyzer.objs/byte/fialyzer__Erl_type.{cmo,cmt} (exit 2)
# (cd _build/default && /usr/local/bin/ocamlc.opt -w -40 -g -bin-annot -I lib/.fialyzer.objs/byte -I /Users/yuuya_uezato/.opam/system/lib/base -I /Users/yuuya_uezato/.opam/system/lib/base/caml -I /Users/yuuya_uezato/.opam/system/lib/base/shadow_stdlib -I /Users/yuuya_uezato/.opam/system/lib/bitstring -I /Users/yuuya_uezato/.opam/system/lib/camlzip -I /Users/yuuya_uezato/.opam/system/lib/obeam -[...]
# File "lib/erl_type.ml", line 96, characters 0-1091:
# Error: This variant pattern is expected to have type t
#        The constructor Some does not belong to type t
#     ocamlopt lib/.fialyzer.objs/native/fialyzer__Erl_type.{cmx,o} (exit 2)
# (cd _build/default && /usr/local/bin/ocamlopt.opt -w -40 -g -I lib/.fialyzer.objs/byte -I lib/.fialyzer.objs/native -I /Users/yuuya_uezato/.opam/system/lib/base -I /Users/yuuya_uezato/.opam/system/lib/base/caml -I /Users/yuuya_uezato/.opam/system/lib/base/shadow_stdlib -I /Users/yuuya_uezato/.opam/system/lib/bitstring -I /Users/yuuya_uezato/.opam/system/lib/camlzip -I /Users/yuuya_uezato/.opa[...]
# File "lib/erl_type.ml", line 96, characters 0-1091:
# Error: This variant pattern is expected to have type t
#        The constructor Some does not belong to type t
yuezato commented 5 years ago

The following code is obtained by reducing the code generated from "erl_type.ml" with deriving show and sexp_of:

type t = None
and u = { tag: string option }

let (pp_u : u -> int)
  =
  let open Ppx_deriving_runtime in
  fun x ->
  (function
   | None -> 0
   | Some x -> 1
  ) x.tag

The above code can be compiled under ppx_deriving=4.3 as follows:

$ opam list | grep ppx_deriving
ppx_deriving            4.3         Type-driven code generation for OCaml >=4.02
$ ocamlfind ocamlc -package ppx_deriving.show -c minimize.ml
$

However, it fails under ppx_deriving=4.4 as follows:

$ opam list | grep ppx_deriving
ppx_deriving            4.4         Type-driven code generation for OCaml >=4.02.2
$ ocamlfind ocamlc -package ppx_deriving.show -c minimize.ml
File "minimize.ml", line 10, characters 5-9:
Error: This variant pattern is expected to have type t
       The constructor Some does not belong to type t
yuezato commented 5 years ago

More concise code, which does not depend the ppx_deriving module:

(*
  https://github.com/ocaml-ppx/ppx_deriving/commit/9eaeeba1b89daf27e41d25d4b3410d4a64cb120a#diff-98ca6e213a0326f9610bb7d60c2f950a
 *)
module Predef = struct
  type 'a _option = 'a option = None | Some of 'a
end

type t = None
and u = { tag: string option }

(* The module corresponds to deriving 4.3 *)      
module M43 = struct
  type 'a option = 'a Predef._option = None | Some of 'a
end

(* The module corresponds to deriving 4.4 *)
module M44 = struct
  type nonrec 'a option = 'a option
end

let (pp_u : u -> int)
  =
  (* M43 -> OK; M44 -> Fail *)
  let open
      M43
  in
  fun x ->
  (function
   | None -> 0
   | Some x -> 1
  ) x.tag