diff options
author | Stavros Aronis <[email protected]> | 2011-10-04 17:18:23 +0200 |
---|---|---|
committer | Stavros Aronis <[email protected]> | 2011-10-14 19:20:51 +0300 |
commit | 33f6f1376a1b2c1109997fd324e3a6072929d950 (patch) | |
tree | d4f6f99634d9ff8575ff2dca0e1661ea452fe87b /lib/dialyzer/src | |
parent | 7892a31a03505e793a96a9956f0df14c7e14efb5 (diff) | |
download | otp-33f6f1376a1b2c1109997fd324e3a6072929d950.tar.gz otp-33f6f1376a1b2c1109997fd324e3a6072929d950.tar.bz2 otp-33f6f1376a1b2c1109997fd324e3a6072929d950.zip |
Fix false warning about closure application
Whenever a variable that could hold one of two or more possible closures was
used in a particular application, the application was assumed to fail if ONE of
the closures would fail in this application. This has been corrected to infer
failing application if ALL possible closures would fail in the particular
application.
Diffstat (limited to 'lib/dialyzer/src')
-rw-r--r-- | lib/dialyzer/src/dialyzer_typesig.erl | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl index 30aec59d22..92868b6878 100644 --- a/lib/dialyzer/src/dialyzer_typesig.erl +++ b/lib/dialyzer/src/dialyzer_typesig.erl @@ -2161,13 +2161,21 @@ get_apply_constr(FunLabels, Dst, ArgTypes, #state{callgraph = CG} = State) -> case lists:member(error, MFAs) of true -> error; false -> - Constrs = [begin - State1 = state__new_constraint_context(State), - State2 = get_plt_constr(MFA, Dst, ArgTypes, State1), - state__cs(State2) - end || {ok, MFA} <- MFAs], - ApplyConstr = mk_disj_constraint_list(Constrs), - {ok, state__store_conj(ApplyConstr, State)} + Constrs0 = + [begin + State1 = state__new_constraint_context(State), + try get_plt_constr(MFA, Dst, ArgTypes, State1) of + State2 -> state__cs(State2) + catch + throw:error -> error + end + end || {ok, MFA} <- MFAs], + case [C || C <- Constrs0, C =/= error] of + [] -> throw(error); + Constrs -> + ApplyConstr = mk_disj_constraint_list(Constrs), + {ok, state__store_conj(ApplyConstr, State)} + end end. state__scc(#state{scc = SCC}) -> |