<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Dániel,<div class=""><br class=""></div><div class="">Thank you for your reply. Indeed, the drawback of my approach is that the internals of f() are not checked, although this could be done by keeping (and exporting) the function under another name.</div><div class="">dialyzer is ran as part of the integration process and the code is only meant to be executed at compile time.</div><div class=""><br class=""></div><div class="">Paul</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 28 Jun 2017, at 14:54, Dániel Szoboszlay <<a href="mailto:dszoboszlay@gmail.com" class="">dszoboszlay@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><p dir="ltr" class="">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" class="">Daniel</p>
<br class=""><div class="gmail_quote"><div dir="ltr" class="">On Sun, 25 Jun 2017, 18:56 Paul Guyot, <<a href="mailto:pguyot@kallisys.net" class="">pguyot@kallisys.net</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br class="">
<br class="">
I do have a parse transform that replaces the body of a 0-arity function with its result, as evaluated at compile time.<br class="">
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 class="">
<br class="">
Typically, such a function would load data from a file and create a gb_sets:set() from this data.<br class="">
<br class="">
-spec f() -> gb_sets:set(unicode:unicode_binary()).<br class="">
f() -><br class="">
        {ok, Content} = file:read_file(?FILENAME),<br class="">
        List0 = binary:split(Content, <<"\n">>, [global]),<br class="">
        List1 = lists:filter(fun(W) -> W =/= <<>> end, List0),<br class="">
        gb_sets:from_list(List1).<br class="">
<br class="">
With the parse_transform, dialyzer complains on usage, e.g. :<br class="">
<br class="">
[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 class="">
<br class="">
Yet, of course, some_module.erl does not violate the opacity of gb_sets:set() itself.<br class="">
I can trick dialyzer with an expensive identity function:<br class="">
<br class="">
        gb_sets:add(Value, binary_to_term(term_to_binary(Var)))<br class="">
<br class="">
Any better idea?<br class="">
<br class="">
Paul<br class="">
_______________________________________________<br class="">
erlang-questions mailing list<br class="">
<a href="mailto:erlang-questions@erlang.org" target="_blank" class="">erlang-questions@erlang.org</a><br class="">
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank" class="">http://erlang.org/mailman/listinfo/erlang-questions</a><br class="">
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>