Skip to content

Commit 44bade0

Browse files
authored
Allow submoding during module inclusion checks (#21)
1 parent de3bec9 commit 44bade0

File tree

2 files changed

+327
-40
lines changed

2 files changed

+327
-40
lines changed

testsuite/tests/typing-local/local.ml

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,3 +1917,212 @@ Line 3, characters 63-64:
19171917
Error: This expression has type string -> float
19181918
but an expression was expected of type string -> local_ float
19191919
|}]
1920+
1921+
(* Submoding during module inclusion *)
1922+
1923+
module F (X : sig val foo : local_ float -> string end) : sig
1924+
val foo : float -> string
1925+
end = X;;
1926+
[%%expect{|
1927+
module F :
1928+
functor (X : sig val foo : local_ float -> string end) ->
1929+
sig val foo : float -> string end
1930+
|}]
1931+
1932+
module F (X : sig val foo : float -> string end) : sig
1933+
val foo : float -> local_ string
1934+
end = X;;
1935+
[%%expect{|
1936+
module F :
1937+
functor (X : sig val foo : float -> string end) ->
1938+
sig val foo : float -> local_ string end
1939+
|}]
1940+
1941+
module F (X : sig val foo : float -> string end) : sig
1942+
val foo : local_ float -> string
1943+
end = X;;
1944+
[%%expect{|
1945+
Line 3, characters 6-7:
1946+
3 | end = X;;
1947+
^
1948+
Error: Signature mismatch:
1949+
Modules do not match:
1950+
sig val foo : float -> string end
1951+
is not included in
1952+
sig val foo : local_ float -> string end
1953+
Values do not match:
1954+
val foo : float -> string
1955+
is not included in
1956+
val foo : local_ float -> string
1957+
|}]
1958+
1959+
module F (X : sig val foo : float -> local_ string end) : sig
1960+
val foo : float -> string
1961+
end = X;;
1962+
[%%expect{|
1963+
Line 3, characters 6-7:
1964+
3 | end = X;;
1965+
^
1966+
Error: Signature mismatch:
1967+
Modules do not match:
1968+
sig val foo : float -> local_ string end
1969+
is not included in
1970+
sig val foo : float -> string end
1971+
Values do not match:
1972+
val foo : float -> local_ string
1973+
is not included in
1974+
val foo : float -> string
1975+
|}]
1976+
1977+
module F (X : sig val foo : local_ float -> float -> string end) : sig
1978+
val foo : float -> float -> string
1979+
end = X;;
1980+
[%%expect{|
1981+
Line 3, characters 6-7:
1982+
3 | end = X;;
1983+
^
1984+
Error: Signature mismatch:
1985+
Modules do not match:
1986+
sig val foo : local_ float -> float -> string end
1987+
is not included in
1988+
sig val foo : float -> float -> string end
1989+
Values do not match:
1990+
val foo : local_ float -> float -> string
1991+
is not included in
1992+
val foo : float -> float -> string
1993+
|}]
1994+
1995+
module F (X : sig val foo : local_ float -> float -> string end) : sig
1996+
val foo : float -> local_ (float -> string)
1997+
end = X;;
1998+
[%%expect{|
1999+
module F :
2000+
functor (X : sig val foo : local_ float -> float -> string end) ->
2001+
sig val foo : float -> local_ (float -> string) end
2002+
|}]
2003+
2004+
module F (X : sig val foo : float -> float -> string end) : sig
2005+
val foo : float -> local_ (float -> string)
2006+
end = X;;
2007+
[%%expect{|
2008+
module F :
2009+
functor (X : sig val foo : float -> float -> string end) ->
2010+
sig val foo : float -> local_ (float -> string) end
2011+
|}]
2012+
2013+
type 'a inv = Inv of ('a -> 'a)
2014+
type 'a co = Co of 'a
2015+
type 'a contra = Contra of ('a -> int)
2016+
type 'a bi = Bi
2017+
2018+
module F (X : sig val foo : (float -> string) inv end) : sig
2019+
val foo : (float -> local_ string) inv
2020+
end = X;;
2021+
[%%expect{|
2022+
type 'a inv = Inv of ('a -> 'a)
2023+
type 'a co = Co of 'a
2024+
type 'a contra = Contra of ('a -> int)
2025+
type 'a bi = Bi
2026+
Line 8, characters 6-7:
2027+
8 | end = X;;
2028+
^
2029+
Error: Signature mismatch:
2030+
Modules do not match:
2031+
sig val foo : (float -> string) inv end
2032+
is not included in
2033+
sig val foo : (float -> local_ string) inv end
2034+
Values do not match:
2035+
val foo : (float -> string) inv
2036+
is not included in
2037+
val foo : (float -> local_ string) inv
2038+
|}]
2039+
2040+
module F (X : sig val foo : (float -> string) co end) : sig
2041+
val foo : (float -> local_ string) co
2042+
end = X;;
2043+
[%%expect{|
2044+
module F :
2045+
functor (X : sig val foo : (float -> string) co end) ->
2046+
sig val foo : (float -> local_ string) co end
2047+
|}]
2048+
2049+
module F (X : sig val foo : (float -> string) contra end) : sig
2050+
val foo : (float -> local_ string) contra
2051+
end = X;;
2052+
[%%expect{|
2053+
Line 3, characters 6-7:
2054+
3 | end = X;;
2055+
^
2056+
Error: Signature mismatch:
2057+
Modules do not match:
2058+
sig val foo : (float -> string) contra end
2059+
is not included in
2060+
sig val foo : (float -> local_ string) contra end
2061+
Values do not match:
2062+
val foo : (float -> string) contra
2063+
is not included in
2064+
val foo : (float -> local_ string) contra
2065+
|}]
2066+
2067+
module F (X : sig val foo : (float -> string) bi end) : sig
2068+
val foo : (float -> local_ string) bi
2069+
end = X;;
2070+
[%%expect{|
2071+
module F :
2072+
functor (X : sig val foo : (float -> string) bi end) ->
2073+
sig val foo : (float -> local_ string) bi end
2074+
|}]
2075+
2076+
module F (X : sig val foo : (float -> local_ string) inv end) : sig
2077+
val foo : (float -> string) inv
2078+
end = X;;
2079+
[%%expect{|
2080+
Line 3, characters 6-7:
2081+
3 | end = X;;
2082+
^
2083+
Error: Signature mismatch:
2084+
Modules do not match:
2085+
sig val foo : (float -> local_ string) inv end
2086+
is not included in
2087+
sig val foo : (float -> string) inv end
2088+
Values do not match:
2089+
val foo : (float -> local_ string) inv
2090+
is not included in
2091+
val foo : (float -> string) inv
2092+
|}]
2093+
2094+
module F (X : sig val foo : (float -> local_ string) co end) : sig
2095+
val foo : (float -> string) co
2096+
end = X;;
2097+
[%%expect{|
2098+
Line 3, characters 6-7:
2099+
3 | end = X;;
2100+
^
2101+
Error: Signature mismatch:
2102+
Modules do not match:
2103+
sig val foo : (float -> local_ string) co end
2104+
is not included in
2105+
sig val foo : (float -> string) co end
2106+
Values do not match:
2107+
val foo : (float -> local_ string) co
2108+
is not included in
2109+
val foo : (float -> string) co
2110+
|}]
2111+
2112+
module F (X : sig val foo : (float -> local_ string) contra end) : sig
2113+
val foo : (float -> string) contra
2114+
end = X;;
2115+
[%%expect{|
2116+
module F :
2117+
functor (X : sig val foo : (float -> local_ string) contra end) ->
2118+
sig val foo : (float -> string) contra end
2119+
|}]
2120+
2121+
module F (X : sig val foo : (float -> local_ string) bi end) : sig
2122+
val foo : (float -> string) bi
2123+
end = X;;
2124+
[%%expect{|
2125+
module F :
2126+
functor (X : sig val foo : (float -> local_ string) bi end) ->
2127+
sig val foo : (float -> string) bi end
2128+
|}]

0 commit comments

Comments
 (0)