From 985f5a1fae38caed84cde8bc09f6f60e91710f20 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Wed, 15 Nov 2017 12:57:57 +0100
Subject: dialyzer: Extend the map implementation's handling of ?unit

The Maps implementation handles ?unit in more cases.

Exactly when t_is_none_or_unit() is to be called is not clear to me.
The added cases are about a map type being ?unit, but the key or the
value of an association can also be ?unit, but that is not always
checked.
---
 lib/hipe/cerl/erl_types.erl | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'lib/hipe')

diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index abb6c259f6..4e0f93212d 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -1877,6 +1877,7 @@ t_map_put(KV, Map, Opaques) ->
 
 %% Key and Value are *not* unopaqued, but the map is
 map_put(_, ?none, _) -> ?none;
+map_put(_, ?unit, _) -> ?none;
 map_put({Key, Value}, ?map(Pairs,DefK,DefV), Opaques) ->
   case t_is_none_or_unit(Key) orelse t_is_none_or_unit(Value) of
     true -> ?none;
@@ -1902,6 +1903,7 @@ t_map_update(KV, Map) ->
 -spec t_map_update({erl_type(), erl_type()}, erl_type(), opaques()) -> erl_type().
 
 t_map_update(_, ?none, _) -> ?none;
+t_map_update(_, ?unit, _) -> ?none;
 t_map_update(KV={Key, _}, M, Opaques) ->
   case t_is_subtype(t_atom('true'), t_map_is_key(Key, M, Opaques)) of
     false -> ?none;
@@ -1922,6 +1924,7 @@ t_map_get(Key, Map, Opaques) ->
 	    end).
 
 map_get(_, ?none) -> ?none;
+map_get(_, ?unit) -> ?none;
 map_get(Key, ?map(Pairs, DefK, DefV)) ->
   DefRes =
     case t_do_overlap(DefK, Key) of
@@ -1957,6 +1960,7 @@ t_map_is_key(Key, Map, Opaques) ->
 	    end).
 
 map_is_key(_, ?none) -> ?none;
+map_is_key(_, ?unit) -> ?none;
 map_is_key(Key, ?map(Pairs, DefK, _DefV)) ->
   case is_singleton_type(Key) of
     true ->
-- 
cgit v1.2.3