<p dir="ltr">Why don't you simply run Dialyzer on a build made without your parse transform? It could even verify the internals of f().</p>
<p dir="ltr">Daniel</p>
<br><div class="gmail_quote"><div dir="ltr">On Sun, 25 Jun 2017, 18:56 Paul Guyot, <<a href="mailto:pguyot@kallisys.net">pguyot@kallisys.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I do have a parse transform that replaces the body of a 0-arity function with its result, as evaluated at compile time.<br>
I am looking for a way to avoid an opaque violation warning from dialyzer when this function returns, say, a gb_sets:set(). The spec is properly copied into the parsed tree, but dialyzer just ignores it.<br>
<br>
Typically, such a function would load data from a file and create a gb_sets:set() from this data.<br>
<br>
-spec f() -> gb_sets:set(unicode:unicode_binary()).<br>
f() -><br>
        {ok, Content} = file:read_file(?FILENAME),<br>
        List0 = binary:split(Content, <<"\n">>, [global]),<br>
        List1 = lists:filter(fun(W) -> W =/= <<>> end, List0),<br>
        gb_sets:from_list(List1).<br>
<br>
With the parse_transform, dialyzer complains on usage, e.g. :<br>
<br>
[warning] some_module.erl:123 the call gb_sets:add(<VALUE>,Var::{1..1114111,{_,_,_}}) does not have an opaque term of type gb_sets:set(_) as 2nd argument<br>
<br>
Yet, of course, some_module.erl does not violate the opacity of gb_sets:set() itself.<br>
I can trick dialyzer with an expensive identity function:<br>
<br>
        gb_sets:add(Value, binary_to_term(term_to_binary(Var)))<br>
<br>
Any better idea?<br>
<br>
Paul<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div>