[erlang-questions] Tricking dialyzer with an opaque type

Dániel Szoboszlay dszoboszlay@REDACTED
Wed Jun 28 14:54:27 CEST 2017


Why don't you simply run Dialyzer on a build made without your parse
transform? It could even verify the internals of f().

Daniel

On Sun, 25 Jun 2017, 18:56 Paul Guyot, <pguyot@REDACTED> wrote:

> Hello,
>
> I do have a parse transform that replaces the body of a 0-arity function
> with its result, as evaluated at compile time.
> 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.
>
> Typically, such a function would load data from a file and create a
> gb_sets:set() from this data.
>
> -spec f() -> gb_sets:set(unicode:unicode_binary()).
> f() ->
>         {ok, Content} = file:read_file(?FILENAME),
>         List0 = binary:split(Content, <<"\n">>, [global]),
>         List1 = lists:filter(fun(W) -> W =/= <<>> end, List0),
>         gb_sets:from_list(List1).
>
> With the parse_transform, dialyzer complains on usage, e.g. :
>
> [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
>
> Yet, of course, some_module.erl does not violate the opacity of
> gb_sets:set() itself.
> I can trick dialyzer with an expensive identity function:
>
>         gb_sets:add(Value, binary_to_term(term_to_binary(Var)))
>
> Any better idea?
>
> Paul
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170628/aa36fe28/attachment.htm>


More information about the erlang-questions mailing list