Age | Commit message (Collapse) | Author |
|
It is allowed in Erlang/OTP 17 to redefine the map() types. However,
Dialyzer did not handle local map() types correctly.
|
|
Also fixed some cases where Dialyzer could crash due to reaching
system limits.
|
|
This ticket is about records in Erlang code, and when to check the
fields against the (optional) types given when defining records.
Dialyzer operates on the Erlang Core format, where there are no trace
of records. The fix implemented is a Real Hack:
Given the new option 'dialyzer' erl_expand_records marks the line
number of records in a way that is undone by v3_core, which in turn
inserts annotations that can be recognized by Dialyzer.
|
|
|
|
When checking typed record fields Dialyzer failed to handle
types containing remote types.
Thanks to Erik Søe Sørensen for reporting this bug.
|
|
Dialyzer sometimes output warnings like
Attempt to test for inequality between a term of type 'false' and a
term of opaque type 'false' | gb_set()
The reason was that erl_types:t_inf/3 when called from
erl_types:t_find_unknown_opaque() did not return 'false' but found the
mismatch. It should not return the mismatch unless the intersection is
empty ('none').
Thanks to Shayan Pooya [[email protected]] for pointing out the bug.
|
|
Namely, extend the HiPE tagging scheme info, properly handle the translation
of the (is_)map type test to Icode and RTL and support handling of the map()
type in the type system.
While at it, also performed some clean up of things that needed small fixes.
|
|
* aronisstav/hipe/opaque_fix:
Don't 'opaque-decorate' a success typing using an incompatible spec
|
|
Without this patch Dialyzer crashes when analyzing the supplemented test case.
|
|
Remove debug printouts.
|
|
|
|
|
|
|
|
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.
|
|
Handle immediate opaque types as aliases:
A declaration of dict/0
-opaque dict() :: dict(_, _).
-opaque dict(Key, Value) :: ...
is handled as an alias, that is, when using dict() it is immediately
replaced by dict(_, _).
This is a means to avoid having to handle equivalent opaque types
later. To be changed if it doesn't work well.
|
|
This should fix a problem with variables in parameterized types.
In particular it concerns parameterized opaque types and records.
|
|
|
|
|
|
It is now OK to inspect and modify the internals of opaque types within
the scope of the module.
The contracts are used for decorating types with opaqueness when it is
harmless to do so. The opaqueness is propagated by the typesig module
and also by the dataflow module.
A lot of details have been fixed or updated. In particular the modules
erl_types and erl_bif_types have been modified extensively.
The version in vsn.mk has been updated to 2.7. The reason is a
modification of #opaque{} in erl_types.
Dialyzer seems to be about five percent slower than it used to be.
|
|
Hans Bolider reported a dialyzer crash when using a remote type in
the tail position of a maybe_improper_list() declaration. A test
was created (by extending an existing module of the testsuite)
and erl_types was modified to expand the remote type and not pass
it unexpanded to subsequent phases in the processing.
|
|
* sa/dialyzer-types-arity/OTP-10861:
Minor refactoring
Update Dialyzer's documentation
Support for types with the same name and different arity
|
|
|
|
|
|
|
|
The code related to the introduction of unicode_string() and
unicode_char() has been removed. The types char() and string() have
been extended to include Unicode characters.
In fact char() was changed some time ago; this commit is about
cleaning up the documentation and introduce better names for some
functions.
|
|
Dialyzer now understands the "fun(...)" syntax in type specs.
|
|
Before patch Dialyzer was reporting all the fields that were not subtypes
of the declared ones as incorrect. The correct violations are for the fields
whose intersection with the declared ones is empty.
|
|
Originally reported by Joseph Wayne Norton, simplified testcase provided by Hans
Bolinder.
|
|
|
|
The clauses handling opaque types haven't been fixed here.
|
|
When "collapsing" heads of list elements from a list's tail into the list's
head the new head can be different.
|
|
|
|
|
|
|
|
Using a list rather than a dict() for unified variables saves quite
some time. In particular Dialyzer is a heavy user of t_unify().
|
|
Variable substitution was not generalizing any unknown variables.
|
|
* sa/dialyzer-bug-fixes:
Fix typer's crash for nonexisting files
Remove unused macro
Decrease tuple arity limit
Fix bug in dataflow
OTP-9597
|
|
|
|
This fixes a memory related crash.
|
|
Atoms in some occurrences were not correctly quoted when formatted to
strings, for instance by the typer program. Example:
-module(tb).
-export(['UPPERCASE-FUNCTION-NAME'/0, f1/0, f2/0, f3/0]).
-record('UPPERCASE-RECORD-NAME', {x}).
-record(r2, {'UPPERCASE-FIELD-NAME'}).
-type 'UPPERCASE-TYPE-NAME'() :: integer().
'UPPERCASE-FUNCTION-NAME'() -> ok.
f1() -> #'UPPERCASE-RECORD-NAME'{x=1}.
f2() -> #r2{'UPPERCASE-FIELD-NAME'=1}.
-spec f3() -> 'UPPERCASE-TYPE-NAME'().
f3() -> 1.
Given the program above, the output from typer --plt some.plt tb.erl
resulted in the following specs being printed:
-spec UPPERCASE-FUNCTION-NAME() -> 'ok'.
-spec f1() -> #UPPERCASE-RECORD-NAME{x::1}.
-spec f2() -> #r2{UPPERCASE-FIELD-NAME::1}.
-spec f3() -> UPPERCASE-TYPE-NAME().
This commit changes the output to become the following:
-spec 'UPPERCASE-FUNCTION-NAME'() -> 'ok'.
-spec f1() -> #'UPPERCASE-RECORD-NAME'{x::1}.
-spec f2() -> #r2{'UPPERCASE-FIELD-NAME'::1}.
-spec f3() -> 'UPPERCASE-TYPE-NAME'().
|
|
|
|
|
|
|
|
Same functionality provided by string:join/2.
|
|
|
|
The introduction of filenames being unicode binaries revealed a problem
in the type analysis of the native code compiler which resulted in an
infinite loop when compiling the 'filename' module.
In addition, the hard-coded type information for the built-in functions
of the 're' module was out-of-date, which resulted in erroneous type
information for 'filelib' functions being stored in the PLT.
|
|
- Fixed pretty rare crash when taking the infimum of two tuple_sets
(initial fix by Kostis Sagonas but then a better fix was provided
by Stavros Aronis and this is the one adopted).
- Fixed pretty rare crash when using parameterized types containing unbound
variables (thanks to Nicolas Trangez for reporting it).
- Fixed pretty rare infinite loop when refining the types of an SCC whose
functions all returned none() (thanks to Stavros Aronis).
|
|
The change of taking out some hard-coded information about the file module
uncovered that the unfolding of recursive types was probably too shallow.
This has been fixed by unfolding it until a deeper limit (REC_TYPE_LIMIT).
While at erl_types.erl also did some cleanup changes and fixed an erroneous
io:format message.
|
|
Changes which fix some problems reported by dialyzer users:
1. The handling of nested opaque types
2. The handling of remote types in record expressions used as types
While at it, updated dialyzer's RELEASE_NOTES to reflect these fixes
and did some cleanups to dialyzer_utils.erl so that it gets in sync
with dialyzer's main development branch.
|
|
Bumped version number and wrote RELEASE_NOTES.
Included all changes described in release notes.
Some spec-related changes to some files in lib/hipe/cerl.
|