@@ -177,6 +177,13 @@ let check_virtual loc env virt kind sign =
177177 | meths , vars ->
178178 raise(Error (loc, env, Virtual_class (kind, meths, vars)))
179179
180+ let rec check_virtual_clty loc env virt kind clty =
181+ match clty with
182+ | Cty_constr (_ , _ , clty ) | Cty_arrow (_ , _ , clty ) ->
183+ check_virtual_clty loc env virt kind clty
184+ | Cty_signature sign ->
185+ check_virtual loc env virt kind sign
186+
180187(* Return the constructor type associated to a class type *)
181188let rec constructor_type constr cty =
182189 match cty with
@@ -398,6 +405,8 @@ and class_type_aux env virt self_scope scty =
398405 ) styl params
399406 in
400407 let typ = Cty_constr (path, params, clty) in
408+ (* Check for unexpected virtual methods *)
409+ check_virtual_clty scty.pcty_loc env virt Class_type typ;
401410 cltyp (Tcty_constr ( path, lid , ctys)) typ
402411
403412 | Pcty_signature pcsig ->
@@ -552,12 +561,11 @@ type first_pass_accummulater =
552561 concrete_vals : VarSet .t ;
553562 local_meths : MethSet .t ;
554563 local_vals : VarSet .t ;
555- vars : Ident .t Vars .t ;
556- meths : Ident .t Meths .t ; }
564+ vars : Ident .t Vars .t ; }
557565
558566let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
559567 let { rev_fields; val_env; par_env; concrete_meths; concrete_vals;
560- local_meths; local_vals; vars; meths } = acc
568+ local_meths; local_vals; vars } = acc
561569 in
562570 let loc = cf.pcf_loc in
563571 let attributes = cf.pcf_attributes in
@@ -612,13 +620,6 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
612620 (val_env, par_env, inherited_vars, vars))
613621 parent_sign.csig_vars (val_env, par_env, [] , vars)
614622 in
615- let meths =
616- Meths. fold
617- (fun label _ meths ->
618- if Meths. mem label meths then meths
619- else Meths. add label (Ident. create_local label) meths)
620- parent_sign.csig_meths meths
621- in
622623 (* Methods available through super *)
623624 let super_meths =
624625 MethSet. fold
@@ -641,7 +642,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
641642 in
642643 let rev_fields = field :: rev_fields in
643644 { acc with rev_fields; val_env; par_env;
644- concrete_meths; concrete_vals; vars; meths })
645+ concrete_meths; concrete_vals; vars })
645646 | Pcf_val (label , mut , Cfk_virtual styp ) ->
646647 with_attrs
647648 (fun () ->
@@ -723,15 +724,11 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
723724 let cty = transl_simple_type val_env false sty in
724725 let ty = cty.ctyp_type in
725726 add_method loc val_env label.txt priv Virtual ty sign;
726- let meths =
727- if Meths. mem label.txt meths then meths
728- else Meths. add label.txt (Ident. create_local label.txt) meths
729- in
730727 let field =
731728 Virtual_method { label; priv; cty; loc; attributes }
732729 in
733730 let rev_fields = field :: rev_fields in
734- { acc with rev_fields; meths })
731+ { acc with rev_fields })
735732
736733 | Pcf_method (label , priv , Cfk_concrete (override , expr )) ->
737734 with_attrs
@@ -785,10 +782,6 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
785782 raise(Error (loc, val_env,
786783 Field_type_mismatch (" method" , label.txt, err)))
787784 end ;
788- let meths =
789- if Meths. mem label.txt meths then meths
790- else Meths. add label.txt (Ident. create_local label.txt) meths
791- in
792785 let sdefinition = make_method self_loc cl_num expr in
793786 let warning_state = Warnings. backup () in
794787 let field =
@@ -799,7 +792,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf =
799792 let rev_fields = field :: rev_fields in
800793 let concrete_meths = MethSet. add label.txt concrete_meths in
801794 let local_meths = MethSet. add label.txt local_meths in
802- { acc with rev_fields; concrete_meths; local_meths; meths })
795+ { acc with rev_fields; concrete_meths; local_meths })
803796
804797 | Pcf_constraint (sty1 , sty2 ) ->
805798 with_attrs
@@ -837,11 +830,10 @@ and class_fields_first_pass self_loc cl_num sign self_scope
837830 let local_meths = MethSet. empty in
838831 let local_vals = VarSet. empty in
839832 let vars = Vars. empty in
840- let meths = Meths. empty in
841833 let init_acc =
842834 { rev_fields; val_env; par_env;
843835 concrete_meths; concrete_vals;
844- local_meths; local_vals; vars; meths }
836+ local_meths; local_vals; vars }
845837 in
846838 let acc =
847839 Builtin_attributes. warning_scope []
@@ -850,7 +842,7 @@ and class_fields_first_pass self_loc cl_num sign self_scope
850842 (class_field_first_pass self_loc cl_num sign self_scope)
851843 init_acc cfs)
852844 in
853- List. rev acc.rev_fields, acc.vars, acc.meths
845+ List. rev acc.rev_fields, acc.vars
854846
855847and class_field_second_pass cl_num sign met_env field =
856848 let mkcf desc loc attrs =
@@ -1003,7 +995,7 @@ and class_structure cl_num virt self_scope final val_env met_env loc
1003995 end ;
1004996
1005997 (* Typing of class fields *)
1006- let (fields, vars, meths ) =
998+ let (fields, vars) =
1007999 class_fields_first_pass self_loc cl_num sign self_scope
10081000 val_env par_env str
10091001 in
@@ -1016,6 +1008,13 @@ and class_structure cl_num virt self_scope final val_env met_env loc
10161008 update_class_signature loc val_env
10171009 ~warn_implicit_public: false virt kind sign;
10181010
1011+ let meths =
1012+ Meths. fold
1013+ (fun label _ meths ->
1014+ Meths. add label (Ident. create_local label) meths)
1015+ sign.csig_meths Meths. empty
1016+ in
1017+
10191018 (* Close the signature if it is final *)
10201019 begin match final with
10211020 | Not_final -> ()
@@ -1087,6 +1086,8 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl =
10871086 try Ctype. unify val_env ty' ty with Ctype. Unify err ->
10881087 raise(Error (cty'.ctyp_loc, val_env, Parameter_mismatch err)))
10891088 tyl params;
1089+ (* Check for unexpected virtual methods *)
1090+ check_virtual_clty scl.pcl_loc val_env virt Class clty';
10901091 let cl =
10911092 rc {cl_desc = Tcl_ident (path, lid, tyl);
10921093 cl_loc = scl.pcl_loc;
@@ -1972,7 +1973,6 @@ let report_error env ppf = function
19721973 (function ppf ->
19731974 fprintf ppf " but is expected to have type" )
19741975 | Unexpected_field (ty , lab ) ->
1975- Printtyp. prepare_for_printing [ty];
19761976 fprintf ppf
19771977 " @[@[<2>This object is expected to have type :@ %a@]\
19781978 @ This type does not have a method %s."
@@ -2057,12 +2057,12 @@ let report_error env ppf = function
20572057 Includeclass. report_error Type ppf error
20582058 | Unbound_val lab ->
20592059 fprintf ppf " Unbound instance variable %s" lab
2060- | Unbound_type_var (printer , ( ty0 , real , lab , ty ) ) ->
2061- let ty1 =
2062- if real then ty0 else Btype. newgenty( Tobject (ty0, ref None ))
2063- in
2064- Printtyp. prepare_for_printing [ty; ty1] ;
2065- let print_reason ppf ( ty0 , lab , ty ) =
2060+ | Unbound_type_var (printer , reason ) ->
2061+ let print_reason ppf ( ty0 , real , lab , ty ) =
2062+ let ty1 =
2063+ if real then ty0 else Btype. newgenty( Tobject (ty0, ref None )) in
2064+ Printtyp. add_type_to_preparation ty ;
2065+ Printtyp. add_type_to_preparation ty1;
20662066 fprintf ppf
20672067 " The method %s@ has type@;<1 2>%a@ where@ %a@ is unbound"
20682068 lab
@@ -2072,7 +2072,7 @@ let report_error env ppf = function
20722072 fprintf ppf
20732073 " @[<v>@[Some type variables are unbound in this type:@;<1 2>%t@]@ \
20742074 @[%a@]@]"
2075- printer print_reason (ty0, lab, ty)
2075+ printer print_reason reason
20762076 | Non_generalizable_class (id , clty ) ->
20772077 fprintf ppf
20782078 " @[The type of this class,@ %a,@ \
0 commit comments