Skip to content

"ocamlc -i ..." can generate mli-file that is not compilable #7402

@vicuna

Description

@vicuna

Original bug ID: 7402
Reporter: kosik
Assigned to: @garrigue
Status: closed (set by @garrigue on 2017-03-14T03:23:07Z)
Resolution: duplicate
Priority: normal
Severity: minor
Version: 4.02.3
Target version: later
Category: typing
Duplicate of: #4791 #6323

Bug description

When I tried to use "ocamlc -i ..." command to generate "*.mli" files, I have noticed that the generated files are not always compilable (for various reasons).

I've attached the files that reproduce the problem in the simplest possible context.

Individual files:

(* the contents of "m.mli" *)

type t
val v : t

???????????????????????????????????????????????????

(* the contents of "main.ml" *)

module M = struct
let v = M.v
end

let v = M.v

???????????????????????????????????????????????????

the contents of "Makefile"

main.cmi m.cmi : %.cmi : %.mli
ocamlc -c $<

main.mli : main.ml m.cmi
ocamlc -i $&lt; &gt; $@

main.cmi : m.cmi

The following command (unsurprisingly) succeeds:

ocamlc -c m.mli

The following command "succeeds":

ocamlc -i main.ml > main.mli

but it generates "main.mli" which does not make sense:

module M : sig val v : M.t end
val v : M.t

Of course, an attempt to compile it fails:

ocamlc -c main.mli

File "main.mli", line 2, characters 8-11:
Error: Unbound type constructor M.t

I think this is a bug because if "ocamlc -i ..." generates a mli-file and exits with an exit-status 0, it is natural to assume that it is supposed to be compilable.

I am not sure what is the best way to fix this. There are at least two possibilities:

(1)

Considering the fact that this:

module M = struct end
module M = struct end

is already rejected by "ocamlc", it seems sensible to change the definition of the Ocaml language so that shadowing of global modules locally will not be allowed. Consequently, "ocamlc -i ..." can generate mli-file that makes sense.

(2)

Or we can keep the language definition as it is, (allowing shadowing of global modules locally, even though shadowing of local modules locally is already forbidden), and just make sure that if "ocamlc -i" cannot generate mli-file that is compilable, it will not generate anything, print a sensible error message (explaining to th user why that is not possible) and exit with an appropriate exit-code.

Steps to reproduce

tar xvzf files.tar.gz
make

File attachments

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions