ocaml/testsuite/tests/typing-gadts/unexpected_existentials.ml

159 lines
3.9 KiB
OCaml

(* TEST
* expect
*)
(** Test the error message for existential types apparearing
in unexpected position *)
type any = Any: 'a -> any
[%%expect {|
type any = Any : 'a -> any
|}]
let Any x = Any ()
[%%expect {|
Line 1, characters 4-9:
1 | let Any x = Any ()
^^^^^
Error: Existential types are not allowed in toplevel bindings,
but this pattern introduces the existential type $Any_'a.
|}]
let () =
let Any x = Any () and () = () in
()
[%%expect {|
Line 2, characters 6-11:
2 | let Any x = Any () and () = () in
^^^^^
Error: Existential types are not allowed in "let ... and ..." bindings,
but this pattern introduces the existential type $Any_'a.
|}]
let () =
let rec Any x = Any () in
()
[%%expect {|
Line 2, characters 10-15:
2 | let rec Any x = Any () in
^^^^^
Error: Existential types are not allowed in recursive bindings,
but this pattern introduces the existential type $Any_'a.
|}]
let () =
let[@attribute] Any x = Any () in
()
[%%expect {|
Line 2, characters 18-23:
2 | let[@attribute] Any x = Any () in
^^^^^
Error: Existential types are not allowed in presence of attributes,
but this pattern introduces the existential type $Any_'a.
|}]
class c (Any x) = object end
[%%expect {|
Line 1, characters 8-15:
1 | class c (Any x) = object end
^^^^^^^
Error: Existential types are not allowed in class arguments,
but this pattern introduces the existential type $Any_'a.
|}]
class c = object(Any x)end
[%%expect {|
Line 1, characters 16-23:
1 | class c = object(Any x)end
^^^^^^^
Error: Existential types are not allowed in self patterns,
but this pattern introduces the existential type $Any_'a.
|}]
type other = Any: _ -> other
[%%expect {|
type other = Any : 'a -> other
|}]
let Any x = Any ()
[%%expect {|
Line 1, characters 4-9:
1 | let Any x = Any ()
^^^^^
Error: Existential types are not allowed in toplevel bindings,
but the constructor Any introduces existential types.
|}]
class c = let Any _x = () in object end
[%%expect {|
Line 1, characters 14-20:
1 | class c = let Any _x = () in object end
^^^^^^
Error: Existential types are not allowed in bindings inside class definition,
but the constructor Any introduces existential types.
|}]
let () =
let Any x = Any () and () = () in
()
[%%expect {|
Line 2, characters 6-11:
2 | let Any x = Any () and () = () in
^^^^^
Error: Existential types are not allowed in "let ... and ..." bindings,
but the constructor Any introduces existential types.
|}]
let () =
let rec Any x = Any () in
()
[%%expect {|
Line 2, characters 10-15:
2 | let rec Any x = Any () in
^^^^^
Error: Existential types are not allowed in recursive bindings,
but the constructor Any introduces existential types.
|}]
let () =
let[@attribute] Any x = Any () in
()
[%%expect {|
Line 2, characters 18-23:
2 | let[@attribute] Any x = Any () in
^^^^^
Error: Existential types are not allowed in presence of attributes,
but the constructor Any introduces existential types.
|}]
class c (Any x) = object end
[%%expect {|
Line 1, characters 8-15:
1 | class c (Any x) = object end
^^^^^^^
Error: Existential types are not allowed in class arguments,
but the constructor Any introduces existential types.
|}]
class c = object(Any x) end
[%%expect {|
Line 1, characters 16-23:
1 | class c = object(Any x) end
^^^^^^^
Error: Existential types are not allowed in self patterns,
but the constructor Any introduces existential types.
|}]
class c = let Any _x = () in object end
[%%expect {|
Line 1, characters 14-20:
1 | class c = let Any _x = () in object end
^^^^^^
Error: Existential types are not allowed in bindings inside class definition,
but the constructor Any introduces existential types.
|}]