diff options
author | Hans Bolinder <[email protected]> | 2014-11-25 09:06:13 +0100 |
---|---|---|
committer | Hans Bolinder <[email protected]> | 2014-11-25 09:06:13 +0100 |
commit | b0a48f37a5c04d158369cc69d5a8afafd67663cd (patch) | |
tree | 391bb3c30bc396a927f56418f9fd9a5dfe3272c1 /lib/stdlib/src | |
parent | b36de499775d6dfcdb61ce1df079911a4ed3f2d5 (diff) | |
parent | 872fa86ddebbc84b07dc5426d25f7fb300731f52 (diff) | |
download | otp-b0a48f37a5c04d158369cc69d5a8afafd67663cd.tar.gz otp-b0a48f37a5c04d158369cc69d5a8afafd67663cd.tar.bz2 otp-b0a48f37a5c04d158369cc69d5a8afafd67663cd.zip |
Merge branch 'maint'
* maint:
dialyzer: correct record updates
Diffstat (limited to 'lib/stdlib/src')
-rw-r--r-- | lib/stdlib/src/erl_expand_records.erl | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/stdlib/src/erl_expand_records.erl b/lib/stdlib/src/erl_expand_records.erl index c74f68647f..64a00acd88 100644 --- a/lib/stdlib/src/erl_expand_records.erl +++ b/lib/stdlib/src/erl_expand_records.erl @@ -702,9 +702,10 @@ record_update(R, Name, Fs, Us0, St0) -> record_match(R, Name, Lr, Fs, Us, St0) -> {Ps,News,St1} = record_upd_fs(Fs, Us, St0), NLr = neg_line(Lr), + RLine = record_offset(Lr, St1), {{'case',Lr,R, - [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name} | Ps]}],[], - [{tuple,Lr,[{atom,Lr,Name} | News]}]}, + [{clause,Lr,[{tuple,RLine,[{atom,Lr,Name} | Ps]}],[], + [{tuple,RLine,[{atom,Lr,Name} | News]}]}, {clause,NLr,[{var,NLr,'_'}],[], [call_error(NLr, {tuple,NLr,[{atom,NLr,badrecord},{atom,NLr,Name}]})]} ]}, @@ -733,6 +734,10 @@ record_setel(R, Name, Fs, Us0) -> Lr = element(2, hd(Us)), Wildcards = duplicate(length(Fs), {var,Lr,'_'}), NLr = neg_line(Lr), + %% Note: calling record_offset() here is not necessary since it is + %% targeted at Dialyzer which always calls the compiler with + %% 'strict_record_updates' meaning that record_setel() will never + %% be called. {'case',Lr,R, [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name} | Wildcards]}],[], [foldr(fun ({I,Lf,Val}, Acc) -> |