<div dir="ltr"><div>Hi, Fred and Stanislav,</div><div><br></div><div>Thank you for your replies.</div><div>Now I understood why dialyzer is complaining about the underspec return. It really makes sense.</div><div>But I still didn't get why proplists is "working". I've enabled the <i>unknown</i> warning as stated below and I'm using OTP24 and the latest rebar3. The behaviour is the same with or without the <i>unknown</i> warning:</div><div><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"><br></span></span></div><div>rebar.config<span style="font-family:monospace">:<br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">{erl_opts, [debug_info]}.<br>{deps, []}.<br>{dialyzer, [<br>   {get_warnings, true},<br>   {warnings, [error_handling, underspecs, <b>unknown</b>, unmatched_returns]}<br></span><div><span style="font-family:monospace">]}.</span></div></blockquote><div><div><br></div><div>Source with proplist emulation:<br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace"><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span><br>
<br><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-export</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">test</span><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">/</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">0</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span><br>
<br><span style="color:rgb(24,24,178);background-color:rgb(255,255,255)">%% From <<a href="https://erlang.org/doc/man/proplists.html">https://erlang.org/doc/man/proplists.html</a>></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">-type</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> property() :: atom() </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">|</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> tuple().
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">-type</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> proplist() :: </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">property()</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">-spec</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> test() </span><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> proplist().
</span><br>test() <span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br>    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br>        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">one_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">a</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">b</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">c</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,
</span><br>        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">another_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">d</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">e</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">f</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br>    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.</span><br></span></div></blockquote><div><br></div><div>Result:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace"><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Verifying dependencies...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Analyzing applications...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Compiling test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Dialyzer starting, this may take a while...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Updating plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Resolving files...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Updating base plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Resolving files...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Checking 204 files in ../../home/pzulato/.cache/rebar3/rebar3_24.0_plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Copying ../../home/pzulato/.cache/rebar3/rebar3_24.0_plt to _build/default/rebar3_24.0_plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Checking 204 files in _build/default/rebar3_24.0_plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Doing success typing analysis...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Resolving files...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Analyzing 1 files with _build/default/rebar3_24.0_plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br>
<br><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">src/</span><span style="color:rgb(24,178,178);background-color:rgb(255,255,255)">test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.erl</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br>Line <span style="color:rgb(24,178,178);background-color:rgb(255,255,255)">8</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> Column </span><span style="color:rgb(24,178,178);background-color:rgb(255,255,255)">2</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">: </span><span style="font-weight:bold;color:rgb(0,0,0);background-color:rgb(255,255,255)">Type specification </span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">test:test() -> proplist()</span><span style="font-weight:bold;color:rgb(0,0,0);background-color:rgb(255,255,255)"> is a supertype of the success typing: </span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">test:test() -> [{'another_test',['d' | 'e' | 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Warnings written to _build/default/24.0.dialyzer_warnings</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">===> </span><span style="font-weight:bold;color:rgb(255,84,84);background-color:rgb(255,255,255)">Warnings occurred running dialyzer: 1</span></span></div></blockquote><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"></span></div><div><div><div>Source with real proplist:<br></div></div><span style="font-family:monospace"></span></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace"><span style="font-family:monospace"><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">
</span></span><br><span style="font-family:monospace"><span style="font-family:monospace"><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-export</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">test</span><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">/</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">0</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">
</span></span><br><span style="font-family:monospace"><span style="font-family:monospace"><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">-spec</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> test() </span><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> proplists:proplist().</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">test() <span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">one_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">a</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">b</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">c</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,
</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">another_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">d</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">e</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">f</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace">    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.</span></span></span><br><span style="font-family:monospace"><span style="font-family:monospace"></span></span></blockquote><span style="font-family:monospace"><span style="font-family:monospace">
</span></span></div><div><span style="font-family:monospace"><span style="font-family:monospace"><br></span></span></div><div>Result:</div><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace"><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Verifying dependencies...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Analyzing applications...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Compiling test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Dialyzer starting, this may take a while...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Updating plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Resolving files...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Checking 204 files in _build/default/rebar3_24.0_plt...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Doing success typing analysis...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Resolving files...</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">===> Analyzing 1 files with _build/default/rebar3_24.0_plt...</span><br></span></div></blockquote><br><div><br></div><div>Do I need to do something else than adding the <i>unknown</i> warning into rebar.config or is it enough?<br></div><div><br></div><div><br></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Best regards,<br>Paulo Zulato<br><br>--<br>«Quis custodiet ipsos custodes?»</div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 18 May 2021 at 03:50, Stanislav Ledenev <<a href="mailto:s.ledenev@gmail.com">s.ledenev@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">1. As I understand underspec and overspec requires precise indication of types. <div>So for a list of a,b,c atoms you _must_ indicate [a,b,c] but not just a list of atoms. </div><div>Because list of atoms implies a list of any size with any atoms not a list of 3 specific atoms a,b,c.<br><br>2. The only possible reason why proplists:proplist "works" is that the dialyzer </div><div>doesn't know about this type and it is kinda silent in such cases. Try -Wunknown option.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">пн, 17 мая 2021 г. в 23:25, Paulo Zulato <<a href="mailto:paulozulato@gmail.com" target="_blank">paulozulato@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hello,</div><div><br></div><div>I'm trying to figure out why dialyzer is complaining about a function when I don't explicitly declare its return as a proplist.<br></div><div>I have this small module which returns a proplist in the form <span style="font-family:monospace">{atom(), [atom()]}</span>:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace"><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span></span><br><span style="font-family:monospace">
</span><br><span style="font-family:monospace"><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-export</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">test</span><span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">/</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">0</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span></span><br><span style="font-family:monospace">
test() <span style="color:rgb(178,104,24);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">   </span></span><br><span style="font-family:monospace">    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">    </span></span><br><span style="font-family:monospace">        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">one_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">a</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">b</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">c</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,
</span></span><br><span style="font-family:monospace">        <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">{</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">another_test</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">[</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">d</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">e</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">,</span><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">f</span><span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]}</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span></span><br><span style="font-family:monospace">    <span style="color:rgb(178,24,178);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.</span></span><br><span style="font-family:monospace"></span></blockquote><br><div>For function above, I made the following spec, but dialyzer has complained (as stated below) when I enabled its underspecs warnings<span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(24,178,178)"></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.</span><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">-spec test() -> [{atom(), [atom()]}].</span><br><span style="font-family:monospace">% src/test.erl</span><br><span style="font-family:monospace">%    Type specification test:test() -> [{atom(),[atom()]}] is a supertype of the success typing: test:test() -> [{'another_test',['d' | 'e' | 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]</span><br><span style="font-family:monospace"></span></blockquote><div><br></div><div>Well... both lists are non-empty lists as stated by dialyzer, so I modified the spec, without success:<br></div><div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">-spec test() -> [{atom(), [atom(), ...]}, ...].<br>%src/test.erl<br>%   Type specification test:test() -> [{atom(),[atom(),...]},...] is a supertype of the success typing: test:test() -> [{'another_test',['d' | 'e' | 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]<br></span></blockquote><div><br></div><div>Then I tried to explicitly declare it as a proplist, and dialyzer has accepted it:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">-spec test() -> proplists:proplist().<br></span><div><span style="font-family:monospace">% OK, no warnings.</span></div></blockquote><div><br></div><div>As it worked, I tried to do the same as proplists module does and created two types, which I used on my new spec. And, surprisingly, dialyzer has complained about it! <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace">% From <<a href="https://erlang.org/doc/man/proplists.html" target="_blank">https://erlang.org/doc/man/proplists.html</a>><br></span></div><div><span style="font-family:monospace">-type property() :: atom() | tuple().<br>-type proplist() :: [property()]. <br></span></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace"><br>-spec test() -> proplist().<br>%src/test.erl <br></span></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span style="font-family:monospace">%   Type specification test:test() -> proplist() is a supertype of the success typing: test:test() -> [{'another_test',['d' | 'e' | 'f',...]} | {'one_test',['a' | 'b' | 'c',...]},...]</span><br></div></blockquote><br><div></div><div></div><div>Therefore, I could not understand why declaring the return as "proplists:proplist" is OK while declaring it as lists, nonempty lists or creating the same types as proplists are not OK. Why is dialyzer complaining about the other specs? Is dialyzer handling proplists in a different way? Could someone help me to understand this behaviour?<br></div><div><br></div><div><br></div><div>Best Regards,</div><div><div><div><div dir="ltr">Paulo Zulato<br><br>--<br>«Quis custodiet ipsos custodes?»</div></div></div></div></div>
</blockquote></div>
</blockquote></div>