aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2018-05-24 12:21:21 +0200
committerHans Bolinder <[email protected]>2018-05-25 09:46:47 +0200
commit324fc38bc442460f871f3ae002dd853415ae9e51 (patch)
tree26ea1179da346c7954a6064b05460c2eb7cbec0e /lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl
parent4f91c8a34f4cc2c728a63e8d218566b3b3795b10 (diff)
downloadotp-324fc38bc442460f871f3ae002dd853415ae9e51.tar.gz
otp-324fc38bc442460f871f3ae002dd853415ae9e51.tar.bz2
otp-324fc38bc442460f871f3ae002dd853415ae9e51.zip
dialyzer: Refine the test for overspecified functions
The -Woverspecs (-Wspecdiffs) option generates warnings in a few more cases. The refinement is analogous to the test that -Wunderspecs already does: it checks if the contract has nothing in common with some element (see erl_types:t_elements/1) of the success typing.
Diffstat (limited to 'lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl')
-rw-r--r--lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl b/lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl
new file mode 100644
index 0000000000..caa44f6c91
--- /dev/null
+++ b/lib/dialyzer/test/overspecs_SUITE_data/src/iodata.erl
@@ -0,0 +1,41 @@
+-module(iodata).
+
+%% A small part of beam_asm.
+
+-export([encode/2]).
+
+-spec encode(non_neg_integer(), integer()) -> iodata(). % extra range binary()
+
+encode(Tag, N) when Tag >= 0, N < 0 ->
+ encode1(Tag, negative_to_bytes(N));
+encode(Tag, N) when Tag >= 0, N < 16 ->
+ (N bsl 4) bor Tag; % not in the specification
+encode(Tag, N) when Tag >= 0, N < 16#800 ->
+ [((N bsr 3) band 2#11100000) bor Tag bor 2#00001000, N band 16#ff];
+encode(Tag, N) when Tag >= 0 ->
+ encode1(Tag, to_bytes(N)).
+
+encode1(Tag, Bytes) ->
+ case iolist_size(Bytes) of
+ Num when 2 =< Num, Num =< 8 ->
+ [((Num-2) bsl 5) bor 2#00011000 bor Tag| Bytes];
+ Num when 8 < Num ->
+ [2#11111000 bor Tag, encode(0, Num-9)| Bytes]
+ end.
+
+to_bytes(N) ->
+ Bin = binary:encode_unsigned(N),
+ case Bin of
+ <<0:1,_/bits>> -> Bin;
+ <<1:1,_/bits>> -> [0,Bin]
+ end.
+
+negative_to_bytes(N) when N >= -16#8000 ->
+ <<N:16>>;
+negative_to_bytes(N) ->
+ Bytes = byte_size(binary:encode_unsigned(-N)),
+ Bin = <<N:Bytes/unit:8>>,
+ case Bin of
+ <<0:1,_/bits>> -> [16#ff,Bin];
+ <<1:1,_/bits>> -> Bin
+ end.