|
@@ -1749,11 +1749,15 @@ let rec type_binop ctx op e1 e2 is_assign_op p =
|
|
|
| (o,cf) :: ops when is_assign_op && o = OpAssignOp(op) || o == op ->
|
|
|
(match follow (monomorphs cf.cf_params cf.cf_type) with
|
|
|
| TFun([(_,_,t1);(_,_,t2)],r) ->
|
|
|
- let t1,t2 = if left || Meta.has Meta.Commutative cf.cf_meta then t1,t2 else t2,t1 in
|
|
|
- if type_iseq t t2 && (if Meta.has Meta.Impl cf.cf_meta then type_iseq (apply_params a.a_types pl a.a_this) t1 else type_iseq (TAbstract(a,pl)) t1) then begin
|
|
|
- if not (can_access ctx c cf true) then display_error ctx ("Cannot access operator function " ^ (s_type_path a.a_path) ^ "." ^ cf.cf_name) p;
|
|
|
- cf,r,o = OpAssignOp(op),Meta.has Meta.Commutative cf.cf_meta
|
|
|
- end else loop ops
|
|
|
+ let impl = Meta.has Meta.Impl cf.cf_meta in
|
|
|
+ (* implementation fields can only be used in left mode (issue #2130) *)
|
|
|
+ if impl && not left then loop ops else begin
|
|
|
+ let t1,t2 = if left || Meta.has Meta.Commutative cf.cf_meta then t1,t2 else t2,t1 in
|
|
|
+ if type_iseq t t2 && (if impl then type_iseq (apply_params a.a_types pl a.a_this) t1 else type_iseq (TAbstract(a,pl)) t1) then begin
|
|
|
+ if not (can_access ctx c cf true) then display_error ctx ("Cannot access operator function " ^ (s_type_path a.a_path) ^ "." ^ cf.cf_name) p;
|
|
|
+ cf,r,o = OpAssignOp(op),Meta.has Meta.Commutative cf.cf_meta
|
|
|
+ end else loop ops
|
|
|
+ end;
|
|
|
| _ -> loop ops)
|
|
|
| _ :: ops ->
|
|
|
loop ops
|