diff options
author | Hans Bolinder <[email protected]> | 2015-08-18 14:54:29 +0200 |
---|---|---|
committer | Hans Bolinder <[email protected]> | 2015-08-19 09:24:42 +0200 |
commit | 050d93682e07e0c50667dbfb1468389078b776f2 (patch) | |
tree | ce3b83a54a09a44b886ea157768668ab54d79105 /lib/dialyzer/test | |
parent | 0b29b85757d186a5cc94aaa1761e812c95fec2d0 (diff) | |
download | otp-050d93682e07e0c50667dbfb1468389078b776f2.tar.gz otp-050d93682e07e0c50667dbfb1468389078b776f2.tar.bz2 otp-050d93682e07e0c50667dbfb1468389078b776f2.zip |
dialyzer: Fix a bug concerning parameterized opaque types
The example is provided by James Fish in
http://erlang.org/pipermail/erlang-questions/2014-December/082204.html.
Note that warnings with text such as "the _ variable breaks
opaqueness" are still possible.
Diffstat (limited to 'lib/dialyzer/test')
-rw-r--r-- | lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue.erl | 17 | ||||
-rw-r--r-- | lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue_params.erl | 15 |
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue.erl b/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue.erl new file mode 100644 index 0000000000..0f76680464 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue.erl @@ -0,0 +1,17 @@ +-module(myqueue). + +-export([new/0, in/2]). + +-record(myqueue, {queue = queue:new() :: queue:queue({integer(), _})}). + +-opaque myqueue(Item) :: #myqueue{queue :: queue:queue({integer(), Item})}. + +-export_type([myqueue/1]). + +-spec new() -> myqueue(_). +new() -> + #myqueue{queue=queue:new()}. + +-spec in(Item, myqueue(Item)) -> myqueue(Item). +in(Item, #myqueue{queue=Q}) -> + #myqueue{queue=queue:in({1, Item}, Q)}. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue_params.erl b/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue_params.erl new file mode 100644 index 0000000000..8d766b7804 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/para/myqueue_params.erl @@ -0,0 +1,15 @@ +-module(myqueue_params). + +-export([new/0, in/2]). + +-record(myqueue_params, {myqueue = myqueue:new() :: myqueue:myqueue(integer())}). + +-type myqueue_params() :: #myqueue_params{myqueue :: + myqueue:myqueue(integer())}. +-spec new() -> myqueue_params(). +new() -> + #myqueue_params{myqueue=myqueue:new()}. + +-spec in(integer(), myqueue_params()) -> myqueue_params(). +in(Item, #myqueue_params{myqueue=Q} = P) when is_integer(Item) -> + P#myqueue_params{myqueue=myqueue:in(Item, Q)}. |