aboutsummaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorAnthony Ramine <[email protected]>2013-06-06 01:34:25 +0200
committerFredrik Gustafsson <[email protected]>2013-08-27 16:15:21 +0200
commitf846bf70b0c97ce66f29b0ff88a50316924bf34e (patch)
treec2a7efa35614f7eea475665c04505830f4dba839 /system
parente2c0f6dd1fc9b6bd506a481644b9c63f9d575aa1 (diff)
downloadotp-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 'system')
0 files changed, 0 insertions, 0 deletions