diff options
author | Hans Bolinder <[email protected]> | 2015-08-24 08:28:42 +0200 |
---|---|---|
committer | Hans Bolinder <[email protected]> | 2015-08-24 08:28:42 +0200 |
commit | f81065c4296c679bfdd023e988289b4d884cfdd2 (patch) | |
tree | e846ea7a1349677457a28f7bbde297b46e3f063a /lib/dialyzer/test/small_SUITE_data/src/keydel.erl | |
parent | 378f70052f13ae607eebd5aebd7e978dc48a4c53 (diff) | |
parent | e409bd71d9aec56dec9f111966d1ca99d2537c41 (diff) | |
download | otp-f81065c4296c679bfdd023e988289b4d884cfdd2.tar.gz otp-f81065c4296c679bfdd023e988289b4d884cfdd2.tar.bz2 otp-f81065c4296c679bfdd023e988289b4d884cfdd2.zip |
Merge branch 'maint'
* maint:
hipe/dialyzer: Fix a bug concerning opaque types and keydelete/3
Diffstat (limited to 'lib/dialyzer/test/small_SUITE_data/src/keydel.erl')
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/src/keydel.erl | 29 |
1 files changed, 29 insertions, 0 deletions
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. |