diff options
author | Anthony Ramine <[email protected]> | 2013-06-06 01:34:25 +0200 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-08-27 16:15:21 +0200 |
commit | f846bf70b0c97ce66f29b0ff88a50316924bf34e (patch) | |
tree | c2a7efa35614f7eea475665c04505830f4dba839 /lib/stdlib/test/erl_eval_SUITE.erl | |
parent | e2c0f6dd1fc9b6bd506a481644b9c63f9d575aa1 (diff) | |
download | otp-f846bf70b0c97ce66f29b0ff88a50316924bf34e.tar.gz otp-f846bf70b0c97ce66f29b0ff88a50316924bf34e.tar.bz2 otp-f846bf70b0c97ce66f29b0ff88a50316924bf34e.zip |
Fix variable usage tracking in erl_lint
When analyzing complex expressions (i.e. comprehensions, cases, tries,
ifs and receives), erl_lint does not forget about old unused variables
when returning the updated variable table. This causes a bug where old
unused variables are not recorded as such:
t(X, Y) ->
#r{a=[ K || K <- Y ],b=[ K || K <- Y ]}.
As erl_lint uses vtmerge_pat/2 to merge the results of the analysis of
the two list comprehensions, X is marked as used and the warning is not
emitted.
The function vtmerge_pat/2 is used instead of the similar vtmerge/2
which does not mark multiple occurrences of a variable as usage to
handle cases like the following one:
t(X, Y) ->
#r{a=A=X,b=A=Y}.
Other simpler expressions like conses, tuples and external fun
references do not correctly follow this behaviour, e.g. A is not marked
as used in the following code:
t(X, Y) ->
{A=X,A=Y}.
This commit fixes both issues and makes erl_lint not return old unused
variables in updated tables and makes all compound expressions use
vtmerge_pat/2.
Reported-by: Anders Ramsell
Diffstat (limited to 'lib/stdlib/test/erl_eval_SUITE.erl')
0 files changed, 0 insertions, 0 deletions