From d57dea02cc2196ff6160471d06297413af5e20f2 Mon Sep 17 00:00:00 2001 From: Hans Bolinder Date: Fri, 21 Aug 2015 11:54:30 +0200 Subject: hipe/dialyzer: Fix a bug concerning opaque types and keydelete/3 Thanks to ILYA Khlopotov for pointing the bug out. --- lib/dialyzer/test/small_SUITE_data/src/keydel.erl | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lib/dialyzer/test/small_SUITE_data/src/keydel.erl (limited to 'lib/dialyzer/test/small_SUITE_data/src/keydel.erl') diff --git a/lib/dialyzer/test/small_SUITE_data/src/keydel.erl b/lib/dialyzer/test/small_SUITE_data/src/keydel.erl new file mode 100644 index 0000000000..18a5c0670c --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/src/keydel.erl @@ -0,0 +1,29 @@ +-module(keydel). + +-export([store/3]). + +-record(att, {f}). + +-type attachment() :: list(). + +-opaque att() :: #att{} | attachment(). + +-spec store(atom(), any(), att()) -> att(). +store(Field, undefined, Att) when is_list(Att) -> + lists:keydelete(Field, 1, Att); +store(Field, Value, Att) when is_list(Att) -> + lists:keystore(Field, 1, Att, {Field, Value}); +store(Field, Value, Att) -> + store(Field, Value, upgrade(Att)). + + +-spec upgrade(#att{}) -> attachment(). +upgrade(#att{} = Att) -> + Map = lists:zip( + record_info(fields, att), + lists:seq(2, record_info(size, att)) + ), + %% Don't store undefined elements since that is default + [{F, element(I, Att)} || {F, I} <- Map, element(I, Att) /= undefined]; +upgrade(Att) -> + Att. -- cgit v1.2.3