172
172
type(code, del_path, 1, Xs) ->
173
173
strict(arg_types(code, del_path, 1), Xs,
176
176
t_tuple([t_atom('error'), t_atom('bad_name')]))
178
178
type(code, delete, 1, Xs) ->
179
strict(arg_types(code, delete, 1), Xs, fun (_) -> t_bool() end);
179
strict(arg_types(code, delete, 1), Xs, fun (_) -> t_boolean() end);
180
180
type(code, ensure_loaded, 1, Xs) ->
181
181
type(code, load_file, 1, Xs);
182
182
type(code, get_chunk, 2, Xs) ->
199
199
t_atom('false')])
201
201
type(code, is_sticky, 1, Xs) ->
202
strict(arg_types(code, is_sticky, 1), Xs, fun (_) -> t_bool() end);
202
strict(arg_types(code, is_sticky, 1), Xs, fun (_) -> t_boolean() end);
203
203
type(code, is_module_native, 1, Xs) ->
204
204
strict(arg_types(code, is_module_native, 1), Xs,
205
fun (_) -> t_sup(t_bool(), t_atom('undefined')) end);
205
fun (_) -> t_sup(t_boolean(), t_atom('undefined')) end);
206
206
type(code, lib_dir, 0, _) ->
208
208
type(code, lib_dir, 1, Xs) ->
346
346
case t_is_atom(Lhs) andalso t_is_atom(Rhs) of
348
348
case {t_atom_vals(Lhs), t_atom_vals(Rhs)} of
349
{unknown, _} -> t_bool();
350
{_, unknown} -> t_bool();
349
{unknown, _} -> t_boolean();
350
{_, unknown} -> t_boolean();
351
351
{[X], [X]} -> t_atom('true');
352
352
{LhsVals, RhsVals} ->
353
353
case lists:all(fun({X, Y}) -> X =/= Y end,
354
354
[{X, Y} || X <- LhsVals, Y <- RhsVals]) of
355
355
true -> t_atom('false');
360
360
case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
361
false -> t_boolean();
363
363
case {t_number_vals(Lhs), t_number_vals(Rhs)} of
364
364
{[X], [X]} when is_integer(X) -> t_atom('true');
390
390
case t_is_atom(Lhs) andalso t_is_atom(Rhs) of
392
392
case {t_atom_vals(Lhs), t_atom_vals(Rhs)} of
393
{unknown, _} -> t_bool();
394
{_, unknown} -> t_bool();
393
{unknown, _} -> t_boolean();
394
{_, unknown} -> t_boolean();
395
395
{[Val], [Val]} -> t_atom('false');
396
396
{LhsVals, RhsVals} ->
397
397
t_sup([t_from_term(X =/= Y) || X <- LhsVals, Y <- RhsVals])
400
400
case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
401
false -> t_boolean();
403
403
LhsMax = number_max(Lhs),
404
404
LhsMin = number_min(Lhs),
599
599
type(erlang, 'and', 2, Xs) ->
600
strict(arg_types(erlang, 'and', 2), Xs, fun (_) -> t_bool() end);
600
strict(arg_types(erlang, 'and', 2), Xs, fun (_) -> t_boolean() end);
601
601
type(erlang, 'or', 2, Xs) ->
602
strict(arg_types(erlang, 'or', 2), Xs, fun (_) -> t_bool() end);
602
strict(arg_types(erlang, 'or', 2), Xs, fun (_) -> t_boolean() end);
603
603
type(erlang, 'xor', 2, Xs) ->
604
strict(arg_types(erlang, 'xor', 2), Xs, fun (_) -> t_bool() end);
604
strict(arg_types(erlang, 'xor', 2), Xs, fun (_) -> t_boolean() end);
605
605
type(erlang, 'not', 1, Xs) ->
606
strict(arg_types(erlang, 'not', 1), Xs, fun (_) -> t_bool() end);
606
strict(arg_types(erlang, 'not', 1), Xs, fun (_) -> t_boolean() end);
607
607
type(erlang, 'band', 2, Xs) ->
608
608
strict(arg_types(erlang, 'band', 2), Xs,
609
609
fun ([X1, X2]) ->
726
726
fun (_) -> t_sup(t_integer(), t_atom('false')) end);
727
727
type(erlang, check_process_code, 2, Xs) ->
728
728
strict(arg_types(erlang, check_process_code, 2), Xs,
729
fun (_) -> t_bool() end);
729
fun (_) -> t_boolean() end);
730
730
type(erlang, concat_binary, 1, Xs) ->
731
731
strict(arg_types(erlang, concat_binary, 1), Xs, fun (_) -> t_binary() end);
732
732
type(erlang, date, 0, _) ->
745
745
type(erlang, demonitor, 1, Xs) ->
746
746
strict(arg_types(erlang, demonitor, 1), Xs, fun (_) -> t_atom('true') end);
747
747
type(erlang, disconnect_node, 1, Xs) ->
748
strict(arg_types(erlang, disconnect_node, 1), Xs, fun (_) -> t_bool() end);
748
strict(arg_types(erlang, disconnect_node, 1), Xs, fun (_) -> t_boolean() end);
749
749
type(erlang, display, 1, _) -> t_atom('true');
750
750
type(erlang, dist_exit, 3, Xs) ->
751
751
strict(arg_types(erlang, dist_exit, 3), Xs, fun (_) -> t_atom('true') end);
780
780
type(erlang, float_to_list, 1, Xs) ->
781
781
strict(arg_types(erlang, float_to_list, 1), Xs, fun (_) -> t_string() end);
782
782
type(erlang, function_exported, 3, Xs) ->
783
strict(arg_types(erlang, function_exported, 3), Xs, fun (_) -> t_bool() end);
783
strict(arg_types(erlang, function_exported, 3), Xs,
784
fun (_) -> t_boolean() end);
784
785
type(erlang, fun_info, 1, Xs) ->
785
786
strict(arg_types(erlang, fun_info, 1), Xs,
786
787
fun (_) -> t_list(t_tuple([t_atom(), t_any()])) end);
791
792
strict(arg_types(erlang, fun_to_list, 1), Xs, fun (_) -> t_string() end);
792
793
type(erlang, garbage_collect, 0, _) -> t_atom('true');
793
794
type(erlang, garbage_collect, 1, Xs) ->
794
strict(arg_types(erlang, garbage_collect, 1), Xs, fun (_) -> t_bool() end);
795
strict(arg_types(erlang, garbage_collect, 1), Xs, fun (_) -> t_boolean() end);
795
796
type(erlang, get, 0, _) -> t_list(t_tuple(2));
796
797
type(erlang, get, 1, _) -> t_any(); % | t_atom('undefined')
797
798
type(erlang, get_cookie, 0, _) -> t_atom(); % | t_atom('nocookie')
848
849
type(erlang, iolist_to_binary, 1, Xs) ->
849
850
strict(arg_types(erlang, iolist_to_binary, 1), Xs,
850
851
fun (_) -> t_binary() end);
851
type(erlang, is_alive, 0, _) -> t_bool();
852
type(erlang, is_alive, 0, _) -> t_boolean();
852
853
type(erlang, is_atom, 1, Xs) ->
853
854
Fun = fun (X) -> check_guard(X, fun (Y) -> t_is_atom(Y) end, t_atom()) end,
854
855
strict(arg_types(erlang, is_atom, 1), Xs, Fun);
866
867
strict(arg_types(erlang, is_bitstring, 1), Xs, Fun);
867
868
type(erlang, is_boolean, 1, Xs) ->
869
check_guard(X, fun (Y) -> t_is_bool(Y) end, t_bool())
870
check_guard(X, fun (Y) -> t_is_boolean(Y) end, t_boolean())
871
872
strict(arg_types(erlang, is_boolean, 1), Xs, Fun);
872
873
type(erlang, is_builtin, 3, Xs) ->
873
strict(arg_types(erlang, is_builtin, 3), Xs, fun (_) -> t_bool() end);
874
strict(arg_types(erlang, is_builtin, 3), Xs, fun (_) -> t_boolean() end);
874
875
type(erlang, is_constant, 1, Xs) ->
876
877
check_guard(X, fun (Y) -> t_is_constant(Y) end, t_constant())
887
888
type(erlang, is_function, 2, Xs) ->
888
889
Fun = fun ([FunType, ArityType]) ->
889
890
case t_number_vals(ArityType) of
891
unknown -> t_boolean();
892
893
FunConstr = t_fun(any_list(Val), t_any()),
893
894
Fun2 = fun (X) ->
894
895
t_is_subtype(X, FunConstr) andalso (not t_is_none(X))
896
897
check_guard_single(FunType, Fun2, FunConstr);
897
IntList when is_list(IntList) -> t_bool() %% true?
898
IntList when is_list(IntList) -> t_boolean() %% true?
900
901
strict(arg_types(erlang, is_function, 2), Xs, Fun);
922
923
strict(arg_types(erlang, is_port, 1), Xs, Fun);
923
924
type(erlang, is_process_alive, 1, Xs) ->
924
925
strict(arg_types(erlang, is_process_alive, 1), Xs,
925
fun (_) -> t_bool() end);
926
fun (_) -> t_boolean() end);
926
927
type(erlang, is_record, 2, Xs) ->
927
928
Fun = fun ([X, Y]) ->
928
929
case t_is_tuple(X) of
930
931
case t_is_none(t_inf(t_tuple(), X)) of
931
932
true -> t_atom('false');
935
936
case t_tuple_subtypes(X) of
937
unknown -> t_boolean();
938
939
case t_tuple_args(Tuple) of
940
%% any -> t_boolean();
941
942
case t_is_atom(Tag) of
943
944
TagAtom = t_inf(Tag, t_atom()),
944
945
case t_is_none(TagAtom) of
945
946
true -> t_atom('false');
949
950
case t_atom_vals(Tag) of
951
952
case t_atom_vals(Y) of
952
953
[RealTag] -> t_atom('true');
1077
1078
type(erlang, make_ref, 0, _) -> t_reference();
1078
1079
type(erlang, make_tuple, 2, Xs) ->
1079
1080
strict(arg_types(erlang, make_tuple, 2), Xs,
1082
case t_number_vals(Int) of
1083
[N] when is_integer(N), N >= 0 -> t_tuple(N);
1087
type(erlang, make_tuple, 3, Xs) ->
1088
strict(arg_types(erlang, make_tuple, 3), Xs,
1089
fun ([Int, _, _]) ->
1081
1090
case t_number_vals(Int) of
1082
1091
[N] when is_integer(N), N >= 0 -> t_tuple(N);
1083
1092
_Other -> t_tuple()
1099
1108
type(erlang, md5_update, 2, Xs) ->
1100
1109
strict(arg_types(erlang, md5_update, 2), Xs, fun (_) -> t_binary() end);
1101
1110
type(erlang, module_loaded, 1, Xs) ->
1102
strict(arg_types(erlang, module_loaded, 1), Xs, fun (_) -> t_bool() end);
1111
strict(arg_types(erlang, module_loaded, 1), Xs, fun (_) -> t_boolean() end);
1103
1112
type(erlang, monitor, 2, Xs) ->
1104
1113
strict(arg_types(erlang, monitor, 2), Xs, fun (_) -> t_reference() end);
1105
1114
type(erlang, monitor_node, 2, Xs) ->
1179
1188
type(erlang, pre_loaded, 0, _) -> t_list(t_atom());
1180
1189
type(erlang, process_display, 2, _) -> t_atom('true');
1181
1190
type(erlang, process_flag, 2, Xs) ->
1182
T_process_flag_returns = t_sup([t_bool(), t_atom(), t_non_neg_integer()]),
1191
T_process_flag_returns = t_sup([t_boolean(), t_atom(), t_non_neg_integer()]),
1183
1192
strict(arg_types(erlang, process_flag, 2), Xs,
1184
1193
fun ([Flag, _Option]) ->
1185
1194
case t_is_atom(Flag) of
1187
1196
case t_atom_vals(Flag) of
1188
1197
['error_handler'] -> t_atom();
1189
1198
['min_heap_size'] -> t_non_neg_integer();
1190
['monitor_nodes'] -> t_bool();
1199
['monitor_nodes'] -> t_boolean();
1191
1200
['priority'] -> t_process_priority_level();
1192
1201
['save_calls'] -> t_non_neg_integer();
1193
['trap_exit'] -> t_bool();
1202
['trap_exit'] -> t_boolean();
1194
1203
List when is_list(List) ->
1195
1204
T_process_flag_returns;
1320
1329
case t_atom_vals(Item) of
1321
1330
['label'] -> t_sup(t_tuple([Item, t_any()]), t_nil());
1322
1331
['serial'] -> t_sup(t_tuple([Item, t_tuple(2)]), t_nil());
1323
['send'] -> t_tuple([Item, t_bool()]);
1324
['receive'] -> t_tuple([Item, t_bool()]);
1325
['print'] -> t_tuple([Item, t_bool()]);
1326
['timestamp'] -> t_tuple([Item, t_bool()]);
1332
['send'] -> t_tuple([Item, t_boolean()]);
1333
['receive'] -> t_tuple([Item, t_boolean()]);
1334
['print'] -> t_tuple([Item, t_boolean()]);
1335
['timestamp'] -> t_tuple([Item, t_boolean()]);
1327
1336
List when is_list(List) ->
1328
1337
t_sup(t_tuple([t_seq_trace_info(), t_any()]), t_nil());
1333
1342
type(erlang, seq_trace_print, 1, Xs) ->
1334
strict(arg_types(erlang, seq_trace_print, 1), Xs, fun (_) -> t_bool() end);
1343
strict(arg_types(erlang, seq_trace_print, 1), Xs, fun (_) -> t_boolean() end);
1335
1344
type(erlang, seq_trace_print, 2, Xs) ->
1336
strict(arg_types(erlang, seq_trace_print, 2), Xs, fun (_) -> t_bool() end);
1345
strict(arg_types(erlang, seq_trace_print, 2), Xs, fun (_) -> t_boolean() end);
1337
1346
type(erlang, set_cookie, 2, Xs) ->
1338
1347
strict(arg_types(erlang, set_cookie, 2), Xs, fun (_) -> t_atom('true') end);
1339
1348
type(erlang, setelement, 3, Xs) ->
1340
1349
strict(arg_types(erlang, setelement, 3), Xs,
1341
1350
fun ([X1, X2, X3]) ->
1343
case t_tuple_subtypes(X2) of
1344
unknown -> t_tuple();
1346
Sz = t_tuple_size(X2),
1347
As = t_tuple_args(X2),
1348
case t_number_vals(X1) of
1350
t_tuple([t_sup(X, X3) || X <- As]);
1351
[N] when is_integer(N), 1 =< N, N =< Sz ->
1352
t_tuple(list_replace(N, X3, As));
1353
[N] when is_integer(N), N < 1 ->
1355
[N] when is_integer(N), N > Sz ->
1359
(N, Xs) when is_integer(N), 1 =< N, N =< Sz ->
1360
X = lists:nth(N, Xs),
1362
list_replace(N, Y, Xs);
1351
case t_tuple_subtypes(X2) of
1352
unknown -> t_tuple();
1354
Sz = t_tuple_size(X2),
1355
As = t_tuple_args(X2),
1356
case t_number_vals(X1) of
1358
t_tuple([t_sup(X, X3) || X <- As]);
1359
[N] when is_integer(N), 1 =< N, N =< Sz ->
1360
t_tuple(list_replace(N, X3, As));
1361
[N] when is_integer(N), N < 1 ->
1363
[N] when is_integer(N), N > Sz ->
1366
Fun = fun (N, Xs) when is_integer(N), 1 =< N, N =< Sz ->
1367
X = lists:nth(N, Xs),
1369
list_replace(N, Y, Xs);
1366
t_tuple(lists:foldl(Fun, As, Ns))
1368
Ts when is_list(Ts) ->
1369
t_sup([type(erlang, setelement, 3, [X1, Y, X3]) || Y <- Ts])
1373
t_tuple(lists:foldl(Fun, As, Ns))
1375
Ts when is_list(Ts) ->
1376
t_sup([type(erlang, setelement, 3, [X1, Y, X3]) || Y <- Ts])
1373
1379
type(erlang, setnode, 2, Xs) ->
1374
1380
strict(arg_types(erlang, setnode, 2), Xs, fun (_) -> t_atom('true') end);
1456
1462
fun (_) -> t_atom('true') end);
1457
1463
type(erlang, suspend_process, 2, Xs) ->
1458
1464
strict(arg_types(erlang, suspend_process, 2), Xs,
1459
fun (_) -> t_bool() end);
1465
fun (_) -> t_boolean() end);
1460
1466
type(erlang, system_flag, 2, Xs) ->
1461
1467
strict(arg_types(erlang, system_flag, 2), Xs,
1462
1468
fun ([Flag,_Value]) ->
1463
1469
%% this provides an overapproximation of all return values
1464
1470
T_system_flag_2 = t_sup([t_integer(),
1466
1472
t_system_cpu_topology(),
1467
1473
t_system_multi_scheduling()]),
1468
1474
case t_is_atom(Flag) of
1732
1738
type(erts_debug, flat_size, 1, Xs) ->
1733
1739
strict(arg_types(erts_debug, flat_size, 1), Xs, fun (_) -> t_integer() end);
1734
1740
type(erts_debug, same, 2, Xs) ->
1735
strict(arg_types(erts_debug, same, 2), Xs, fun (_) -> t_bool() end);
1741
strict(arg_types(erts_debug, same, 2), Xs, fun (_) -> t_boolean() end);
1736
1742
%%-- ets ----------------------------------------------------------------------
1737
1743
type(ets, all, 0, _) ->
1738
1744
t_list(t_tab());
1747
1753
strict(arg_types(ets, delete_object, 2), Xs, fun (_) -> t_atom('true') end);
1748
1754
type(ets, first, 1, Xs) ->
1749
1755
strict(arg_types(ets, first, 1), Xs, fun (_) -> t_any() end);
1756
type(ets, give_away, 3, Xs) ->
1757
strict(arg_types(ets, give_away, 3), Xs, fun (_) -> t_atom('true') end);
1750
1758
type(ets, info, 1, Xs) ->
1751
1759
strict(arg_types(ets, info, 1), Xs,
1758
1766
type(ets, insert, 2, Xs) ->
1759
1767
strict(arg_types(ets, insert, 2), Xs, fun (_) -> t_atom('true') end);
1760
1768
type(ets, insert_new, 2, Xs) ->
1761
strict(arg_types(ets, insert_new, 2), Xs, fun (_) -> t_bool() end);
1769
strict(arg_types(ets, insert_new, 2), Xs, fun (_) -> t_boolean() end);
1762
1770
type(ets, is_compiled_ms, 1, Xs) ->
1763
strict(arg_types(ets, is_compiled_ms, 1), Xs, fun (_) -> t_bool() end);
1771
strict(arg_types(ets, is_compiled_ms, 1), Xs, fun (_) -> t_boolean() end);
1764
1772
type(ets, last, 1, Xs) ->
1765
1773
type(ets, first, 1, Xs);
1766
1774
type(ets, lookup, 2, Xs) ->
1781
1789
type(ets, match_spec_run_r, 3, Xs) ->
1782
1790
strict(arg_types(ets, match_spec_run_r, 3), Xs, fun (_) -> t_list() end);
1783
1791
type(ets, member, 2, Xs) ->
1784
strict(arg_types(ets, member, 2), Xs, fun (_) -> t_bool() end);
1792
strict(arg_types(ets, member, 2), Xs, fun (_) -> t_boolean() end);
1785
1793
type(ets, new, 2, Xs) ->
1786
1794
strict(arg_types(ets, new, 2), Xs, fun (_) -> t_tab() end);
1787
1795
type(ets, next, 2, Xs) ->
1808
1816
type(ets, select_reverse, 1, Xs) -> type(ets, select, 1, Xs);
1809
1817
type(ets, select_reverse, 2, Xs) -> type(ets, select, 2, Xs);
1810
1818
type(ets, select_reverse, 3, Xs) -> type(ets, select, 3, Xs);
1819
type(ets, setopts, 2, Xs) ->
1820
strict(arg_types(ets, setopts, 2), Xs, fun (_) -> t_atom('true') end);
1811
1821
type(ets, slot, 2, Xs) ->
1812
1822
strict(arg_types(ets, slot, 2), Xs,
1813
1823
fun (_) -> t_sup(t_list(t_tuple()), t_atom('$end_of_table')) end);
1814
1824
type(ets, update_counter, 3, Xs) ->
1815
1825
strict(arg_types(ets, update_counter, 3), Xs, fun (_) -> t_integer() end);
1816
1826
type(ets, update_element, 3, Xs) ->
1817
strict(arg_types(ets, update_element, 3), Xs, fun (_) -> t_bool() end);
1827
strict(arg_types(ets, update_element, 3), Xs, fun (_) -> t_boolean() end);
1818
1828
%%-- file ---------------------------------------------------------------------
1819
1829
type(file, close, 1, Xs) ->
1820
1830
strict(arg_types(file, close, 1), Xs, fun (_) -> t_file_return() end);
1934
1944
type(hipe_bifs, bitarray, 2, Xs) ->
1935
1945
strict(arg_types(hipe_bifs, bitarray, 2), Xs, fun (_) -> t_bitarray() end);
1936
1946
type(hipe_bifs, bitarray_sub, 2, Xs) ->
1937
strict(arg_types(hipe_bifs, bitarray_sub, 2), Xs, fun (_) -> t_bool() end);
1947
strict(arg_types(hipe_bifs, bitarray_sub, 2), Xs, fun (_) -> t_boolean() end);
1938
1948
type(hipe_bifs, bitarray_update, 3, Xs) ->
1939
1949
strict(arg_types(hipe_bifs, bitarray_update, 3), Xs,
1940
1950
fun (_) -> t_bitarray() end);
1958
1968
strict(arg_types(hipe_bifs, call_count_on, 1), Xs,
1959
1969
fun (_) -> t_sup(t_atom('true'), t_nil()) end);
1960
1970
type(hipe_bifs, check_crc, 1, Xs) ->
1961
strict(arg_types(hipe_bifs, check_crc, 1), Xs, fun (_) -> t_bool() end);
1971
strict(arg_types(hipe_bifs, check_crc, 1), Xs, fun (_) -> t_boolean() end);
1962
1972
type(hipe_bifs, enter_code, 2, Xs) ->
1963
1973
strict(arg_types(hipe_bifs, enter_code, 2), Xs,
1964
1974
fun (_) -> t_tuple([t_integer(),
2612
2622
%%-- net_kernel ---------------------------------------------------------------
2613
2623
type(net_kernel, dflag_unicode_io, 1, Xs) ->
2614
2624
strict(arg_types(net_kernel, dflag_unicode_io, 1), Xs,
2615
fun (_) -> t_bool() end);
2625
fun (_) -> t_boolean() end);
2616
2626
%%-- ordsets ------------------------------------------------------------------
2617
2627
type(ordsets, filter, 2, Xs) ->
2618
2628
type(lists, filter, 2, Xs);
2675
2685
type(string, concat, 2, Xs) -> % NOTE: added to avoid loss of information
2676
2686
strict(arg_types(string, concat, 2), Xs, fun (_) -> t_string() end);
2677
2687
type(string, equal, 2, Xs) -> % NOTE: added to avoid loss of information
2678
strict(arg_types(string, equal, 2), Xs, fun (_) -> t_bool() end);
2688
strict(arg_types(string, equal, 2), Xs, fun (_) -> t_boolean() end);
2679
2689
type(string, to_float, 1, Xs) ->
2680
2690
strict(arg_types(string, to_float, 1), Xs,
2681
2691
fun (_) -> t_sup(t_tuple([t_float(), t_string()]),
2706
2716
t_tuple([t_atom('incomplete'), t_string(), t_ML()])])
2708
2718
type(unicode, bin_is_7bit, 1, Xs) ->
2709
strict(arg_types(unicode, bin_is_7bit, 1), Xs, fun (_) -> t_bool() end);
2719
strict(arg_types(unicode, bin_is_7bit, 1), Xs, fun (_) -> t_boolean() end);
2711
2721
%%-----------------------------------------------------------------------------
2712
2722
type(M, F, A, Xs) when is_atom(M), is_atom(F),
3278
3288
arg_types(erlang, 'rem', 2) ->
3279
3289
[t_integer(), t_integer()];
3280
3290
arg_types(erlang, 'and', 2) ->
3281
[t_bool(), t_bool()];
3291
[t_boolean(), t_boolean()];
3282
3292
arg_types(erlang, 'or', 2) ->
3283
[t_bool(), t_bool()];
3293
[t_boolean(), t_boolean()];
3284
3294
arg_types(erlang, 'xor', 2) ->
3285
[t_bool(), t_bool()];
3295
[t_boolean(), t_boolean()];
3286
3296
arg_types(erlang, 'not', 1) ->
3288
3298
arg_types(erlang, 'band', 2) ->
3289
3299
[t_integer(), t_integer()];
3290
3300
arg_types(erlang, 'bor', 2) ->
3501
3511
[t_tuple([t_date(), t_time()])];
3502
3512
arg_types(erlang, localtime_to_universaltime, 2) ->
3503
3513
arg_types(erlang, localtime_to_universaltime, 1) ++
3504
[t_sup(t_bool(), t_atom('undefined'))];
3514
[t_sup(t_boolean(), t_atom('undefined'))];
3505
3515
arg_types(erlang, make_fun, 3) ->
3506
3516
[t_atom(), t_atom(), t_arity()];
3507
3517
arg_types(erlang, make_ref, 0) ->
3509
3519
arg_types(erlang, make_tuple, 2) ->
3510
3520
[t_non_neg_fixnum(), t_any()]; % the value 0 is OK as first argument
3521
arg_types(erlang, make_tuple, 3) ->
3522
[t_non_neg_fixnum(), t_any(), t_list(t_tuple([t_pos_integer(), t_any()]))];
3511
3523
arg_types(erlang, match_spec_test, 3) ->
3512
3524
[t_sup(t_list(), t_tuple()),
3525
3537
arg_types(erlang, monitor, 2) ->
3526
3538
[t_atom(), t_sup([t_pid(), t_atom(), t_tuple([t_atom(), t_node()])])];
3527
3539
arg_types(erlang, monitor_node, 2) ->
3528
[t_node(), t_bool()];
3540
[t_node(), t_boolean()];
3529
3541
arg_types(erlang, monitor_node, 3) ->
3530
[t_node(), t_bool(), t_list(t_atom('allow_passive_connect'))];
3542
[t_node(), t_boolean(), t_list(t_atom('allow_passive_connect'))];
3531
3543
arg_types(erlang, node, 0) ->
3533
3545
arg_types(erlang, node, 1) ->
3596
3608
t_atom('min_heap_size'), t_atom('priority'), t_atom('save_calls'),
3597
3609
t_atom('monitor_nodes'), % undocumented
3598
3610
t_tuple([t_atom('monitor_nodes'), t_list()])]), % undocumented
3599
t_sup([t_bool(), t_atom(), t_non_neg_integer()])];
3611
t_sup([t_boolean(), t_atom(), t_non_neg_integer()])];
3600
3612
arg_types(erlang, process_flag, 3) ->
3601
3613
[t_pid(), t_atom('save_calls'), t_non_neg_integer()];
3602
3614
arg_types(erlang, process_info, 1) ->
3632
3644
arg_types(erlang, send_after, 3) ->
3633
3645
[t_non_neg_integer(), t_sup(t_pid(), t_atom()), t_any()];
3634
3646
arg_types(erlang, seq_trace, 2) ->
3635
[t_atom(), t_sup([t_bool(), t_tuple([t_fixnum(), t_fixnum()]), t_nil()])];
3647
[t_atom(), t_sup([t_boolean(), t_tuple([t_fixnum(), t_fixnum()]), t_nil()])];
3636
3648
arg_types(erlang, seq_trace_info, 1) ->
3637
3649
[t_seq_trace_info()];
3638
3650
arg_types(erlang, seq_trace_print, 1) ->
3735
3747
arg_types(erlang, term_to_binary, 2) ->
3736
3748
[t_any(), t_list(t_sup([t_atom('compressed'),
3737
t_tuple([t_atom('minor_version'), t_integer()])]))];
3749
t_tuple([t_atom('compressed'), t_from_range(0, 9)]),
3750
t_tuple([t_atom('minor_version'), t_integers([0, 1])])]))];
3738
3751
arg_types(erlang, throw, 1) ->
3740
3753
arg_types(erlang, time, 0) ->
3760
3773
arg_types(erlang, trace_pattern, 2) ->
3761
3774
[t_sup(t_tuple([t_atom(), t_atom(), t_sup(t_arity(), t_atom('_'))]),
3762
3775
t_atom('on_load')),
3763
t_sup([t_bool(), t_list(), t_atom('restart'), t_atom('pause')])];
3776
t_sup([t_boolean(), t_list(), t_atom('restart'), t_atom('pause')])];
3764
3777
arg_types(erlang, trace_pattern, 3) ->
3765
3778
arg_types(erlang, trace_pattern, 2) ++
3766
3779
[t_list(t_sup([t_atom('global'), t_atom('local'),
3797
3810
%%------- erts_debug ----------------------------------------------------------
3798
3811
arg_types(erts_debug, breakpoint, 2) ->
3799
[t_tuple([t_atom(), t_atom(), t_sup(t_integer(), t_atom('_'))]), t_bool()];
3812
[t_tuple([t_atom(), t_atom(), t_sup(t_integer(), t_atom('_'))]), t_boolean()];
3800
3813
arg_types(erts_debug, disassemble, 1) ->
3801
3814
[t_sup(t_mfa(), t_integer())];
3802
3815
arg_types(erts_debug, flat_size, 1) ->
3878
3893
arg_types(ets, select, 3);
3879
3894
arg_types(ets, slot, 2) ->
3880
3895
[t_tab(), t_non_neg_fixnum()]; % 2nd arg can be 0
3896
arg_types(ets, setopts, 2) ->
3897
Opt = t_sup(t_tuple([t_atom('heir'), t_pid(), t_any()]),
3898
t_tuple([t_atom('heir'), t_atom('none')])),
3899
[t_tab(), t_sup(Opt, t_list(Opt))];
3881
3900
arg_types(ets, update_counter, 3) ->
3882
3901
[t_tab(), t_any(), t_sup(t_integer(),
3883
3902
t_sup(t_tuple([t_integer(), t_integer()]),
3957
3976
arg_types(hipe_bifs, bif_address, 3) ->
3958
3977
[t_atom(), t_atom(), t_arity()];
3959
3978
arg_types(hipe_bifs, bitarray, 2) ->
3960
[t_non_neg_fixnum(), t_bool()];
3979
[t_non_neg_fixnum(), t_boolean()];
3961
3980
arg_types(hipe_bifs, bitarray_sub, 2) ->
3962
3981
[t_bitarray(), t_non_neg_fixnum()];
3963
3982
arg_types(hipe_bifs, bitarray_update, 3) ->
3964
[t_bytearray(), t_non_neg_fixnum(), t_bool()];
3983
[t_bytearray(), t_non_neg_fixnum(), t_boolean()];
3965
3984
arg_types(hipe_bifs, bytearray, 2) ->
3966
3985
[t_non_neg_fixnum(), t_byte()];
3967
3986
arg_types(hipe_bifs, bytearray_sub, 2) ->
3983
4002
arg_types(hipe_bifs, enter_sdesc, 1) ->
3984
4003
[t_tuple([t_integer(), t_integer(), t_integer(), t_integer(), t_integer()])];
3985
4004
arg_types(hipe_bifs, find_na_or_make_stub, 2) ->
3986
[t_mfa(), t_bool()];
4005
[t_mfa(), t_boolean()];
3987
4006
arg_types(hipe_bifs, fun_to_address, 1) ->
3989
4008
%% arg_types(hipe_bifs, get_emu_address, 1) ->
4019
4038
arg_types(hipe_bifs, set_funinfo_native_address, 3) ->
4020
4039
arg_types(hipe_bifs, set_native_address, 3);
4021
4040
arg_types(hipe_bifs, set_native_address, 3) ->
4022
[t_mfa(), t_integer(), t_bool()];
4041
[t_mfa(), t_integer(), t_boolean()];
4023
4042
arg_types(hipe_bifs, system_crc, 1) ->
4025
4044
arg_types(hipe_bifs, term_to_word, 1) ->
4056
4075
arg_types(io_lib, format, 2);
4057
4076
%%------- lists ---------------------------------------------------------------
4058
4077
arg_types(lists, all, 2) ->
4059
[t_fun([t_any()], t_bool()), t_list()];
4078
[t_fun([t_any()], t_boolean()), t_list()];
4060
4079
arg_types(lists, any, 2) ->
4061
[t_fun([t_any()], t_bool()), t_list()];
4080
[t_fun([t_any()], t_boolean()), t_list()];
4062
4081
arg_types(lists, append, 2) ->
4063
4082
arg_types(erlang, '++', 2); % alias
4064
4083
arg_types(lists, delete, 2) ->
4065
4084
[t_any(), t_maybe_improper_list()];
4066
4085
arg_types(lists, dropwhile, 2) ->
4067
[t_fun([t_any()], t_bool()), t_maybe_improper_list()];
4086
[t_fun([t_any()], t_boolean()), t_maybe_improper_list()];
4068
4087
arg_types(lists, filter, 2) ->
4069
[t_fun([t_any()], t_bool()), t_list()];
4088
[t_fun([t_any()], t_boolean()), t_list()];
4070
4089
arg_types(lists, flatten, 1) ->
4072
4091
arg_types(lists, flatmap, 2) ->
4110
4129
arg_types(lists, merge, 2) ->
4111
4130
[t_list(), t_list()];
4112
4131
%% arg_types(lists, merge, 3) ->
4113
%% [t_fun([t_any(), t_any()], t_bool()), t_list(), t_list()];
4132
%% [t_fun([t_any(), t_any()], t_boolean()), t_list(), t_list()];
4114
4133
%% arg_types(lists, merge3, 3) ->
4115
4134
%% [t_list(), t_list(), t_list()];
4116
4135
arg_types(lists, min, 1) ->
4132
4151
arg_types(lists, sort, 1) ->
4134
4153
arg_types(lists, sort, 2) ->
4135
[t_fun([t_any(), t_any()], t_bool()), t_list()];
4154
[t_fun([t_any(), t_any()], t_boolean()), t_list()];
4136
4155
arg_types(lists, split, 2) ->
4137
4156
[t_non_neg_fixnum(), t_maybe_improper_list()]; % do not lie in 2nd arg
4138
4157
arg_types(lists, splitwith, 2) ->
4139
[t_fun([t_any()], t_bool()), t_maybe_improper_list()];
4158
[t_fun([t_any()], t_boolean()), t_maybe_improper_list()];
4140
4159
arg_types(lists, subtract, 2) ->
4141
4160
arg_types(erlang, '--', 2); % alias
4142
4161
arg_types(lists, takewhile, 2) ->
4143
[t_fun([t_any()], t_bool()), t_maybe_improper_list()];
4162
[t_fun([t_any()], t_boolean()), t_maybe_improper_list()];
4144
4163
arg_types(lists, usort, 1) ->
4145
4164
arg_types(lists, sort, 1); % same
4146
4165
arg_types(lists, usort, 2) ->
4563
4582
%% From the 'ets' documentation
4564
4583
%%-----------------------------
4565
%% Option = Type | Access | named_table | {keypos,Pos}
4566
%% Type = set | ordered_set | bag | duplicate_bag
4567
%% Access = public | protected | private
4584
%% Option = Type | Access | named_table | {keypos,Pos}
4585
%% | {heir,pid(),HeirData} | {heir,none} | {write_concurrency,bool()}
4586
%% Type = set | ordered_set | bag | duplicate_bag
4587
%% Access = public | protected | private
4589
%% HeirData = term()
4569
4590
t_ets_new_options() ->
4570
4591
t_list(t_sup([t_atom('set'),
4571
4592
t_atom('ordered_set'),
4754
4778
t_inet_setoption() ->
4755
4779
t_sup([%% first the 2-tuple options
4756
t_tuple([t_atom('active'), t_sup(t_bool(), t_atom('once'))]),
4757
t_tuple([t_atom('broadcast'), t_bool()]),
4758
t_tuple([t_atom('delay_send'), t_bool()]),
4759
t_tuple([t_atom('dontroute'), t_bool()]),
4760
t_tuple([t_atom('exit_on_close'), t_bool()]),
4780
t_tuple([t_atom('active'), t_sup(t_boolean(), t_atom('once'))]),
4781
t_tuple([t_atom('broadcast'), t_boolean()]),
4782
t_tuple([t_atom('delay_send'), t_boolean()]),
4783
t_tuple([t_atom('dontroute'), t_boolean()]),
4784
t_tuple([t_atom('exit_on_close'), t_boolean()]),
4761
4785
t_tuple([t_atom('header'), t_non_neg_integer()]),
4762
t_tuple([t_atom('keepalive'), t_bool()]),
4763
t_tuple([t_atom('nodelay'), t_bool()]),
4786
t_tuple([t_atom('keepalive'), t_boolean()]),
4787
t_tuple([t_atom('nodelay'), t_boolean()]),
4764
4788
t_tuple([t_atom('packet'), t_inet_setoption_packettype()]),
4765
4789
t_tuple([t_atom('packet_size'), t_non_neg_integer()]),
4766
4790
t_tuple([t_atom('read_packets'), t_non_neg_integer()]),
4767
4791
t_tuple([t_atom('recbuf'), t_non_neg_integer()]),
4768
t_tuple([t_atom('reuseaddr'), t_bool()]),
4792
t_tuple([t_atom('reuseaddr'), t_boolean()]),
4769
4793
t_tuple([t_atom('send_timeout'), t_non_neg_integer()]),
4770
4794
t_tuple([t_atom('sndbuf'), t_non_neg_integer()]),
4771
4795
t_tuple([t_atom('priority'), t_non_neg_integer()]),