Age | Commit message (Collapse) | Author |
|
Background
-----------
In record fields with a type declaration but without an initializer, the
Erlang parser inserted automatically the singleton type 'undefined' to
the list of declared types, if that value was not present there.
I.e. the record declaration:
-record(rec, {f1 :: float(),
f2 = 42 :: integer(),
f3 :: some_mod:some_typ()}).
was translated by the parser to:
-record(rec, {f1 :: float() | 'undefined',
f2 = 42 :: integer(),
f3 :: some_mod:some_typ() | 'undefined'}).
The rationale for this was that creation of a "dummy" #rec{} record
should not result in a warning from dialyzer that e.g. the implicit
initialization of the #rec.f1 field violates its type declaration.
Problems
---------
This seemingly innocent action has some unforeseen consequences.
For starters, there is no way for programmers to declare that e.g. only
floats make sense for the f1 field of #rec{} records when there is no
`obvious' default initializer for this field. (This also affects tools
like PropEr that use these declarations produced by the Erlang parser to
generate random instances of records for testing purposes.)
It also means that dialyzer does not warn if e.g. an is_atom/1 test or
something more exotic like an atom_to_list/1 call is performed on the
value of the f1 field.
Similarly, there is no way to extend dialyzer to warn if it finds record
constructions where f1 is not initialized to some float.
Last but not least, it is semantically problematic when the type of the
field is an opaque type: creating a union of an opaque and a structured
type is very problematic for analysis because it fundamentally breaks
the opacity of the term at that point.
Change
-------
To solve these problems the parser will not automatically insert the
'undefined' value anymore; instead the user has the option to choose the
places where this value makes sense (for the field) and where it does
not and insert the | 'undefined' there manually.
Consequences of this change
----------------------------
This change means that dialyzer will issue a warning for all places
where records with uninitialized fields are created and those fields have
a declared type that is incompatible with 'undefined' (e.g. float()).
This warning can be suppressed easily by adding | 'undefined' to the
type of this field. This also adds documentation that the user really
intends to create records where this field is uninitialized.
|
|
|
|
OTP-12032
* tomszilagyi/shell-support-del-home-end:
Erlang shell: Support keys Del, Home and End
|
|
* bjorn/compiler/fix-crash:
beam_reorder: Eliminate compiler crash
|
|
* maint:
Avoid always updating inet_dns in the primary bootstrap
|
|
* bjorn/kernel/inet_dns/OTP-13027:
Avoid always updating inet_dns in the primary bootstrap
|
|
|
|
OTP-13031
* tuncer/leex-leo-liu-result-field-order:
yecc: fix file/2 error tuple doc
leex: fix file/2 error tuple doc (Reported-by: Leo Liu)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Conflicts:
OTP_VERSION
|
|
|
|
|
|
|
|
The include file inet_dns_record_adts.hrl is generated by the
Perl script inet_dns_record_adts.pl in a non-deterministic way.
That is, every time the script is run, the functions will be in
a different order. That will cause inet_dns.beam in the primary
bootstrap to be updated every time the bootstrap is updated,
even though there is no actual code change.
Modify the Perl script to sort the keys pulled out from hashes
to make the order deterministic.
|
|
c288ab87 added beam_reorder to move get_tuple_element instructions.
Compiling code such as the following would crash the compiler:
alloc(_U1, _U2, R) ->
V = R#alloc.version,
Res = id(V),
_ = id(0),
Res.
The crash would occur because the following two instructions:
{get_tuple_element,{x,2},1,{x,1}}.
{allocate_zero,1,2}.
were swapped and rewritten to:
{allocate_zero,1,1}.
{get_tuple_element,{x,2},1,{x,1}}.
That transformation is not safe because the allocate_zero instruction
would kill {x,2}, which is the register that is holding the reference
to the tuple. Only do the transformation when the tuple reference is
in an x register with a lower number than the destination register.
|
|
|
|
* dgud/mnesia/restore-leak/OTP-13025:
mnesia: Fix mnesia:restore/2 which caused a disk_log leak
|
|
* ia/inets/string-not-atom/OTP-13022:
inets: Use ?MODULE_STRING instead of ?MODULE as argument should be a string
|
|
* kostis/eldap-no-unmatched-returns:
Eliminate dialyzer warnings for unmatched_returns
|
|
|
|
* nybek/supervisor_reporting_error:
Fix supervisor reporting error
|
|
Introduced a leak of disk_log processes in the rewrite to try-catch.
|
|
* maint:
ssh: 4.1->4.2
|
|
|
|
* maint:
ssh: document dh-gex default values
ssh: document ecdh and hmac-sha2-512
|
|
* hans/ssh/doc_dh-gex_defaults:
ssh: document dh-gex default values
|
|
* hans/ssh/doc-ecdh_and_hmac512:
ssh: document ecdh and hmac-sha2-512
|
|
|
|
|
|
|
|
|
|
Conflicts:
OTP_VERSION
erts/doc/src/notes.xml
erts/vsn.mk
lib/debugger/doc/src/notes.xml
lib/debugger/vsn.mk
otp_versions.table
|
|
|
|
This enables the user to provide default HTTP header values for headers
that should always be sent. Note that these values
may override built in defaults.
|
|
Add this now as 18 allows optional callback specs
|
|
|
|
* stevendanna/eunit-doc-timeout:
Document eunit's default 5 second test timeout
OTP-13017
|
|
* legoscia/patch-10:
Fix typos in crypto documentation
OTP-13017
|
|
|
|
* lucafavatella/fix-snmp-doc-typo:
Fix typo in SNMP MIB in documentation
OTP-13017
|
|
|
|
* siri/ts_lib-get_arg/remove_space/OTP-13015:
Allow internal spaces in IFEQ test in generated Makefile
|
|
When generating Makefile from Makefile.src, ts_lib:get_arg/4 earlier
removed all spaces in the extracted argument. The code was probably
meant for removing leading and trailing spaces only, and is now
corrected to do so.
|
|
* bjorn/compiler/misc:
Move select_val optimization from beam_clean to beam_peep
beam_type: Improve optimizations by keeping track of booleans
beam_type: Improve optimization by keeping track of integers
beam_type: Remove unused clause
beam_type: Fix forgotten change of internal representation
beam_dead: Improve optimization of literal binary matching
beam_dead: Optimize select_val instructions
Move out bit syntax optimizations from beam_block
sys_core_fold: Extend the list of BIFs that return integers
v3_codegen: Optimize matching of the final size-less binary segment
Regain full coverage of beam_block
|