<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style id="owaParaStyle" type="text/css">P {margin-top:0;margin-bottom:0;}</style>
</head>
<body ocsi="0" fpstyle="1" bgcolor="#ffffff">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Hi,<br>
<br>
> Using Erlang 17.0, I get Dialyzer errors like the following:<br>
> {function_clause,[{erl_types,t_contains_opaque,<br>
>                              [{c,remote,[{remote,ssl,sslsocket,[]}],unknown}, ...}<br>
<br>
Thanks for reporting this.<br>
<br>
It seems to an old bug with a new symptom since 17.0.<br>
<br>
Best regards,<br>
<br>
Hans Bolinder, Erlang/OTP team, Ericsson<br>
<br>
A diff against 66e9c3d:<br>
<br>
diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl<br>
index 6065b79..06c0d10 100644<br>
--- a/lib/hipe/cerl/erl_types.erl<br>
+++ b/lib/hipe/cerl/erl_types.erl<br>
@@ -209,6 +209,7 @@<br>
      type_is_defined/4,<br>
      record_field_diffs_to_string/2,<br>
      subst_all_vars_to_any/1,<br>
+         subst_all_remote/2,<br>
      lift_list_to_pos_empty/1,<br>
          is_opaque_type/2,<br>
      is_erl_type/1,<br>
@@ -3161,6 +3162,18 @@ t_subst_aux(?union(List), VarMap) -><br>
 t_subst_aux(T, _VarMap) -><br>
   T.<br>
           <br>
+-spec subst_all_remote(erl_type(), erl_type()) -> erl_type().<br>
+<br>
+subst_all_remote(Type0, Substitute) -><br>
+  Map =<br>
+    fun(Type) -><br>
+        case erl_types:t_is_remote(Type) of<br>
+          true -> Substitute;<br>
+          false -> Type<br>
+        end<br>
+    end,<br>
+  erl_types:t_map(Map, Type0).<br>
+<br>
 %%-----------------------------------------------------------------------------<br>
 %% Unification<br>
 %%<br>
@@ -4474,7 +4487,7 @@ get_mod_record([{FieldName, DeclType}|Left1],<br>
            [{FieldName, ModType}|Left2], Acc) -><br>
   ModTypeNoVars = subst_all_vars_to_any(ModType),<br>
   case<br>
-    t_is_remote(ModTypeNoVars) orelse t_is_subtype(ModTypeNoVars, DeclType)<br>
+    contains_remote(ModTypeNoVars) orelse t_is_subtype(ModTypeNoVars, DeclType)<br>
   of<br>
     false -> {error, FieldName};<br>
     true -> get_mod_record(Left1, Left2, [{FieldName, ModType}|Acc])<br>
@@ -4488,6 +4501,10 @@ get_mod_record(DeclFields, [], Acc) -><br>
 get_mod_record(_, [{FieldName2, _ModType}|_], _Acc) -><br>
   {error, FieldName2}.<br>
 <br>
+contains_remote(Type) -><br>
+  TypeNoRemote = subst_all_remote(Type, t_none()),<br>
+  not t_is_equal(Type, TypeNoRemote).<br>
+<br>
 fields_from_form([], _TypeNames, _RecDict, _VarDict) -><br>
   {[], []};<br>
 fields_from_form([{Name, Type}|Tail], TypeNames, RecDict,<br>
<br>
</div>
</body>
</html>