(* TEST
 expect;
*)

class ['a] c = object constraint 'a = int method m (x: bool #c) = () end;;

[%%expect{|
Line 1, characters 0-72:
1 | class ['a] c = object constraint 'a = int method m (x: bool #c) = () end;;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The class type "#c" is used with parameter(s) "bool ",
       whereas the class type definition constrains those parameters to be
       "int "
|}]

class ['a, 'b] c = object constraint 'a = int method m (x: (bool, 'b) #c) = () end;;

[%%expect{|
Line 1, characters 0-82:
1 | class ['a, 'b] c = object constraint 'a = int method m (x: (bool, 'b) #c) = () end;;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The class type "#c" is used with parameter(s) "(bool, 'b) ",
       whereas the class type definition constrains those parameters to be
       "(int, 'b) "
|}]

class c = object method m (x: #c) = int_of_string x#m end;;

[%%expect{|
Line 1, characters 0-57:
1 | class c = object method m (x: #c) = int_of_string x#m end;;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The abbreviation "#c" expands to type "< m : 'a -> int; .. >"
       but is used with type "< m : string; .. > as 'a"
|}]
