aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2012-12-21 11:09:31 +0100
committerBjörn Gustavsson <[email protected]>2013-01-22 19:20:13 +0100
commit3f8be66021a5b3ce764181a2f9685ed7bfc81607 (patch)
treeb92b417fa632fc87dace0a572b38de9c3f42fd12 /lib
parent53210f62a94126b643666886dfbefb8bae9e86a2 (diff)
downloadotp-3f8be66021a5b3ce764181a2f9685ed7bfc81607.tar.gz
otp-3f8be66021a5b3ce764181a2f9685ed7bfc81607.tar.bz2
otp-3f8be66021a5b3ce764181a2f9685ed7bfc81607.zip
Enumeration decoding: Don't emit a default clause if it cannot match
Dialyzer will warn for default clauses that cannot possible match.
Diffstat (limited to 'lib')
-rw-r--r--lib/asn1/src/asn1ct_imm.erl22
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/asn1/src/asn1ct_imm.erl b/lib/asn1/src/asn1ct_imm.erl
index 7eb807aa5e..d0459ae60b 100644
--- a/lib/asn1/src/asn1ct_imm.erl
+++ b/lib/asn1/src/asn1ct_imm.erl
@@ -60,9 +60,17 @@ per_dec_boolean() ->
{map,{get_bits,1,[1]},[{0,false},{1,true}]}.
per_dec_enumerated(NamedList0, Aligned) ->
- Constraint = [{'ValueRange',{0,length(NamedList0)-1}}],
- NamedList = per_dec_enumerated_fix_list(NamedList0, [enum_error], 0),
+ Ub = length(NamedList0) - 1,
+ Constraint = [{'ValueRange',{0,Ub}}],
Int = per_dec_integer(Constraint, Aligned),
+ EnumTail = case matched_range(Int) of
+ {0,Ub} ->
+ %% The error case can never happen.
+ [];
+ _ ->
+ [enum_error]
+ end,
+ NamedList = per_dec_enumerated_fix_list(NamedList0, EnumTail, 0),
{map,Int,NamedList}.
per_dec_enumerated(BaseNamedList, NamedListExt0, Aligned) ->
@@ -241,6 +249,16 @@ per_num_bits(N) when N =< 64 -> 6;
per_num_bits(N) when N =< 128 -> 7;
per_num_bits(N) when N =< 255 -> 8.
+matched_range({get_bits,Bits0,[U|Flags]}) when is_integer(U) ->
+ case lists:member(signed, Flags) of
+ false ->
+ Bits = U*Bits0,
+ {0,(1 bsl Bits) - 1};
+ true ->
+ unknown
+ end;
+matched_range(_Op) -> unknown.
+
%%%
%%% Remove unnecessary aligning to octet boundaries.
%%%