Open Bastacyclop opened 1 year ago
I cannot reproduce this bug with the master
(2.3.0+) version of odoc (same dune version), do you still observe it after upgrading odoc?
Hmm, this is still failing on 2.4.1 for me.
Slightly smaller test case:
type t = int option
let rec f ?(optional : t) () = f ?optional ()
So, this turns out to be quite interesting. The problem is that we're reading the type of the function, and have found an optional argument. We then ask for the representation of the type and expect to find a arg option
so we can label the argument as optional with type arg
:
let arg =
if Btype.is_optional lbl then
match Compat.get_desc (Compat.repr arg) with
| Tconstr(_option, [arg], _) -> read_type_expr env arg
| _ -> assert false
else read_type_expr env arg
In this case, we're finding the constructor t
which doesn't have any arguments, so the match fails and we hit the assert. I'm not quite sure what calling repr
is supposed to do - it's a no-op from OCaml 4.14 onwards, but I tried the test case on 4.12 and it failed there too - also, since I happened to have a 4.02 switch around, I tried it on that and it failed there too.
In a further test, the following did not fail:
type t = int option
let rec f ?(optional : t) () = ()
It'd be handy to have someone who knows how the compiler handles this for an opinion - @Octachron, would you be able to take a look and suggest how to handle this?
At first glance, the current code is too syntactic. The compiler version (which may also fail in corner cases(?)) looks like this:
let extract_option_type env ty =
match get_desc (expand_head env ty) with
Tconstr(path, [ty], _) when Path.same path Predef.path_option -> ty
| _ -> assert false
The important difference is the expand_head env ty
part before matching the type expression description which will expand type abbreviations before trying to compare the result to the built-in option type path.
Hum, I don't have an Env.t
at this point. This'll require something a bit different I think.
Minimal example and triggered assertion:
Type annotations avoid hitting the assertion: