Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
vicuna opened this issue Nov 5, 2016 · 0 comments
Closed

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

vicuna opened this issue Nov 5, 2016 · 0 comments

Comments

@vicuna
Copy link

vicuna commented Nov 5, 2016

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants