diff --git a/Makefile.in b/Makefile.in index 931832c6c901..58535524aaa8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -518,6 +518,15 @@ $(APPS): ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)"$${PATH}" \ $(MAKE) $(TYPE) BUILD_ALL=true +## +## Generate `otp_internal` from the -deprecated() attributes in source. +## +deprecations: all + $(ERL_TOP)/lib/stdlib/scripts/update_deprecations \ + $(ERL_TOP)/lib/*/ebin $(ERL_TOP)/erts/preloaded/ebin \ + > $(ERL_TOP)/lib/stdlib/src/otp_internal.erl \ + && $(MAKE) stdlib + preloaded: $(make_verbose)cd erts/preloaded/src && \ ERL_TOP=$(ERL_TOP) PATH=$(BOOT_PREFIX)"$${PATH}" \ diff --git a/lib/edoc/src/edoc_data.erl b/lib/edoc/src/edoc_data.erl index a8373d653645..ed81c9f4c3f0 100644 --- a/lib/edoc/src/edoc_data.erl +++ b/lib/edoc/src/edoc_data.erl @@ -328,8 +328,6 @@ get_deprecated(Ts, F, A, Env) -> case otp_internal:obsolete(M, F, A) of {Tag, Text} when Tag =:= deprecated; Tag =:= removed -> deprecated([Text]); - {Tag, Repl, _Rel} when Tag =:= deprecated; Tag =:= removed -> - deprecated(Repl, Env); _ -> [] end; @@ -337,24 +335,9 @@ get_deprecated(Ts, F, A, Env) -> Es end. -deprecated(Repl, Env) -> - {Text, Ref} = replacement_function(Env#env.module, Repl), - Desc = ["Use ", {a, href(Ref, Env), [{code, [Text]}]}, " instead."], - deprecated(Desc). - deprecated(Desc) -> [{deprecated, description(Desc)}]. --dialyzer({no_match, replacement_function/2}). - -replacement_function(M0, {M,F,A}) when is_list(A) -> - %% refer to the largest listed arity - the most general version - replacement_function(M0, {M,F,lists:last(lists:sort(A))}); -replacement_function(M, {M,F,A}) -> - {io_lib:fwrite("~w/~w", [F, A]), edoc_refs:function(F, A)}; -replacement_function(_, {M,F,A}) -> - {io_lib:fwrite("~w:~w/~w", [M, F, A]), edoc_refs:function(M, F, A)}. - get_expr_ref(Expr) -> case catch {ok, erl_syntax_lib:analyze_application(Expr)} of {ok, {F, A}} when is_atom(F), is_integer(A) -> diff --git a/lib/stdlib/scripts/update_deprecations b/lib/stdlib/scripts/update_deprecations new file mode 100755 index 000000000000..810a186b53f3 --- /dev/null +++ b/lib/stdlib/scripts/update_deprecations @@ -0,0 +1,149 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2020. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +-mode(compile). + +-import(lists, [foldl/3,sort/1]). + +-record(st, { functions = [], types = [] }). + +main([_|_]=Directories) -> + emit(summarize(Directories)), + halt(0). + +summarize(Directories) -> + foldl(fun summarize_directory/2, #st{}, Directories). + +summarize_directory(Dir, Acc) -> + Files = [filename:join(Dir, F) || F <- filelib:wildcard("*.beam", Dir)], + foldl(fun summarize_file/2, Acc, Files). + +summarize_file(File, Acc) -> + {ok, {Module, [Chunk]}} = beam_lib:chunks(File, [attributes]), + {attributes, Attributes} = Chunk, + summarize_attributes(Attributes, Module, Acc). + +summarize_attributes([{deprecated, Ds} | As], Module, Acc0) -> + Fs = sa_1(Ds, deprecated, Module, Acc0#st.functions), + Acc = Acc0#st{ functions = Fs }, + summarize_attributes(As, Module, Acc); +summarize_attributes([{removed, Rs} | As], Module, Acc0) -> + Fs = sa_1(Rs, removed, Module, Acc0#st.functions), + Acc = Acc0#st{ functions = Fs }, + summarize_attributes(As, Module, Acc); +summarize_attributes([{deprecated_type, Ds} | As], Module, Acc0) -> + Ts = sa_1(Ds, deprecated, Module, Acc0#st.types), + Acc = Acc0#st{ types = Ts }, + summarize_attributes(As, Module, Acc); +summarize_attributes([{removed_type, Rs} | As], Module, Acc0) -> + Ts = sa_1(Rs, removed, Module, Acc0#st.types), + Acc = Acc0#st{ types = Ts }, + summarize_attributes(As, Module, Acc); +summarize_attributes([_ | As], Module, Acc) -> + summarize_attributes(As, Module, Acc); +summarize_attributes([], _Module, Acc) -> + Acc. + +sa_1([{F, A, Info} | As], Tag, Module, Acc0) -> + sa_1(As, Tag, Module, [{Tag, Module, F, A, Info} | Acc0]); +sa_1([{F, A} | As], Tag, Module, Acc0) -> + sa_1(As, Tag, Module, [{Tag, Module, F, A, undefined} | Acc0]); +sa_1([module | As], Tag, Module, Acc0) -> + sa_1(As, Tag, Module, [{Tag, Module, '_', '_', undefined} | Acc0]); +sa_1([], _Tag, _Module, Acc) -> + Acc. + +%% + +emit(#st{ functions = Fs, types = Ts }) -> + io:format("%%\n" + "%% WARNING: DO NOT EDIT THIS FILE.\n" + "%%\n" + "%% This file was auto-generated from attributes in the source\n" + "%% code.\n" + "%%\n" + "%% To add a description to a deprecation or removal attribute,\n" + "%% write a string after the arity:\n" + "%%\n" + "%% -deprecated([{foo,1,\"use bar/1 instead\"}]).\n" + "%% -deprecated_type([{gadget,1,\"use widget/1 instead\"}]).\n" + "%% -removed([{hello,2,\"use there/2 instead\"}]).\n" + "%% -removed_type([{frobnitz,1,\"use grunka/1 instead\"}]).\n" + "%%\n" + "%% Descriptions cannot be given with the `f/1` shorthand, and\n" + "%% it will fall back to a generic description referring the\n" + "%% user to the documentation.\n" + "%%\n" + "%% Use `./otp_build update_deprecations` to update this file\n" + "%% after adding an attribute.\n" + "%%\n" + "-module(otp_internal).\n" + "-include(\"otp_internal.hrl\").\n" + "%%\n"), + + emit_function("obsolete", Fs), + emit_function("obsolete_type", Ts), + + ok. + +emit_function(FuncName, Entries) -> + io:format("-dialyzer({no_match, ~ts/3}).\n", [FuncName]), + [emit_clause(FuncName, E) || E <- sort_clauses(Entries)], + + io:format("~ts(_,_,_) -> no.\n\n", [FuncName]). + +sort_clauses(Entries) -> + Tagged = [{clause_order(E), E} || E <- Entries], + [E || {_, E} <- sort(Tagged)]. + +%% Wildcard matches must be emitted *after* specific matches to avoid +%% losing descriptions. +clause_order({_Tag, _Module, F, A, _Info}) when F =/= '_', A =/= '_' -> 0; +clause_order({_Tag, _Module, F, '_', _Info}) when F =/= '_' -> 1; +clause_order({_Tag, _Module, '_', A, _Info}) when A =/= '_' -> 2; +clause_order({_Tag, _Module, '_', '_', _Info}) -> 3. + +emit_clause(FuncName, {Tag, M, F, A, Info}) -> + io:format("~ts(~ts, ~ts, ~ts) ->\n" + " {~p, ~p};\n", + [FuncName, match_string(M), match_string(F), match_string(A), + Tag, info_string(Info)]). + +%% + +info_string(undefined) -> + "see the documentation for details"; +info_string(next_version) -> + "will be removed in the next version. " + "See the documentation for details"; +info_string(next_major_release) -> + "will be removed in the next major release. " + "See the documentation for details"; +info_string(eventually) -> + "will be removed in a future release. " + "See the documentation for details"; +info_string(String) when is_list(String) -> + String. + +match_string('_') -> "_"; +match_string(Term) -> io_lib:format("~p", [Term]). diff --git a/lib/stdlib/src/Makefile b/lib/stdlib/src/Makefile index 86003c953dd7..5784318f51d5 100644 --- a/lib/stdlib/src/Makefile +++ b/lib/stdlib/src/Makefile @@ -133,7 +133,7 @@ HRL_FILES= \ ../include/qlc.hrl \ ../include/zip.hrl -INTERNAL_HRL_FILES= dets.hrl erl_tar.hrl +INTERNAL_HRL_FILES= dets.hrl erl_tar.hrl otp_internal.hrl ERL_FILES= $(MODULES:%=%.erl) diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl index 5b46885e0385..5163b0df1d35 100644 --- a/lib/stdlib/src/erl_lint.erl +++ b/lib/stdlib/src/erl_lint.erl @@ -248,18 +248,18 @@ format_error({redefine_bif_import,{F,A}}) -> format_error({deprecated, MFA, ReplacementMFA, Rel}) -> io_lib:format("~s is deprecated and will be removed in ~s; use ~s", [format_mfa(MFA), Rel, format_mfa(ReplacementMFA)]); -format_error({deprecated, {M1, F1, A1}, String}) when is_list(String) -> - io_lib:format("~p:~p/~p: ~s", [M1, F1, A1, String]); +format_error({deprecated, MFA, String}) when is_list(String) -> + io_lib:format("~s is deprecated; ~s", [format_mfa(MFA), String]); format_error({deprecated_type, {M1, F1, A1}, String}) when is_list(String) -> - io_lib:format("~p:~p~s: ~s", [M1, F1, gen_type_paren(A1), String]); + io_lib:format("the type ~p:~p~s is deprecated; ~s", + [M1, F1, gen_type_paren(A1), String]); format_error({removed, MFA, ReplacementMFA, Rel}) -> io_lib:format("call to ~s will fail, since it was removed in ~s; " "use ~s", [format_mfa(MFA), Rel, format_mfa(ReplacementMFA)]); format_error({removed, MFA, String}) when is_list(String) -> - io_lib:format("~s: ~s", [format_mfa(MFA), String]); -format_error({removed_type, MNA, ReplacementMNA, Rel}) -> - io_lib:format("the type ~s was removed in ~s; use ~s instead", - [format_mna(MNA), Rel, format_mna(ReplacementMNA)]); + io_lib:format("~s is removed; ~s", [format_mfa(MFA), String]); +format_error({removed_type, MNA, String}) -> + io_lib:format("the type ~s is removed; ~s", [format_mna(MNA), String]); format_error({obsolete_guard, {F, A}}) -> io_lib:format("~p/~p obsolete (use is_~p/~p)", [F, A, F, A]); format_error({obsolete_guard_overridden,Test}) -> @@ -1062,7 +1062,7 @@ check_deprecated(Forms, St0) -> true -> St0#lint.defined; false -> St0#lint.exports end, - X = gb_sets:to_list(Exports), + X = ignore_predefined_funcs(gb_sets:to_list(Exports)), #lint{module = Mod} = St0, Bad = [{E,L} || {attribute, L, deprecated, Depr} <- Forms, D <- lists:flatten([Depr]), @@ -1120,7 +1120,7 @@ check_removed(Forms, St0) -> true -> St0#lint.defined; false -> St0#lint.exports end, - X = gb_sets:to_list(Exports), + X = ignore_predefined_funcs(gb_sets:to_list(Exports)), #lint{module = Mod} = St0, Bad = [{E,L} || {attribute, L, removed, Removed} <- Forms, R <- lists:flatten([Removed]), @@ -1169,6 +1169,18 @@ removed_desc([Char | Str]) when is_integer(Char) -> removed_desc(Str); removed_desc([]) -> true; removed_desc(_) -> false. +%% Ignores functions added by erl_internal:add_predefined_functions/1 +ignore_predefined_funcs([{behaviour_info,1} | Fs]) -> + ignore_predefined_funcs(Fs); +ignore_predefined_funcs([{module_info,0} | Fs]) -> + ignore_predefined_funcs(Fs); +ignore_predefined_funcs([{module_info,1} | Fs]) -> + ignore_predefined_funcs(Fs); +ignore_predefined_funcs([Other | Fs]) -> + [Other | ignore_predefined_funcs(Fs)]; +ignore_predefined_funcs([]) -> + []. + %% check_imports(Forms, State0) -> State check_imports(Forms, St0) -> @@ -3904,8 +3916,8 @@ deprecated_type(L, M, N, As, St) -> false -> St end; - {removed, Replacement, Rel} -> - add_warning(L, {removed_type, {M,N,NAs}, Replacement, Rel}, St); + {removed, String} -> + add_warning(L, {removed_type, {M,N,NAs}, String}, St); no -> St end. diff --git a/lib/stdlib/src/otp_internal.erl b/lib/stdlib/src/otp_internal.erl index 1d8302563d58..47364ddc81af 100644 --- a/lib/stdlib/src/otp_internal.erl +++ b/lib/stdlib/src/otp_internal.erl @@ -1,701 +1,436 @@ %% -%% %CopyrightBegin% +%% WARNING: DO NOT EDIT THIS FILE. %% -%% Copyright Ericsson AB 1999-2018. All Rights Reserved. +%% This file was auto-generated from attributes in the source +%% code. %% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at +%% To add a description to a deprecation or removal attribute, +%% write a string after the arity: %% -%% http://www.apache.org/licenses/LICENSE-2.0 +%% -deprecated([{foo,1,"use bar/1 instead"}]). +%% -deprecated_type([{gadget,1,"use widget/1 instead"}]). +%% -removed([{hello,2,"use there/2 instead"}]). +%% -removed_type([{frobnitz,1,"use grunka/1 instead"}]). %% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. +%% Descriptions cannot be given with the `f/1` shorthand, and +%% it will fall back to a generic description referring the +%% user to the documentation. %% -%% %CopyrightEnd% +%% Use `./otp_build update_deprecations` to update this file +%% after adding an attribute. %% -module(otp_internal). - --export([obsolete/3, obsolete_type/3]). - -%%---------------------------------------------------------------------- - +-include("otp_internal.hrl"). +%% -dialyzer({no_match, obsolete/3}). - --type tag() :: 'deprecated' | 'removed'. %% | 'experimental'. --type mfas() :: mfa() | {atom(), atom(), [byte()]}. --type release() :: string(). - --spec obsolete(module(), atom(), arity()) -> - 'no' | {tag(), string()} | {tag(), mfas(), release()}. - -obsolete(Module, Name, Arity) -> - case obsolete_1(Module, Name, Arity) of - {deprecated=Tag,{_,_,_}=Replacement} -> - {Tag,Replacement,"a future release"}; - {_,String}=Ret when is_list(String) -> - Ret; - {_,_,_}=Ret -> - Ret; - no -> - no - end. - -%% *** kernel added in OTP 23 *** - -obsolete_1(pg2, F, A) -> - IsFun = case {F, A} of - {create, 1} -> true; - {delete, 1} -> true; - {join, 2} -> true; - {leave, 2} -> true; - {get_members, 1} -> true; - {get_local_members, 1} -> true; - {get_closest_pid, 1} -> true; - {which_groups, 1} -> true; - {start, 0} -> true; - {start_link, 0} -> true; - {init, 1} -> true; - {handle_call, 3} -> true; - {handle_cast, 2} -> true; - {handle_info, 2} -> true; - {terminate, 2} -> true; - _ -> false - end, - - {deprecated, - if IsFun == true -> ""; - true -> - "(unknown function) however, " - end - ++ "the module pg2 is deprecated and scheduled " - ++ "for removal in OTP 24; use pg instead"}; - -%% *** - -obsolete_1(net, call, 4) -> - {deprecated, {rpc, call, 4}}; -obsolete_1(net, cast, 4) -> - {deprecated, {rpc, cast, 4}}; -obsolete_1(net, broadcast, 3) -> - {deprecated, {rpc, eval_everywhere, 3}}; -obsolete_1(net, ping, 1) -> - {deprecated, {net_adm, ping, 1}}; -obsolete_1(net, sleep, 1) -> - {deprecated, "Use 'receive after T -> ok end' instead"}; -obsolete_1(net, relay, 1) -> - {deprecated, {slave, relay, 1}}; - - -obsolete_1(erlang, now, 0) -> - {deprecated, - "Deprecated BIF. See the \"Time and Time Correction in Erlang\" " - "chapter of the ERTS User's Guide for more information."}; - -obsolete_1(calendar, local_time_to_universal_time, 1) -> - {deprecated, {calendar, local_time_to_universal_time_dst, 1}}; - -%% *** inets added in OTP 23 *** - -obsolete_1(http_uri, parse, 1) -> - {deprecated, "deprecated; use uri_string functions instead"}; - -obsolete_1(http_uri, parse, 2) -> - {deprecated, "deprecated; use uri_string functions instead"}; - -obsolete_1(http_uri, encode, 1) -> - {deprecated, "deprecated; use uri_string functions instead"}; - -obsolete_1(http_uri, decode, 1) -> - {deprecated, "deprecated; use uri_string functions instead"}; - -obsolete_1(http_uri, scheme_defaults, 0) -> - {deprecated, "deprecated; use uri_string functions instead"}; - -obsolete_1(httpd, parse_query, 1) -> - {deprecated, {uri_string, dissect_query, 1}}; - -%% *** STDLIB added in OTP 22 *** - -obsolete_1(sys, get_debug, 3) -> - {deprecated, - "Deprecated function. " - "Incorrectly documented and in fact only for internal use. " - "Can often be replaced with sys:get_log/1."}; - -%% *** STDLIB added in OTP 20 *** - -obsolete_1(gen_fsm, start, 3) -> - {deprecated, {gen_statem, start, 3}}; -obsolete_1(gen_fsm, start, 4) -> - {deprecated, {gen_statem, start, 4}}; - -obsolete_1(gen_fsm, start_link, 3) -> - {deprecated, {gen_statem, start_link, 3}}; -obsolete_1(gen_fsm, start_link, 4) -> - {deprecated, {gen_statem, start_link, 4}}; - -obsolete_1(gen_fsm, stop, 1) -> - {deprecated, {gen_statem, stop, 1}}; -obsolete_1(gen_fsm, stop, 3) -> - {deprecated, {gen_statem, stop, 3}}; - -obsolete_1(gen_fsm, enter_loop, 4) -> - {deprecated, {gen_statem, enter_loop, 4}}; -obsolete_1(gen_fsm, enter_loop, 5) -> - {deprecated, {gen_statem, enter_loop, 5}}; -obsolete_1(gen_fsm, enter_loop, 6) -> - {deprecated, {gen_statem, enter_loop, 6}}; - -obsolete_1(gen_fsm, reply, 2) -> - {deprecated, {gen_statem, reply, 2}}; - -obsolete_1(gen_fsm, send_event, 2) -> - {deprecated, {gen_statem, cast, 2}}; -obsolete_1(gen_fsm, send_all_state_event, 2) -> - {deprecated, {gen_statem, cast, 2}}; - -obsolete_1(gen_fsm, sync_send_event, 2) -> - {deprecated, {gen_statem, call, 2}}; -obsolete_1(gen_fsm, sync_send_event, 3) -> - {deprecated, {gen_statem, call, 3}}; - -obsolete_1(gen_fsm, sync_send_all_state_event, 2) -> - {deprecated, {gen_statem, call, 2}}; -obsolete_1(gen_fsm, sync_send_all_state_event, 3) -> - {deprecated, {gen_statem, call, 3}}; - -obsolete_1(gen_fsm, start_timer, 2) -> - {deprecated, {erlang, start_timer, 3}}; -obsolete_1(gen_fsm, cancel_timer, 1) -> - {deprecated, {erlang, cancel_timer, 1}}; -obsolete_1(gen_fsm, send_event_after, 2) -> - {deprecated, {erlang, send_after, 3}}; - -%% *** CRYPTO added in OTP 22.2 *** - -obsolete_1(crypto, next_iv, 2) -> - {deprecated, - "Deprecated. See the 'New and Old API' chapter of the CRYPTO User's Guide." - }; -obsolete_1(crypto, next_iv, 3) -> - {deprecated, - "Deprecated. See the 'New and Old API' chapter of the CRYPTO User's Guide." - }; - -obsolete_1(crypto, hmac, 3) -> - {deprecated, {crypto, mac, 4}}; -obsolete_1(crypto, hmac, 4) -> - {deprecated, {crypto, macN, 5}}; - -obsolete_1(crypto, hmac_init, 2) -> - {deprecated, {crypto, mac_init, 3}}; -obsolete_1(crypto, hmac_update, 2) -> - {deprecated, {crypto, mac_update, 2}}; -obsolete_1(crypto, hmac_final, 1) -> - {deprecated, {crypto, mac_final, 1}}; -obsolete_1(crypto, hmac_final_n, 2) -> - {deprecated, {crypto, mac_finalN, 2}}; - -obsolete_1(crypto, cmac, 3) -> - {deprecated, {crypto, mac, 4}}; -obsolete_1(crypto, cmac, 4) -> - {deprecated, {crypto, macN, 5}}; - -obsolete_1(crypto, poly1305, 2) -> - {deprecated, {crypto, mac, 3}}; - -obsolete_1(crypto, stream_init, 2) -> - {deprecated, - "Deprecated and will be removed in a future release; " - "Use crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1 or " - "crypto:crypto_one_time/4." - }; -obsolete_1(crypto, stream_init, 3) -> - {deprecated, - "Deprecated and will be removed in a future release; " - "Use crypto:crypto_init/4 + crypto:crypto_update/2 + crypto:crypto_final/1 or " - "crypto:crypto_one_time/5." - }; -obsolete_1(crypto, stream_encrypt, 2) -> - {deprecated, {crypto, crypto_update, 2}}; -obsolete_1(crypto, stream_decrypt, 2) -> - {deprecated, {crypto, crypto_update, 2}}; - -obsolete_1(crypto, block_encrypt, 3) -> - {deprecated, - "Deprecated and will be removed in a future release; " - "Use crypto:crypto_one_time/4 " - "or crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1." - }; -obsolete_1(crypto, block_encrypt, 4) -> - {deprecated, - "Deprecated. and will be removed in a future release; " - "Use crypto:crypto_one_time/5, crypto:crypto_one_time_aead/6,7 " - "or crypto:crypto_(dyn_iv)?_init + crypto:crypto_(dyn_iv)?_update + crypto:crypto_final." - }; -obsolete_1(crypto, block_decrypt, 3) -> - {deprecated, - "Deprecated and will be removed in a future release; " - "Use crypto:crypto_one_time/4 " - "or crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1." - }; -obsolete_1(crypto, block_decrypt, 4) -> - {deprecated, - "Deprecated and will be removed in a future release; " - "Use crypto:crypto_one_time/5, crypto:crypto_one_time_aead/6,7 " - "or crypto:crypto_(dyn_iv)?_init + crypto:crypto_(dyn_iv)?_update + crypto:crypto_final." - }; - -%% *** CRYPTO added in OTP 20 *** - -obsolete_1(crypto, rand_uniform, 2) -> - {deprecated, {rand, uniform, 1}}; - -%% *** CRYPTO added in OTP 19 *** - -obsolete_1(crypto, rand_bytes, 1) -> - {removed, {crypto, strong_rand_bytes, 1}, "20.0"}; - -%% *** CRYPTO added in R16B01 *** - -obsolete_1(crypto, md4, 1) -> - {removed, {crypto, hash, 2}, "20.0"}; -obsolete_1(crypto, md5, 1) -> - {removed, {crypto, hash, 2}, "20.0"}; -obsolete_1(crypto, sha, 1) -> - {removed, {crypto, hash, 2}, "20.0"}; - -obsolete_1(crypto, md4_init, 0) -> - {removed, {crypto, hash_init, 1}, "20.0"}; -obsolete_1(crypto, md5_init, 0) -> - {removed, {crypto, hash_init, 1}, "20.0"}; -obsolete_1(crypto, sha_init, 0) -> - {removed, {crypto, hash_init, 1}, "20.0"}; - -obsolete_1(crypto, md4_update, 2) -> - {removed, {crypto, hash_update, 2}, "20.0"}; -obsolete_1(crypto, md5_update, 2) -> - {removed, {crypto, hash_update, 2}, "20.0"}; -obsolete_1(crypto, sha_update, 2) -> - {removed, {crypto, hash_update, 2}, "20.0"}; - -obsolete_1(crypto, md4_final, 1) -> - {removed, {crypto, hash_final, 1}, "20.0"}; -obsolete_1(crypto, md5_final, 1) -> - {removed, {crypto, hash_final, 1}, "20.0"}; -obsolete_1(crypto, sha_final, 1) -> - {removed, {crypto, hash_final, 1}, "20.0"}; - -obsolete_1(crypto, md5_mac, 2) -> - {removed, {crypto, hmac, 3}, "20.0"}; -obsolete_1(crypto, sha_mac, 2) -> - {removed, {crypto, hmac, 3}, "20.0"}; -obsolete_1(crypto, sha_mac, 3) -> - {removed, {crypto, hmac, 4}, "20.0"}; - -obsolete_1(crypto, sha_mac_96, 2) -> - {removed, {crypto, hmac, 4}, "20.0"}; -obsolete_1(crypto, md5_mac_96, 2) -> - {removed, {crypto, hmac, 4}, "20.0"}; - -obsolete_1(crypto, rsa_sign, 2) -> - {removed, {crypto, sign, 4}, "20.0"}; -obsolete_1(crypto, rsa_sign, 3) -> - {removed, {crypto, sign, 4}, "20.0"}; -obsolete_1(crypto, rsa_verify, 3) -> - {removed, {crypto, verify, 5}, "20.0"}; -obsolete_1(crypto, rsa_verify, 4) -> - {removed, {crypto, verify, 5}, "20.0"}; - -obsolete_1(crypto, dss_sign, 2) -> - {removed, {crypto, sign, 4}, "20.0"}; -obsolete_1(crypto, dss_sign, 3) -> - {removed, {crypto, sign, 4}, "20.0"}; - -obsolete_1(crypto, dss_verify, 3) -> - {removed, {crypto, verify, 5}, "20.0"}; -obsolete_1(crypto, dss_verify, 4) -> - {removed, {crypto, verify, 5}, "20.0"}; - -obsolete_1(crypto, mod_exp, 3) -> - {removed, {crypto, mod_pow, 3}, "20.0"}; - -obsolete_1(crypto, dh_compute_key, 3) -> - {removed, {crypto, compute_key, 4}, "20.0"}; -obsolete_1(crypto, dh_generate_key, 1) -> - {removed, {crypto, generate_key, 2}, "20.0"}; -obsolete_1(crypto, dh_generate_key, 2) -> - {removed, {crypto, generate_key, 3}, "20.0"}; - -obsolete_1(crypto, des_cbc_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, des3_cbc_encrypt, 5) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, des_ecb_encrypt, 2) -> - {removed, {crypto, block_encrypt, 3}, "20.0"}; -obsolete_1(crypto, des_ede3_cbc_encrypt, 5) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, des_cfb_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, des3_cfb_encrypt, 5) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_ecb_encrypt, 2) -> - {removed, {crypto, block_encrypt, 3}, "20.0"}; -obsolete_1(crypto, blowfish_cbc_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_cfb64_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_ofb64_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cfb_128_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cbc_128_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cbc_256_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto,rc2_cbc_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; -obsolete_1(crypto,rc2_40_cbc_encrypt, 3) -> - {removed, {crypto, block_encrypt, 4}, "20.0"}; - -obsolete_1(crypto, des_cbc_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, des3_cbc_decrypt, 5) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, des_ecb_decrypt, 2) -> - {removed, {crypto, block_decrypt, 3}, "20.0"}; -obsolete_1(crypto, des_ede3_cbc_decrypt, 5) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, des_cfb_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, des3_cfb_decrypt, 5) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_ecb_decrypt, 2) -> - {removed, {crypto, block_decrypt, 3}, "20.0"}; -obsolete_1(crypto, blowfish_cbc_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_cfb64_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, blowfish_ofb64_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cfb_128_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cbc_128_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto, aes_cbc_256_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto,rc2_cbc_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; -obsolete_1(crypto,rc2_40_cbc_decrypt, 3) -> - {removed, {crypto, block_decrypt, 4}, "20.0"}; - -obsolete_1(crypto, aes_ctr_stream_decrypt, 2) -> - {removed, {crypto, stream_decrypt, 2}, "20.0"}; -obsolete_1(crypto, aes_ctr_stream_encrypt, 2) -> - {removed, {crypto, stream_encrypt, 2}, "20.0"}; -obsolete_1(crypto, aes_ctr_decrypt, 3) -> - {removed, {crypto, stream_decrypt, 2}, "20.0"}; -obsolete_1(crypto, aes_ctr_encrypt, 3) -> - {removed, {crypto, stream_encrypt, 2}, "20.0"}; -obsolete_1(crypto, rc4_encrypt, 2) -> - {removed, {crypto, stream_encrypt, 2}, "20.0"}; -obsolete_1(crypto, rc4_encrypt_with_state, 2) -> - {removed, {crypto, stream_encrypt, 2}, "20.0"}; -obsolete_1(crypto, aes_ctr_stream_init, 2) -> - {removed, {crypto, stream_init, 3}, "20.0"}; -obsolete_1(crypto, rc4_set_key, 1) -> - {removed, {crypto, stream_init, 2}, "20.0"}; - -obsolete_1(crypto, rsa_private_decrypt, 3) -> - {removed, {crypto, private_decrypt, 4}, "20.0"}; -obsolete_1(crypto, rsa_public_decrypt, 3) -> - {removed, {crypto, public_decrypt, 4}, "20.0"}; -obsolete_1(crypto, rsa_private_encrypt, 3) -> - {removed, {crypto, private_encrypt, 4}, "20.0"}; -obsolete_1(crypto, rsa_public_encrypt, 3) -> - {removed, {crypto, public_encrypt, 4}, "20.0"}; - -obsolete_1(crypto, des_cfb_ivec, 2) -> - {removed, {crypto, next_iv, 3}, "20.0"}; -obsolete_1(crypto,des_cbc_ivec, 1) -> - {removed, {crypto, next_iv, 2}, "20.0"}; -obsolete_1(crypto, aes_cbc_ivec, 1) -> - {removed, {crypto, next_iv, 2}, "20.0"}; - -obsolete_1(crypto,info, 0) -> - {removed, {crypto, module_info, 0}, "20.0"}; - -obsolete_1(crypto, strong_rand_mpint, 3) -> - {removed, "removed in 20.0; only needed by removed functions"}; -obsolete_1(crypto, erlint, 1) -> - {removed, "removed in 20.0; only needed by removed functions"}; -obsolete_1(crypto, mpint, 1) -> - {removed, "removed in 20.0; only needed by removed functions"}; - - -%% *** SNMP *** - -obsolete_1(snmp, N, A) -> - case is_snmp_agent_function(N, A) of - false -> - no; - true -> - {deprecated, "Deprecated (will be removed in OTP 18); use snmpa:"++atom_to_list(N)++"/"++ - integer_to_list(A)++" instead"} - end; - -obsolete_1(snmpa, old_info_format, 1) -> - {deprecated, "Deprecated; (will be removed in OTP 18); use \"new\" format instead"}; - - -%% *** MEGACO *** - -obsolete_1(megaco, format_versions, 1) -> - {deprecated, "Deprecated; use megaco:print_version_info/0,1 instead"}; - - -%% *** OS-MON-MIB *** - -%% FIXME: Remove this warning in OTP 24. -obsolete_1(os_mon_mib, _, _) -> - {removed, "was removed in 22.0"}; - -obsolete_1(auth, is_auth, 1) -> - {deprecated, {net_adm, ping, 1}}; -obsolete_1(auth, cookie, 0) -> - {deprecated, {erlang, get_cookie, 0}}; -obsolete_1(auth, cookie, 1) -> - {deprecated, {erlang, set_cookie, 2}}; -obsolete_1(auth, node_cookie, 1) -> - {deprecated, "Deprecated; use erlang:set_cookie/2 and net_adm:ping/1 instead"}; -obsolete_1(auth, node_cookie, 2) -> - {deprecated, "Deprecated; use erlang:set_cookie/2 and net_adm:ping/1 instead"}; - -%% Added in R16 -obsolete_1(wxCalendarCtrl, enableYearChange, _) -> %% wx bug documented? - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxDC, computeScaleAndOrigin, 1) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxClientDC, new, 0) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxPaintDC, new, 0) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxWindowDC, new, 0) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxGraphicsRenderer, createLinearGradientBrush, 7) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxGraphicsRenderer, createRadialGradientBrush, 8) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxGridCellEditor, endEdit, 4) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxGridCellEditor, paintBackground, 3) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxIdleEvent, canSend, 1) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxMDIClientWindow, new, 1) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxMDIClientWindow, new, 2) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxPostScriptDC, getResolution, 0) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxPostScriptDC, setResolution, 1) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxCursor, new, 3) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; -obsolete_1(wxCursor, new, 4) -> - {deprecated,"deprecated function not available in wxWidgets-2.9 and later"}; - -%% Added in OTP 17. -obsolete_1(asn1ct, decode,3) -> - {removed,"removed; use Mod:decode/2 instead"}; -obsolete_1(asn1ct, encode, 2) -> - {removed,"removed; use Mod:encode/2 instead"}; -obsolete_1(asn1ct, encode, 3) -> - {removed,"removed; use Mod:encode/2 instead"}; -obsolete_1(asn1rt, decode,3) -> - {removed,"removed; use Mod:decode/2 instead"}; -obsolete_1(asn1rt, encode, 2) -> - {removed,"removed; use Mod:encode/2 instead"}; -obsolete_1(asn1rt, encode, 3) -> - {removed,"removed; use Mod:encode/2 instead"}; -obsolete_1(asn1rt, info, 1) -> - {removed,"removed; use Mod:info/0 instead"}; -obsolete_1(asn1rt, utf8_binary_to_list, 1) -> - {removed,{unicode,characters_to_list,1},"OTP 20"}; -obsolete_1(asn1rt, utf8_list_to_binary, 1) -> - {removed,{unicode,characters_to_binary,1},"OTP 20"}; - -%% Added in OTP 18. -obsolete_1(core_lib, get_anno, 1) -> - {removed,{cerl,get_ann,1},"19"}; -obsolete_1(core_lib, set_anno, 2) -> - {removed,{cerl,set_ann,2},"19"}; -obsolete_1(core_lib, is_literal, 1) -> - {removed,{cerl,is_literal,1},"19"}; -obsolete_1(core_lib, is_literal_list, 1) -> - {removed,"removed; use lists:all(fun cerl:is_literal/1, L)" - " instead"}; -obsolete_1(core_lib, literal_value, 1) -> - {removed,{core_lib,concrete,1},"19"}; -obsolete_1(erl_scan, set_attribute, 3) -> - {removed,{erl_anno,set_line,2},"19.0"}; -obsolete_1(erl_scan, attributes_info, 1) -> - {removed,"removed in 19.0; use " - "erl_anno:{column,line,location,text}/1 instead"}; -obsolete_1(erl_scan, attributes_info, 2) -> - {removed,"removed in 19.0; use " - "erl_anno:{column,line,location,text}/1 instead"}; -obsolete_1(erl_scan, token_info, 1) -> - {removed,"removed in 19.0; use " - "erl_scan:{category,column,line,location,symbol,text}/1 instead"}; -obsolete_1(erl_scan, token_info, 2) -> - {removed,"removed in 19.0; use " - "erl_scan:{category,column,line,location,symbol,text}/1 instead"}; -obsolete_1(erl_parse, set_line, 2) -> - {removed,{erl_anno,set_line,2},"19.0"}; -obsolete_1(erl_parse, get_attributes, 1) -> - {removed,"removed in 19.0; use " - "erl_anno:{column,line,location,text}/1 instead"}; -obsolete_1(erl_parse, get_attribute, 2) -> - {removed,"removed in 19.0; use " - "erl_anno:{column,line,location,text}/1 instead"}; -obsolete_1(erl_lint, modify_line, 2) -> - {removed,{erl_parse,map_anno,2},"19.0"}; -obsolete_1(ssl, negotiated_next_protocol, 1) -> - {removed,"removed in 20.0; use ssl:negotiated_protocol/1 instead"}; -obsolete_1(ssl, connection_info, 1) -> - {removed, "removed in 20.0; use ssl:connection_information/[1,2] instead"}; - -obsolete_1(httpd_conf, check_enum, 2) -> - {removed, "removed; use lists:member/2 instead"}; -obsolete_1(httpd_conf, clean, 1) -> - {removed, "removed; use sting:strip/1 instead or possible the re module"}; -obsolete_1(httpd_conf, custom_clean, 3) -> - {removed, "removed; use sting:strip/3 instead or possible the re module"}; -obsolete_1(httpd_conf, is_directory, 1) -> - {removed, "removed; use filelib:is_dir/1 instead"}; -obsolete_1(httpd_conf, is_file, 1) -> - {removed, "removed; use filelib:is_file/1 instead"}; -obsolete_1(httpd_conf, make_integer, 1) -> - {removed, "removed; use erlang:list_to_integer/1 instead"}; - -%% Added in OTP 19. - -obsolete_1(random, _, _) -> - {deprecated, "the 'random' module is deprecated; " - "use the 'rand' module instead"}; -obsolete_1(code, rehash, 0) -> - {deprecated, "deprecated because the code path cache feature has been removed"}; -obsolete_1(queue, lait, 1) -> - {deprecated, {queue,liat,1}}; - -%% Removed in OTP 19. - -obsolete_1(rpc, safe_multi_server_call, A) when A =:= 2; A =:= 3 -> - {removed, {rpc, multi_server_call, A}, "19.0"}; - -%% Added in OTP 20. - -obsolete_1(filename, find_src, 1) -> - {deprecated, "deprecated; use filelib:find_source/1 instead"}; -obsolete_1(filename, find_src, 2) -> - {deprecated, "deprecated; use filelib:find_source/3 instead"}; - -obsolete_1(erlang, get_stacktrace, 0) -> - {deprecated, "deprecated; use the new try/catch syntax for retrieving the stack backtrace"}; - -%% Removed in OTP 20. - -obsolete_1(erlang, hash, 2) -> - {removed, {erlang, phash2, 2}, "20.0"}; - -%% Add in OTP 21. - -obsolete_1(ssl, ssl_accept, 1) -> - {deprecated, "deprecated; use ssl:handshake/1 instead"}; -obsolete_1(ssl, ssl_accept, 2) -> - {deprecated, "deprecated; use ssl:handshake/2 instead"}; -obsolete_1(ssl, ssl_accept, 3) -> - {deprecated, "deprecated; use ssl:handshake/3 instead"}; -obsolete_1(otp_mib, F, _) when F =:= load; F =:= unload -> - {deprecated, "deprecated; functionality will be removed in a future release"}; - -%% not obsolete - -obsolete_1(_, _, _) -> - no. - --spec is_snmp_agent_function(atom(), byte()) -> boolean(). - -is_snmp_agent_function(c, 1) -> true; -is_snmp_agent_function(c, 2) -> true; -is_snmp_agent_function(compile, 3) -> true; -is_snmp_agent_function(is_consistent, 1) -> true; -is_snmp_agent_function(mib_to_hrl, 1) -> true; -is_snmp_agent_function(change_log_size, 1) -> true; -is_snmp_agent_function(log_to_txt, 2) -> true; -is_snmp_agent_function(log_to_txt, 3) -> true; -is_snmp_agent_function(log_to_txt, 4) -> true; -is_snmp_agent_function(current_request_id, 0) -> true; -is_snmp_agent_function(current_community, 0) -> true; -is_snmp_agent_function(current_address, 0) -> true; -is_snmp_agent_function(current_context, 0) -> true; -is_snmp_agent_function(current_net_if_data, 0) -> true; -is_snmp_agent_function(get_symbolic_store_db, 0) -> true; -is_snmp_agent_function(name_to_oid, 1) -> true; -is_snmp_agent_function(name_to_oid, 2) -> true; -is_snmp_agent_function(oid_to_name, 1) -> true; -is_snmp_agent_function(oid_to_name, 2) -> true; -is_snmp_agent_function(int_to_enum, 2) -> true; -is_snmp_agent_function(int_to_enum, 3) -> true; -is_snmp_agent_function(enum_to_int, 2) -> true; -is_snmp_agent_function(enum_to_int, 3) -> true; -is_snmp_agent_function(get, 2) -> true; -is_snmp_agent_function(info, 1) -> true; -is_snmp_agent_function(load_mibs, 2) -> true; -is_snmp_agent_function(unload_mibs, 2) -> true; -is_snmp_agent_function(dump_mibs, 0) -> true; -is_snmp_agent_function(dump_mibs, 1) -> true; -is_snmp_agent_function(register_subagent, 3) -> true; -is_snmp_agent_function(unregister_subagent, 2) -> true; -is_snmp_agent_function(send_notification, 3) -> true; -is_snmp_agent_function(send_notification, 4) -> true; -is_snmp_agent_function(send_notification, 5) -> true; -is_snmp_agent_function(send_notification, 6) -> true; -is_snmp_agent_function(send_trap, 3) -> true; -is_snmp_agent_function(send_trap, 4) -> true; -is_snmp_agent_function(add_agent_caps, 2) -> true; -is_snmp_agent_function(del_agent_caps, 1) -> true; -is_snmp_agent_function(get_agent_caps, 0) -> true; -is_snmp_agent_function(_, _) -> false. - --dialyzer({no_match, obsolete_type/3}). - --spec obsolete_type(module(), atom(), arity()) -> - 'no' | {tag(), string()} | {tag(), mfas(), release()}. +obsolete(auth, cookie, 0) -> + {deprecated, "use erlang:get_cookie/0 instead"}; +obsolete(auth, cookie, 1) -> + {deprecated, "use erlang:set_cookie/2 instead"}; +obsolete(auth, is_auth, 1) -> + {deprecated, "use net_adm:ping/1 instead"}; +obsolete(calendar, local_time_to_universal_time, 1) -> + {deprecated, "use calendar:local_time_to_universal_time_dst/1 instead"}; +obsolete(code, rehash, 0) -> + {deprecated, "the code path cache feature has been removed"}; +obsolete(crypto, block_decrypt, 3) -> + {deprecated, "use crypto:crypto_one_time/4 or crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1 instead"}; +obsolete(crypto, block_decrypt, 4) -> + {deprecated, "use crypto:crypto_one_time/5, crypto:crypto_one_time_aead/6,7 or crypto:crypto_(dyn_iv)?_init + crypto:crypto_(dyn_iv)?_update + crypto:crypto_final instead"}; +obsolete(crypto, block_encrypt, 3) -> + {deprecated, "use crypto:crypto_one_time/4 or crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1 instead"}; +obsolete(crypto, block_encrypt, 4) -> + {deprecated, "use crypto:crypto_one_time/5, crypto:crypto_one_time_aead/6,7 or crypto:crypto_(dyn_iv)?_init + crypto:crypto_(dyn_iv)?_update + crypto:crypto_final instead"}; +obsolete(crypto, cmac, 3) -> + {deprecated, "use crypto:mac/4 instead"}; +obsolete(crypto, cmac, 4) -> + {deprecated, "use crypto:macN/5 instead"}; +obsolete(crypto, hmac, 3) -> + {deprecated, "use crypto:mac/4 instead"}; +obsolete(crypto, hmac, 4) -> + {deprecated, "use crypto:macN/5 instead"}; +obsolete(crypto, hmac_final, 1) -> + {deprecated, "use crypto:mac_final/1 instead"}; +obsolete(crypto, hmac_final_n, 2) -> + {deprecated, "use crypto:mac_finalN/2 instead"}; +obsolete(crypto, hmac_init, 2) -> + {deprecated, "use crypto:mac_init/3 instead"}; +obsolete(crypto, hmac_update, 2) -> + {deprecated, "use crypto:mac_update/2 instead"}; +obsolete(crypto, poly1305, 2) -> + {deprecated, "use crypto:mac/3 instead"}; +obsolete(crypto, rand_uniform, 2) -> + {deprecated, "use rand:rand_uniform/1 instead"}; +obsolete(crypto, stream_decrypt, 2) -> + {deprecated, "use crypto:crypto_update/2 instead"}; +obsolete(crypto, stream_encrypt, 2) -> + {deprecated, "use crypto:crypto_update/2 instead"}; +obsolete(erlang, get_stacktrace, 0) -> + {deprecated, "use the new try/catch syntax for retrieving the stack backtrace"}; +obsolete(erlang, now, 0) -> + {deprecated, "see the \"Time and Time Correction in Erlang\" chapter of the ERTS User's Guide for more information"}; +obsolete(http_uri, decode, 1) -> + {deprecated, "use uri_string functions instead"}; +obsolete(http_uri, encode, 1) -> + {deprecated, "use uri_string functions instead"}; +obsolete(http_uri, parse, 1) -> + {deprecated, "use uri_string functions instead"}; +obsolete(http_uri, parse, 2) -> + {deprecated, "use uri_string functions instead"}; +obsolete(http_uri, scheme_defaults, 0) -> + {deprecated, "use uri_string functions instead"}; +obsolete(httpd, parse_query, 1) -> + {deprecated, "use uri_string:dissect_query/1 instead"}; +obsolete(megaco, format_versions, 1) -> + {deprecated, "use megaco:print_version_info/0,1 instead"}; +obsolete(net, broadcast, 3) -> + {deprecated, "use rpc:eval_everywhere/3 instead"}; +obsolete(net, call, 4) -> + {deprecated, "use rpc:call/4 instead"}; +obsolete(net, cast, 4) -> + {deprecated, "use rpc:cast/4 instead"}; +obsolete(net, ping, 1) -> + {deprecated, "use net_adm:ping/1 instead"}; +obsolete(net, relay, 1) -> + {deprecated, "use slave:relay/1 instead"}; +obsolete(net, sleep, 1) -> + {deprecated, "use 'receive after T -> ok end' instead"}; +obsolete(queue, lait, 1) -> + {deprecated, "use queue:liat/1 instead"}; +obsolete(snmp, add_agent_caps, 2) -> + {deprecated, "use snmpa:add_agent_caps/2 instead"}; +obsolete(snmp, c, 1) -> + {deprecated, "use snmpa:c/1 instead"}; +obsolete(snmp, c, 2) -> + {deprecated, "use snmpa:c/2 instead"}; +obsolete(snmp, change_log_size, 1) -> + {deprecated, "use snmpa:change_log_size/1 instead"}; +obsolete(snmp, compile, 3) -> + {deprecated, "use snmpa:compile/3 instead"}; +obsolete(snmp, current_address, 0) -> + {deprecated, "use snmpa:current_address/0 instead"}; +obsolete(snmp, current_community, 0) -> + {deprecated, "use snmpa:current_community/0 instead"}; +obsolete(snmp, current_context, 0) -> + {deprecated, "use snmpa:current_context/0 instead"}; +obsolete(snmp, current_net_if_data, 0) -> + {deprecated, "use snmpa:current_net_if_data/0 instead"}; +obsolete(snmp, current_request_id, 0) -> + {deprecated, "use snmpa:current_request_id/0 instead"}; +obsolete(snmp, del_agent_caps, 1) -> + {deprecated, "use snmpa:del_agent_caps/1 instead"}; +obsolete(snmp, dump_mibs, 0) -> + {deprecated, "use snmpa:dump_mibs/0 instead"}; +obsolete(snmp, dump_mibs, 1) -> + {deprecated, "use snmpa:dump_mibs/1 instead"}; +obsolete(snmp, enum_to_int, 2) -> + {deprecated, "use snmpa:enum_to_int/2 instead"}; +obsolete(snmp, enum_to_int, 3) -> + {deprecated, "use snmpa:enum_to_int/3 instead"}; +obsolete(snmp, get, 2) -> + {deprecated, "use snmpa:get/2 instead"}; +obsolete(snmp, get_agent_caps, 0) -> + {deprecated, "use snmpa:get_agent_caps/0 instead"}; +obsolete(snmp, get_symbolic_store_db, 0) -> + {deprecated, "use snmpa:get_symbolic_store_db/0 instead"}; +obsolete(snmp, info, 1) -> + {deprecated, "use snmpa:info/1 instead"}; +obsolete(snmp, int_to_enum, 2) -> + {deprecated, "use snmpa:int_to_enum/2 instead"}; +obsolete(snmp, int_to_enum, 3) -> + {deprecated, "use snmpa:int_to_enum/3 instead"}; +obsolete(snmp, is_consistent, 1) -> + {deprecated, "use snmpa:is_consistent/1 instead"}; +obsolete(snmp, load_mibs, 2) -> + {deprecated, "use snmpa:load_mibs/2 instead"}; +obsolete(snmp, log_to_txt, 2) -> + {deprecated, "use snmpa:log_to_txt/2 instead"}; +obsolete(snmp, log_to_txt, 3) -> + {deprecated, "use snmpa:log_to_txt/3 instead"}; +obsolete(snmp, log_to_txt, 4) -> + {deprecated, "use snmpa:log_to_txt/4 instead"}; +obsolete(snmp, mib_to_hrl, 1) -> + {deprecated, "use snmpa:mib_to_hrl/1 instead"}; +obsolete(snmp, name_to_oid, 1) -> + {deprecated, "use snmpa:name_to_oid/1 instead"}; +obsolete(snmp, name_to_oid, 2) -> + {deprecated, "use snmpa:name_to_oid/2 instead"}; +obsolete(snmp, oid_to_name, 1) -> + {deprecated, "use snmpa:oid_to_name/1 instead"}; +obsolete(snmp, oid_to_name, 2) -> + {deprecated, "use snmpa:oid_to_name/2 instead"}; +obsolete(snmp, register_subagent, 3) -> + {deprecated, "use snmpa:register_subagent/3 instead"}; +obsolete(snmp, send_notification, 3) -> + {deprecated, "use snmpa:send_notification/3 instead"}; +obsolete(snmp, send_notification, 4) -> + {deprecated, "use snmpa:send_notification/4 instead"}; +obsolete(snmp, send_notification, 5) -> + {deprecated, "use snmpa:send_notification/5 instead"}; +obsolete(snmp, send_notification, 6) -> + {deprecated, "use snmpa:send_notification/6 instead"}; +obsolete(snmp, send_trap, 3) -> + {deprecated, "use snmpa:send_trap/3 instead"}; +obsolete(snmp, send_trap, 4) -> + {deprecated, "use snmpa:send_trap/4 instead"}; +obsolete(snmp, unload_mibs, 2) -> + {deprecated, "use snmpa:unload_mibs/2 instead"}; +obsolete(snmp, unregister_subagent, 2) -> + {deprecated, "use snmpa:unregister_subagent/2 instead"}; +obsolete(snmpa, old_info_format, 1) -> + {deprecated, "use \"new\" format instead"}; +obsolete(sys, get_debug, 3) -> + {deprecated, "incorrectly documented and only for internal use. Can often be replaced with sys:get_log/1"}; +obsolete(wxClientDC, new, 0) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxCursor, new, 3) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxCursor, new, 4) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxDC, computeScaleAndOrigin, 1) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxGraphicsRenderer, createLinearGradientBrush, 7) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxGraphicsRenderer, createRadialGradientBrush, 8) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxGridCellEditor, endEdit, 4) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxGridCellEditor, paintBackground, 3) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxIdleEvent, canSend, 1) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxMDIClientWindow, new, 1) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxMDIClientWindow, new, 2) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxPaintDC, new, 0) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxPostScriptDC, getResolution, 0) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxPostScriptDC, setResolution, 1) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(wxWindowDC, new, 0) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(core_lib, get_anno, 1) -> + {removed, "use cerl:get_ann/1 instead"}; +obsolete(core_lib, is_literal, 1) -> + {removed, "use cerl:is_literal/1 instead"}; +obsolete(core_lib, is_literal_list, 1) -> + {removed, "use cerl:is_literal_list/1 instead"}; +obsolete(core_lib, literal_value, 1) -> + {removed, "use cerl:concrete/1 instead"}; +obsolete(core_lib, set_anno, 2) -> + {removed, "use cerl:set_ann/2 instead"}; +obsolete(crypto, aes_cbc_128_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, aes_cbc_128_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, aes_cbc_256_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, aes_cbc_256_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, aes_cbc_ivec, 2) -> + {removed, "use crypto:next_iv/2 instead"}; +obsolete(crypto, aes_cfb_128_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, aes_cfb_128_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, aes_ctr_decrypt, 3) -> + {removed, "use crypto:stream_decrypt/2 instead"}; +obsolete(crypto, aes_ctr_encrypt, 3) -> + {removed, "use crypto:stream_encrypt/2 instead"}; +obsolete(crypto, aes_ctr_stream_decrypt, 2) -> + {removed, "use crypto:stream_decrypt/2 instead"}; +obsolete(crypto, aes_ctr_stream_encrypt, 2) -> + {removed, "use crypto:stream_encrypt/2 instead"}; +obsolete(crypto, aes_ctr_stream_init, 2) -> + {removed, "use crypto:stream_init/3 instead"}; +obsolete(crypto, blowfish_cbc_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, blowfish_cbc_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, blowfish_cfb64_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, blowfish_cfb64_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, blowfish_ecb_decrypt, 2) -> + {removed, "use crypto:block_decrypt/3 instead"}; +obsolete(crypto, blowfish_ecb_encrypt, 2) -> + {removed, "use crypto:block_encrypt/3 instead"}; +obsolete(crypto, blowfish_ofb64_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, blowfish_ofb64_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, des3_cbc_decrypt, 5) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, des3_cbc_encrypt, 5) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, des3_cfb_decrypt, 5) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, des3_cfb_encrypt, 5) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, des3_ede3_cbc_decrypt, 5) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, des_cbc_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, des_cbc_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, des_cbc_ivec, 2) -> + {removed, "use crypto:next_iv/2 instead"}; +obsolete(crypto, des_cfb_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, des_cfb_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, des_cfb_ivec, 2) -> + {removed, "use crypto:next_iv/3 instead"}; +obsolete(crypto, des_ecb_decrypt, 2) -> + {removed, "use crypto:block_decrypt/3 instead"}; +obsolete(crypto, des_ecb_encrypt, 2) -> + {removed, "use crypto:block_encrypt/3 instead"}; +obsolete(crypto, des_ede3_cbc_encrypt, 5) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, dh_compute_key, 3) -> + {removed, "use crypto:compute_key/4 instead"}; +obsolete(crypto, dh_generate_key, 1) -> + {removed, "use crypto:generate_key/2 instead"}; +obsolete(crypto, dh_generate_key, 2) -> + {removed, "use crypto:generate_key/3 instead"}; +obsolete(crypto, erlint, 1) -> + {removed, "only needed by other removed functions"}; +obsolete(crypto, info, 0) -> + {removed, "use crypto:module_info/0 instead"}; +obsolete(crypto, md4, 1) -> + {removed, "use crypto:hash/2 instead"}; +obsolete(crypto, md4_final, 1) -> + {removed, "use crypto:hash_final/1 instead"}; +obsolete(crypto, md4_init, 0) -> + {removed, "use crypto:hash_init/1 instead"}; +obsolete(crypto, md4_update, 2) -> + {removed, "use crypto:hash_update/2 instead"}; +obsolete(crypto, md5, 1) -> + {removed, "use crypto:hash/2 instead"}; +obsolete(crypto, md5_final, 1) -> + {removed, "use crypto:hash_final/1 instead"}; +obsolete(crypto, md5_init, 0) -> + {removed, "use crypto:hash_init/1 instead"}; +obsolete(crypto, md5_mac, 2) -> + {removed, "use crypto:hmac/3 instead"}; +obsolete(crypto, md5_mac_96, 2) -> + {removed, "use crypto:hmac/4 instead"}; +obsolete(crypto, md5_update, 2) -> + {removed, "use crypto:hash_update/2 instead"}; +obsolete(crypto, mod_exp, 3) -> + {removed, "use crypto:mod_pow/3 instead"}; +obsolete(crypto, mpint, 1) -> + {removed, "only needed by other removed functions"}; +obsolete(crypto, rand_bytes, 1) -> + {removed, "use crypto:strong_rand_bytes/1 instead"}; +obsolete(crypto, rc2_40_cbc_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, rc2_40_cbc_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, rc2_cbc_decrypt, 3) -> + {removed, "use crypto:block_decrypt/4 instead"}; +obsolete(crypto, rc2_cbc_encrypt, 3) -> + {removed, "use crypto:block_encrypt/4 instead"}; +obsolete(crypto, rc4_encrypt, 2) -> + {removed, "use crypto:stream_encrypt/2 instead"}; +obsolete(crypto, rc4_encrypt_with_state, 2) -> + {removed, "use crypto:stream_encrypt/2 instead"}; +obsolete(crypto, rc4_set_key, 2) -> + {removed, "use crypto:stream_init/2 instead"}; +obsolete(crypto, sha, 1) -> + {removed, "use crypto:hash/2 instead"}; +obsolete(crypto, sha_final, 1) -> + {removed, "use crypto:hash_final/1 instead"}; +obsolete(crypto, sha_init, 0) -> + {removed, "use crypto:hash_init/1 instead"}; +obsolete(crypto, sha_mac, 2) -> + {removed, "use crypto:hmac/3 instead"}; +obsolete(crypto, sha_mac, 3) -> + {removed, "use crypto:hmac/4 instead"}; +obsolete(crypto, sha_mac_96, 2) -> + {removed, "use crypto:hmac/4 instead"}; +obsolete(crypto, sha_update, 2) -> + {removed, "use crypto:hash_update/2 instead"}; +obsolete(crypto, strong_rand_mpint, 3) -> + {removed, "only needed by other removed functions"}; +obsolete(erl_lint, modify_line, 2) -> + {removed, "use erl_parse:map_anno/2 instead"}; +obsolete(erl_parse, get_attribute, 2) -> + {removed, "erl_anno:{column,line,location,text}/1 instead"}; +obsolete(erl_parse, get_attributes, 1) -> + {removed, "erl_anno:{column,line,location,text}/1 instead"}; +obsolete(erl_parse, set_line, 2) -> + {removed, "use erl_anno:set_line/2"}; +obsolete(erl_scan, set_attribute, 3) -> + {removed, "use erl_anno:set_line/2 instead"}; +obsolete(erlang, hash, 2) -> + {removed, "use erlang:phash2/2 instead"}; +obsolete(httpd_conf, check_enum, 2) -> + {removed, "use lists:member/2 instead"}; +obsolete(httpd_conf, clean, 1) -> + {removed, "use sting:strip/1 instead or possibly the re module"}; +obsolete(httpd_conf, custom_clean, 3) -> + {removed, "use sting:strip/1 instead or possibly the re module"}; +obsolete(httpd_conf, is_directory, 1) -> + {removed, "use filelib:is_dir/1 instead"}; +obsolete(httpd_conf, is_file, 1) -> + {removed, "use filelib:is_file/1 instead"}; +obsolete(httpd_conf, make_integer, 1) -> + {removed, "use erlang:list_to_integer/1 instead"}; +obsolete(rpc, safe_multi_server_call, 2) -> + {removed, "use rpc:multi_server_call/2 instead"}; +obsolete(rpc, safe_multi_server_call, 3) -> + {removed, "use rpc:multi_server_call/3 instead"}; +obsolete(ssl, connection_info, 1) -> + {removed, "use ssl:connection_information/[1,2] instead"}; +obsolete(ssl, negotiated_next_protocol, 1) -> + {removed, "use ssl:negotiated_protocol/1 instead"}; +obsolete(auth, node_cookie, _) -> + {deprecated, "use erlang:set_cookie/2 and net_adm:ping/1 instead"}; +obsolete(crypto, next_iv, _) -> + {deprecated, "see the 'New and Old API' chapter of the CRYPTO User's guide"}; +obsolete(crypto, stream_init, _) -> + {deprecated, "use crypto:crypto_init/3 + crypto:crypto_update/2 + crypto:crypto_final/1 or crypto:crypto_one_time/4 instead"}; +obsolete(filename, find_src, _) -> + {deprecated, "use filelib:find_source/1,3 instead"}; +obsolete(ssl, ssl_accept, _) -> + {deprecated, "use ssl_handshake/1,2,3 instead"}; +obsolete(wxCalendarCtrl, enableYearChange, _) -> + {deprecated, "not available in wxWidgets-2.9 and later"}; +obsolete(asn1ct, decode, _) -> + {removed, "use Mod:decode/2 instead"}; +obsolete(asn1ct, encode, _) -> + {removed, "use Mod:encode/2 instead"}; +obsolete(crypto, dss_sign, _) -> + {removed, "use crypto:sign/4 instead"}; +obsolete(crypto, dss_verify, _) -> + {removed, "use crypto:verify/5 instead"}; +obsolete(crypto, rsa_sign, _) -> + {removed, "use crypto:sign/4 instead"}; +obsolete(crypto, rsa_verify, _) -> + {removed, "use crypto:verify/5 instead"}; +obsolete(erl_scan, attributes_info, _) -> + {removed, "erl_anno:{column,line,location,text}/1 instead"}; +obsolete(erl_scan, token_info, _) -> + {removed, "erl_scan:{category,column,line,location,symbol,text}/1 instead"}; +obsolete(gen_fsm, _, _) -> + {deprecated, "use the 'gen_statem' module instead"}; +obsolete(pg2, _, _) -> + {deprecated, "the 'pg2' module is deprecated and scheduled for removal in OTP 24; use 'pg' instead."}; +obsolete(random, _, _) -> + {deprecated, "use the 'rand' module instead"}; +obsolete(os_mon_mib, _, _) -> + {removed, "this module was removed in OTP 22.0"}; +obsolete(_,_,_) -> no. -dialyzer({no_match, obsolete_type/3}). -obsolete_type(Module, Name, NumberOfVariables) -> - case obsolete_type_1(Module, Name, NumberOfVariables) of - {deprecated=Tag,{_,_,_}=Replacement} -> - {Tag,Replacement,"in a future release"}; - {_,String}=Ret when is_list(String) -> - Ret; - {_,_,_}=Ret -> - Ret; - no -> - no - end. +obsolete_type(erl_scan, column, 0) -> + {removed, "use erl_anno:column() instead"}; +obsolete_type(erl_scan, line, 0) -> + {removed, "use erl_anno:line() instead"}; +obsolete_type(erl_scan, location, 0) -> + {removed, "use erl_anno:location() instead"}; +obsolete_type(_,_,_) -> no. -obsolete_type_1(erl_scan,column,0) -> - {removed,{erl_anno,column,0},"19.0"}; -obsolete_type_1(erl_scan,line,0) -> - {removed,{erl_anno,line,0},"19.0"}; -obsolete_type_1(erl_scan,location,0) -> - {removed,{erl_anno,location,0},"19.0"}; -obsolete_type_1(_,_,_) -> - no. diff --git a/lib/stdlib/src/otp_internal.hrl b/lib/stdlib/src/otp_internal.hrl new file mode 100644 index 000000000000..ace1fa5cc133 --- /dev/null +++ b/lib/stdlib/src/otp_internal.hrl @@ -0,0 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2020. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%% +%% This file is included by the file "otp_internal.erl", which is +%% auto-generated by stdlib/scripts/update_deprecations +%% + +-export([obsolete/3, obsolete_type/3]). + +-type tag() :: 'deprecated' | 'removed'. %% | 'experimental'. +-type mfas() :: mfa() | {atom(), atom(), [byte()]}. +-type release() :: string(). + +-spec obsolete(module(), atom(), arity()) -> + 'no' | {tag(), string()} | {tag(), mfas(), release()}. + +-spec obsolete_type(module(), atom(), arity()) -> + 'no' | {tag(), string()} | {tag(), mfas(), release()}. diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl index 4448a919bc2e..7ea00bc73122 100644 --- a/lib/stdlib/test/erl_lint_SUITE.erl +++ b/lib/stdlib/test/erl_lint_SUITE.erl @@ -2072,8 +2072,9 @@ otp_5362(Config) when is_list(Config) -> {error, [{5,erl_lint,{call_to_redefined_old_bif,{spawn,1}}}], [{4,erl_lint,{deprecated,{erlang,now,0}, - "Deprecated BIF. See the \"Time and Time Correction in Erlang\" " - "chapter of the ERTS User's Guide for more information."}}]}}, + "see the \"Time and Time Correction in Erlang\" " + "chapter of the ERTS User's Guide for more " + "information"}}]}}, {otp_5362_5, <<"-compile(nowarn_deprecated_function). -compile(nowarn_bif_clash). @@ -2130,8 +2131,9 @@ otp_5362(Config) when is_list(Config) -> {nowarn_bif_clash,{spawn,1}}]}, % has no effect {warnings, [{5,erl_lint,{deprecated,{erlang,now,0}, - "Deprecated BIF. See the \"Time and Time Correction in Erlang\" " - "chapter of the ERTS User's Guide for more information."}}]}}, + "see the \"Time and Time Correction in Erlang\" " + "chapter of the ERTS User's Guide for more " + "information"}}]}}, {otp_5362_9, <<"-include_lib(\"stdlib/include/qlc.hrl\"). @@ -2161,13 +2163,15 @@ otp_5362(Config) when is_list(Config) -> [], {warnings, [{1,erl_lint,{deprecated,{calendar,local_time_to_universal_time,1}, - {calendar,local_time_to_universal_time_dst,1}, "a future release"}}]}}, + "use calendar:local_time_to_universal_time_dst/1 " + "instead"}}]}}, {call_removed_function, <<"t(X) -> erlang:hash(X, 10000).">>, [], {warnings, - [{1,erl_lint,{removed,{erlang,hash,2},{erlang,phash2,2},"20.0"}}]}}, + [{1,erl_lint,{removed,{erlang,hash,2}, + "use erlang:phash2/2 instead"}}]}}, {nowarn_call_removed_function_1, <<"t(X) -> erlang:hash(X, 10000).">>, @@ -2184,7 +2188,7 @@ otp_5362(Config) when is_list(Config) -> [], {warnings,[{1,erl_lint, {removed,{os_mon_mib,any_function_really,1}, - "was removed in 22.0"}}]}}, + "this module was removed in OTP 22.0"}}]}}, {nowarn_call_removed_module, <<"t(X) -> os_mon_mib:any_function_really(X).">>, @@ -2223,7 +2227,6 @@ otp_15456(Config) when is_list(Config) -> warn_deprecated_function]}, {warnings,[{5,erl_lint, {deprecated,{random,seed,3}, - "the 'random' module is deprecated; " "use the 'rand' module instead"}}]}}, %% {nowarn_unused_function,[{M,F,A}]} can be given @@ -4148,9 +4151,9 @@ otp_14378(Config) -> [], {warnings,[{4,erl_lint, {deprecated,{erlang,now,0}, - "Deprecated BIF. See the \"Time and Time Correction" - " in Erlang\" chapter of the ERTS User's Guide" - " for more information."}}]}}], + "see the \"Time and Time Correction in Erlang\" " + "chapter of the ERTS User's Guide for more " + "information"}}]}}], [] = run(Config, Ts), ok. diff --git a/otp_build b/otp_build index 8f611240e758..52da262fcf96 100755 --- a/otp_build +++ b/otp_build @@ -79,6 +79,7 @@ usage () git) echo "update_primary [--no-commit] - build and maybe commit a new primary bootstrap" echo "update_preloaded [--no-commit] - build and maybe commit the preloaded modules" + echo "update_deprecations [--no-commit] - build and maybe commit deprecations" ;; esac } @@ -865,6 +866,35 @@ get_do_commit () fi } +do_deprecations_git () +{ + get_do_commit $1 + setup_make + + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET \ + deprecations || exit 1; + + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET \ + primary_bootstrap || exit 1; + + if [ $do_commit = true ]; then + git add -A bootstrap/lib/stdlib/ebin/otp_internal.beam + git add -A lib/stdlib/src/otp_internal.erl + git commit --no-verify -m 'Update deprecations' + echo "" + echo "Deprecations updated and committed." + echo "" + else + echo "" + echo "Deprecations updated. Use the following commands to stage " + echo "changed files:" + echo "" + echo "$ git add bootstrap/lib/stdlib/ebin/otp_internal.beam" + echo "$ git add lib/stdlib/src/otp_internal.erl" + echo "" + fi +} + do_primary_git () { get_do_commit $1 @@ -1179,6 +1209,11 @@ case "$1" in fi; FLAVOR=$1 do_boot;; + update_deprecations) + case $version_controller in + git) do_deprecations_git "$2";; + none) git_required ;; + esac ;; update_primary) case $version_controller in git) do_primary_git "$2";;