Age | Commit message (Collapse) | Author |
|
The types array(), dict(), digraph(), gb_set(), gb_tree(), queue(),
set(), and tid() have been deprecated. They will be removed in OTP 18.0.
Instead the types array:array(), dict:dict(), digraph:graph(),
gb_set:set(), gb_tree:tree(), queue:queue(), sets:set(), and ets:tid()
can be used. (Note: it has always been necessary to use ets:tid().)
It is allowed in OTP 17.0 to locally re-define the types array(), dict(),
and so on.
New types array:array/1, dict:dict/2, gb_sets:set/1, gb_trees:tree/2,
queue:queue/1, and sets:set/1 have been added.
|
|
* josevalim/suppress-all-auto-imports:
Allow all auto imports to be suppressed at once
OTP-11682
|
|
|
|
In the current iteration of Maps we should deny *any* variables in
Map keys.
|
|
Update erlang lint and syntax expand for #{ K := V }
|
|
|
|
Reported-by: Michele Miron
|
|
This adds optional names to fun expressions. A named fun expression
is parsed as a tuple `{named_fun,Loc,Name,Clauses}` in erl_parse.
If a fun expression has a name, it must be present and be the same in
every of its clauses. The function name shadows the environment of the
expression shadowing the environment and it is shadowed by the
environment of the clauses' arguments. An unused function name triggers
a warning unless it is prefixed by _, just as every variable.
Variable _ is allowed as a function name.
It is not an error to put a named function in a record field default
value.
When transforming to Core Erlang, the named fun Fun is changed into
the following expression:
letrec 'Fun'/Arity =
fun (Args) ->
let <Fun> = 'Fun'/Arity
in Case
in 'Fun'/Arity
where Args is the list of arguments of 'Fun'/Arity and Case the
Core Erlang expression corresponding to the clauses of Fun.
This transformation allows us to entirely skip any k_var to k_local
transformation in the fun's clauses bodies.
|
|
This patch introduces the no_auto_import attribute:
-compile(no_auto_import).
Useful for code generation tools that always use the
qualified function names and want to avoid the auto
imported functions clashing with local ones.
Implementation wise, we chose to have a special flag
'all' to avoid doing many set lookups when checking for
suppression.
|
|
Conflicts:
bootstrap/lib/stdlib/ebin/erl_lint.beam
|
|
When reporting a field redefinition in a record, erl_lint can forget
about some old unused variables.
f() -> X = 1, #r{a=foo,a=bar,a=qux}.
|
|
Variables used in the body of a try expression were marked as unsafe
*and* used, which makes no sense as an unsafe variable can't be used.
Function vtsubtract/2 is used to forget usage of such unsafe variables.
Reported-by: Paul Davis
|
|
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
|
|
* maint:
Fix a bug in the linter regarding the 'fun M:F/A' construct
|
|
If the fun M:F/A construct was used erroneously the linter could
crash.
Thanks to Mikhail Sobolev for reporting the bug.
|
|
It makes no sense to be able to do `<<...,Rest/binary>> <= ...` in a
comprehension. The related Dialyzer test is removed.
|
|
|
|
The default_types() in erl_lint returned a dictionary
with all default types. However, calculating this dict
was expensive and we actually didn't use the default
values in this dictionary.
This patch replaces the dictionary use for one function
that checks if the type is a default type or not,
and remove the bits that checked explicitly for those
default types when iterating the dictionary.
|
|
The modifier 'l' can be used for turning off the string recognition of
~p and ~P.
|
|
|
|
|
|
There are currently no keywords reserved for the future.
|
|
All guards BIFs are auto-imported. That can be verified like this:
[] = [{F,A} || {erlang,F,A} <- erlang:system_info(snifs),
erl_internal:guard_bif(F, A),
not erl_internal:bif(F, A)]
Therefore, calling a guard BIF in a guard without a module name
is always allowed (provided that there is not a local function or
an import with the same name), and therefore we can remove the
error reporting code. But keep an assertion so that we will find
out if any non-auto-imported guard BIFs are added in the future.
|
|
* bjorn/remove-tuple-funs/OTP-10170:
erl_lint: Removes vestiges of tuple fun support
|
|
* bjorn/remove-packages/OTP-10348:
erl_lint: Remove vestiges of package support
shell: Remove vestiges of package support
|
|
|
|
1c1649481025236cad29a7ee3cbd8f552757b2b6 dropped support for
packages in erl_lint, but did not remove the error message
for {bad_module_name,M}.
|
|
The warnings for deprecated tuple funs were removed in
de7e01c958ff7c9e6da4034a53567a30a4ae5792.
|
|
|
|
* lh/forget-mnemosyne/OTP-10729:
Remove what remains of the Mnemosyne code
Remove support for the query keyword and query expressions
|
|
|
|
|
|
|
|
Expect modifications, additions and corrections.
There is a kludge in file_io_server and
erl_scan:continuation_location() that's not so pleasing.
|
|
|
|
|
|
Tuple funs were deprecated in R15B (in commit a4029940e309518f5500).
|
|
The run-time warning for use of tuple funs will not catch the use
of literal tuple funs, such as:
if
{erlang,'+'}(3,X) =:= 0 -> true;
true -> false
end.
Therefore, add a compile-time warning to give users some warning
before they stop working in R16.
|
|
|
|
|
|
Attempting to call is_record/3 (without an erlang: prefix) from a
guard if there was a local function named is_record/3 would cause
a compiler crash. For consistency with other guard tests, disallow
the call.
is_record/2 in a guard will still be allowed (and work correctly)
even if there is a local is_record/2. It could be argued that
is_record/2 should be handled in the same way as is_record/3,
but changing that now could break working code.
|
|
If a guard test (such as is_list/1) has a local definition in a
module (or is imported), erl_lint will reject a call to it from
a guard if the call is not at the top-level:
foo(L) when is_list(L) =:= true -> %% Will be rejected.
ok.
is_list(_) -> ok.
But if the call is at the top-level, it will be accepted (and
cause a crash in a later compiler pass):
foo(L) when is_list(L) -> %% Will be accepted by erl_lint
ok.
is_list(_) -> ok.
This inconsistency was an oversight introduced when it became
possible to override BIFs with local definitions.
|
|
When a new built-in type is introduced, type definitions with the
same name will still be allowed for "a while".
|
|
Currently, the external fun syntax "fun M:F/A" only supports
literals. That is, "fun lists:reverse/1" is allowed but not
"fun M:F/A".
In many real-life situations, some or all of M, F, A are
not known until run-time, and one is forced to either use
the undocumented erlang:make_fun/3 BIF or to use a
"tuple fun" (which is deprecated).
EEP-23 suggests that the parser (erl_parse) should immediately
transform "fun M:F/A" to "erlang:make_fun(M, F, A)". We have
not followed that approach in this implementation, because we
want the abstract code to mirror the source code as closely
as possible, and we also consider erlang:make_fun/3 to
be an implementation detail that we might want to remove in
the future.
Instead, we will change the abstract format for "fun M:F/A" (in a way
that is not backwards compatible), and while we are at it, we will
move the translation from "fun M:F/A" to "erlang:make_fun(M, F, A)"
from sys_pre_expand down to the v3_core pass. We will also update
the debugger and xref to use the new format.
We did consider making the abstract format backward compatible if
no variables were used in the fun, but decided against it. Keeping
it backward compatible would mean that there would be different
abstract formats for the no-variable and variable case, and tools
would have to handle both formats, probably forever.
Reference: http://www.erlang.org/eeps/eep-0023.html
|
|
'behaviour_info(callbacks)' is a special function that is defined in a module
which describes a behaviour and returns a list of its callbacks.
This function is now automatically generated using the '-callback' specs. An
error is returned by lint if user defines both '-callback' attributes and the
behaviour_info/1 function. If no type info is needed for a callback use a
generic spec for it.
|
|
Behaviours may define specs for their callbacks using the familiar spec syntax,
replacing the '-spec' keyword with '-callback'. Simple lint checks are performed
to ensure that no callbacks are defined twice and all types referred are
declared.
These attributes can be then used by tools to provide documentation to the
behaviour or find discrepancies in the callback definitions in the callback
module.
|
|
|
|
|
|
In the following program, erl_lint crashed with an erl_lint internal error.
With this patch it does not, but prints "bad export_type declaration" errors
instead.
-module(baz).
-export([test/0]).
-export_type(t/0).
-export_type([3.14]).
-type t() :: any().
test() -> 42.
|
|
* pan/otp_8683_compiler_warnings:
Remove (harmless) warning regarding auto-imported BIF max/2
Update primary bootstrap
Correct warnings and errors for auto-imported bif clashes
Conflicts:
bootstrap/lib/stdlib/ebin/erl_lint.beam
|