@@ -370,11 +370,15 @@ format_error_1({redefine_bif_import,{F,A}}) ->
370370 import directive overrides auto-imported BIF ~w /~w --
371371 use "-compile({no_auto_import,[~w /~w ]})." to resolve name clash
372372 """ , [F ,A ,F ,A ]};
373- format_error_1 ({deprecated , MFA , String , Rel }) ->
373+ format_error_1 ({deprecated , MFA , String , Rel }) when is_tuple (MFA ) ->
374+ format_error_1 ({deprecated , format_mfa (MFA ), String , Rel });
375+ format_error_1 ({deprecated , Thing , String , Rel }) when is_list (String ) ->
374376 {~ " ~s is deprecated and will be removed in ~s ; ~s " ,
375- [format_mfa (MFA ), Rel , String ]};
376- format_error_1 ({deprecated , MFA , String }) when is_list (String ) ->
377- {~ " ~s is deprecated; ~s " , [format_mfa (MFA ), String ]};
377+ [Thing , Rel , String ]};
378+ format_error_1 ({deprecated , MFA , String }) when is_tuple (MFA ) ->
379+ format_error_1 ({deprecated , format_mfa (MFA ), String });
380+ format_error_1 ({deprecated , Thing , String }) when is_list (String ) ->
381+ {~ " ~s is deprecated; ~s " , [Thing , String ]};
378382format_error_1 ({deprecated_type , {M1 , F1 , A1 }, String , Rel }) ->
379383 {~ " the type ~p :~p~s is deprecated and will be removed in ~s ; ~s " ,
380384 [M1 , F1 , gen_type_paren (A1 ), Rel , String ]};
@@ -2485,14 +2489,23 @@ gexpr({op,_Anno,EqOp,L,R}, Vt, St0) when EqOp =:= '=:='; EqOp =:= '=/=' ->
24852489gexpr ({op ,Anno ,Op ,L ,R }, Vt , St0 ) ->
24862490 {Avt ,St1 } = gexpr_list ([L ,R ], Vt , St0 ),
24872491 case is_gexpr_op (Op , 2 ) of
2488- true -> {Avt ,St1 };
2492+ true -> {Avt ,warn_obsolete_op ( Op , 2 , Anno , St1 ) };
24892493 false -> {Avt ,add_error (Anno , illegal_guard_expr , St1 )}
24902494 end ;
24912495% % Everything else is illegal! You could put explicit tests here to
24922496% % better error diagnostics.
24932497gexpr (E , _Vt , St ) ->
24942498 {[],add_error (element (2 , E ), illegal_guard_expr , St )}.
24952499
2500+ warn_obsolete_op (Op , A , Anno , St ) ->
2501+ case {Op , A } of
2502+ {'and' , 2 } ->
2503+ add_warning (Anno , {deprecated , " 'and'" , " use 'andalso' instead" , " OTP 29" }, St );
2504+ {'or' , 2 } ->
2505+ add_warning (Anno , {deprecated , " 'or'" , " use 'orelse' instead" , " OTP 29" }, St );
2506+ _ -> St
2507+ end .
2508+
24962509% % gexpr_list(Expressions, VarTable, State) ->
24972510% % {UsedVarTable,State'}
24982511
@@ -2857,8 +2870,9 @@ expr({op,Anno,Op,L,R}, Vt, St0) when Op =:= 'orelse'; Op =:= 'andalso' ->
28572870expr ({op ,_Anno ,EqOp ,L ,R }, Vt , St0 ) when EqOp =:= '=:=' ; EqOp =:= '=/=' ->
28582871 St = expr_check_match_zero (R , expr_check_match_zero (L , St0 )),
28592872 expr_list ([L ,R ], Vt , St ); % They see the same variables
2860- expr ({op ,_Anno ,_Op ,L ,R }, Vt , St ) ->
2861- expr_list ([L ,R ], Vt , St ); % They see the same variables
2873+ expr ({op ,Anno ,Op ,L ,R }, Vt , St ) ->
2874+ St1 = warn_obsolete_op (Op , 2 , Anno , St ),
2875+ expr_list ([L ,R ], Vt , St1 ); % They see the same variables
28622876% % The following are not allowed to occur anywhere!
28632877expr ({remote ,_Anno ,M ,_F }, _Vt , St ) ->
28642878 {[],add_error (erl_parse :first_anno (M ), illegal_expr , St )};
0 commit comments