diff --git a/compiler/src/typed/typemod.re b/compiler/src/typed/typemod.re index ee34b78af..a10fa5c44 100644 --- a/compiler/src/typed/typemod.re +++ b/compiler/src/typed/typemod.re @@ -674,6 +674,15 @@ let rec type_module = (~toplevel=false, anchor, env, statements) => { | Some(_) => failwith("Impossible: invalid alias") | None => Ident.create(name.txt) }; + let type_ = + switch (type_path) { + | PExternal(_) => { + ...type_, + type_manifest: + Some(Ctype.newconstr(type_path, type_.type_params)), + } + | PIdent(_) => type_ + }; ([TSigType(id, type_, TRecNot), ...sigs], stmts); | PProvideException({name: {txt: IdentName(name)}, alias, loc}) => let ext = Typetexp.find_exception(env, loc, IdentName(name)); diff --git a/compiler/test/input/reprovideTypeUnifyA.gr b/compiler/test/input/reprovideTypeUnifyA.gr new file mode 100644 index 000000000..b64175cd5 --- /dev/null +++ b/compiler/test/input/reprovideTypeUnifyA.gr @@ -0,0 +1,5 @@ +module ReprovideTypeUnifyA + +from "./reprovideTypeUnifyB" include ReprovideTypeUnifyB +use ReprovideTypeUnifyB.{ type T, a } +print(a == { x: 1, }) diff --git a/compiler/test/input/reprovideTypeUnifyB.gr b/compiler/test/input/reprovideTypeUnifyB.gr new file mode 100644 index 000000000..2266e21a8 --- /dev/null +++ b/compiler/test/input/reprovideTypeUnifyB.gr @@ -0,0 +1,6 @@ +module ReprovideTypeUnifyB + +from "./reprovideTypeUnifyC" include ReprovideTypeUnifyC +use ReprovideTypeUnifyC.{ type T } +let a = { x: 1, } +provide { type T, a } diff --git a/compiler/test/input/reprovideTypeUnifyC.gr b/compiler/test/input/reprovideTypeUnifyC.gr new file mode 100644 index 000000000..ed6877e41 --- /dev/null +++ b/compiler/test/input/reprovideTypeUnifyC.gr @@ -0,0 +1,5 @@ +module ReprovideTypeUnifyC + +provide record T { + x: Number, +} diff --git a/compiler/test/suites/provides.re b/compiler/test/suites/provides.re index 22ba3386b..e91797a3b 100644 --- a/compiler/test/suites/provides.re +++ b/compiler/test/suites/provides.re @@ -13,6 +13,7 @@ describe("provides", ({test, testSkip}) => { ); let assertCompileError = makeCompileErrorRunner(test); let assertRun = makeRunner(test_or_skip); + let assertFileRun = makeFileRunner(test_or_skip); let assertRunError = makeErrorRunner(test_or_skip); let assertHasWasmExport = (name, prog, expectedExports) => { test( @@ -249,4 +250,9 @@ describe("provides", ({test, testSkip}) => { "module Test; enum T { A }; provide let a = A; provide { type T }", [("GRAIN$EXPORT$a", Binaryen.Export.external_global)], ); + assertFileRun( + "issue_1886_type_reprovided_unify", + "reprovideTypeUnifyA", + "true\n", + ); });