@@ -1917,3 +1917,212 @@ Line 3, characters 63-64:
1917
1917
Error: This expression has type string -> float
1918
1918
but an expression was expected of type string -> local_ float
1919
1919
|}]
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